{"version":3,"file":"magicx-eng-ai-autocomplete-angular.mjs","sources":["../../src/lib/internal/date-grid/date-grid.component.ts","../../src/lib/internal/date-grid/date-grid.component.html","../../src/lib/internal/layout/cluster.component.ts","../../src/lib/internal/layout/stack.component.ts","../../src/lib/internal/pill-list/pill-list.component.ts","../../src/lib/internal/pill-list/pill-list.component.html","../../src/lib/internal/product-strip/product-strip.component.ts","../../src/lib/internal/product-strip/product-strip.component.html","../../src/lib/internal/layout/grid.component.ts","../../src/lib/internal/layout/grid.component.html","../../src/lib/internal/suggestion-item/suggestion-item.component.ts","../../src/lib/internal/suggestion-item/suggestion-item.component.html","../../src/lib/internal/suggestion-grid/suggestion-grid.component.ts","../../src/lib/internal/suggestion-grid/suggestion-grid.component.html","../../src/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.ts","../../src/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.html","../../src/lib/controller/observables.ts","../../src/lib/controller/ai-autocomplete.controller.ts","../../src/lib/internal/editor-host/editor-host.directive.ts","../../src/lib/internal/submit-button/submit-button.component.ts","../../src/lib/internal/submit-button/submit-button.component.html","../../src/lib/ai-autocomplete/ai-autocomplete.component.ts","../../src/lib/ai-autocomplete/ai-autocomplete.component.html","../../src/lib/input/ai-autocomplete-input.directive.ts","../../src/lib/ai-autocomplete.module.ts","../../src/public-api.ts","../../src/magicx-eng-ai-autocomplete-angular.ts"],"sourcesContent":["import { CommonModule } from \"@angular/common\";\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport {\n  cellDay,\n  cellIso,\n  type DateMonthView,\n  type DateRange,\n  type DateSelection,\n  dateCellMarks,\n  isoDate,\n  monthLabel,\n  type SuggestionOption,\n  visibleDateRange,\n  WEEKDAY_LABELS,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * The dropdown's calendar body, rendered in place of the options grid when the\n * active parameter is a date. Angular analogue of vanilla's `renderDateGrid`\n * and React's `<DateGrid>`.\n *\n * The cells carry the same `${listboxId}-option-${i}` ids, `role=\"option\"` and\n * `aria-selected` the options grid emits, and that is load-bearing rather than\n * cosmetic: the keyboard controller lives in the vanilla core for all three\n * packages, navigates by index into `filteredOptions`, and commits by clicking\n * `#${listboxId}-option-${i}`. `getEffectiveColumns` also measures the live\n * `grid-template-columns` of option-0's parent, which is why the 7 columns sit\n * on the cell container itself and not on an ancestor.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-date-grid\",\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./date-grid.component.html\",\n  styleUrls: [\"./date-grid.component.css\"],\n})\nexport class DateGridComponent {\n  /** The visible month's cells. These ARE `filteredOptions` — see `buildDateOptions`. */\n  @Input() options: SuggestionOption[] = [];\n  @Input() activeIndex = -1;\n  @Input() listboxId = \"\";\n  @Input() view: DateMonthView | null = null;\n  /** What the calendar paints as answered — see the core's `dateSelectionFor`. */\n  @Input() selection: DateSelection = { selectedIso: null, selectedRange: null, rangeStart: null };\n\n  @Output() readonly select = new EventEmitter<SuggestionOption>();\n  @Output() readonly highlight = new EventEmitter<number>();\n\n  /** The pointer left cell `index` — the dropdown clears a highlight still on it. */\n  @Output() readonly unhighlight = new EventEmitter<number>();\n  @Output() readonly previousMonth = new EventEmitter<void>();\n  @Output() readonly nextMonth = new EventEmitter<void>();\n\n  readonly weekdays = WEEKDAY_LABELS;\n\n  /** Index of the cell showing a 170ms press animation, or -1. */\n  pressedIndex = -1;\n\n  get monthLabel(): string {\n    return this.view ? monthLabel(this.view) : \"\";\n  }\n\n  dayOf(option: SuggestionOption): number | null {\n    return cellDay(option);\n  }\n\n  isToday(option: SuggestionOption): boolean {\n    return cellIso(option) === isoDate(new Date());\n  }\n\n  /** Before today: rendered dimmed, but every bit as pickable as the rest. */\n  isPast(option: SuggestionOption): boolean {\n    const iso = cellIso(option);\n    // ISO strings order the same way the dates they name do.\n    return iso != null && iso < isoDate(new Date());\n  }\n\n  isSelected(option: SuggestionOption): boolean {\n    return dateCellMarks(cellIso(option), {\n      selectedIso: this.selection.selectedIso,\n      range: this.paintedRange,\n    }).selected;\n  }\n\n  /** Between the two ends of the painted span — banded, not filled. */\n  isInRange(option: SuggestionOption): boolean {\n    return dateCellMarks(cellIso(option), {\n      selectedIso: this.selection.selectedIso,\n      range: this.paintedRange,\n    }).inRange;\n  }\n\n  /**\n   * While a start is pending, the span runs to whatever cell is highlighted —\n   * the hover/arrow preview that tells the user the first tap registered.\n   *\n   * A getter rather than a cached field: `OnPush` re-runs the template's\n   * bindings whenever `options`, `activeIndex` or `selection` changes, and each\n   * of those changes this answer.\n   */\n  private get paintedRange(): DateRange | null {\n    return visibleDateRange({\n      pendingStart: this.selection.rangeStart,\n      highlightedIso: cellIso(this.options[this.activeIndex]),\n      selected: this.selection.selectedRange,\n    });\n  }\n\n  onSelect(option: SuggestionOption, index: number): void {\n    this.pressedIndex = index;\n    this.select.emit(option);\n    setTimeout(() => {\n      this.pressedIndex = -1;\n    }, 170);\n  }\n\n  onKeyDown(event: KeyboardEvent, option: SuggestionOption, index: number): void {\n    if (event.key === \"Enter\" || event.key === \" \") {\n      event.preventDefault();\n      this.onSelect(option, index);\n    }\n  }\n\n  /** Keeps the input focused, which the dropdown's visibility gate depends on. */\n  preventBlur(event: MouseEvent): void {\n    event.preventDefault();\n  }\n\n  // Padding cells have no date of their own, so they key off position.\n  trackByCell = (index: number, option: SuggestionOption): string =>\n    cellIso(option) ?? `pad-${index}`;\n}\n","<div class=\"magicx-aia-datepicker\" data-aia-datepicker=\"\">\n  <div class=\"magicx-aia-datepicker-header\">\n    <!-- tabIndex -1 for the same reason the skip button is: Tab is already\n         bound to walking the dropdown's options. -->\n    <button\n      type=\"button\"\n      tabindex=\"-1\"\n      class=\"magicx-aia-datepicker-nav\"\n      data-aia-date-prev=\"\"\n      aria-label=\"Previous month\"\n      (mousedown)=\"preventBlur($event)\"\n      (click)=\"previousMonth.emit()\"\n    >\n      &lsaquo;\n    </button>\n    <span class=\"magicx-aia-datepicker-month\" data-aia-date-month=\"\" aria-live=\"polite\">\n      {{ monthLabel }}\n    </span>\n    <button\n      type=\"button\"\n      tabindex=\"-1\"\n      class=\"magicx-aia-datepicker-nav\"\n      data-aia-date-next=\"\"\n      aria-label=\"Next month\"\n      (mousedown)=\"preventBlur($event)\"\n      (click)=\"nextMonth.emit()\"\n    >\n      &rsaquo;\n    </button>\n  </div>\n\n  <!-- Decorative: each cell announces its own full date, so repeating the\n       column letters to AT adds noise — and the duplicate T/S would be\n       meaningless read aloud anyway. -->\n  <div class=\"magicx-aia-datepicker-weekdays\" aria-hidden=\"true\">\n    <span class=\"magicx-aia-datepicker-weekday\" *ngFor=\"let label of weekdays\">{{ label }}</span>\n  </div>\n\n  <div class=\"magicx-aia-datepicker-grid\" data-aia-date-grid=\"\">\n    <ng-container *ngFor=\"let option of options; trackBy: trackByCell; let i = index\">\n      <!-- Padding for the days before the 1st / after the last. Non-tappable,\n           so arrow navigation skips it; hidden from AT so the month reads as\n           its own days and nothing else. -->\n      <div\n        *ngIf=\"dayOf(option) === null; else dayCell\"\n        [id]=\"listboxId + '-option-' + i\"\n        role=\"option\"\n        data-aia-option=\"\"\n        data-aia-date-cell=\"\"\n        aria-hidden=\"true\"\n        [attr.aria-selected]=\"false\"\n        tabindex=\"-1\"\n        class=\"magicx-aia-date-cell magicx-aia-date-cell--blank\"\n      ></div>\n\n      <ng-template #dayCell>\n        <!-- A day already gone by is de-emphasized, not disabled: it renders\n             dimmed but stays every bit as pickable as the rest of the month. -->\n        <div\n          [id]=\"listboxId + '-option-' + i\"\n          role=\"option\"\n          data-aia-option=\"\"\n          data-aia-date-cell=\"\"\n          [attr.aria-selected]=\"i === activeIndex\"\n          [attr.aria-label]=\"option.text\"\n          tabindex=\"0\"\n          class=\"magicx-aia-date-cell magicx-aia-date-cell--day\"\n          [class.magicx-aia-date-cell--past]=\"isPast(option)\"\n          [class.magicx-aia-date-cell--highlighted]=\"i === activeIndex\"\n          [class.magicx-aia-date-cell--today]=\"isToday(option)\"\n          [class.magicx-aia-date-cell--in-range]=\"isInRange(option)\"\n          [class.magicx-aia-date-cell--selected]=\"isSelected(option)\"\n          [class.magicx-aia-date-cell--pressed]=\"i === pressedIndex\"\n          (click)=\"onSelect(option, i)\"\n          (keydown)=\"onKeyDown($event, option, i)\"\n          (mouseenter)=\"highlight.emit(i)\"\n          (mouseleave)=\"unhighlight.emit(i)\"\n        >\n          <!-- The cell paints the day number; `option.text` is the full\n               committed value (\"March 23 2026\") and is what AT announces,\n               since that is what selecting it puts in the input. -->\n          <span class=\"magicx-aia-date-cell-number\">{{ dayOf(option) }}</span>\n        </div>\n      </ng-template>\n    </ng-container>\n  </div>\n</div>\n","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from \"@angular/core\";\n\n/**\n * Horizontal layout primitive — children sit in a row and wrap when out of\n * room. Mirrors the React `<Cluster>` component / vanilla `.aia-cluster` CSS\n * primitive. `noWrap` keeps a single row; `inline` makes it inline-level.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-cluster\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  template: \"<ng-content></ng-content>\",\n  styleUrls: [\"./cluster.component.css\"],\n  host: {\n    class: \"aia-cluster\",\n    \"[attr.data-align]\": \"align\",\n    \"[attr.data-justify]\": \"justify\",\n    \"[attr.data-nowrap]\": \"noWrap ? '' : null\",\n    \"[attr.data-inline]\": \"inline ? '' : null\",\n    \"[style.--aia-cluster-gap]\": \"gap\",\n  },\n})\nexport class ClusterComponent {\n  /** Gap between children. Any CSS length. Defaults to the CSS fallback (0.5rem). */\n  @Input() gap?: string;\n  /** Cross-axis alignment. Defaults to `center`. */\n  @Input() align: \"start\" | \"center\" | \"end\" | \"baseline\" = \"center\";\n  /** Main-axis distribution. Defaults to `start`. */\n  @Input() justify: \"start\" | \"center\" | \"end\" | \"between\" | \"around\" = \"start\";\n  /** When true, the cluster does NOT flex-wrap (single-row clusters). */\n  @Input() noWrap = false;\n  /** Render inline-level (inline-flex) instead of block. */\n  @Input() inline = false;\n}\n","import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from \"@angular/core\";\n\n/**\n * Vertical layout primitive — children stack top-to-bottom with `space` gap.\n * Mirrors the React `<Stack>` component / vanilla `.aia-stack` CSS primitive.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-stack\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  template: \"<ng-content></ng-content>\",\n  styleUrls: [\"./stack.component.css\"],\n  host: {\n    class: \"aia-stack\",\n    \"[attr.data-align]\": \"align\",\n    \"[style.--aia-stack-space]\": \"space\",\n  },\n})\nexport class StackComponent {\n  /** Gap between children. Any CSS length. Defaults to the CSS fallback (0.5rem). */\n  @Input() space?: string;\n  /** Cross-axis alignment of children. Defaults to `stretch` (full width). */\n  @Input() align: \"start\" | \"center\" | \"end\" | \"stretch\" = \"stretch\";\n}\n","import { CommonModule } from \"@angular/common\";\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport type { Suggestion } from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Internal pill list used by both the dropdown and Tier 1's inline pillbar.\n * Mirrors `packages/react/src/components/PillList.tsx` one-for-one — including\n * the per-index opacity ramp (1 / 0.7 / 0.4 / 0.2) and the skeleton-loading\n * fallback that preserves layout while the next fetch is in flight.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-pill-list\",\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./pill-list.component.html\",\n  styleUrls: [\"./pill-list.component.css\"],\n})\nexport class PillListComponent {\n  @Input() pills: Suggestion[] = [];\n  @Input() activePillIndex = 0;\n  @Input() rounded = false;\n  /**\n   * When true, pills become non-interactive shimmering skeletons. Real pills\n   * (with their text) are rendered when provided so widths/positions match\n   * the previous state; with no pills, fixed-width fallback placeholders are\n   * rendered instead.\n   */\n  @Input() loading = false;\n  /**\n   * Whether the active (leading) pill should render selected (full opacity)\n   * rather than its positional `first` tier. Auto trigger ⇒ true while a\n   * dropdown option is highlighted; manual trigger ⇒ true after the user taps\n   * the pill. See `AIAutocompleteController.isActivePillSelected$`.\n   */\n  @Input() activeSelected = false;\n\n  @Output() readonly selectPill = new EventEmitter<number>();\n\n  /** Fallback widths when loading with zero cached pills (matches React). */\n  readonly fallbackSkeletonWidths = [125, 69];\n\n  /** The active pill is \"selected\" only when `activeSelected` is set. */\n  isSelected(index: number): boolean {\n    return this.activeSelected && index === this.activePillIndex;\n  }\n\n  /**\n   * Opacity per pill state — mirrors PillList.tsx `PILL_OPACITY`. The selected\n   * pill is full opacity; otherwise pills take a positional tier (first / next\n   * / last).\n   */\n  pillOpacity(index: number): number {\n    if (this.isSelected(index)) return 1; // Selected\n    if (index === 0) return 0.7; // First\n    if (index === 1) return 0.4; // Next\n    return 0.2; // Last\n  }\n\n  trackByType = (_: number, pill: Suggestion): string => pill.parameter;\n  trackByWidth = (_: number, w: number): number => w;\n\n  onPillClick(index: number): void {\n    if (this.loading) return;\n    this.selectPill.emit(index);\n  }\n\n  onPillMouseDown(event: Event): void {\n    // Prevent the editor from losing focus when a pill is tapped.\n    event.preventDefault();\n  }\n}\n","<ng-container *ngIf=\"loading && pills.length === 0; else realPills\">\n  <span class=\"aia-pill-list\" data-aia-pill-list-loading=\"\">\n    <span\n      *ngFor=\"let w of fallbackSkeletonWidths; trackBy: trackByWidth; let i = index\"\n      data-aia-pill-skeleton=\"\"\n      class=\"aia-pill aia-pill-skeleton\"\n      [class.aia-pill-rounded]=\"rounded\"\n      [style.width.px]=\"w\"\n      [style.opacity]=\"pillOpacity(i)\"\n    ></span>\n  </span>\n</ng-container>\n\n<ng-template #realPills>\n  <span\n    class=\"aia-pill-list\"\n    [attr.data-aia-pill-list-loading]=\"loading ? '' : null\"\n  >\n    <button\n      *ngFor=\"let pill of pills; trackBy: trackByType; let i = index\"\n      type=\"button\"\n      data-aia-pill=\"\"\n      [attr.data-aia-loading]=\"loading ? '' : null\"\n      tabindex=\"-1\"\n      class=\"aia-pill\"\n      [class.aia-pill-rounded]=\"rounded\"\n      [class.aia-pill-skeleton]=\"loading\"\n      [style.opacity]=\"pillOpacity(i)\"\n      [disabled]=\"loading\"\n      (mousedown)=\"onPillMouseDown($event)\"\n      (click)=\"onPillClick(i)\"\n    >\n      {{ pill.text }}\n    </button>\n  </span>\n</ng-template>\n","import { CommonModule } from \"@angular/common\";\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  type ElementRef,\n  EventEmitter,\n  Input,\n  type OnChanges,\n  type OnDestroy,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport {\n  attachProductRowWheel,\n  type Product,\n  type ProductImageFallback,\n  type ProductsLayout,\n  productImageSources,\n  productInitial,\n  type UIStrings,\n  uiStringsFor,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Internal product strip rendered below the dropdown's options grid. Mirrors\n * `packages/react/src/components/ProductStrip.tsx` and the vanilla core's\n * `renderProductStrip`, so all three packages emit the same structure and\n * theme identically.\n *\n * Two layout notes carried over from the vanilla implementation:\n *\n * - The dropdown paints a background but never sets `color`, so anything here\n *   relying on `color: inherit` would pick up the *host page's* text colour —\n *   black text on a dark panel. Every text node resolves its colour through\n *   the same `--aia-option-*` chain the options use.\n * - The options grid carries a negative bottom margin so the footer rides up\n *   over its reserved band, and whatever follows the grid inherits that pull.\n *   The dropdown root is marked `data-aia-has-products` and the appearance\n *   layer zeroes the band at its source rather than the strip cancelling it\n *   from here.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-product-strip\",\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./product-strip.component.html\",\n  styleUrls: [\"./product-strip.component.css\"],\n})\nexport class ProductStripComponent implements OnDestroy, OnChanges {\n  @Input() products: Product[] = [];\n  /** Scopes the section label's id to the owning listbox. */\n  @Input() listboxId = \"\";\n  /**\n   * False while the panel is fading out. The closed dropdown keeps rendering\n   * its last content for the fade, and focusable cards inside it would still\n   * answer Tab.\n   */\n  @Input() focusable = true;\n  /** How the cards lay out — a scrolling row, or stacked as full-width rows. Default: \"row\". */\n  @Input() layout: ProductsLayout = \"row\";\n  @Input() imageFallback: ProductImageFallback = \"image\";\n  /** The words of the widget language. Default: English. */\n  @Input() strings: UIStrings = uiStringsFor();\n  readonly initial = productInitial;\n  /**\n   * Per product id, the `src`s that failed to load: a card moves on to the\n   * next source (a Shopify thumbnail falls back to the original) and shows its\n   * placeholder once none is left.\n   */\n  private readonly failedImages = new Map<string, string[]>();\n\n  ngOnChanges(): void {\n    const sources = new Map(\n      this.products.map((product) => [product.id, productImageSources(product.imageUrl)]),\n    );\n    for (const [id, failed] of this.failedImages) {\n      const current = sources.get(id) ?? [];\n      if (!failed.every((src) => current.includes(src))) this.failedImages.delete(id);\n    }\n  }\n\n  imageSource(product: Product): string | null {\n    const failed = this.failedImages.get(product.id) ?? [];\n    return productImageSources(product.imageUrl).find((src) => !failed.includes(src)) ?? null;\n  }\n\n  onImageError(product: Product): void {\n    const src = this.imageSource(product);\n    if (src) this.failedImages.set(product.id, [...(this.failedImages.get(product.id) ?? []), src]);\n  }\n\n  @Output() readonly select = new EventEmitter<Product>();\n  /**\n   * Focus moved into / out of the strip. The panel closes on blur by default\n   * and the editor blurs the moment a card takes focus, so the dropdown\n   * reports focus as still-inside rather than shutting out from under the card\n   * the user just tabbed to.\n   */\n  @Output() readonly focusChange = new EventEmitter<boolean>();\n\n  private detachWheel: (() => void) | null = null;\n\n  /**\n   * A mouse wheel over the row scrolls it sideways. The row sits inside the\n   * section's `*ngIf`, so the query fires with the element as products arrive\n   * and with `undefined` as they go; the binding follows it either way.\n   */\n  @ViewChild(\"row\")\n  set row(ref: ElementRef<HTMLElement> | undefined) {\n    this.detachWheel?.();\n    this.detachWheel = ref ? attachProductRowWheel(ref.nativeElement) : null;\n  }\n\n  ngOnDestroy(): void {\n    this.detachWheel?.();\n    this.detachWheel = null;\n  }\n\n  get labelId(): string {\n    return `${this.listboxId}-products-label`;\n  }\n\n  cardId(index: number): string {\n    return `${this.listboxId}-product-${index}`;\n  }\n\n  trackByProduct = (_: number, product: Product): string => product.id;\n\n  onClick(event: MouseEvent, product: Product): void {\n    // Let the browser keep the clicks that mean \"open this somewhere else\" —\n    // intercepting them would defeat the point of rendering an <a>. Those are\n    // navigations the user asked for explicitly, so they don't emit.\n    if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0) {\n      return;\n    }\n    event.preventDefault();\n    this.select.emit(product);\n  }\n\n  onKeyDown(event: KeyboardEvent, product: Product): void {\n    if (event.key !== \"Enter\" && event.key !== \" \") return;\n    event.preventDefault();\n    this.select.emit(product);\n  }\n\n  onCardFocus(): void {\n    this.focusChange.emit(true);\n  }\n\n  onCardBlur(event: FocusEvent): void {\n    const next = event.relatedTarget as HTMLElement | null;\n    if (next?.closest(\"[data-aia-dropdown]\")) return;\n    this.focusChange.emit(false);\n  }\n}\n","<!-- `group` is the one role a listbox accepts around a set of options, so the\n     strip stays inside the listbox without breaking its content model. -->\n<section\n  *ngIf=\"products.length > 0\"\n  class=\"aia-products\"\n  data-aia-products=\"\"\n  [attr.data-aia-products-layout]=\"layout\"\n  role=\"group\"\n  [attr.aria-labelledby]=\"labelId\"\n>\n  <!-- data-aia-products-label: the scroll arrow centres itself on this row. -->\n  <div class=\"aia-products-label\" [id]=\"labelId\" data-aia-products-label=\"\">{{ strings.products }}</div>\n\n  <!-- #row: the component binds wheel-to-sideways scrolling on it. -->\n  <div #row class=\"aia-products-row\" data-aia-products-row=\"\">\n    <!-- A real <a href> rather than a <div>: it keeps the browser's own link\n         affordances — cmd/ctrl-click for a new tab, middle-click, right-click →\n         \"copy link address\". role=\"option\" overrides how assistive tech\n         announces it, which is correct inside a listbox; the deliberate trade\n         is that AT no longer calls it a link. An attribute binding, so a\n         product without a url gets no href at all rather than \"null\". -->\n    <a\n      *ngFor=\"let product of products; let i = index; trackBy: trackByProduct\"\n      [id]=\"cardId(i)\"\n      class=\"aia-product\"\n      data-aia-product=\"\"\n      [attr.data-aia-product-sold-out]=\"product.available === false ? '' : null\"\n      role=\"option\"\n      [attr.aria-selected]=\"false\"\n      [attr.href]=\"product.url ?? null\"\n      [attr.tabindex]=\"focusable ? 0 : -1\"\n      (click)=\"onClick($event, product)\"\n      (keydown)=\"onKeyDown($event, product)\"\n      (focus)=\"onCardFocus()\"\n      (blur)=\"onCardBlur($event)\"\n    >\n      <span\n        class=\"aia-product-media\"\n        aria-hidden=\"true\"\n        [attr.data-aia-product-placeholder]=\"!imageSource(product) && imageFallback === 'image' ? '' : null\"\n        [attr.data-aia-product-initial]=\"!imageSource(product) && imageFallback === 'initial' ? '' : null\"\n      >\n        <!-- alt=\"\" on purpose: the title is already the card's accessible\n             name, and repeating it would have a screen reader read it twice. -->\n        <img\n          *ngIf=\"imageSource(product) as src\"\n          class=\"aia-product-image\"\n          [src]=\"src\"\n          (error)=\"onImageError(product)\"\n          alt=\"\"\n          loading=\"lazy\"\n          decoding=\"async\"\n        />\n        <ng-container *ngIf=\"!imageSource(product) && imageFallback === 'initial'\">{{ initial(product.title) }}</ng-container>\n      </span>\n\n      <!-- Every field but the title is optional, so absent ones render no\n           element at all — the column gap can't leave a hole for a box that\n           isn't there. -->\n      <span class=\"aia-product-body\">\n        <span *ngIf=\"product.vendor\" class=\"aia-product-vendor\">{{ product.vendor }}</span>\n        <span class=\"aia-product-title\">{{ product.title }}</span>\n        <span *ngIf=\"product.price\" class=\"aia-product-price\">{{ product.price }}</span>\n        <!-- In the text column rather than the aria-hidden media tile, so the\n             card's accessible name says it; the stylesheet lifts it over the\n             image. -->\n        <span *ngIf=\"product.available === false\" class=\"aia-product-badge\">{{ strings.soldOut }}</span>\n      </span>\n    </a>\n  </div>\n</section>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  type ElementRef,\n  Input,\n  type OnChanges,\n  type SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport { optionsGridTemplateColumns } from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Intrinsic grid layout primitive — auto-fits as many columns as fit between\n * `min` and `max` wide, wrapping to new rows when there's no more horizontal\n * room. Mirrors the React `<Grid>` component / vanilla `.aia-grid` primitive.\n *\n * Optionally scrolls (`scroll`, capped height).\n *\n * @internal\n */\n@Component({\n  selector: \"aia-grid\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./grid.component.html\",\n  styleUrls: [\"./grid.component.css\"],\n  host: { class: \"aia-grid-host\" },\n})\nexport class GridComponent implements OnChanges {\n  /** Minimum cell width. CSS length, e.g. \"16rem\". Columns auto-fit at runtime. */\n  @Input() min = \"16rem\";\n  /** Maximum cell width. CSS length. Defaults (via CSS) to `1fr` (stretch). */\n  @Input() max?: string;\n  /** Gap between cells. */\n  @Input() gap?: string;\n  /** Cap the height and scroll vertically when content overflows. */\n  @Input() scroll = false;\n  /** Max height when `scroll`. CSS length. Defaults (via CSS) to 120px. */\n  @Input() maxHeight?: string;\n  /** Scroll back to the top whenever this key changes (`scroll` only). */\n  @Input() scrollResetKey?: string;\n  /** Fixed column count. Overrides the intrinsic auto-fit when set; rows fill left-to-right. */\n  @Input() cols?: number;\n  /** Explicit `grid-template-columns` value. Overrides `cols` when set. */\n  @Input() template?: string;\n  /**\n   * Identity of the content group on screen, mirrored onto `data-aia-group`.\n   * The core's scroll-arrow controller reads it to tell a new set of options\n   * (rising in) from the same set re-rendered.\n   */\n  @Input() group?: string;\n\n  /**\n   * Explicit column template overrides the intrinsic auto-fit (inline wins).\n   * The track string is built by the core so all three packages emit the same\n   * one; a measured template (the two-column split) wins over the count.\n   */\n  get templateColumns(): string | null {\n    if (this.template) return this.template;\n    return this.cols ? optionsGridTemplateColumns(this.cols) : null;\n  }\n\n  @ViewChild(\"grid\", { static: false }) gridRef?: ElementRef<HTMLDivElement>;\n\n  /**\n   * A new `scrollResetKey` means a different content group is being shown (e.g.\n   * the next suggestion's options after a selection) — start it from the top\n   * instead of inheriting the previous group's scroll offset.\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    const change = changes[\"scrollResetKey\"];\n    if (!change || change.isFirstChange()) return;\n    const grid = this.gridRef?.nativeElement;\n    if (grid) grid.scrollTop = 0;\n  }\n}\n","<div\n  #grid\n  class=\"aia-grid\"\n  [attr.data-scroll]=\"scroll ? '' : null\"\n  [attr.data-aia-group]=\"group ?? null\"\n  [style.--aia-grid-min]=\"min\"\n  [style.--aia-grid-max]=\"max\"\n  [style.--aia-grid-gap]=\"gap\"\n  [style.--aia-grid-max-height]=\"maxHeight\"\n  [style.grid-template-columns]=\"templateColumns\"\n>\n  <ng-content></ng-content>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  Input,\n  inject,\n  type OnDestroy,\n  Output,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport { DomSanitizer, type SafeHtml } from \"@angular/platform-browser\";\nimport {\n  formatOptionCount,\n  optionImageSources,\n  optionLabel,\n  type SuggestionOption,\n  sanitizeOptionIconSvg,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Internal single-option cell used inside the suggestion grid. Mirrors\n * `packages/react/src/components/SuggestionItem.tsx`. Handles:\n *\n * - Tappable vs non-tappable cursor + hover styling\n * - Pressed-state compress animation (170ms, single-flight)\n * - Keyboard activation (Enter/Space)\n * - ARIA `role=\"option\"` + `aria-selected` for the listbox pattern\n * - Loading skeleton when `loading=true`\n * - Server-provided icon (`icon_svg`), allowlisted through the core's\n *   `sanitizeOptionIconSvg` before it is bound as HTML\n * - Server-provided picture (`image_url`) as a square thumbnail in place of\n *   the icon, and item count (`item_count`) at the row's trailing edge\n *\n * @internal\n */\n@Component({\n  selector: \"aia-suggestion-item\",\n  standalone: true,\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./suggestion-item.component.html\",\n  styleUrls: [\"./suggestion-item.component.css\"],\n})\nexport class SuggestionItemComponent implements OnDestroy {\n  @Input() option!: SuggestionOption;\n  @Input() isHighlighted = false;\n  @Input() id = \"\";\n  @Input() loading = false;\n  /** Whether to draw the option's `icon_svg` before its text. Default: true. */\n  @Input() showIcon = true;\n  /** Whether to draw the option's `image_url` as a thumbnail before its text, in place of the icon. Default: true. */\n  @Input() showImage = true;\n  /** Whether to show the option's `item_count` at the row's trailing edge. Default: true. */\n  @Input() showCount = true;\n  /** Fade this option's text toward its bottom edge (last visible row of a scrollable grid). */\n  @Input() scrollHint = false;\n  /**\n   * Start delay of this row's entrance animation (ms) — each row rises in a\n   * beat after the one nearer the input. Captured once, on first render, so a\n   * later change-detection pass can't restart a row mid-rise.\n   */\n  @Input() set enterDelayMs(value: number) {\n    if (this.enterDelay === null) this.enterDelay = value;\n  }\n  /**\n   * The captured delay; `null` until the first `enterDelayMs` binding lands.\n   * The template binds it to `--aia-option-enter-delay` (the core's\n   * OPTION_ENTER_DELAY_VAR), which the stylesheet's entrance rule reads.\n   */\n  enterDelay: number | null = null;\n\n  @Output() readonly select = new EventEmitter<SuggestionOption>();\n  @Output() readonly highlight = new EventEmitter<void>();\n  /**\n   * The pointer left this row. The owner clears the highlight if it is still\n   * on this row: a hover highlight ends with the hover, so Enter afterwards\n   * submits instead of picking a row the pointer is no longer on.\n   */\n  @Output() readonly unhighlight = new EventEmitter<void>();\n\n  pressed = false;\n\n  private readonly cdr = inject(ChangeDetectorRef);\n  private readonly sanitizer = inject(DomSanitizer);\n  private pressedTimer: ReturnType<typeof setTimeout> | undefined;\n  private iconSource: string | undefined;\n  private iconSafe: SafeHtml | null = null;\n  /**\n   * The `src`s that failed to load: the row moves on to the next source (a\n   * Shopify thumbnail falls back to the original), and the tile keeps its\n   * placeholder fill once none is left.\n   */\n  private failedSrcs: readonly string[] = [];\n\n  /** The option's text. `icon` is the icon's name and is never shown as text. */\n  get label(): string {\n    return optionLabel(this.option);\n  }\n\n  /**\n   * The picture's `src`, or `null` when the row draws none: images off, no\n   * `image_url`, or one that is not an http(s) URL. A picture stands in for\n   * the icon — a row never leads with two visuals.\n   */\n  get imageSrc(): string | null {\n    const sources = this.imageSources;\n    return (\n      sources.find((src) => !this.failedSrcs.includes(src)) ?? sources[sources.length - 1] ?? null\n    );\n  }\n\n  /** Whether every source of the picture failed to load (the tile's fill stays). */\n  get imageFailed(): boolean {\n    const sources = this.imageSources;\n    return sources.length > 0 && sources.every((src) => this.failedSrcs.includes(src));\n  }\n\n  onImageError(): void {\n    const src = this.imageSrc;\n    if (src !== null && !this.failedSrcs.includes(src)) this.failedSrcs = [...this.failedSrcs, src];\n    this.cdr.markForCheck();\n  }\n\n  private get imageSources(): string[] {\n    return this.showImage ? optionImageSources(this.option.image_url) : [];\n  }\n\n  /**\n   * The count as printed (\"1,284\"), or `null` when the row shows none. The\n   * unit word after it is the stylesheet's (`--aia-option-count-unit`).\n   */\n  get countLabel(): string | null {\n    return this.showCount ? formatOptionCount(this.option.item_count) : null;\n  }\n\n  /**\n   * The option's icon as bindable HTML, or `null` when it has none (or its\n   * markup failed the allowlist). Angular's own HTML sanitizer strips `<svg>`\n   * wholesale, so the core's allowlisted output is marked trusted instead —\n   * it is never the server's raw string. Recomputed only when the markup\n   * changes; the getter runs on every OnPush check.\n   */\n  get iconHtml(): SafeHtml | null {\n    const svg = this.showIcon && !this.imageSrc ? this.option.icon_svg : undefined;\n    if (svg !== this.iconSource) {\n      this.iconSource = svg;\n      const html = svg ? sanitizeOptionIconSvg(svg) : null;\n      this.iconSafe = html ? this.sanitizer.bypassSecurityTrustHtml(html) : null;\n    }\n    return this.iconSafe;\n  }\n\n  ngOnDestroy(): void {\n    if (this.pressedTimer !== undefined) clearTimeout(this.pressedTimer);\n  }\n\n  onSelect(): void {\n    if (this.loading || !this.option.is_tappable || this.pressed) return;\n    this.pressed = true;\n    this.cdr.markForCheck();\n    this.select.emit(this.option);\n    if (this.pressedTimer !== undefined) clearTimeout(this.pressedTimer);\n    this.pressedTimer = setTimeout(() => {\n      this.pressed = false;\n      this.cdr.markForCheck();\n    }, 170);\n  }\n\n  onMouseEnter(): void {\n    if (this.loading || !this.option.is_tappable) return;\n    this.highlight.emit();\n  }\n\n  onMouseLeave(): void {\n    this.unhighlight.emit();\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (this.loading || !this.option.is_tappable) return;\n    if (event.key === \"Enter\" || event.key === \" \") {\n      event.preventDefault();\n      this.onSelect();\n    }\n  }\n}\n","<div\n  [id]=\"id\"\n  role=\"option\"\n  data-aia-option=\"\"\n  [attr.data-aia-loading]=\"loading ? '' : null\"\n  [attr.data-aia-icon]=\"iconHtml && option.icon ? option.icon : null\"\n  [attr.data-aia-image]=\"imageSrc ? '' : null\"\n  [attr.data-aia-item-count]=\"countLabel !== null ? option.item_count : null\"\n  [attr.aria-selected]=\"isHighlighted\"\n  class=\"aia-suggestion-item\"\n  [style.--aia-option-enter-delay]=\"(enterDelay ?? 0) + 'ms'\"\n  [class.aia-suggestion-item-highlighted]=\"isHighlighted && !loading\"\n  [class.aia-suggestion-item-tappable]=\"option.is_tappable\"\n  [class.aia-suggestion-item-non-tappable]=\"!option.is_tappable\"\n  [class.aia-suggestion-item-pressed]=\"pressed\"\n  [class.aia-suggestion-item-scroll-hint]=\"scrollHint\"\n  [attr.tabindex]=\"loading || !option.is_tappable ? -1 : 0\"\n  (click)=\"onSelect()\"\n  (keydown)=\"onKeyDown($event)\"\n  (mouseenter)=\"onMouseEnter()\"\n  (mouseleave)=\"onMouseLeave()\"\n>\n  <span class=\"aia-suggestion-content\">\n    <!-- The tile keeps a placeholder fill under the picture, so a slow or\n         failed load leaves a neutral square rather than a gap. The picture is\n         decorative: the text is the option's accessible name. -->\n    <span *ngIf=\"imageSrc as src\" class=\"aia-suggestion-image\" aria-hidden=\"true\">\n      <img\n        [src]=\"src\"\n        alt=\"\"\n        loading=\"lazy\"\n        decoding=\"async\"\n        referrerpolicy=\"no-referrer\"\n        draggable=\"false\"\n        [hidden]=\"imageFailed\"\n        (error)=\"onImageError()\"\n      />\n    </span>\n    <span\n      *ngIf=\"iconHtml\"\n      class=\"aia-suggestion-icon\"\n      aria-hidden=\"true\"\n      [innerHTML]=\"iconHtml\"\n    ></span>\n    <span class=\"aia-suggestion-text\">{{ label }}</span>\n    <span *ngIf=\"option.tag\" class=\"aia-suggestion-tag\">{{ option.tag }}</span>\n    <!-- Part of the row's accessible name, read after the option's text. -->\n    <span *ngIf=\"countLabel !== null\" class=\"aia-suggestion-count\">{{ countLabel }}</span>\n  </span>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport {\n  type AfterViewChecked,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  EventEmitter,\n  HostListener,\n  Input,\n  inject,\n  type OnChanges,\n  Output,\n  type SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport {\n  isOptionsGridMobileViewport,\n  measureOptionsGrid,\n  needsOptionsGridMeasurement,\n  type OptionsGridPlan,\n  optionEnterDelayMs,\n  planOptionsGrid,\n  type SuggestionOption,\n  sameOptionRows,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\nimport { GridComponent } from \"../layout/grid.component\";\nimport { SuggestionItemComponent } from \"../suggestion-item/suggestion-item.component\";\n\n/**\n * Internal grid of suggestion options. Mirrors\n * `packages/react/src/components/SuggestionGrid.tsx` — a thin wrapper over the\n * `Grid` layout primitive (which owns the auto-fit columns and the\n * capped-height scroll). It only wires each option to its\n * select/highlight handlers and listbox-scoped id.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-suggestion-grid\",\n  standalone: true,\n  imports: [CommonModule, GridComponent, SuggestionItemComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./suggestion-grid.component.html\",\n})\nexport class SuggestionGridComponent implements OnChanges, AfterViewChecked {\n  @Input() options: SuggestionOption[] = [];\n  @Input() activeIndex = -1;\n  @Input() listboxId = \"\";\n  @Input() loading = false;\n  /**\n   * Identity of the suggestion these options belong to. When it changes the\n   * grid scrolls back to the top, so the next parameter's options are read\n   * from the first one instead of from the previous list's scroll offset.\n   */\n  @Input() groupKey = \"\";\n  /**\n   * Which side of the input the dropdown opens on. The rows' entrance starts\n   * from the input's side outward, so \"above\" reverses the order.\n   */\n  @Input() optionsPosition: \"above\" | \"below\" = \"below\";\n  /** Whether rows draw their `icon_svg` before the text. Default: true. */\n  @Input() showIcons = true;\n  /** Whether rows draw their `image_url` as a thumbnail before the text. Default: true. */\n  @Input() showImages = true;\n  /** Whether rows show their `item_count` at the trailing edge. Default: true. */\n  @Input() showCounts = true;\n\n  @Output() readonly select = new EventEmitter<SuggestionOption>();\n  @Output() readonly highlight = new EventEmitter<number>();\n  /** The pointer left option `index` — the dropdown clears a highlight still on it. */\n  @Output() readonly unhighlight = new EventEmitter<number>();\n\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  @ViewChild(GridComponent, { static: false }) private gridComp?: GridComponent;\n\n  /**\n   * The measured layout plan. Starts as the measurement-free baseline (one\n   * column); after each view update the rendered rows are measured and the\n   * plan upgrades to two columns when they provably fit — same two-pass the\n   * React grid does with its layout effect, all through `planOptionsGrid`.\n   */\n  plan: OptionsGridPlan = planOptionsGrid(0, false, null, null);\n  private needsMeasure = true;\n  /**\n   * The rows the current plan was measured from. A skeleton mirroring them\n   * keeps that plan — see `sameOptionRows`.\n   */\n  private measuredRows: SuggestionOption[] | null = null;\n\n  // Re-measure when the viewport changes (breakpoint or width both matter to\n  // the two-column fit).\n  @HostListener(\"window:resize\")\n  onResize(): void {\n    this.needsMeasure = true;\n    this.cdr.markForCheck();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Only the inputs the plan depends on reset it — activeIndex changes on\n    // every arrow key and must not knock a measured two-column grid back to\n    // the baseline (the React grid's layout effect excludes it the same way).\n    if (!changes[\"options\"] && !changes[\"loading\"]) return;\n    if (this.loading && sameOptionRows(this.measuredRows, this.options)) return;\n    this.measuredRows = this.loading ? null : this.options;\n    this.needsMeasure = true;\n    // The pre-measure baseline for the new inputs, so the first paint is the\n    // same one-column layout the other packages start from.\n    this.plan = planOptionsGrid(this.options.length, isOptionsGridMobileViewport(), null, null);\n  }\n\n  ngAfterViewChecked(): void {\n    if (!this.needsMeasure) return;\n    this.needsMeasure = false;\n    const isMobile = isOptionsGridMobileViewport();\n    const grid = this.gridComp?.gridRef?.nativeElement;\n    // Measuring clones every row and forces a layout — skip it whenever the\n    // plan would ignore the result (mobile, fewer than five options).\n    const shouldMeasure =\n      grid && !this.loading && needsOptionsGridMeasurement(this.options.length, isMobile);\n    const measured = shouldMeasure ? measureOptionsGrid(grid) : null;\n    const next = planOptionsGrid(\n      this.options.length,\n      isMobile,\n      measured?.rowWidths ?? null,\n      measured?.gridWidth ?? null,\n    );\n    const unchanged =\n      next.template === this.plan.template &&\n      next.maxHeight === this.plan.maxHeight &&\n      next.scrollHintIndices.join() === this.plan.scrollHintIndices.join();\n    if (unchanged) return;\n    // The view was already checked this cycle — apply the measured plan in a\n    // fresh microtask so OnPush picks it up without an\n    // ExpressionChangedAfterItHasBeenChecked error.\n    queueMicrotask(() => {\n      this.plan = next;\n      this.cdr.markForCheck();\n    });\n  }\n\n  isScrollHint(index: number): boolean {\n    return !this.loading && this.plan.scrollHintIndices.includes(index);\n  }\n\n  /**\n   * Start delay of row `index`'s entrance — each row rises in a beat after\n   * the one nearer the input. Skeleton rows fade in together (they're\n   * placeholders, not content arriving).\n   */\n  enterDelayMs(index: number): number {\n    if (this.loading) return 0;\n    // Across the columns the measured plan settled on — the two-column\n    // upgrade only decides that after the rows exist.\n    return optionEnterDelayMs(index, this.plan.cols, this.options.length, this.optionsPosition);\n  }\n\n  /**\n   * The group is part of the identity: a new suggestion's options are new\n   * rows and get the entrance animation even when one spells the same as a\n   * row already on screen.\n   */\n  trackByOptionText = (_: number, opt: SuggestionOption): string => `${this.groupKey}\\0${opt.text}`;\n}\n","<!-- max=\"1fr\": columns share out the full width, so a lone column spans the\n     whole options box instead of stopping at 250px. -->\n<aia-grid\n  min=\"250px\"\n  max=\"1fr\"\n  gap=\"0\"\n  [scroll]=\"true\"\n  [scrollResetKey]=\"groupKey\"\n  [template]=\"plan.template\"\n  [maxHeight]=\"plan.maxHeight\"\n  [group]=\"groupKey\"\n>\n  <aia-suggestion-item\n    *ngFor=\"let option of options; trackBy: trackByOptionText; let i = index\"\n    [option]=\"option\"\n    [isHighlighted]=\"i === activeIndex\"\n    [id]=\"listboxId + '-option-' + i\"\n    [loading]=\"loading\"\n    [showIcon]=\"showIcons\"\n    [showImage]=\"showImages\"\n    [showCount]=\"showCounts\"\n    [scrollHint]=\"isScrollHint(i)\"\n    [enterDelayMs]=\"enterDelayMs(i)\"\n    (select)=\"select.emit($event)\"\n    (highlight)=\"highlight.emit(i)\"\n    (unhighlight)=\"unhighlight.emit(i)\"\n  ></aia-suggestion-item>\n</aia-grid>\n","import { CommonModule } from \"@angular/common\";\nimport {\n  type AfterViewChecked,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  Input,\n  inject,\n  NgZone,\n  type OnChanges,\n  type OnDestroy,\n  type OnInit,\n  type SimpleChanges,\n  ViewChild,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport {\n  type AppearanceMode,\n  attachScrollArrow,\n  buildAttributionUrl,\n  containScroll,\n  type DateMonthView,\n  type DateSelection,\n  getFooterHint,\n  isCalendarFormat,\n  type Product,\n  type ProductImageFallback,\n  type ProductsLayout,\n  type ScrollArrowController,\n  type Suggestion,\n  type SuggestionOption,\n  type UIStrings,\n  uiStringsFor,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\nimport { BehaviorSubject, combineLatest, type Observable } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\nimport type { AIAutocompleteController } from \"../controller/ai-autocomplete.controller\";\nimport { DateGridComponent } from \"../internal/date-grid/date-grid.component\";\nimport { ClusterComponent } from \"../internal/layout/cluster.component\";\nimport { StackComponent } from \"../internal/layout/stack.component\";\nimport { PillListComponent } from \"../internal/pill-list/pill-list.component\";\nimport { ProductStripComponent } from \"../internal/product-strip/product-strip.component\";\nimport { SuggestionGridComponent } from \"../internal/suggestion-grid/suggestion-grid.component\";\n\ninterface DropdownVm {\n  pills: Suggestion[];\n  options: SuggestionOption[];\n  activeIndex: number;\n  isActivePillSelected: boolean;\n  isLoading: boolean;\n  /** The loading skeleton is fading out before the response's options replace it. */\n  skeletonExiting: boolean;\n  showsPills: boolean;\n  /** Whether the pillbar ends in the trailing \"skip\" button. */\n  showsSkip: boolean;\n  /**\n   * Disabled state for the skip button: loading, or the post-selection window\n   * where isLoading is suppressed but the core's skipActivePill() no-ops.\n   */\n  skipDisabled: boolean;\n  /** Active pill's label, for the skip button's aria-label. */\n  activePillLabel: string;\n  showsOptions: boolean;\n  /** Whether the calendar body renders in place of the options grid. */\n  showsDateGrid: boolean;\n  /** The month the calendar shows. Null unless `showsDateGrid`. */\n  dateView: DateMonthView | null;\n  /** What the calendar paints as answered — see the core's `dateSelectionFor`. */\n  dateSelection: DateSelection;\n  showsFallbackSkeleton: boolean;\n  isVisible: boolean;\n  /** Product cards for the strip. Empty unless `products` is configured. */\n  products: Product[];\n  /** Identity of the suggestion the options belong to — drives the grid's scroll reset. */\n  groupKey: string;\n  footerKey: string;\n  footerHint: string;\n  /** The words of the widget language. */\n  strings: UIStrings;\n  optionsPosition: \"above\" | \"below\";\n  /** Whether option rows draw their `icon_svg` before the text. */\n  showOptionIcons: boolean;\n  /** Whether option rows draw their `image_url` as a thumbnail before the text. */\n  showOptionImages: boolean;\n  /** Whether option rows show their `item_count` at the trailing edge. */\n  showOptionCounts: boolean;\n}\n\n/** The content-bearing fields of the view-model (everything but `isVisible`). */\ntype DropdownContent = Omit<DropdownVm, \"isVisible\">;\n\n/**\n * Tier 2 dropdown component — the Angular equivalent of React's\n * `<AIAutocompleteDropdown />`. Renders the pillbar, options grid, and\n * loading skeleton based on the supplied controller's `dropdown$` snapshot.\n *\n * ```html\n * <ai-autocomplete-dropdown [controller]=\"ac\"></ai-autocomplete-dropdown>\n * ```\n *\n * All actions (pill click, option select, option highlight) are forwarded to\n * the controller. Consumers who need to observe these events can subscribe\n * to the controller's per-field observables.\n *\n * @public\n */\n@Component({\n  selector: \"ai-autocomplete-dropdown\",\n  standalone: true,\n  imports: [\n    CommonModule,\n    PillListComponent,\n    ProductStripComponent,\n    SuggestionGridComponent,\n    DateGridComponent,\n    StackComponent,\n    ClusterComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./ai-autocomplete-dropdown.component.html\",\n  // The shared appearance layer carries the design tokens + box-sizing reset +\n  // optionsPosition reversal, so a standalone dropdown (no Tier 1 component on\n  // the page) is fully styled once `mode` is set.\n  styleUrls: [\"../shared/appearance.css\", \"./ai-autocomplete-dropdown.component.css\"],\n})\nexport class AIAutocompleteDropdownComponent\n  implements OnInit, OnChanges, AfterViewChecked, OnDestroy\n{\n  /** The controller that owns the autocomplete state. Required. */\n  @Input() controller!: AIAutocompleteController;\n  /** Whether to render the pillbar above the options grid. Default: true. */\n  @Input() showPills = true;\n  /**\n   * Whether the pillbar ends in a small \"skip\" button that dismisses the\n   * active pill — same action as pressing → at the end of the input. It sits\n   * at the trailing edge of the bar: visually top-right when the dropdown\n   * opens below the input, bottom-right when `optionsPosition` is \"above\".\n   * Default: true. Hidden automatically during re-edit and while the fallback\n   * skeleton renders.\n   */\n  @Input() showSkipButton = true;\n  /**\n   * Whether option rows draw their `icon_svg` before the text. Default: true.\n   * Set to false to render option rows as text only.\n   */\n  @Input() showOptionIcons = true;\n  /**\n   * Whether option rows draw their `image_url` as a square thumbnail before\n   * the text, in place of the icon. Default: true. Set to false to render\n   * option rows without pictures.\n   */\n  @Input() showOptionImages = true;\n  /**\n   * Whether option rows show their `item_count` as a muted label at the\n   * trailing edge (\"12 items\"). Default: true. Set to false to hide the counts.\n   */\n  @Input() showOptionCounts = true;\n  /**\n   * How the product strip lays its cards out: a horizontally scrolling row\n   * (the default), or the same cards stacked as full-width rows.\n   */\n  @Input() productsLayout: ProductsLayout = \"row\";\n  /** Missing/failed image fallback. Style initials with `[data-aia-product-initial]`. */\n  @Input() productImageFallback: ProductImageFallback = \"image\";\n  /** Optional CSS class applied to the dropdown root. */\n  @Input() className?: string;\n  /**\n   * Color mode for a standalone dropdown. When set, the dropdown self-scopes the\n   * design tokens to its own root (adds `magicx-aia` + `data-mode`), so it needs\n   * no `.magicx-aia` wrapper. `\"auto\"` follows `prefers-color-scheme`. Leave it\n   * unset when the dropdown sits inside a `.magicx-aia` ancestor (e.g. Tier 1).\n   */\n  @Input() mode?: AppearanceMode;\n  /**\n   * The widget language. It picks the words the dropdown draws: Spanish for\n   * any \"es\" tag, else English. Only this input counts, as in the vanilla\n   * widget. Tier 1 passes its own `language`.\n   */\n  @Input() language?: string;\n\n  /** Concrete resolved mode, or null when `mode` is unset (inherit from ancestor). */\n  resolvedMode: \"light\" | \"dark\" | null = null;\n  private modeMql?: MediaQueryList;\n  private modeListener?: () => void;\n  private readonly cdr = inject(ChangeDetectorRef);\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly zone = inject(NgZone);\n  private releaseScroll?: () => void;\n\n  /** Root class list — adds `magicx-aia` only when self-scoping via `mode`. */\n  get rootClass(): string {\n    let cls = \"magicx-aia-dropdown\";\n    if (this.resolvedMode) cls += \" magicx-aia\";\n    if (this.className) cls += ` ${this.className}`;\n    return cls;\n  }\n\n  /** Fallback skeleton-bar widths used when loading with zero cached options. */\n  readonly fallbackSkeletonBarWidths = [159, 119, 164];\n\n  /** Accessible name of the \"more below\" scroll arrow. */\n  get scrollArrowLabel(): string {\n    return uiStringsFor(this.language).scrollArrow;\n  }\n\n  // The dropdown root and the arrow button live under the `*ngIf` on vm$, so\n  // they come and go with it — hence non-static queries, re-read every check.\n  @ViewChild(\"dropdownRoot\", { static: false }) private dropdownRootRef?: ElementRef<HTMLElement>;\n  @ViewChild(\"scrollArrow\", { static: false })\n  private scrollArrowRef?: ElementRef<HTMLButtonElement>;\n  /** The grid the scroll-arrow controller is currently bound to. */\n  private scrollArrowBinding: { grid: HTMLElement; controller: ScrollArrowController } | null =\n    null;\n\n  /**\n   * Attribution/branding link URL for the footer, with a `utm_source` derived\n   * from the embedding page's hostname (see {@link buildAttributionUrl}).\n   */\n  readonly brandHref = buildAttributionUrl();\n\n  /**\n   * View-model derived from the controller's `dropdown$`. Adds three booleans\n   * (`showsPills`, `showsOptions`, `showsFallbackSkeleton`, `isVisible`) that\n   * keep template-level logic to a property read per §19.6.\n   *\n   * Initialized once in `ngOnInit` — must NOT be a getter. A getter returns a\n   * fresh `Observable` instance on every property read; with OnPush + `async`\n   * pipe that means each change-detection cycle unsubscribes/resubscribes,\n   * causing the `*ngIf=\"vm$ | async as vm\"` root to briefly resolve `null`\n   * and flicker the entire dropdown DOM.\n   */\n  vm$!: Observable<DropdownVm>;\n\n  // Bridge for the @Input `showPills` into the reactive pipeline. Without this,\n  // changing the input after init wouldn't trigger a new vm emission until the\n  // next controller.dropdown$ tick — and we'd lose the showPills update entirely\n  // if the controller is idle. Updated from ngOnChanges below.\n  private readonly showPills$ = new BehaviorSubject<boolean>(true);\n  // Same bridge, for `showSkipButton`.\n  private readonly showSkipButton$ = new BehaviorSubject<boolean>(true);\n  // Same bridge, for `showOptionIcons`.\n  private readonly showOptionIcons$ = new BehaviorSubject<boolean>(true);\n  // Same bridge, for `showOptionImages` and `showOptionCounts`.\n  private readonly showOptionImages$ = new BehaviorSubject<boolean>(true);\n  private readonly showOptionCounts$ = new BehaviorSubject<boolean>(true);\n  // Same bridge, for `language`.\n  private readonly language$ = new BehaviorSubject<string | undefined>(undefined);\n\n  // Last content emitted while the dropdown was visible. Reused during the\n  // close fade so the populated dropdown fades out as one — see initVm.\n  private lastVisibleContent: DropdownContent | null = null;\n\n  ngOnInit(): void {\n    // Seed the input bridges from their resolved values at init time.\n    this.showPills$.next(this.showPills);\n    this.showSkipButton$.next(this.showSkipButton);\n    this.showOptionIcons$.next(this.showOptionIcons);\n    this.showOptionImages$.next(this.showOptionImages);\n    this.showOptionCounts$.next(this.showOptionCounts);\n    this.language$.next(this.language);\n    this.applyMode();\n    this.initVm();\n    // Wheel/touch over the dropdown never scrolls the page behind it. On the\n    // host, so it survives the *ngIf root coming and going; outside the zone,\n    // so a wheel gesture doesn't run change detection on every event.\n    this.zone.runOutsideAngular(() => {\n      this.releaseScroll = containScroll(this.host.nativeElement);\n    });\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes[\"showPills\"]) {\n      this.showPills$.next(this.showPills);\n    }\n    if (changes[\"showSkipButton\"]) {\n      this.showSkipButton$.next(this.showSkipButton);\n    }\n    if (changes[\"showOptionIcons\"]) {\n      this.showOptionIcons$.next(this.showOptionIcons);\n    }\n    if (changes[\"showOptionImages\"]) {\n      this.showOptionImages$.next(this.showOptionImages);\n    }\n    if (changes[\"showOptionCounts\"]) {\n      this.showOptionCounts$.next(this.showOptionCounts);\n    }\n    if (changes[\"language\"]) {\n      this.language$.next(this.language);\n    }\n    if (changes[\"mode\"] && !changes[\"mode\"].firstChange) {\n      this.applyMode();\n    }\n    // Re-bind vm$ when the controller @Input is swapped (e.g. a multi-step form\n    // toggling between controllers). Without this, vm$ stays subscribed to the\n    // previous controller's dropdown$ — rendering stale options, or, if that\n    // controller was destroy()-ed, receiving a completion that collapses the\n    // dropdown permanently. Skip the first change: ngOnChanges fires before\n    // ngOnInit, which owns the initial creation.\n    if (changes[\"controller\"] && !changes[\"controller\"].firstChange && this.controller) {\n      this.initVm();\n    }\n  }\n\n  /**\n   * Keep the core's \"more below\" arrow controller bound to whichever options\n   * grid is currently rendered — the Angular analogue of React's\n   * useScrollArrow. The controller owns the behaviour (measuring, visibility,\n   * the page-scroll on click — see the core's scrollArrow.ts); this only hands\n   * it the live elements after each view check, re-attaching when the grid\n   * element is replaced and tearing down when there is no grid.\n   */\n  ngAfterViewChecked(): void {\n    const root = this.dropdownRootRef?.nativeElement;\n    const button = this.scrollArrowRef?.nativeElement;\n    const grid = root?.querySelector<HTMLElement>(\".aia-grid[data-scroll]\") ?? null;\n    if (this.scrollArrowBinding && this.scrollArrowBinding.grid !== grid) {\n      this.scrollArrowBinding.controller.destroy();\n      this.scrollArrowBinding = null;\n    }\n    if (!root || !button || !grid) return;\n    if (!this.scrollArrowBinding) {\n      this.scrollArrowBinding = {\n        grid,\n        controller: attachScrollArrow({ dropdown: root, grid, button }),\n      };\n      return; // attach() runs the first update itself\n    }\n    this.scrollArrowBinding.controller.update();\n  }\n\n  ngOnDestroy(): void {\n    this.teardownModeListener();\n    this.releaseScroll?.();\n    this.scrollArrowBinding?.controller.destroy();\n    this.scrollArrowBinding = null;\n  }\n\n  /**\n   * Resolve the `mode` input into `resolvedMode`. Unset → null (the dropdown\n   * stays class-less and inherits from a `.magicx-aia` ancestor). `\"auto\"` reads\n   * `prefers-color-scheme` and tracks it live via a media-query listener.\n   */\n  private applyMode(): void {\n    this.teardownModeListener();\n    if (this.mode === undefined) {\n      this.resolvedMode = null;\n      return;\n    }\n    if (this.mode === \"light\" || this.mode === \"dark\") {\n      this.resolvedMode = this.mode;\n      return;\n    }\n    // \"auto\"\n    if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n      this.resolvedMode = \"light\";\n      return;\n    }\n    this.modeMql = window.matchMedia(\"(prefers-color-scheme: dark)\");\n    this.resolvedMode = this.modeMql.matches ? \"dark\" : \"light\";\n    this.modeListener = () => {\n      this.resolvedMode = this.modeMql?.matches ? \"dark\" : \"light\";\n      this.cdr.markForCheck();\n    };\n    this.modeMql.addEventListener(\"change\", this.modeListener);\n  }\n\n  private teardownModeListener(): void {\n    if (this.modeMql && this.modeListener) {\n      this.modeMql.removeEventListener(\"change\", this.modeListener);\n    }\n    this.modeMql = undefined;\n    this.modeListener = undefined;\n  }\n\n  /** Build the view-model stream from the current controller + showPills$. */\n  private initVm(): void {\n    this.vm$ = combineLatest([\n      this.controller.dropdown$,\n      this.showPills$,\n      this.showSkipButton$,\n      this.showOptionIcons$,\n      this.showOptionImages$,\n      this.showOptionCounts$,\n      this.language$,\n    ]).pipe(\n      map(\n        ([\n          dd,\n          showPills,\n          showSkipButton,\n          showOptionIcons,\n          showOptionImages,\n          showOptionCounts,\n          language,\n        ]) => {\n          const activeSuggestion = dd.suggestions[0];\n          const options = activeSuggestion?.options ?? [];\n          const showsPills = showPills && (dd.pills.length > 0 || dd.isLoading);\n          // The trailing \"skip\" button only makes sense next to a real,\n          // skippable pill — never on the fallback skeleton bar, and never\n          // during re-edit (the bar then shows an already answered param).\n          // Deliberately NOT gated on showsPills: with pills rendered elsewhere\n          // (pillPlacement \"inline\"/\"hidden\") the bar renders as a skip-only\n          // row holding just the button. Hidden while the input is empty — the\n          // footer hint doesn't advertise \"→ to skip\" until the user has typed,\n          // so the pristine starting state stays free of the affordance too.\n          const showsSkip =\n            dd.pills.length > 0 && showSkipButton && !dd.isEditing && !dd.isInputEmpty;\n          // Exactly one body renders. `options` above already holds the visible\n          // month's cells when this is a date — the core swapped them in its\n          // derive layer — so the two are the same list drawn two different\n          // ways, and never both at once (two elements answering to the same\n          // option id would break keyboard commit).\n          //\n          // A calendar is withheld while a request is in flight. The options\n          // grid draws its cached options as skeleton rows for that window, but\n          // a month of day cells has no skeleton form worth drawing — and a live\n          // calendar over a loading pill bar invites an answer against\n          // suggestions the response is about to replace. The fallback bars\n          // stand in until it lands.\n          const isDate = isCalendarFormat(dd.formatType ?? \"options\") && dd.dateView != null;\n          const showsOptions = options.length > 0 && !isDate;\n          const showsDateGrid = options.length > 0 && isDate && !dd.isLoading;\n          const showsFallbackSkeleton = dd.isLoading && !showsOptions && !showsDateGrid;\n          // Either half is enough to keep the panel up: products render with no\n          // suggestions, suggestions render with no products.\n          const isVisible =\n            dd.isOpen &&\n            (showsOptions || showsDateGrid || showsPills || dd.isLoading || dd.products.length > 0);\n\n          // While closing, reuse the last visible content so the populated\n          // dropdown fades out as one. Otherwise the pills/options vanish the\n          // instant the state empties (e.g. skipping the last pill with →),\n          // leaving the always-present footer alone for a flash of a footer-only\n          // \"no options\" box mid-fade. Only `isVisible` tracks live state to\n          // drive the opacity transition.\n          if (!isVisible && this.lastVisibleContent) {\n            return { ...this.lastVisibleContent, isVisible: false };\n          }\n\n          const optionHighlighted =\n            dd.activeIndex >= 0 && Boolean(options[dd.activeIndex]?.is_tappable);\n          const strings = uiStringsFor(language);\n          const { key: footerKey, hint: footerHint } = getFooterHint(\n            optionHighlighted,\n            dd.isInputEmpty,\n            strings,\n          );\n          const content: DropdownContent = {\n            pills: dd.pills,\n            options,\n            activeIndex: dd.activeIndex,\n            isActivePillSelected: dd.isActivePillSelected,\n            isLoading: dd.isLoading,\n            skeletonExiting: Boolean(dd.skeletonExiting),\n            showsPills,\n            showsSkip,\n            skipDisabled: dd.isLoading || Boolean(dd.inSelectionAnimation),\n            activePillLabel: dd.pills[0]?.text ?? \"\",\n            showsOptions,\n            showsDateGrid,\n            dateView: dd.dateView ?? null,\n            dateSelection: {\n              selectedIso: dd.selectedDateIso ?? null,\n              selectedRange: dd.selectedDateRange ?? null,\n              rangeStart: dd.dateRangeStart ?? null,\n            },\n            showsFallbackSkeleton,\n            products: dd.products,\n            groupKey: activeSuggestion\n              ? `${activeSuggestion.parameter} ${activeSuggestion.text}`\n              : \"\",\n            footerKey,\n            footerHint,\n            strings,\n            optionsPosition: dd.optionsPosition,\n            showOptionIcons,\n            showOptionImages,\n            showOptionCounts,\n          };\n          if (isVisible) this.lastVisibleContent = content;\n          return { ...content, isVisible };\n        },\n      ),\n    );\n  }\n\n  trackByWidth = (_: number, w: number): number => w;\n\n  onPillClick(index: number): void {\n    this.controller.setActivePill(index);\n  }\n\n  onSkip(): void {\n    this.controller.skipActivePill();\n  }\n\n  onSelect(option: SuggestionOption): void {\n    this.controller.selectOption(option);\n  }\n\n  onPreviousMonth(): void {\n    this.controller.showPreviousMonth();\n  }\n\n  onNextMonth(): void {\n    this.controller.showNextMonth();\n  }\n\n  onHighlight(index: number): void {\n    this.controller.setActiveDropdownIndex(index);\n  }\n\n  // A hover highlight ends with the hover — see the core's `clearHighlight`.\n  onUnhighlight(index: number): void {\n    this.controller.clearHighlight(index);\n  }\n\n  onProductSelect(product: Product): void {\n    this.controller.selectProduct(product);\n  }\n\n  /**\n   * A card taking focus blurs the editor, which would otherwise close the\n   * panel out from under the card the user just tabbed to.\n   */\n  onProductFocusChange(focused: boolean): void {\n    this.controller.setFocused(focused);\n  }\n\n  preventBlur(event: Event): void {\n    // Prevent the editor from losing focus when interacting with the dropdown.\n    event.preventDefault();\n  }\n}\n","<div\n  *ngIf=\"vm$ | async as vm\"\n  #dropdownRoot\n  [id]=\"controller.listboxId\"\n  role=\"listbox\"\n  data-aia-dropdown=\"\"\n  [attr.data-aia-loading]=\"vm.isLoading ? '' : null\"\n  [attr.data-aia-skeleton-exiting]=\"vm.skeletonExiting ? '' : null\"\n  [attr.data-mode]=\"resolvedMode\"\n  [attr.data-options-position]=\"vm.optionsPosition\"\n  [attr.data-aia-has-products]=\"vm.products.length > 0 ? '' : null\"\n  [class]=\"rootClass\"\n  [class.magicx-aia-dropdown-visible]=\"vm.isVisible\"\n  (mousedown)=\"preventBlur($event)\"\n>\n  <aia-stack space=\"8px\">\n    <aia-cluster\n      *ngIf=\"vm.showsPills || vm.showsSkip\"\n      class=\"magicx-aia-dropdown-pillbar\"\n      data-aia-pillbar=\"\"\n      [noWrap]=\"true\"\n    >\n      <!-- The scroll + right-edge fade live on this wrapper (not the bar) so\n           the skip button stays outside the masked region — pinned and fully\n           opaque while overflowing pills fade under it. Absent in a skip-only\n           row (pills rendered elsewhere via pillPlacement inline/hidden). -->\n      <span *ngIf=\"vm.showsPills\" class=\"magicx-aia-pill-scroll\" data-aia-pill-scroll=\"\">\n        <aia-pill-list\n          [pills]=\"vm.pills\"\n          [activePillIndex]=\"0\"\n          [activeSelected]=\"vm.isActivePillSelected\"\n          [rounded]=\"true\"\n          [loading]=\"vm.isLoading\"\n          (selectPill)=\"onPillClick($event)\"\n        ></aia-pill-list>\n      </span>\n      <button\n        *ngIf=\"vm.showsSkip\"\n        type=\"button\"\n        tabindex=\"-1\"\n        class=\"magicx-aia-skip\"\n        data-aia-skip=\"\"\n        [disabled]=\"vm.skipDisabled\"\n        [attr.aria-label]=\"\n          vm.activePillLabel ? vm.strings.skipLabel + ' ' + vm.activePillLabel : vm.strings.skipLabel\n        \"\n        (click)=\"onSkip()\"\n      >\n        {{ vm.strings.skip }}\n      </button>\n    </aia-cluster>\n\n    <aia-suggestion-grid\n      *ngIf=\"vm.showsOptions\"\n      [options]=\"vm.options\"\n      [activeIndex]=\"vm.activeIndex\"\n      [listboxId]=\"controller.listboxId\"\n      [loading]=\"vm.isLoading\"\n      [groupKey]=\"vm.groupKey\"\n      [optionsPosition]=\"vm.optionsPosition\"\n      [showIcons]=\"vm.showOptionIcons\"\n      [showImages]=\"vm.showOptionImages\"\n      [showCounts]=\"vm.showOptionCounts\"\n      (select)=\"onSelect($event)\"\n      (highlight)=\"onHighlight($event)\"\n      (unhighlight)=\"onUnhighlight($event)\"\n    ></aia-suggestion-grid>\n\n    <aia-date-grid\n      *ngIf=\"vm.showsDateGrid\"\n      [options]=\"vm.options\"\n      [activeIndex]=\"vm.activeIndex\"\n      [listboxId]=\"controller.listboxId\"\n      [view]=\"vm.dateView\"\n      [selection]=\"vm.dateSelection\"\n      (select)=\"onSelect($event)\"\n      (highlight)=\"onHighlight($event)\"\n      (unhighlight)=\"onUnhighlight($event)\"\n      (previousMonth)=\"onPreviousMonth()\"\n      (nextMonth)=\"onNextMonth()\"\n    ></aia-date-grid>\n\n    <div\n      *ngIf=\"vm.showsFallbackSkeleton\"\n      class=\"magicx-aia-dropdown-skeleton-bars\"\n      data-aia-skeleton-bars=\"\"\n    >\n      <span\n        *ngFor=\"let w of fallbackSkeletonBarWidths; trackBy: trackByWidth\"\n        class=\"magicx-aia-dropdown-skeleton-bar\"\n        [style.width.px]=\"w\"\n      ></span>\n    </div>\n\n    <!-- *ngIf, not just the section's own guard inside the component: the host\n         element is an in-flow child of .aia-stack (display:flex; gap:8px), so\n         an always-instantiated zero-height host would add a SECOND 8px gap\n         between the grid and the footer — in every dropdown, products or not.\n         The grid's --aia-grid-overlap-bottom is tuned for exactly one gap, so\n         the footer would land 8px below the band it is meant to cover. -->\n    <aia-product-strip\n      *ngIf=\"vm.products.length > 0\"\n      [products]=\"vm.products\"\n      [listboxId]=\"controller.listboxId\"\n      [focusable]=\"vm.isVisible\"\n      [layout]=\"productsLayout\"\n      [imageFallback]=\"productImageFallback\"\n      [strings]=\"vm.strings\"\n      (select)=\"onProductSelect($event)\"\n      (focusChange)=\"onProductFocusChange($event)\"\n    ></aia-product-strip>\n\n    <footer class=\"magicx-aia-footer\" data-aia-footer=\"\">\n      <div class=\"magicx-aia-footer-row\">\n        <span class=\"magicx-aia-footer-hint-group\">\n          <kbd class=\"magicx-aia-footer-key\">{{ vm.footerKey }}</kbd>\n          <span class=\"magicx-aia-footer-hint\">{{ vm.footerHint }}</span>\n        </span>\n        <a\n          class=\"magicx-aia-footer-brand-link\"\n          [href]=\"brandHref\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n        >\n          <span class=\"magicx-aia-footer-brand\">AI</span>\n          <span class=\"magicx-aia-footer-badge\">Autocomplete</span>\n        </a>\n      </div>\n    </footer>\n  </aia-stack>\n  <!-- \"More below\" arrow — an overlay on the panel, not a section of the\n       stack. Shown/positioned by the core's scroll-arrow controller (see\n       syncScrollArrow); markup mirrors vanilla's createScrollArrowButton. -->\n  <button\n    #scrollArrow\n    type=\"button\"\n    tabindex=\"-1\"\n    class=\"magicx-aia-scroll-arrow\"\n    data-aia-scroll-arrow=\"\"\n    [attr.aria-label]=\"scrollArrowLabel\"\n    aria-hidden=\"true\"\n  >\n    <svg\n      viewBox=\"0 0 16 16\"\n      width=\"18\"\n      height=\"18\"\n      fill=\"none\"\n      stroke=\"currentColor\"\n      stroke-width=\"1.75\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n      aria-hidden=\"true\"\n      focusable=\"false\"\n    >\n      <path d=\"M4 6.5 8 10.5l4-4\" />\n    </svg>\n  </button>\n</div>\n","import { distinctUntilChanged, map, type Observable, shareReplay } from \"rxjs\";\n\n/**\n * Per-field observable derivation factory. Enforces the §19.4 invariant:\n *\n * - `distinctUntilChanged` — prevents re-emission storms when the upstream\n *   state object ticks but the field a consumer cares about hasn't changed.\n *   Without this, every keystroke would re-render every async-pipe binding\n *   in the consumer's template even when nothing changed for that binding.\n * - `shareReplay({ bufferSize: 1, refCount: true })` — guarantees that\n *   multiple subscribers (multiple `async` pipes in a template, e.g.\n *   `*ngIf=\"isLoading$ | async\"` and `[disabled]=\"isLoading$ | async\"`)\n *   share a single upstream subscription. `refCount: true` is non-obvious\n *   but essential: without it, the inner subscription survives after the\n *   last subscriber unmounts, leaking the chain back to `state$`.\n *\n * Every public observable on {@link AIAutocompleteController} must go through\n * this factory — no exceptions.\n *\n * @internal\n */\nexport function deriveField<T, R>(\n  source$: Observable<T>,\n  selector: (value: T) => R,\n  equalityFn?: (a: R, b: R) => boolean,\n): Observable<R> {\n  return source$.pipe(\n    map(selector),\n    distinctUntilChanged(equalityFn),\n    shareReplay({ bufferSize: 1, refCount: true }),\n  );\n}\n","import {\n  type AutocompleteResult,\n  type CompletedParamState,\n  AIAutocomplete as CoreAIAutocomplete,\n  type CoreState,\n  type CustomFieldsReport,\n  dateSelectionFor,\n  type IdentifiedParamState,\n  identifiedParamLabel,\n  type Product,\n  type Segment,\n  type SkippedParamState,\n  type Suggestion,\n  type SuggestionOption,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\nimport { BehaviorSubject, combineLatest, map, type Observable, shareReplay } from \"rxjs\";\nimport type {\n  AIAutocompleteControllerOptions,\n  AIAutocompleteControllerState,\n  AIAutocompleteControllerUpdate,\n  AIAutocompleteDropdownState,\n} from \"../shared/types\";\nimport { deriveField } from \"./observables\";\n\n/**\n * Tier 2 logic surface for `@magicx-eng/ai-autocomplete-angular` — the Angular\n * equivalent of React's `useAIAutocomplete()` hook. Wraps a headless\n * `@magicx-eng/ai-autocomplete-vanilla` core and exposes its state as RxJS\n * observables plus thin action methods.\n *\n * The controller is consumer-managed — the consumer creates it\n * with `new`, holds the reference, and **must call `destroy()`** in their\n * own `ngOnDestroy`. The Tier 1 `<ai-autocomplete>` component does this\n * automatically; Tier 2 consumers do not get auto-cleanup.\n *\n * @public\n */\nexport class AIAutocompleteController {\n  private readonly core: CoreAIAutocomplete;\n  private readonly rawState$: BehaviorSubject<CoreState>;\n  // optionsPosition isn't part of CoreState (it's a core option), so track it\n  // here and fold it into `dropdown$` so the dropdown can read placement from\n  // the controller — configured once, kept in sync through update().\n  private readonly optionsPosition$ = new BehaviorSubject<\"above\" | \"below\">(\"below\");\n  private readonly unsubscribeCore: () => void;\n  private isDestroyed = false;\n\n  // === Per-field observables ===\n  // Each one runs through deriveField, which bakes in distinctUntilChanged\n  // and shareReplay({ bufferSize: 1, refCount: true }) per §19.4.\n\n  /** Plain-text content of the editor. */\n  readonly text$: Observable<string>;\n  /** Completed (bold) params currently in the editor. */\n  readonly completedParams$: Observable<CompletedParamState[]>;\n  /**\n   * Suggestions the user dismissed with the skip key (→). Nothing renders\n   * them; they exist so a hand-rolled submit can pass them to\n   * `buildSubmitResult` and carry the same `text: \"skipped\"` entries the\n   * SDK's own requests do.\n   */\n  readonly skippedParams$: Observable<SkippedParamState[]>;\n  /**\n   * Params the server identified in the user's own words. Already rendered\n   * through `segments$`; exposed so a hand-rolled submit can pass them to\n   * `buildSubmitResult` and report the same `identified_params` the SDK's\n   * own results carry.\n   */\n  readonly identifiedParams$: Observable<IdentifiedParamState[]>;\n  /** Actionable suggestion pills (first one is the active pill). */\n  readonly suggestionPills$: Observable<Suggestion[]>;\n  /** Text + completed-param segments for rendering the editor body. */\n  readonly segments$: Observable<Segment[]>;\n  /** ID of the most-recently-promoted param (drives shimmer animation). */\n  readonly newParamId$: Observable<string | null>;\n  /** All suggestions from the server (including non-actionable ones). */\n  readonly suggestions$: Observable<Suggestion[]>;\n  /**\n   * What the product strip shows: the items the latest `/suggest` response\n   * reported as matching the query, or — with `products` configured on the\n   * controller — the results of that custom search.\n   */\n  readonly products$: Observable<Product[]>;\n  /**\n   * The catalog grounding report the latest response carried, or null when it\n   * carried none: which of the query's constraints the catalog applied, which\n   * it dropped, and how many items (and which) the applied ones left\n   * standing. Null is \"no news\", not an empty catalog.\n   */\n  readonly customFields$: Observable<CustomFieldsReport | null>;\n  /** Currently highlighted dropdown option index. -1 = none. */\n  readonly activeIndex$: Observable<number>;\n  /**\n   * UI-visible loading flag — suppressed during the post-select press\n   * animation and during re-edit (cached options stay visible there). Use\n   * this instead of the raw core state for any loading-skeleton binding.\n   */\n  readonly isLoading$: Observable<boolean>;\n  /** Server-reported \"query is complete\" flag. */\n  readonly isReady$: Observable<boolean>;\n  /** Whether the editor currently has focus. */\n  readonly isFocused$: Observable<boolean>;\n  /** Whether the dropdown should currently be visible. */\n  readonly isDropdownOpen$: Observable<boolean>;\n  /**\n   * Whether the active (leading) pill should render selected (full opacity)\n   * rather than the de-emphasized `first` tier. Auto trigger ⇒ true only while\n   * a dropdown option is highlighted; manual ⇒ true once the pill is tapped.\n   */\n  readonly isActivePillSelected$: Observable<boolean>;\n  /** Server-suggested placeholder text for the editor. */\n  readonly placeholderText$: Observable<string>;\n  /** Last fetch error, or null. */\n  readonly error$: Observable<Error | null>;\n  /** Param currently being re-edited, or null. */\n  readonly editingParam$: Observable<CompletedParamState | null>;\n  /** Plain-text offset where the edit region starts, or null. */\n  readonly editingAnchor$: Observable<number | null>;\n  /** Live caret offset within the editor. */\n  readonly caretOffset$: Observable<number | null>;\n\n  // === Composite observables ===\n\n  /**\n   * Snapshot of every public field in one object. Convenient for\n   * `*ngIf=\"ctrl.state$ | async as state\"` templating — aliases all fields\n   * under a single subscription instead of multiple `| async` pipes.\n   */\n  readonly state$: Observable<AIAutocompleteControllerState>;\n\n  /**\n   * Composite state for the dropdown view. Tier 2 consumers spread this into\n   * `<ai-autocomplete-dropdown>`; Tier 1 uses the same shape internally.\n   */\n  readonly dropdown$: Observable<AIAutocompleteDropdownState>;\n\n  /**\n   * Throws if invoked outside a browser environment. For SSR / Angular\n   * Universal, gate construction with `isPlatformBrowser`.\n   */\n  constructor(opts: AIAutocompleteControllerOptions = {}) {\n    if (typeof document === \"undefined\") {\n      throw new Error(\n        \"AIAutocompleteController requires a browser environment. \" +\n          \"For SSR / Angular Universal, gate construction with isPlatformBrowser.\",\n      );\n    }\n\n    // Headless mode never renders to the host, so a throwaway div is fine —\n    // it's required by the core's signature for symmetry with full mode.\n    const host = document.createElement(\"div\");\n\n    this.core = new CoreAIAutocomplete(host, {\n      ...opts,\n      renderMode: \"headless\",\n      source: opts.source ?? \"headless-sdk\",\n      // Headless mode never renders the dropdown DOM, but the keyboard\n      // controller still reads `optionsPosition` to decide which vertical\n      // arrow opens the dropdown from the input.\n      optionsPosition: opts.optionsPosition ?? \"below\",\n    });\n\n    this.rawState$ = new BehaviorSubject<CoreState>(this.core.getState());\n    // Push the store's *current* state, not the snapshot the listener was\n    // handed. The core notifies listeners synchronously, and some actions\n    // trigger reentrant `store.set` calls (e.g. typing a non-matching char\n    // during re-edit makes the core synchronously exit re-edit and kick off a\n    // fetch).\n    //\n    // The core's store used to deliver such a nested set inline and then\n    // resume the outer listener loop, so a listener could be handed an older\n    // state (still in re-edit) *after* a newer one (re-edit exited) — which\n    // resurrected a stale `editingParam` and retriggered the editor's re-edit\n    // caret-park, yanking the caret back to where re-editing started. The\n    // store now queues notifications and drains them in order, so that\n    // out-of-order delivery can no longer happen at the source.\n    //\n    // Reading `getState()` at emission time is kept as belt-and-braces: it\n    // costs nothing (distinctUntilChanged downstream drops the duplicate\n    // emissions) and keeps this bridge correct for any future consumer that\n    // emits mid-cascade. React needs neither, since it batches renders and\n    // gates its caret effects on dependencies.\n    this.unsubscribeCore = this.core.subscribe(() => {\n      if (!this.isDestroyed) this.rawState$.next(this.core.getState());\n    });\n\n    // === Per-field observables ===\n    // Array-valued fields use shallow equality. The vanilla store spreads on\n    // every write (`store.set({ completedParams: [...] })`), so reference\n    // equality would re-fire downstream subscribers on every state tick even\n    // when the array's contents are unchanged. The other fields are\n    // primitives or stable object references, so default identity equality\n    // works fine.\n    this.text$ = deriveField(this.rawState$, (s) => s.text);\n    this.completedParams$ = deriveField(this.rawState$, (s) => s.completedParams, arrEq);\n    this.skippedParams$ = deriveField(this.rawState$, (s) => s.skippedParams, arrEq);\n    this.identifiedParams$ = deriveField(this.rawState$, (s) => s.identifiedParams, arrEq);\n    this.suggestionPills$ = deriveField(this.rawState$, (s) => s.actionableSuggestions, arrEq);\n    this.segments$ = deriveField(this.rawState$, (s) => s.segments, arrEq);\n    this.newParamId$ = deriveField(this.rawState$, (s) => s.newParamId);\n    this.suggestions$ = deriveField(this.rawState$, (s) => s.suggestions, arrEq);\n    this.products$ = deriveField(this.rawState$, (s) => s.products, arrEq);\n    this.customFields$ = deriveField(this.rawState$, (s) => s.customFields);\n    this.activeIndex$ = deriveField(this.rawState$, (s) => s.activeDropdownIndex);\n    this.isLoading$ = deriveField(this.rawState$, computeUiLoading);\n    this.isReady$ = deriveField(this.rawState$, (s) => s.isReady);\n    this.isFocused$ = deriveField(this.rawState$, (s) => s.isFocused);\n    this.isDropdownOpen$ = deriveField(this.rawState$, (s) => s.isDropdownOpen);\n    this.isActivePillSelected$ = deriveField(this.rawState$, (s) => s.isActivePillSelected);\n    this.placeholderText$ = deriveField(this.rawState$, (s) => s.placeholderText);\n    this.error$ = deriveField(this.rawState$, (s) => s.error);\n    this.editingParam$ = deriveField(this.rawState$, (s) => s.editingParam);\n    this.editingAnchor$ = deriveField(this.rawState$, (s) => s.editingAnchor);\n    this.caretOffset$ = deriveField(this.rawState$, (s) => s.caretOffset);\n\n    // === Composite observables ===\n    // Project directly off `rawState$` with a single map() so each store\n    // tick produces exactly ONE coherent state$ emission. Using\n    // `combineLatest` over the per-field observables here would fire one\n    // emission per inner-source tick (up to N per store update), and the\n    // editor-host directive's post-promote refocus would run against an\n    // intermediate state where `newParamId` was set but `segments` /\n    // `caretOffset` still held their old values — leaving the caret stuck\n    // at the pre-click position.\n    this.state$ = this.rawState$.pipe(\n      map(computeState),\n      shareReplay({ bufferSize: 1, refCount: true }),\n    );\n\n    this.optionsPosition$.next(opts.optionsPosition ?? \"below\");\n    this.dropdown$ = combineLatest([this.rawState$, this.optionsPosition$]).pipe(\n      map(([s, optionsPosition]) => computeDropdown(s, optionsPosition)),\n      shareReplay({ bufferSize: 1, refCount: true }),\n    );\n  }\n\n  // === Read-only accessors ===\n\n  /** Stable ARIA listbox ID for the dropdown. Pass to `<textarea aria-controls=\"...\">`. */\n  get listboxId(): string {\n    return this.core.listboxId;\n  }\n\n  /** Whether `destroy()` has been called. After destruction all action methods no-op. */\n  get destroyed(): boolean {\n    return this.isDestroyed;\n  }\n\n  /**\n   * Synchronous snapshot of the controller's current public state. Mirrors\n   * the latest emission of `state$`. Useful in callbacks where you can't\n   * `subscribe` (e.g. inside an event handler).\n   */\n  getState(): AIAutocompleteControllerState {\n    return computeState(this.rawState$.value);\n  }\n\n  /**\n   * The structured query as the SDK understands it right now — the same\n   * object `onResult` delivers after each response and `onSubmit` delivers\n   * on submit. Read it on demand from a place that has no event handy (a\n   * custom submit button, a \"save draft\" action).\n   */\n  getResult(): AutocompleteResult {\n    return this.core.getResult();\n  }\n\n  // === Action methods (pass-through to the core) ===\n  //\n  // Every action method begins with an `isDestroyed` guard so that callers\n  // who hold a stale reference after `destroy()` don't accidentally trigger\n  // work on a torn-down core. The vanilla core does not gate its own methods\n  // post-dispose — `reset()`, `handleTextChange()`, and friends would still\n  // schedule fetches or fire HTTP requests against an aborted controller,\n  // and the responses would have nowhere to surface (rawState$ is already\n  // complete). The guard makes the JSDoc-promised \"no-op silently\"\n  // semantics actually true.\n\n  /** Clear all state, rotate `session_id`, and re-fetch. Call after submit. */\n  reset(): void {\n    if (this.isDestroyed) return;\n    this.core.reset();\n  }\n\n  /**\n   * Records a submit in telemetry. Enter is recorded by the SDK; call this\n   * from a submit button you render, so each submit is counted once.\n   */\n  recordSubmit(result: AutocompleteResult): void {\n    if (this.isDestroyed) return;\n    this.core.recordSubmit(result);\n  }\n\n  /** Pick a dropdown option (or replace the re-edited param if in re-edit mode). */\n  selectOption(option: SuggestionOption): void {\n    if (this.isDestroyed) return;\n    this.core.selectOption(option);\n  }\n\n  /**\n   * Announce a product selection — fires the `onProductSelect` callback the\n   * controller was constructed with. `<ai-autocomplete-dropdown>` calls this\n   * for you; consumers rendering their own strip call it themselves.\n   *\n   * Emitting is the whole behaviour: the SDK deliberately does not navigate to\n   * `product.url`, because only the integration knows whether a selection\n   * means \"open the PDP\", \"add to cart\", or \"fill the input\".\n   */\n  selectProduct(product: Product): void {\n    if (this.isDestroyed) return;\n    this.core.selectProduct(product);\n  }\n\n  /** Promote the pill at `index` to active (front of the list). */\n  setActivePill(index: number): void {\n    if (this.isDestroyed) return;\n    this.core.setActivePill(index);\n  }\n\n  /**\n   * Skip the active pill — same action as pressing → at the end of the input.\n   * The dropdown's skip button calls this; consumers rendering their own skip\n   * affordance call it directly. The skipped suggestion joins `skippedParams$`.\n   */\n  skipActivePill(): void {\n    if (this.isDestroyed) return;\n    this.core.skipActivePill();\n  }\n\n  /** Drop the last completed param's \"completed\" status. Text stays as plain text. */\n  removeLastParam(): void {\n    if (this.isDestroyed) return;\n    this.core.removeLastParam();\n  }\n\n  /** Clear the shimmer animation state for the most-recently-added param. */\n  clearNewParamId(): void {\n    if (this.isDestroyed) return;\n    this.core.clearNewParamId();\n  }\n\n  /** Controlled-mode setter for editor text. */\n  setValue(text: string): void {\n    if (this.isDestroyed) return;\n    this.core.setValue(text);\n  }\n\n  /** Controlled-mode setter for completed params. */\n  setCompletedParams(params: CompletedParamState[]): void {\n    if (this.isDestroyed) return;\n    this.core.setCompletedParams(params);\n  }\n\n  /** Forward plain-text input from the consumer's `<textarea>` to the core. */\n  handleTextChange(value: string): void {\n    if (this.isDestroyed) return;\n    this.core.handleTextChange(value);\n  }\n\n  /** Forward keyboard events from the consumer's `<textarea>` to the core. */\n  handleKeyDown(event: KeyboardEvent): void {\n    if (this.isDestroyed) return;\n    this.core.handleKeyDown(event);\n  }\n\n  /** Notify the core of focus state. */\n  setFocused(focused: boolean): void {\n    if (this.isDestroyed) return;\n    this.core.setFocused(focused);\n  }\n\n  /** Enter re-edit mode for the bold param with the given id. */\n  startEditingParam(paramId: string): void {\n    if (this.isDestroyed) return;\n    this.core.startEditingParam(paramId);\n  }\n\n  /** Exit re-edit mode without changing the bold param. */\n  exitEditMode(): void {\n    if (this.isDestroyed) return;\n    this.core.exitEditMode();\n  }\n\n  /** Forward post-input caret position (extends the edit tail). */\n  handleCaretAfterInput(offset: number | null): void {\n    if (this.isDestroyed) return;\n    this.core.handleCaretAfterInput(offset);\n  }\n\n  /** Forward selection-only caret moves (may exit re-edit). */\n  handleCaretMove(offset: number | null): void {\n    if (this.isDestroyed) return;\n    this.core.handleCaretMove(offset);\n  }\n\n  /** Replace the bold param being re-edited. Returns true when applied. */\n  replaceEditingRange(replacement: string): boolean {\n    if (this.isDestroyed) return false;\n    return this.core.replaceEditingRange(replacement);\n  }\n\n  /** Set the highlighted option index (typically driven by hover). */\n  setActiveDropdownIndex(index: number): void {\n    if (this.isDestroyed) return;\n    this.core.setActiveDropdownIndex(index);\n  }\n\n  /**\n   * The pointer left option `index`: clear the highlight if it is still on it,\n   * so Enter afterwards submits instead of picking an option the pointer is no\n   * longer on. A highlight the keyboard has since moved is left alone.\n   */\n  clearHighlight(index: number): void {\n    if (this.isDestroyed) return;\n    this.core.clearHighlight(index);\n  }\n\n  /** Page the datepicker back one month. No-op unless a date pill is active. */\n  showPreviousMonth(): void {\n    if (this.isDestroyed) return;\n    this.core.showPreviousMonth();\n  }\n\n  /** Page the datepicker forward one month. No-op unless a date pill is active. */\n  showNextMonth(): void {\n    if (this.isDestroyed) return;\n    this.core.showNextMonth();\n  }\n\n  /**\n   * Runs mapProducts synchronously on the shown items again without a request.\n   * Keeps the same cards while updating their content.\n   * Does nothing without mapProducts or with a custom products integration.\n   */\n  refreshProducts(): void {\n    if (this.isDestroyed) return;\n    this.core.refreshProducts();\n  }\n\n  // === Lifecycle ===\n\n  /**\n   * Apply runtime changes to a subset of options. Event callbacks\n   * (`onSubmit`, `onResult`, `onError`, etc.) cannot be swapped this way — they are\n   * registered once at construction (matches the React hook's design). For\n   * dynamic event reactivity, subscribe to the corresponding observable\n   * (e.g. `text$` instead of `onChange`).\n   */\n  update(opts: AIAutocompleteControllerUpdate): void {\n    if (this.isDestroyed) return;\n    this.core.update(opts);\n    if (opts.optionsPosition !== undefined) {\n      this.optionsPosition$.next(opts.optionsPosition);\n    }\n  }\n\n  /**\n   * Release all resources — unsubscribes from the core, destroys the core,\n   * and completes the internal state subject. Safe to call multiple times.\n   * After destruction, action methods no-op silently.\n   */\n  destroy(): void {\n    if (this.isDestroyed) return;\n    this.isDestroyed = true;\n    this.unsubscribeCore();\n    this.core.destroy();\n    this.rawState$.complete();\n  }\n}\n\n// ===== Pure helpers — not part of the public surface =====\n\n/**\n * Shallow array equality. The vanilla store reassigns array fields on every\n * write (`store.set({ completedParams: [...prev, x] })`), so reference\n * equality alone would re-emit downstream even when the contents are\n * identical. Used for `completedParams$`, `suggestions$`, `suggestionPills$`,\n * and `segments$`.\n */\nfunction arrEq<T>(a: readonly T[], b: readonly T[]): boolean {\n  if (a === b) return true;\n  if (a.length !== b.length) return false;\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) return false;\n  }\n  return true;\n}\n\n/** UI-visible loading — the core's `dropdownLoading` (see its docs). */\nfunction computeUiLoading(s: CoreState): boolean {\n  return s.dropdownLoading;\n}\n\nfunction computeState(s: CoreState): AIAutocompleteControllerState {\n  return {\n    text: s.text,\n    completedParams: s.completedParams,\n    skippedParams: s.skippedParams,\n    identifiedParams: s.identifiedParams,\n    suggestionPills: s.actionableSuggestions,\n    segments: s.segments,\n    newParamId: s.newParamId,\n    suggestions: s.suggestions,\n    products: s.products,\n    customFields: s.customFields,\n    activeIndex: s.activeDropdownIndex,\n    isLoading: computeUiLoading(s),\n    isReady: s.isReady,\n    isFocused: s.isFocused,\n    isDropdownOpen: s.isDropdownOpen,\n    placeholderText: s.placeholderText,\n    error: s.error,\n    editingParam: s.editingParam,\n    editingIdentified: s.editingIdentified,\n    editingAnchor: s.editingAnchor,\n    caretOffset: s.caretOffset,\n  };\n}\n\nfunction computeDropdown(\n  s: CoreState,\n  optionsPosition: \"above\" | \"below\",\n): AIAutocompleteDropdownState {\n  const editingParam = s.editingParam;\n  const editingIdentified = s.editingIdentified;\n  const dateSelection = dateSelectionFor(s);\n  const activeSuggestion = s.actionableSuggestions[0];\n  const dropdownPill: Suggestion | null = editingParam\n    ? {\n        parameter: editingParam.suggestionParameter,\n        text: editingParam.suggestionPlaceholder,\n        required: true,\n        options: editingParam.options,\n      }\n    : editingIdentified\n      ? // Answering a span the user wrote themselves: the pill names the\n        // parameter the server matched it to, so the calendar isn't unlabelled.\n        {\n          parameter: editingIdentified.parameter,\n          text: identifiedParamLabel(editingIdentified.parameter),\n          required: true,\n          options: [],\n        }\n      : null;\n  const dropdownActivePill = s.dropdownSuggestion ?? dropdownPill ?? activeSuggestion;\n  const dropdownPills = dropdownPill ? [dropdownPill] : s.actionableSuggestions;\n  return {\n    suggestions: dropdownActivePill ? [{ ...dropdownActivePill, options: s.dropdownOptions }] : [],\n    activeIndex: s.activeDropdownIndex,\n    isOpen: s.isDropdownOpen,\n    pills: dropdownPills,\n    isActivePillSelected: s.isActivePillSelected,\n    isLoading: computeUiLoading(s),\n    skeletonExiting: s.skeletonExiting,\n    isInputEmpty: s.text.trim().length === 0,\n    products: s.products,\n    isEditing: Boolean(editingParam) || Boolean(editingIdentified),\n    inSelectionAnimation: s.inSelectionAnimation,\n    // Datepicker. `s.filteredOptions` above already carries the visible\n    // month's cells rather than the suggestion's own options when this is\n    // \"date\" — the core swapped them in its derive layer, so the dropdown only\n    // has to know which body to draw.\n    formatType: s.activeFormatType,\n    dateView: s.dateView,\n    selectedDateIso: dateSelection.selectedIso,\n    selectedDateRange: dateSelection.selectedRange,\n    dateRangeStart: dateSelection.rangeStart,\n    optionsPosition,\n  };\n}\n","import {\n  Directive,\n  ElementRef,\n  Input,\n  inject,\n  NgZone,\n  type OnChanges,\n  type OnDestroy,\n  type OnInit,\n  Renderer2,\n  type SimpleChanges,\n} from \"@angular/core\";\nimport {\n  chipIdFromTap,\n  extractPlainText,\n  getCursorOffset,\n  keepCaretOnChip,\n  plainTextLength,\n  renderEditableContent,\n  setCursorOffset,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\nimport { Subject, takeUntil } from \"rxjs\";\nimport type { AIAutocompleteController } from \"../../controller/ai-autocomplete.controller\";\nimport type { AIAutocompleteControllerState } from \"../../shared/types\";\n\n/**\n * Module-level cache for the one-time plaintext-only feature detection.\n * Mirrors `supportsPlaintextOnly` in useContentEditableEditor.ts.\n */\nlet plaintextOnlyCache: boolean | undefined;\nfunction supportsPlaintextOnly(): boolean {\n  if (plaintextOnlyCache !== undefined) return plaintextOnlyCache;\n  if (typeof document === \"undefined\") return false;\n  const probe = document.createElement(\"div\");\n  probe.setAttribute(\"contenteditable\", \"plaintext-only\");\n  plaintextOnlyCache = probe.contentEditable === \"plaintext-only\";\n  return plaintextOnlyCache;\n}\n\n/**\n * Internal directive that owns every concern specific to running the\n * autocomplete on top of a contentEditable host: composition state, caret\n * tracking, selectionchange handling, `beforeinput` interception, paste\n * sanitization, plaintext-only feature detection, segment rendering,\n * post-promote refocus, and re-edit caret park.\n *\n * Mirrors `packages/react/src/hooks/useContentEditableEditor.ts` one-for-one.\n * Used only by the Tier 1 `<ai-autocomplete>` component — never exported.\n *\n * @internal\n */\n@Directive({\n  selector: \"[aiaEditorHost]\",\n  standalone: true,\n  host: {\n    role: \"combobox\",\n    \"aria-autocomplete\": \"list\",\n    \"aria-haspopup\": \"listbox\",\n    spellcheck: \"true\",\n    enterkeyhint: \"send\",\n    tabindex: \"0\",\n    \"(input)\": \"onInput()\",\n    \"(keydown)\": \"onKeyDown($event)\",\n    \"(compositionstart)\": \"onCompositionStart()\",\n    \"(compositionend)\": \"onCompositionEnd()\",\n    \"(paste)\": \"onPaste($event)\",\n    \"(click)\": \"onClick($event)\",\n    \"(focus)\": \"onFocus()\",\n    \"(blur)\": \"onBlur()\",\n  },\n})\nexport class AIAutocompleteEditorHostDirective implements OnInit, OnChanges, OnDestroy {\n  @Input(\"aiaEditorHost\") controller!: AIAutocompleteController;\n  @Input() autoFocus = true;\n  /** Whether completed chips draw the icon of the option that answered them. Default: true. */\n  @Input() showChipIcons = true;\n  /** Whether completed chips draw the picture of the option that answered them, in place of the icon. Default: true. */\n  @Input() showChipImages = true;\n\n  private readonly el = inject<ElementRef<HTMLDivElement>>(ElementRef);\n  private readonly renderer = inject(Renderer2);\n  private readonly zone = inject(NgZone);\n  private readonly destroy$ = new Subject<void>();\n\n  private composing = false;\n  private lastInputAt = 0;\n  private lastSeenParamId = \"\";\n  // The last state rendered, so a toggle of `showChipIcons` can re-render\n  // the editor without waiting for the controller's next state tick.\n  private lastState: AIAutocompleteControllerState | null = null;\n  private lastEditingId = \"\";\n  /**\n   * Id of whichever chip the dropdown is currently open on — a completed param\n   * being re-edited, or a span the server identified as a date. Either kind\n   * counts, otherwise every caret tick inside an open date span would re-enter\n   * the pick it is already in.\n   */\n  private editingParamId: string | null = null;\n\n  private documentSelectionListener?: () => void;\n  private beforeInputListener?: (event: Event) => void;\n\n  ngOnInit(): void {\n    if (!this.controller) {\n      throw new Error(\"[aiaEditorHost] requires a controller\");\n    }\n\n    const el = this.el.nativeElement;\n    const ceMode = supportsPlaintextOnly() ? \"plaintext-only\" : \"true\";\n    this.renderer.setAttribute(el, \"contenteditable\", ceMode);\n    this.renderer.setAttribute(el, \"aria-controls\", this.controller.listboxId);\n    this.renderer.setAttribute(el, \"suppress-content-editable-warning\", \"true\");\n\n    // Auto-focus on mount. If the editor already has focus (e.g. from a\n    // click that fired before our lifecycle ran), notify the controller\n    // instead of stealing focus.\n    if (this.autoFocus) {\n      queueMicrotask(() => {\n        if (typeof document === \"undefined\") return;\n        if (document.activeElement === el) {\n          this.controller.setFocused(true);\n        } else {\n          el.focus();\n        }\n      });\n    }\n\n    this.bindDocumentSelectionListener();\n    this.bindBeforeInputListener();\n    this.bindStateSubscription();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    const toggled = (changes[\"showChipIcons\"] ?? changes[\"showChipImages\"]) !== undefined;\n    const first = changes[\"showChipIcons\"]?.firstChange ?? changes[\"showChipImages\"]?.firstChange;\n    if (toggled && !first && this.lastState) {\n      this.renderEditor(this.lastState);\n    }\n  }\n\n  private renderEditor(state: AIAutocompleteControllerState): void {\n    renderEditableContent({\n      input: this.el.nativeElement,\n      segments: state.segments,\n      newParamId: state.newParamId,\n      editingParamId: state.editingParam?.id ?? null,\n      placeholderText: state.placeholderText,\n      isFocused: state.isFocused,\n      showChipIcons: this.showChipIcons,\n      showChipImages: this.showChipImages,\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n    if (this.documentSelectionListener && typeof document !== \"undefined\") {\n      document.removeEventListener(\"selectionchange\", this.documentSelectionListener);\n    }\n    if (this.beforeInputListener) {\n      this.el.nativeElement.removeEventListener(\"beforeinput\", this.beforeInputListener);\n    }\n  }\n\n  // === Host event handlers ===\n\n  /**\n   * A tap on a chip opens *that* chip. Touch browsers place the caret where\n   * they see fit (iOS snaps it to a word boundary, and the focusing tap often\n   * parks it at the end of the text — inside the last chip when the input ends\n   * with one), so the selectionchange path can miss the tapped chip or open\n   * the wrong one. The click target is the element actually hit and overrides\n   * it; `keepCaretOnChip` then pulls a stray caret onto the tapped chip so the\n   * next selectionchange doesn't close or redirect what the tap opened.\n   */\n  onClick(event: MouseEvent): void {\n    const el = this.el.nativeElement;\n    const id = chipIdFromTap(el, event.target);\n    if (!id) return;\n    this.controller.startEditingParam(id);\n    keepCaretOnChip(el, id);\n  }\n\n  onCompositionStart(): void {\n    this.composing = true;\n  }\n\n  onCompositionEnd(): void {\n    this.composing = false;\n    this.fireInput();\n  }\n\n  onInput(): void {\n    this.lastInputAt = performance.now();\n    this.fireInput();\n    this.controller.handleCaretAfterInput(getCursorOffset(this.el.nativeElement));\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    this.controller.handleKeyDown(event);\n  }\n\n  onPaste(event: ClipboardEvent): void {\n    event.preventDefault();\n    const el = this.el.nativeElement;\n    const text = (event.clipboardData?.getData(\"text/plain\") ?? \"\").replace(/\\r?\\n/g, \" \");\n    if (!text) return;\n    const doc = el.ownerDocument ?? document;\n    const sel = doc.getSelection();\n    if (!sel || sel.rangeCount === 0) return;\n    const range = sel.getRangeAt(0);\n    if (!el.contains(range.startContainer)) return;\n    range.deleteContents();\n    const node = doc.createTextNode(text);\n    range.insertNode(node);\n    range.setStartAfter(node);\n    range.collapse(true);\n    sel.removeAllRanges();\n    sel.addRange(range);\n    this.fireInput();\n  }\n\n  onFocus(): void {\n    this.controller.setFocused(true);\n  }\n\n  onBlur(): void {\n    this.controller.setFocused(false);\n  }\n\n  // === Internal helpers ===\n\n  private fireInput(): void {\n    if (this.composing) return;\n    const el = this.el.nativeElement;\n    const raw = extractPlainText(el);\n    const shouldCapitalize = raw.length > 0 && raw[0] !== raw[0].toUpperCase();\n    const next = shouldCapitalize ? raw[0].toUpperCase() + raw.slice(1) : raw;\n    this.controller.handleTextChange(next);\n  }\n\n  private bindDocumentSelectionListener(): void {\n    if (typeof document === \"undefined\") return;\n    const el = this.el.nativeElement;\n    // selectionchange fires on every keystroke and caret move — run outside\n    // Angular's zone (§16.1) and re-enter only when we actually need to\n    // notify the controller of a meaningful change.\n    this.zone.runOutsideAngular(() => {\n      const handler = (): void => {\n        const sel = document.getSelection();\n        if (!sel || sel.rangeCount === 0) return;\n        if (!sel.anchorNode || !el.contains(sel.anchorNode)) return;\n        const anchor = sel.anchorNode;\n        const startEl =\n          anchor.nodeType === Node.ELEMENT_NODE ? (anchor as Element) : anchor.parentElement;\n        // Only a COLLAPSED selection means \"the caret landed in a chip\". A\n        // range selection (Cmd+A, shift-arrow, drag) anchors at its start,\n        // which lands inside the first `<strong>` whenever the input begins\n        // with a chip — starting re-edit there parks the caret on that chip\n        // and destroys the user's selection.\n        const strong = sel.isCollapsed\n          ? // Both chip kinds report here. The core decides what a tap means — a\n            // completed param re-opens its options, an identified date opens the\n            // calendar, anything else is inert.\n            startEl?.closest<HTMLElement>(\"strong[data-param-id]\")\n          : null;\n        // `DOMStringMap` is an index signature; bracket notation is required\n        // by `noPropertyAccessFromIndexSignature`.\n        const enclosing = strong?.dataset[\"paramId\"] ?? null;\n        if (enclosing && enclosing !== this.editingParamId) {\n          this.zone.run(() => this.controller.startEditingParam(enclosing));\n          return;\n        }\n        if (performance.now() - this.lastInputAt < 50) return;\n        this.zone.run(() => this.controller.handleCaretMove(getCursorOffset(el)));\n      };\n      this.documentSelectionListener = handler;\n      document.addEventListener(\"selectionchange\", handler);\n    });\n  }\n\n  private bindBeforeInputListener(): void {\n    const el = this.el.nativeElement;\n    // Native beforeinput — React's synthetic onBeforeInput is wired to the\n    // legacy textInput event and doesn't fire reliably for delete* types.\n    const handler = (event: Event): void => {\n      const inputEvent = event as InputEvent;\n      const t = inputEvent.inputType;\n      if (t === \"insertParagraph\" || t === \"insertLineBreak\" || t === \"insertFromDrop\") {\n        event.preventDefault();\n        return;\n      }\n      if (t.startsWith(\"insert\") || t.startsWith(\"delete\")) {\n        const replacement = t.startsWith(\"delete\") ? \"\" : (inputEvent.data ?? \"\");\n        if (this.controller.replaceEditingRange(replacement)) {\n          event.preventDefault();\n        }\n      }\n    };\n    this.beforeInputListener = handler;\n    el.addEventListener(\"beforeinput\", handler);\n  }\n\n  private bindStateSubscription(): void {\n    const el = this.el.nativeElement;\n    this.controller.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {\n      this.editingParamId = state.editingParam?.id ?? state.editingIdentified?.id ?? null;\n\n      this.lastState = state;\n      this.renderEditor(state);\n\n      // Post-promote refocus + caret-after-bold placement (mirrors React's\n      // useLayoutEffect on newParamId).\n      const currentParamId = state.newParamId ?? \"\";\n      if (currentParamId && currentParamId !== this.lastSeenParamId) {\n        this.lastSeenParamId = currentParamId;\n        el.focus();\n        const desired = state.caretOffset ?? plainTextLength(el);\n        setCursorOffset(el, desired);\n      } else if (!currentParamId) {\n        this.lastSeenParamId = \"\";\n      }\n\n      // Re-edit caret park (mirrors React's useLayoutEffect on editingParam).\n      const editingId = state.editingParam?.id ?? \"\";\n      if (editingId && editingId !== this.lastEditingId && state.editingAnchor != null) {\n        this.lastEditingId = editingId;\n        setCursorOffset(el, state.editingAnchor);\n      } else if (!editingId) {\n        this.lastEditingId = \"\";\n      }\n    });\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport { uiStringsFor } from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Internal default submit button (up-arrow). Angular analogue of React's\n * `SubmitButton`. The default/custom/hidden branching stays in the parent\n * (`AIAutocompleteComponent`); this is only the built-in button.\n *\n * @internal\n */\n@Component({\n  selector: \"aia-submit-button\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./submit-button.component.html\",\n  styleUrls: [\"./submit-button.component.css\"],\n})\nexport class SubmitButtonComponent {\n  @Input() disabled = false;\n  /** The accessible name. Default: the English word. */\n  @Input() label = uiStringsFor().submit;\n  @Output() readonly submit = new EventEmitter<MouseEvent>();\n\n  onClick(event: MouseEvent): void {\n    this.submit.emit(event);\n  }\n}\n","<button\n  type=\"button\"\n  data-aia-submit=\"\"\n  class=\"magicx-aia-submit-button\"\n  [disabled]=\"disabled\"\n  [attr.aria-label]=\"label\"\n  (click)=\"onClick($event)\"\n>\n  <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" role=\"img\" [attr.aria-label]=\"label\">\n    <path\n      d=\"M9 14V4M9 4L4 9M9 4L14 9\"\n      stroke=\"currentColor\"\n      stroke-width=\"2\"\n      stroke-linecap=\"round\"\n      stroke-linejoin=\"round\"\n    />\n  </svg>\n</button>\n","import { CommonModule, isPlatformBrowser } from \"@angular/common\";\nimport {\n  type AfterViewInit,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  type ElementRef,\n  EventEmitter,\n  forwardRef,\n  Input,\n  inject,\n  NgZone,\n  type OnChanges,\n  type OnDestroy,\n  type OnInit,\n  Output,\n  PLATFORM_ID,\n  type SimpleChanges,\n  type TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n} from \"@angular/core\";\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport {\n  type APIConfig,\n  type AppearanceMode,\n  type AutocompleteResult,\n  buildSubmitResult,\n  type CompletedParamState,\n  type CoreOptions,\n  extractPlainText,\n  ModeController,\n  type OptionOverrides,\n  type Product,\n  type ProductImageFallback,\n  type ProductsConfig,\n  type ProductsLayout,\n  setCursorOffset,\n  uiStringsFor,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\nimport { AIAutocompleteDropdownComponent } from \"../ai-autocomplete-dropdown/ai-autocomplete-dropdown.component\";\nimport { AIAutocompleteController } from \"../controller/ai-autocomplete.controller\";\nimport { AIAutocompleteEditorHostDirective } from \"../internal/editor-host/editor-host.directive\";\nimport { PillListComponent } from \"../internal/pill-list/pill-list.component\";\nimport { SubmitButtonComponent } from \"../internal/submit-button/submit-button.component\";\n\n/**\n * Tier 1 component — `<ai-autocomplete>`. The Angular equivalent of React's\n * `<AIAutocomplete />`. Owns the contentEditable editor, inline pills, mode\n * controller, submit button slot, and an embedded\n * {@link AIAutocompleteController} that drives the dropdown.\n *\n * @public\n */\n@Component({\n  selector: \"ai-autocomplete\",\n  standalone: true,\n  imports: [\n    CommonModule,\n    AIAutocompleteDropdownComponent,\n    AIAutocompleteEditorHostDirective,\n    PillListComponent,\n    SubmitButtonComponent,\n  ],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  templateUrl: \"./ai-autocomplete.component.html\",\n  styleUrls: [\"./ai-autocomplete.component.css\"],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      // eslint-disable-next-line @typescript-eslint/no-use-before-define\n      useExisting: forwardRef(() => AIAutocompleteComponent),\n      multi: true,\n    },\n  ],\n})\nexport class AIAutocompleteComponent\n  implements OnInit, AfterViewInit, OnChanges, OnDestroy, ControlValueAccessor\n{\n  // === Inputs (mirrors React's AIAutocompleteProps) ===\n\n  @Input() apiConfig?: APIConfig;\n  /**\n   * Optional user context. Include whatever you know about the user — a\n   * profile, preferences, workspace, anything — to personalize suggested\n   * parameters and options to them. Bind a stable reference; the same swap\n   * rule that applies to `apiConfig` applies here.\n   */\n  @Input() additionalContext?: Record<string, unknown>;\n  /**\n   * BCP 47 language tag (e.g. `\"es\"`), sent with every suggestion request.\n   * Default: the browser language (`navigator.language`), else `\"en-US\"`.\n   */\n  @Input() language?: string;\n  /**\n   * Your product id. When set, what the dropdown offers before anything is\n   * typed is read from a cacheable URL for your product, with no credential,\n   * instead of a suggestion request; it falls back to a suggestion request\n   * when it cannot be read.\n   */\n  @Input() productId?: string;\n  /**\n   * Stable id for this visitor, kept by the host across page loads. Rides on\n   * telemetry events so searches can be joined to what the visitor does\n   * afterwards. Must be a UUID v4; omit to send none. A function is called\n   * only once the server has funnel telemetry on.\n   */\n  @Input() visitorId?: string | (() => string | undefined);\n  @Input() optionOverrides?: OptionOverrides;\n  @Input() maskCompletedText = false;\n  @Input() columns?: number;\n  /** Where unfilled pills render. Default: \"dropdown\". */\n  @Input() pillPlacement: \"inline\" | \"dropdown\" | \"hidden\" = \"dropdown\";\n  /** Color mode. \"auto\" follows prefers-color-scheme. Default: \"auto\". */\n  @Input() mode: AppearanceMode = \"auto\";\n  @Input() optionsPosition: \"above\" | \"below\" = \"below\";\n  @Input() animations = true;\n  @Input() dropdownTrigger?: \"auto\" | \"manual\" | \"hidden\";\n  @Input() closeDropdownOnBlur?: boolean;\n  @Input() showNonTappableOptions?: boolean;\n  /**\n   * When true (default), the dropdown's pill bar ends in a small \"skip\" button\n   * that dismisses the active pill — same action as pressing → at the end of\n   * the input. Set to false to hide it. When pills render elsewhere\n   * (`pillPlacement: \"inline\"` / `\"hidden\"`) the bar renders as a skip-only\n   * row holding just the button. Hidden while the input is empty — it appears\n   * alongside the footer's \"→ to skip\" hint once the user has typed.\n   */\n  @Input() showSkipButton = true;\n  /** When true (default), an option that carries an `icon_svg` draws its icon before its text in the dropdown. Set to false to render option rows as text only. */\n  @Input() showOptionIcons = true;\n  /** When true (default), an option that carries an `image_url` draws it as a square thumbnail before its text in the dropdown (in place of its `icon_svg`). Set to false to render option rows without pictures. */\n  @Input() showOptionImages = true;\n  /** When true (default), an option that carries an `item_count` shows it as a muted label at the row's trailing edge (\"12 items\"). Set to false to hide the counts. */\n  @Input() showOptionCounts = true;\n  /**\n   * How the product strip lays its cards out. `\"row\"` (the default) is a\n   * horizontally scrolling shelf of cards. `\"list\"` stacks the same cards as\n   * full-width rows — thumbnail on the left, title, vendor and price on the\n   * right — for results that read as a list (courses, listings, documents)\n   * rather than products on a shelf; the column scrolls vertically inside\n   * `--aia-product-list-max-height`.\n   */\n  @Input() productsLayout: ProductsLayout = \"row\";\n  /** Missing/failed image fallback. Style initials with `[data-aia-product-initial]`. */\n  @Input() productImageFallback: ProductImageFallback = \"image\";\n  /** When true (default), a completed chip in the input draws the icon of the option that answered it. Set to false to render chips as text only. */\n  @Input() showChipIcons = true;\n  /** When true (default), a completed chip in the input draws the picture (`image_url`) of the option that answered it, in place of its icon. Set to false to render chips without pictures. */\n  @Input() showChipImages = true;\n  /** Focus the editor on mount. Default: true. */\n  @Input() autoFocus = true;\n  /** Controlled-mode text value. */\n  @Input() value?: string;\n  /** Controlled-mode completed params. */\n  @Input() completedParams?: CompletedParamState[];\n  /**\n   * When true (default), the dropdown renders a horizontal row of product\n   * cards below the options grid whenever it has products to show: by default\n   * the items the `/suggest` response reports as matching the query, or the\n   * results of a custom `products` search. Set to false to render no strip\n   * and run no custom search.\n   */\n  @Input() showProducts = true;\n  /**\n   * Custom source for the product strip. Omit it and the strip shows the\n   * items the `/suggest` response itself reports as matching the query, with\n   * no extra request. Set it and the dropdown is fed by your own search\n   * endpoint on the SDK's existing fetch cadence instead; the server's items\n   * are then not rendered.\n   *\n   * Bind a stable reference (a component field, not an inline object literal):\n   * a new object on each change-detection pass reads as a swapped integration\n   * and clears the current cards — the same rule that already applies to\n   * `apiConfig` and `optionOverrides`.\n   */\n  @Input() products?: ProductsConfig;\n  @Input() mapProducts?: CoreOptions[\"mapProducts\"];\n  /**\n   * Custom submit button. Pass a `<ng-template>` to replace the default arrow\n   * button. Pass `null` to render no button. Default (`undefined`) renders\n   * the built-in arrow.\n   */\n  @Input() submitButton?: TemplateRef<unknown> | null;\n  /**\n   * When true (default), the editor is cleared and a new session starts after\n   * `submitted` emits — on Enter and on the submit button. Set to false to\n   * leave the query in place: when the handler navigates away, a cleared field\n   * flashes empty until the next page paints. Call `reset()` yourself when you\n   * want a fresh session.\n   */\n  @Input() resetOnSubmit = true;\n\n  // === Outputs ===\n\n  /** Called on Enter or submit-button click. */\n  @Output() readonly submitted = new EventEmitter<AutocompleteResult>();\n  /**\n   * Fires after every successful suggestion round-trip with the structured\n   * query as the SDK now understands it — the same `AutocompleteResult` shape\n   * `submitted` carries, so you can mirror the query as it is built (a live\n   * preview, a draft, analytics) without waiting for submit. Fires once per\n   * applied response, including the initial request on init (an empty\n   * result); never for a failed, aborted or superseded request.\n   */\n  @Output() readonly resultChange = new EventEmitter<AutocompleteResult>();\n  @Output() readonly errored = new EventEmitter<Error>();\n  @Output() readonly valueChange = new EventEmitter<string>();\n  @Output() readonly completedParamsChange = new EventEmitter<CompletedParamState[]>();\n  @Output() readonly focused = new EventEmitter<void>();\n  @Output() readonly blurred = new EventEmitter<void>();\n  /**\n   * Emitted when the user activates a product card. The SDK does not\n   * navigate — you decide what a selection means. Modifier / middle clicks are\n   * left to the browser (cmd-click still opens a tab) and don't emit.\n   */\n  @Output() readonly productSelect = new EventEmitter<Product>();\n\n  // === View refs ===\n\n  @ViewChild(\"container\", { static: true }) containerRef!: ElementRef<HTMLDivElement>;\n  @ViewChild(\"editor\", { static: false }) editorRef?: ElementRef<HTMLDivElement>;\n  @ViewChild(\"pillContainer\") pillContainerRef?: ElementRef<HTMLSpanElement>;\n\n  // === Public state for the template ===\n\n  controller!: AIAutocompleteController;\n  /**\n   * Concrete light/dark value bound to `[attr.data-mode]`. Seeded in ngOnInit\n   * so the attribute is present during SSR (where ModeController, gated behind\n   * isPlatformBrowser in ngAfterViewInit, never runs). On the browser the\n   * ModeController's resolve callback keeps this in sync — so its runtime\n   * prefers-color-scheme updates and this binding always agree (no clobber).\n   */\n  resolvedMode: \"light\" | \"dark\" = \"dark\";\n\n  // === Internal ===\n\n  private modeController?: ModeController;\n  private resizeObserver?: ResizeObserver;\n  private onChangeFn: (value: string) => void = noop;\n  private onTouchedFn: () => void = noop;\n  // Holds a value written by Reactive Forms before ngOnInit ran. Reactive\n  // Forms can call writeValue() during dynamic form construction (e.g. when\n  // a FormControl already holds a value at the moment the directive is\n  // created). We stash the value here and flush it in ngOnInit *after*\n  // the controller exists — otherwise the editor renders empty even though\n  // the form had a value. `undefined` means \"no pending write\".\n  private pendingWriteValue: string | undefined;\n\n  // §16.9: prefer `inject()` over constructor-parameter DI for components.\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly zone = inject(NgZone);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  ngOnInit(): void {\n    // Seed before the browser guard so SSR renders a concrete data-mode.\n    this.resolvedMode = resolveInitialMode(this.mode);\n    if (!isPlatformBrowser(this.platformId)) return;\n\n    this.controller = new AIAutocompleteController({\n      apiConfig: this.apiConfig,\n      additionalContext: this.additionalContext,\n      language: this.language,\n      productId: this.productId,\n      visitorId: this.visitorId,\n      optionOverrides: this.optionOverrides,\n      maskCompletedText: this.maskCompletedText,\n      columns: this.columns,\n      dropdownTrigger: this.dropdownTrigger,\n      optionsPosition: this.optionsPosition,\n      closeDropdownOnBlur: this.closeDropdownOnBlur,\n      showNonTappableOptions: this.showNonTappableOptions,\n      showProducts: this.showProducts,\n      source: \"full-sdk\",\n      products: this.products,\n      mapProducts: this.mapProducts,\n      value: this.value,\n      completedParams: this.completedParams,\n      onSubmit: (result) => this.handleSubmit(result),\n      onResult: (result) => this.resultChange.emit(result),\n      onError: (error) => this.errored.emit(error),\n      onChange: (text) => {\n        this.valueChange.emit(text);\n        this.onChangeFn(text);\n      },\n      onParamsChange: (params) => this.completedParamsChange.emit(params),\n      onFocus: () => this.focused.emit(),\n      onProductSelect: (product) => this.productSelect.emit(product),\n      onBlur: () => {\n        this.blurred.emit();\n        this.onTouchedFn();\n      },\n      setCursor: (offset) => {\n        const editor = this.editorRef?.nativeElement;\n        if (!editor) return;\n        editor.focus();\n        setCursorOffset(editor, offset);\n      },\n    });\n\n    if (this.pendingWriteValue !== undefined) {\n      this.controller.setValue(this.pendingWriteValue);\n      this.pendingWriteValue = undefined;\n    }\n  }\n\n  ngAfterViewInit(): void {\n    if (!isPlatformBrowser(this.platformId)) return;\n    // ModeController writes `data-mode` to the element it's given. The CSS\n    // selectors are scoped to `.magicx-aia[data-mode=\"...\"]` — which lives on\n    // the inner `<div class=\"magicx-aia magicx-aia-container\" #container>`,\n    // NOT the host `<ai-autocomplete>` element. The resolve callback mirrors\n    // the value into `resolvedMode` so the `[attr.data-mode]` binding stays in\n    // lockstep with ModeController — the binding handles SSR, ModeController\n    // handles runtime prefers-color-scheme switches, and because they always\n    // agree neither clobbers the other.\n    this.modeController = new ModeController(\n      this.containerRef.nativeElement,\n      this.mode,\n      (resolved) => {\n        this.resolvedMode = resolved;\n        this.cdr.markForCheck();\n      },\n    );\n\n    // Pill-wrap detection — when the pill list wraps below the editor's last\n    // line, drop its 8px left margin via a data attribute the CSS keys off.\n    // Mirrors the React component's useLayoutEffect.\n    if (typeof ResizeObserver !== \"undefined\") {\n      this.zone.runOutsideAngular(() => {\n        this.resizeObserver = new ResizeObserver(() => this.measurePillWrap());\n        const editor = this.editorRef?.nativeElement;\n        if (editor) this.resizeObserver.observe(editor);\n      });\n      this.measurePillWrap();\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (!this.controller) return;\n    // `SimpleChanges` is `{ [key: string]: SimpleChange }`, so per\n    // `noPropertyAccessFromIndexSignature` each key lookup uses bracket\n    // notation — this keeps the strictness contract that the rest of the\n    // workspace enforces.\n    // Controlled-mode propagation\n    if (changes[\"value\"] && this.value !== undefined) {\n      this.controller.setValue(this.value);\n    }\n    if (changes[\"completedParams\"] && this.completedParams !== undefined) {\n      this.controller.setCompletedParams(this.completedParams);\n    }\n    // Reactive options\n    if (\n      changes[\"apiConfig\"] ||\n      changes[\"additionalContext\"] ||\n      changes[\"language\"] ||\n      changes[\"productId\"] ||\n      changes[\"visitorId\"] ||\n      changes[\"optionOverrides\"] ||\n      changes[\"dropdownTrigger\"] ||\n      changes[\"optionsPosition\"] ||\n      changes[\"closeDropdownOnBlur\"] ||\n      changes[\"showNonTappableOptions\"] ||\n      changes[\"showProducts\"] ||\n      changes[\"products\"] ||\n      changes[\"mapProducts\"]\n    ) {\n      this.controller.update({\n        apiConfig: this.apiConfig,\n        additionalContext: this.additionalContext,\n        language: this.language,\n        productId: this.productId,\n        visitorId: this.visitorId,\n        optionOverrides: this.optionOverrides,\n        dropdownTrigger: this.dropdownTrigger,\n        optionsPosition: this.optionsPosition,\n        closeDropdownOnBlur: this.closeDropdownOnBlur,\n        showNonTappableOptions: this.showNonTappableOptions,\n        showProducts: this.showProducts,\n        // Same reference on an unrelated change is a no-op in the core; only a\n        // genuinely swapped (or removed) integration clears the strip.\n        products: this.products,\n        mapProducts: this.mapProducts,\n      });\n    }\n    if (changes[\"mode\"]) {\n      // Keep the binding correct even when ModeController doesn't exist yet\n      // (SSR / pre-ngAfterViewInit). On the browser, setMode triggers the\n      // resolve callback which sets the same value.\n      this.resolvedMode = resolveInitialMode(this.mode);\n      this.modeController?.setMode(this.mode);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n    this.modeController?.destroy();\n    this.controller?.destroy();\n  }\n\n  // === Imperative API (exposed on the component instance via @ViewChild) ===\n\n  /** Programmatically focus the editor. */\n  focus(): void {\n    this.editorRef?.nativeElement.focus();\n  }\n\n  /** Programmatically blur the editor. */\n  blur(): void {\n    this.editorRef?.nativeElement.blur();\n  }\n\n  /**\n   * Runs mapProducts synchronously on the shown items again without a request.\n   * Keeps the same cards while updating their content.\n   * Does nothing without mapProducts or with a custom products integration.\n   */\n  refreshProducts(): void {\n    this.controller?.refreshProducts();\n  }\n\n  /** Clear all state, rotate session, and re-fetch. */\n  reset(): void {\n    this.controller?.reset();\n  }\n\n  /**\n   * Skip the active pill — same action as the dropdown's skip button / →.\n   * Lets a consumer who hides the built-in button (`showSkipButton=false`)\n   * drive skipping from their own UI.\n   */\n  skipActivePill(): void {\n    this.controller?.skipActivePill();\n  }\n\n  /** Switch color mode at runtime. */\n  setMode(mode: AppearanceMode): void {\n    this.mode = mode;\n    this.resolvedMode = resolveInitialMode(mode);\n    this.modeController?.setMode(mode);\n    this.cdr.markForCheck();\n  }\n\n  // === Template helpers ===\n\n  /**\n   * 'default' → render the built-in arrow button.\n   * 'custom'  → project the consumer-supplied TemplateRef.\n   * 'hidden'  → no button.\n   */\n  get submitButtonState(): \"default\" | \"custom\" | \"hidden\" {\n    if (this.submitButton === null) return \"hidden\";\n    if (this.submitButton === undefined) return \"default\";\n    return \"custom\";\n  }\n\n  /** Narrowed accessor for *ngTemplateOutlet — never undefined. */\n  /** The default submit button's name, in the widget language. */\n  get submitLabel(): string {\n    return uiStringsFor(this.language).submit;\n  }\n\n  get customSubmitTemplate(): TemplateRef<unknown> | null {\n    return this.submitButton ?? null;\n  }\n\n  get showInlinePills(): boolean {\n    return this.pillPlacement === \"inline\";\n  }\n\n  get showDropdownPills(): boolean {\n    return this.pillPlacement === \"dropdown\";\n  }\n\n  /**\n   * `true` when there's something to submit — driven by current segments\n   * and completed params. Read off the live editor via the controller state.\n   */\n  canSubmit(state: { segments: { length: number }; completedParams: { length: number } }): boolean {\n    return state.segments.length > 0 || state.completedParams.length > 0;\n  }\n\n  onWrapperClick(event: MouseEvent): void {\n    // Clicking a pill should activate it without stealing focus elsewhere.\n    const target = event.target as HTMLElement | null;\n    if (target?.closest(\"[data-aia-pill]\")) return;\n    this.focus();\n  }\n\n  onSubmitButtonClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.handleSubmitFromUserAction();\n  }\n\n  onSubmitSlotClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.handleSubmitFromUserAction();\n  }\n\n  onSelectPill(index: number): void {\n    this.controller.setActivePill(index);\n  }\n\n  // === ControlValueAccessor ===\n\n  writeValue(value: string | null): void {\n    const next = value ?? \"\";\n    if (!this.controller) {\n      // Reactive Forms can call writeValue() before ngOnInit creates the\n      // controller (dynamic form construction, or a FormControl that already\n      // had a value at directive-creation time). Buffer the value; ngOnInit\n      // flushes it as soon as the controller exists.\n      this.pendingWriteValue = next;\n      return;\n    }\n    this.controller.setValue(next);\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChangeFn = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouchedFn = fn;\n  }\n\n  setDisabledState(_disabled: boolean): void {\n    // The contentEditable host doesn't have a native disabled attribute. For\n    // v0.1 we accept the call so Angular's forms layer doesn't throw, but\n    // the editor stays interactive. A future enhancement can toggle\n    // contentEditable + ARIA disabled here.\n  }\n\n  // === Submit flow ===\n\n  /**\n   * Called by the controller's onSubmit callback (which fires from the\n   * keyboard controller on Enter). Reads the live editor text — same trick\n   * the React component uses — so the emitted query reflects whatever's in\n   * the DOM right now, not a possibly-stale state snapshot.\n   */\n  // `fromButton`: the SDK records an Enter submit itself before it calls back\n  // here; a click on our own button never passes through it.\n  private handleSubmit(_result: AutocompleteResult, fromButton = false): void {\n    const editor = this.editorRef?.nativeElement;\n    if (!editor) return;\n    const text = extractPlainText(editor);\n    const state = this.controller.getState();\n    const params = this.completedParams ?? state.completedParams;\n    const result = buildSubmitResult(text, params, state.skippedParams, {\n      identifiedParams: state.identifiedParams,\n      isReady: state.isReady,\n      customFields: state.customFields,\n    });\n    if (fromButton) this.controller.recordSubmit(result);\n    this.submitted.emit(result);\n    if (this.resetOnSubmit) this.controller.reset();\n  }\n\n  private handleSubmitFromUserAction(): void {\n    const state = this.controller.getState();\n    if (!this.canSubmit(state)) return;\n    // Synthesize the result for the submit-button click path; same shape\n    // the controller would deliver from a keyboard Enter, so handleSubmit\n    // can take either entry point.\n    this.handleSubmit(\n      {\n        query: state.text.trim(),\n        raw_query: \"\",\n        completed_params: [],\n        identified_params: [],\n        is_ready: state.isReady,\n      },\n      true,\n    );\n  }\n\n  private measurePillWrap(): void {\n    const container = this.pillContainerRef?.nativeElement;\n    const editor = this.editorRef?.nativeElement;\n    if (!container || !editor) return;\n    const inner = container.firstElementChild as HTMLElement | null;\n    if (!inner) return;\n    // Wrap detection: the pill row's top vs the editor's bottom. When the\n    // pills sit on (or above) the editor's last line they're NOT wrapped —\n    // keep the 8px margin so they don't butt against typed text or the\n    // placeholder. This handles the empty-editor + placeholder case\n    // naturally: the placeholder still occupies the editor's line box.\n    const cRect = inner.getBoundingClientRect();\n    const eRect = editor.getBoundingClientRect();\n    const wrapped = cRect.top >= eRect.bottom - 2;\n    this.zone.run(() => {\n      if (wrapped) container.setAttribute(\"data-aia-pill-wrapped\", \"\");\n      else container.removeAttribute(\"data-aia-pill-wrapped\");\n    });\n  }\n}\n\nfunction noop(): void {\n  // Default no-op for CVA callbacks.\n}\n\n/**\n * Resolve a concrete light/dark value from the configured mode. Used to seed\n * the `data-mode` attribute synchronously (including during SSR, where\n * ModeController never runs). On the server `window` is undefined → defaults\n * to \"dark\" (matches the vanilla/React behavior).\n */\nfunction resolveInitialMode(mode: AppearanceMode): \"light\" | \"dark\" {\n  if (mode !== \"auto\") return mode;\n  if (typeof window === \"undefined\") return \"dark\";\n  return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n","<div\n  #container\n  class=\"magicx-aia magicx-aia-container\"\n  [attr.data-pill-placement]=\"pillPlacement\"\n  [attr.data-options-position]=\"optionsPosition\"\n  [attr.data-animations]=\"animations ? 'on' : 'off'\"\n  [attr.data-mode]=\"resolvedMode\"\n>\n  <ai-autocomplete-dropdown\n    *ngIf=\"controller\"\n    [controller]=\"controller\"\n    [showPills]=\"showDropdownPills\"\n    [showSkipButton]=\"showSkipButton\"\n    [showOptionIcons]=\"showOptionIcons\"\n    [showOptionImages]=\"showOptionImages\"\n    [showOptionCounts]=\"showOptionCounts\"\n    [productsLayout]=\"productsLayout\"\n    [productImageFallback]=\"productImageFallback\"\n    [language]=\"language\"\n  ></ai-autocomplete-dropdown>\n\n  <div\n    class=\"magicx-aia-input-wrapper\"\n    data-aia-input-wrapper=\"\"\n    (click)=\"onWrapperClick($event)\"\n    (keyup)=\"$event.stopPropagation()\"\n  >\n    <div class=\"magicx-aia-editor-area\" data-aia-editor=\"\">\n      <div\n        #editor\n        *ngIf=\"controller\"\n        [aiaEditorHost]=\"controller\"\n        [autoFocus]=\"autoFocus\"\n        [showChipIcons]=\"showChipIcons\"\n        [showChipImages]=\"showChipImages\"\n        class=\"magicx-aia-input\"\n        data-aia-input=\"\"\n      ></div>\n\n      <ng-container *ngIf=\"controller && showInlinePills\">\n        <span\n          #pillContainer\n          class=\"magicx-aia-pill-list-container\"\n          data-aia-pill-list-container=\"\"\n          *ngIf=\"\n            (controller.isLoading$ | async) ||\n              ((controller.suggestionPills$ | async)?.length ?? 0) > 0\n          \"\n        >\n          <aia-pill-list\n            [pills]=\"(controller.suggestionPills$ | async) ?? []\"\n            [activePillIndex]=\"0\"\n            [activeSelected]=\"(controller.isActivePillSelected$ | async) ?? false\"\n            [loading]=\"(controller.isLoading$ | async) ?? false\"\n            (selectPill)=\"onSelectPill($event)\"\n          ></aia-pill-list>\n        </span>\n      </ng-container>\n    </div>\n\n    <ng-container [ngSwitch]=\"submitButtonState\">\n      <aia-submit-button\n        *ngSwitchCase=\"'default'\"\n        [disabled]=\"\n          !(\n            controller &&\n            canSubmit({\n              segments: (controller.segments$ | async) ?? [],\n              completedParams: (controller.completedParams$ | async) ?? []\n            })\n          )\n        \"\n        [label]=\"submitLabel\"\n        (submit)=\"onSubmitButtonClick($event)\"\n      ></aia-submit-button>\n\n      <span\n        *ngSwitchCase=\"'custom'\"\n        data-aia-submit=\"\"\n        data-aia-submit-slot=\"\"\n        class=\"magicx-aia-submit-slot\"\n        (click)=\"onSubmitSlotClick($event)\"\n      >\n        <ng-container *ngTemplateOutlet=\"customSubmitTemplate\"></ng-container>\n      </span>\n    </ng-container>\n  </div>\n</div>\n","import {\n  Directive,\n  ElementRef,\n  forwardRef,\n  Input,\n  inject,\n  type OnDestroy,\n  type OnInit,\n  Renderer2,\n} from \"@angular/core\";\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { Subject, takeUntil } from \"rxjs\";\nimport type { AIAutocompleteController } from \"../controller/ai-autocomplete.controller\";\n\n/**\n * Tier 2 input binder. Attach to a `<textarea>` or `<input>` and pass an\n * {@link AIAutocompleteController}:\n *\n * ```html\n * <textarea [aiaInput]=\"ac\"></textarea>\n * ```\n *\n * The directive wires the input's events (input/keydown/focus/blur) to the\n * controller, mirrors controller state into ARIA attributes\n * (`role=\"combobox\"`, `aria-expanded`, `aria-activedescendant`,\n * `aria-autocomplete`, `aria-controls`), and implements\n * {@link ControlValueAccessor} so the host element participates in Reactive\n * Forms out of the box:\n *\n * ```html\n * <textarea [aiaInput]=\"ac\" [formControl]=\"myControl\"></textarea>\n * ```\n *\n * Per the React hook's behavior, the first typed character is auto-capitalized\n * — typing \"h\" becomes \"H\" before being forwarded to the controller. The\n * cursor position is preserved across that rewrite.\n *\n * @public\n */\n@Directive({\n  selector: \"[aiaInput]\",\n  standalone: true,\n  host: {\n    role: \"combobox\",\n    \"aria-autocomplete\": \"list\",\n    \"(input)\": \"onInput($event)\",\n    \"(keydown)\": \"onKeyDown($event)\",\n    \"(keyup)\": \"onCaretMove()\",\n    \"(mouseup)\": \"onCaretMove()\",\n    \"(focus)\": \"onFocus()\",\n    \"(blur)\": \"onBlur()\",\n  },\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      // eslint-disable-next-line @typescript-eslint/no-use-before-define\n      useExisting: forwardRef(() => AIAutocompleteInputDirective),\n      multi: true,\n    },\n  ],\n})\nexport class AIAutocompleteInputDirective implements OnInit, OnDestroy, ControlValueAccessor {\n  /**\n   * The {@link AIAutocompleteController} that owns the autocomplete state.\n   * Required. The directive throws on init if this is missing.\n   */\n  @Input(\"aiaInput\") controller!: AIAutocompleteController;\n\n  private readonly el = inject<ElementRef<HTMLInputElement | HTMLTextAreaElement>>(ElementRef);\n  private readonly renderer = inject(Renderer2);\n  private readonly destroy$ = new Subject<void>();\n\n  private onChangeFn: (value: string) => void = noop;\n  private onTouchedFn: () => void = noop;\n  // Timestamp of the last `input` event. A `keyup`/`select` that fires within\n  // this window is the tail of a keystroke, not a deliberate caret move, so we\n  // skip the caret-move handler there (mirrors the editor host's selectionchange\n  // guard). performance.now() is monotonic; 0 means \"no input yet\".\n  private lastInputAt = 0;\n  // Tracks the most-recently-promoted param so we only reposition the caret\n  // once per option selection (mirrors the editor host's post-promote refocus).\n  private lastSeenParamId = \"\";\n  // Holds a value written by Reactive Forms before ngOnInit ran. Reactive\n  // Forms can call writeValue() during dynamic form construction (e.g. when\n  // a control is patched at the moment the directive is created), and our\n  // controller binding may not be initialized yet. We stash the value here\n  // and flush it into the controller in ngOnInit *before* subscribing to\n  // text$, otherwise text$'s initial \"\" emission would clobber the form\n  // value the textarea already shows. `undefined` means \"no pending write\".\n  private pendingWriteValue: string | undefined;\n\n  ngOnInit(): void {\n    if (!this.controller) {\n      throw new Error('[aiaInput] requires a controller — use `[aiaInput]=\"myController\"`.');\n    }\n\n    if (this.pendingWriteValue !== undefined) {\n      this.controller.setValue(this.pendingWriteValue);\n      this.pendingWriteValue = undefined;\n    }\n\n    const el = this.el.nativeElement;\n    this.renderer.setAttribute(el, \"aria-controls\", this.controller.listboxId);\n\n    // Sync editor text → DOM. Skips the write when values already match, so\n    // user keystrokes don't fight with our writeback. Preserves the caret\n    // position when we do write (and the element still has focus).\n    this.controller.text$.pipe(takeUntil(this.destroy$)).subscribe((text) => {\n      if (el.value === text) return;\n      const wasFocused = typeof document !== \"undefined\" && document.activeElement === el;\n      const start = el.selectionStart;\n      const end = el.selectionEnd;\n      this.renderer.setProperty(el, \"value\", text);\n      if (wasFocused && start != null && end != null) {\n        const clampedStart = Math.min(start, text.length);\n        const clampedEnd = Math.min(end, text.length);\n        try {\n          el.setSelectionRange(clampedStart, clampedEnd);\n        } catch {\n          // `setSelectionRange` throws on some input types (e.g. \"number\");\n          // safe to ignore — those inputs don't have a meaningful selection.\n        }\n      }\n    });\n\n    this.controller.isDropdownOpen$.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {\n      this.renderer.setAttribute(el, \"aria-expanded\", String(isOpen));\n    });\n\n    this.controller.activeIndex$.pipe(takeUntil(this.destroy$)).subscribe((idx) => {\n      if (idx >= 0) {\n        this.renderer.setAttribute(\n          el,\n          \"aria-activedescendant\",\n          `${this.controller.listboxId}-option-${idx}`,\n        );\n      } else {\n        this.renderer.removeAttribute(el, \"aria-activedescendant\");\n      }\n    });\n\n    // After an option selection promotes a param, the core appends its text and\n    // stamps `caretOffset` at the end of the inserted text. The text$ subscriber\n    // above writes the new value but *restores the pre-write caret* (correct for\n    // typing echoes, wrong here), so we move the caret to the promoted position.\n    // Keyed on newParamId so it fires once per selection, not on every tick.\n    // Registered after text$ so the new value is in the DOM before we seek.\n    this.controller.newParamId$.pipe(takeUntil(this.destroy$)).subscribe((id) => {\n      const current = id ?? \"\";\n      if (current && current !== this.lastSeenParamId) {\n        this.lastSeenParamId = current;\n        const offset = this.controller.getState().caretOffset ?? el.value.length;\n        const clamped = Math.min(Math.max(offset, 0), el.value.length);\n        // Only grab focus if we don't already have it — don't yank focus back\n        // from wherever the user moved it after selecting (e.g. a host-app\n        // button). setSelectionRange still positions the caret regardless.\n        if (typeof document !== \"undefined\" && document.activeElement !== el) {\n          el.focus();\n        }\n        try {\n          el.setSelectionRange(clamped, clamped);\n        } catch {\n          // Some input types (e.g. \"number\") don't support setSelectionRange.\n        }\n      } else if (!current) {\n        this.lastSeenParamId = \"\";\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  // === Event handlers (wired via host metadata above) ===\n\n  /**\n   * Auto-capitalizes the first character on the user's first keystroke so the\n   * server receives \"Create\" instead of \"create\". Matches React's\n   * `handleChange` in `useAIAutocomplete`. Skipped during IME composition so\n   * we don't disrupt multi-keystroke input methods (Pinyin, Hangul, etc.).\n   */\n  onInput(event: Event): void {\n    // Stamp the input time before anything else. The autocapitalize path below\n    // calls setSelectionRange, which can synchronously fire a `select` event →\n    // onCaretMove; stamping first ensures that event falls inside the guard\n    // window and is treated as part of this keystroke, not a caret move.\n    this.lastInputAt = performance.now();\n    const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n    const raw = target.value;\n    const isComposing = (event as InputEvent).isComposing === true;\n    const shouldCapitalize = raw.length > 0 && !isComposing && raw[0] !== raw[0].toUpperCase();\n\n    let next = raw;\n    if (shouldCapitalize) {\n      const start = target.selectionStart;\n      const end = target.selectionEnd;\n      next = raw[0].toUpperCase() + raw.slice(1);\n      this.renderer.setProperty(target, \"value\", next);\n      if (start != null && end != null) {\n        try {\n          target.setSelectionRange(start, end);\n        } catch {\n          // See note in ngOnInit's text$ subscriber.\n        }\n      }\n    }\n\n    this.controller.handleTextChange(next);\n    // Sync the real caret into the core. The dropdown's auto-trigger gate only\n    // opens when the caret is at the end of the text; without this, the core's\n    // `caretOffset` stays pinned at whatever a prior promote/select set it to\n    // and goes stale as the user keeps typing, wedging the dropdown closed.\n    // selectionStart is null on some input types (number/email/color); treat\n    // that as \"caret at end\" rather than feeding null into the core.\n    this.controller.handleCaretAfterInput(target.selectionStart ?? target.value.length);\n    this.onChangeFn(next);\n  }\n\n  onKeyDown(event: KeyboardEvent): void {\n    this.controller.handleKeyDown(event);\n  }\n\n  /**\n   * Caret moved by something other than typing — arrow keys, Home/End, or a\n   * mouse click/drag (keyup + mouseup). Forward the new offset so the core can\n   * re-evaluate the caret-at-end dropdown gate (and exit re-edit if the caret\n   * left the region). We deliberately do NOT listen for the `select` event:\n   * programmatic `setSelectionRange` calls (the text$ writeback, the post-select\n   * caret reposition) fire it in jsdom/some browsers, which would re-enter here\n   * and clobber `caretOffset`. `keyup`/`mouseup` only fire for real user input.\n   * Skipped right after an `input` event, where the caret is already handled by\n   * `handleCaretAfterInput` above.\n   */\n  onCaretMove(): void {\n    if (performance.now() - this.lastInputAt < 50) return;\n    const el = this.el.nativeElement;\n    // selectionStart is null on some input types — treat as caret at end.\n    this.controller.handleCaretMove(el.selectionStart ?? el.value.length);\n  }\n\n  onFocus(): void {\n    this.controller.setFocused(true);\n  }\n\n  onBlur(): void {\n    this.controller.setFocused(false);\n    this.onTouchedFn();\n  }\n\n  // === ControlValueAccessor ===\n\n  writeValue(value: string | null): void {\n    const next = value ?? \"\";\n    this.renderer.setProperty(this.el.nativeElement, \"value\", next);\n    // If Angular calls writeValue() before ngOnInit (possible during dynamic\n    // form construction), queue the value and let ngOnInit flush it. We\n    // can't push it into the controller now because either the controller\n    // binding hasn't resolved yet, or text$'s initial subscription would\n    // overwrite it moments later.\n    if (this.controller) {\n      this.controller.setValue(next);\n    } else {\n      this.pendingWriteValue = next;\n    }\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChangeFn = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouchedFn = fn;\n  }\n\n  setDisabledState(disabled: boolean): void {\n    this.renderer.setProperty(this.el.nativeElement, \"disabled\", disabled);\n  }\n}\n\nfunction noop(): void {\n  // Default no-op callback for CVA — overwritten by Angular's form bridge.\n}\n","import { NgModule } from \"@angular/core\";\nimport { AIAutocompleteComponent } from \"./ai-autocomplete/ai-autocomplete.component\";\nimport { AIAutocompleteDropdownComponent } from \"./ai-autocomplete-dropdown/ai-autocomplete-dropdown.component\";\nimport { AIAutocompleteInputDirective } from \"./input/ai-autocomplete-input.directive\";\n\n/**\n * Convenience NgModule that re-exports every public component and directive\n * in this package. Standalone-first consumers can import the individual\n * symbols directly; legacy NgModule-based codebases import this once and\n * get everything.\n *\n * @public\n */\n@NgModule({\n  imports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective],\n  exports: [AIAutocompleteComponent, AIAutocompleteDropdownComponent, AIAutocompleteInputDirective],\n})\nexport class AIAutocompleteModule {}\n","/**\n * Public API surface for @magicx-eng/ai-autocomplete-angular.\n *\n * Populated incrementally as features land. Only symbols re-exported here\n * are considered part of the package's public contract.\n */\n\n// === Re-exported wire types ===\nexport type {\n  AccessTokenConfig,\n  AccessTokenResult,\n  APIConfig,\n  APIKeyConfig,\n  AppearanceMode,\n  AutocompleteResult,\n  CompletedParam,\n  CompletedParamState,\n  CustomFieldsReport,\n  DateMonthView,\n  DateRange,\n  ExpressedFilter,\n  FilterOp,\n  FormatType,\n  IdentifiedParam,\n  IdentifiedParamState,\n  MatchedItem,\n  MatchedItems,\n  OptionOverrides,\n  Product,\n  ProductImageFallback,\n  ProductsConfig,\n  ProductsLayout,\n  Segment,\n  SkippedParamState,\n  SubmitResultExtras,\n  Suggestion,\n  SuggestionOption,\n  TaskKind,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n// === Submit-result builder (folds skipped params into completed_params) ===\nimport {\n  buildSubmitResult as _buildSubmitResult,\n  cellDay as _cellDay,\n  cellIso as _cellIso,\n  DATE_RANGE_META_END as _DATE_RANGE_META_END,\n  DATE_RANGE_META_START as _DATE_RANGE_META_START,\n  DEFAULT_OPTION_COUNT_UNIT as _DEFAULT_OPTION_COUNT_UNIT,\n  dateCellMarks as _dateCellMarks,\n  formatDate as _formatDate,\n  formatDateRange as _formatDateRange,\n  formatOptionCount as _formatOptionCount,\n  isoDate as _isoDate,\n  monthLabel as _monthLabel,\n  optionCountLabel as _optionCountLabel,\n  optionHasImage as _optionHasImage,\n  optionImageSources as _optionImageSources,\n  optionImageSrc as _optionImageSrc,\n  optionLabel as _optionLabel,\n  PRODUCT_PATH_PREFIX as _PRODUCT_PATH_PREFIX,\n  parseDate as _parseDate,\n  parseLooseDate as _parseLooseDate,\n  parseLooseDateRange as _parseLooseDateRange,\n  productFromMatchedItem as _productFromMatchedItem,\n  productImageSources as _productImageSources,\n  productsFromCustomFields as _productsFromCustomFields,\n  sanitizeOptionIconSvg as _sanitizeOptionIconSvg,\n  selectedRangeFor as _selectedRangeFor,\n  visibleDateRange as _visibleDateRange,\n  WEEKDAY_LABELS as _WEEKDAY_LABELS,\n  withSkippedParams as _withSkippedParams,\n} from \"@magicx-eng/ai-autocomplete-vanilla\";\n\n/**\n * Re-exported through local bindings rather than `export ... from`.\n *\n * ng-packagr's flat bundles drop a bare `export { x } from \"<external>\"`: the\n * name survives in the generated `.d.ts`, so consumer code typechecks, but the\n * symbol is absent from `fesm2020` — the entry point the `exports` map resolves\n * by default — and is `undefined` at runtime. Binding to a local const forces\n * it into the bundle.\n */\nexport const buildSubmitResult = _buildSubmitResult;\nexport const withSkippedParams = _withSkippedParams;\n// Date helpers, for turning a committed date back into a `Date` and for\n// rendering a custom calendar in Tier 3.\nexport const cellDay = _cellDay;\nexport const cellIso = _cellIso;\nexport const formatDate = _formatDate;\nexport const isoDate = _isoDate;\nexport const monthLabel = _monthLabel;\nexport const parseDate = _parseDate;\nexport const parseLooseDate = _parseLooseDate;\nexport const WEEKDAY_LABELS = _WEEKDAY_LABELS;\n// Range helpers, for a custom calendar that answers a span in two taps.\n// The two metadata keys are what a committed range records its ends under, so\n// a consumer reading them back never hardcodes the strings.\nexport const DATE_RANGE_META_END = _DATE_RANGE_META_END;\nexport const DATE_RANGE_META_START = _DATE_RANGE_META_START;\nexport const dateCellMarks = _dateCellMarks;\nexport const formatDateRange = _formatDateRange;\nexport const parseLooseDateRange = _parseLooseDateRange;\nexport const selectedRangeFor = _selectedRangeFor;\nexport const visibleDateRange = _visibleDateRange;\n// Option icons, for a custom dropdown that draws `icon_svg` itself.\nexport const optionLabel = _optionLabel;\nexport const sanitizeOptionIconSvg = _sanitizeOptionIconSvg;\n// Option pictures and counts, for a custom dropdown that draws `image_url`\n// and `item_count` itself.\nexport const DEFAULT_OPTION_COUNT_UNIT = _DEFAULT_OPTION_COUNT_UNIT;\nexport const formatOptionCount = _formatOptionCount;\nexport const optionCountLabel = _optionCountLabel;\nexport const optionHasImage = _optionHasImage;\nexport const optionImageSrc = _optionImageSrc;\nexport const optionImageSources = _optionImageSources;\n// Product strip helpers, for a custom strip fed from `customFields$`.\nexport const PRODUCT_PATH_PREFIX = _PRODUCT_PATH_PREFIX;\nexport const productFromMatchedItem = _productFromMatchedItem;\nexport const productImageSources = _productImageSources;\nexport const productsFromCustomFields = _productsFromCustomFields;\n// === Tier 1: Full component ===\nexport { AIAutocompleteComponent } from \"./lib/ai-autocomplete\";\n// === Convenience NgModule ===\nexport { AIAutocompleteModule } from \"./lib/ai-autocomplete.module\";\n// === Tier 2: Dropdown component ===\nexport { AIAutocompleteDropdownComponent } from \"./lib/ai-autocomplete-dropdown\";\n// === Tier 2: Controller (headless logic class) ===\nexport { AIAutocompleteController } from \"./lib/controller\";\n// === Tier 2: Input binder + ControlValueAccessor ===\nexport { AIAutocompleteInputDirective } from \"./lib/input\";\n// === Angular-specific public types ===\nexport type {\n  AIAutocompleteControllerOptions,\n  AIAutocompleteControllerState,\n  AIAutocompleteControllerUpdate,\n  AIAutocompleteDropdownState,\n} from \"./lib/shared/types\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["WEEKDAY_LABELS","cellIso","monthLabel","cellDay","isoDate","dateCellMarks","visibleDateRange","productImageSources","optionLabel","optionImageSources","formatOptionCount","sanitizeOptionIconSvg","map","CoreAIAutocomplete","noop","buildSubmitResult","_buildSubmitResult","_withSkippedParams","_cellDay","_cellIso","_formatDate","_isoDate","_monthLabel","_parseDate","_parseLooseDate","_WEEKDAY_LABELS","_DATE_RANGE_META_END","_DATE_RANGE_META_START","_dateCellMarks","_formatDateRange","_parseLooseDateRange","_selectedRangeFor","_visibleDateRange","_optionLabel","_sanitizeOptionIconSvg","_DEFAULT_OPTION_COUNT_UNIT","_formatOptionCount","_optionCountLabel","_optionHasImage","_optionImageSrc","_optionImageSources","_PRODUCT_PATH_PREFIX","_productFromMatchedItem","_productImageSources","_productsFromCustomFields"],"mappings":"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"}