ngwr 7.1.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -3
  3. package/alert/styles/_index.scss +2 -0
  4. package/back-top/styles/_index.scss +4 -2
  5. package/carousel/styles/_index.scss +2 -0
  6. package/cascader/styles/_index.scss +16 -0
  7. package/color-picker/styles/_index.scss +7 -0
  8. package/command-palette/styles/_index.scss +28 -0
  9. package/density/styles/_index.scss +10 -0
  10. package/descriptions/styles/_index.scss +59 -0
  11. package/dialog/styles/_index.scss +2 -0
  12. package/drawer/styles/_index.scss +2 -0
  13. package/dropdown/styles/_index.scss +1 -0
  14. package/fesm2022/ngwr-carousel.mjs +45 -4
  15. package/fesm2022/ngwr-carousel.mjs.map +1 -1
  16. package/fesm2022/ngwr-cascader.mjs +2 -2
  17. package/fesm2022/ngwr-cascader.mjs.map +1 -1
  18. package/fesm2022/ngwr-command-palette.mjs +17 -3
  19. package/fesm2022/ngwr-command-palette.mjs.map +1 -1
  20. package/fesm2022/ngwr-context-menu.mjs +77 -5
  21. package/fesm2022/ngwr-context-menu.mjs.map +1 -1
  22. package/fesm2022/ngwr-density.mjs +3 -3
  23. package/fesm2022/ngwr-density.mjs.map +1 -1
  24. package/fesm2022/ngwr-descriptions.mjs +11 -2
  25. package/fesm2022/ngwr-descriptions.mjs.map +1 -1
  26. package/fesm2022/ngwr-dialog.mjs +11 -4
  27. package/fesm2022/ngwr-dialog.mjs.map +1 -1
  28. package/fesm2022/ngwr-drag-drop.mjs +13 -3
  29. package/fesm2022/ngwr-drag-drop.mjs.map +1 -1
  30. package/fesm2022/ngwr-drawer.mjs +66 -5
  31. package/fesm2022/ngwr-drawer.mjs.map +1 -1
  32. package/fesm2022/ngwr-dropdown.mjs +35 -11
  33. package/fesm2022/ngwr-dropdown.mjs.map +1 -1
  34. package/fesm2022/ngwr-lightbox.mjs +45 -2
  35. package/fesm2022/ngwr-lightbox.mjs.map +1 -1
  36. package/fesm2022/ngwr-overlay.mjs +70 -1
  37. package/fesm2022/ngwr-overlay.mjs.map +1 -1
  38. package/fesm2022/ngwr-page-header.mjs +11 -3
  39. package/fesm2022/ngwr-page-header.mjs.map +1 -1
  40. package/fesm2022/ngwr-pagination.mjs +11 -3
  41. package/fesm2022/ngwr-pagination.mjs.map +1 -1
  42. package/fesm2022/ngwr-popover.mjs +36 -10
  43. package/fesm2022/ngwr-popover.mjs.map +1 -1
  44. package/fesm2022/ngwr-rotating-text.mjs +15 -4
  45. package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
  46. package/fesm2022/ngwr-select.mjs +35 -14
  47. package/fesm2022/ngwr-select.mjs.map +1 -1
  48. package/fesm2022/ngwr-stepper.mjs +11 -2
  49. package/fesm2022/ngwr-stepper.mjs.map +1 -1
  50. package/fesm2022/ngwr-table.mjs +10 -4
  51. package/fesm2022/ngwr-table.mjs.map +1 -1
  52. package/fesm2022/ngwr-tabs.mjs +38 -6
  53. package/fesm2022/ngwr-tabs.mjs.map +1 -1
  54. package/fesm2022/ngwr-toast.mjs +54 -2
  55. package/fesm2022/ngwr-toast.mjs.map +1 -1
  56. package/fesm2022/ngwr-toolbar.mjs +11 -4
  57. package/fesm2022/ngwr-toolbar.mjs.map +1 -1
  58. package/fesm2022/ngwr-version.mjs +1 -1
  59. package/fesm2022/ngwr-version.mjs.map +1 -1
  60. package/lightbox/styles/_index.scss +4 -0
  61. package/llms-full.txt +673 -0
  62. package/llms.txt +106 -0
  63. package/overlay/styles/_index.scss +31 -0
  64. package/package.json +6 -5
  65. package/page-header/styles/_index.scss +16 -0
  66. package/pagination/styles/_index.scss +34 -0
  67. package/popover/styles/_index.scss +1 -0
  68. package/select/styles/_index.scss +27 -0
  69. package/slider/styles/_index.scss +3 -0
  70. package/splitter/styles/_index.scss +3 -0
  71. package/stepper/styles/_index.scss +30 -0
  72. package/styles.scss +1 -0
  73. package/table/styles/_index.scss +61 -0
  74. package/tabs/styles/_index.scss +24 -0
  75. package/theme/styles/_mixins.scss +47 -0
  76. package/toast/styles/_index.scss +32 -1
  77. package/toolbar/styles/_index.scss +29 -0
  78. package/tree/styles/_index.scss +15 -0
  79. package/types/ngwr-carousel.d.ts +8 -1
  80. package/types/ngwr-command-palette.d.ts +13 -1
  81. package/types/ngwr-context-menu.d.ts +25 -3
  82. package/types/ngwr-density.d.ts +2 -2
  83. package/types/ngwr-descriptions.d.ts +8 -1
  84. package/types/ngwr-dialog.d.ts +7 -0
  85. package/types/ngwr-drag-drop.d.ts +13 -1
  86. package/types/ngwr-drawer.d.ts +11 -3
  87. package/types/ngwr-dropdown.d.ts +10 -1
  88. package/types/ngwr-lightbox.d.ts +5 -0
  89. package/types/ngwr-overlay.d.ts +69 -1
  90. package/types/ngwr-page-header.d.ts +8 -1
  91. package/types/ngwr-pagination.d.ts +7 -1
  92. package/types/ngwr-popover.d.ts +10 -1
  93. package/types/ngwr-rotating-text.d.ts +1 -0
  94. package/types/ngwr-select.d.ts +10 -1
  95. package/types/ngwr-stepper.d.ts +8 -1
  96. package/types/ngwr-table.d.ts +7 -1
  97. package/types/ngwr-tabs.d.ts +6 -0
  98. package/types/ngwr-toolbar.d.ts +7 -1
  99. package/types/ngwr-version.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-select.mjs","sources":["../../../projects/lib/select/tokens/select.token.ts","../../../projects/lib/select/option.ts","../../../projects/lib/select/select.ts","../../../projects/lib/select/select.html","../../../projects/lib/select/option-group.ts","../../../projects/lib/select/option-group.html","../../../projects/lib/select/ngwr-select.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken, type Signal } from '@angular/core';\n\n/** Per-option registration metadata. @internal */\nexport interface WrSelectOptionRegistration {\n readonly id: string;\n readonly value: unknown;\n readonly disabled: boolean;\n /**\n * Lazy label reader. Options render text via `<ng-content>`, so we\n * read it at call time once Angular has settled the projected content.\n */\n readonly getLabel: () => string;\n}\n\n/**\n * Contract a `<wr-option>` uses to talk to its parent `<wr-select>`.\n *\n * @internal\n */\nexport interface WrSelectContext {\n /**\n * Currently selected value. Single mode: `T | null`. Multi mode:\n * `readonly T[]`. Options consult {@link isSelected} instead of\n * reading this directly so the same option code works in both modes.\n */\n readonly value: Signal<unknown>;\n /** Whether the select is in multi-selection mode. */\n readonly multi: Signal<boolean>;\n /** Whether the select is disabled. */\n readonly isDisabled: Signal<boolean>;\n /** Id of the option currently highlighted by keyboard navigation. */\n readonly activeOptionId: Signal<string | null>;\n /**\n * Active search query (search mode only). Empty string when there is\n * no filter applied — options treat that as \"show me\".\n */\n readonly searchQuery: Signal<string>;\n /** True only when `mode=\"search\"`. Options gate filtering on this. */\n readonly isSearch: Signal<boolean>;\n /** Is the given option value currently selected? Handles both single and multi. */\n isSelected(value: unknown): boolean;\n /**\n * Called when a child option is clicked. The label is read lazily\n * via {@link WrSelectOptionRegistration.getLabel}, so callers don't\n * need to thread it through.\n */\n selectOption(value: unknown): void;\n /** Register an option; returns an unregister function. */\n registerOption(reg: WrSelectOptionRegistration): () => void;\n}\n\n/**\n * Token a `<wr-option>` injects to register itself with and notify its\n * parent `<wr-select>`.\n *\n * @internal\n */\nexport const WR_SELECT = new InjectionToken<WrSelectContext>('WR_SELECT');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, DestroyRef, ElementRef, ViewEncapsulation, computed, effect, inject, input } from '@angular/core';\n\nimport { WR_SELECT } from './tokens';\n\nlet uid = 0;\n\n/**\n * Single option inside a `<wr-select>`.\n *\n * The option's display label is taken from its projected text content;\n * the form value is its `value` input.\n *\n * @example\n * ```html\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option [value]=\"42\">Forty-two</wr-option>\n * ```\n */\n@Component({\n selector: 'wr-option',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'option',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() ? true : null',\n '(click)': 'onClick()',\n },\n})\nexport class WrOption {\n /** The value contributed when this option is chosen. Required. */\n readonly value = input.required<unknown>();\n\n /** Disable this option. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Stable id used for `aria-activedescendant`. */\n readonly id = `wr-option-${++uid}`;\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly parent = inject(WR_SELECT, { optional: true });\n\n /**\n * @internal — true when this option is currently selected. Works for\n * both single and multi-select parents via `WrSelectContext.isSelected`.\n */\n protected readonly selected = computed(() => {\n const parent = this.parent;\n if (!parent) return false;\n // Re-read parent's value signal so the computed recomputes on change.\n parent.value();\n return parent.isSelected(this.value());\n });\n\n /** @internal — true when this option is the keyboard cursor target. */\n protected readonly active = computed(() => this.parent?.activeOptionId() === this.id);\n\n /**\n * @internal — search mode only. True when the parent has a query that\n * the option's text content does not match (case-insensitive substring).\n * Hidden options stay in the DOM so registration order survives but\n * collapse via CSS.\n */\n protected readonly hidden = computed(() => {\n const parent = this.parent;\n if (!parent?.isSearch()) return false;\n const q = parent.searchQuery().trim().toLowerCase();\n if (!q) return false;\n const label = (this.host.nativeElement.textContent ?? '').trim().toLowerCase();\n return !label.includes(q);\n });\n\n protected readonly classes = computed(() => {\n const parts = ['wr-option'];\n if (this.selected()) parts.push('wr-option--selected');\n if (this.active()) parts.push('wr-option--active');\n if (this.disabled()) parts.push('wr-option--disabled');\n if (this.hidden()) parts.push('wr-option--hidden');\n return parts.join(' ');\n });\n\n constructor() {\n if (this.parent) {\n const parent = this.parent;\n // Re-register when disabled or value changes so the parent has fresh metadata.\n effect(onCleanup => {\n const unreg = parent.registerOption({\n id: this.id,\n value: this.value(),\n disabled: this.disabled(),\n getLabel: () => this.host.nativeElement.textContent?.trim() ?? '',\n });\n onCleanup(() => unreg());\n });\n inject(DestroyRef);\n }\n }\n\n protected onClick(): void {\n if (this.disabled() || !this.parent) return;\n this.parent.selectOption(this.value());\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { type Observable, debounceTime, finalize, from, isObservable, of, switchMap } from 'rxjs';\n\nimport { useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { WR_OVERLAY } from 'ngwr/overlay';\nimport { noop } from 'ngwr/utils';\n\nimport type { WrSelectMode, WrSelectSearchLoader, WrSelectTagValidator } from './interfaces';\nimport { WrOption } from './option';\nimport { WR_SELECT, type WrSelectContext, type WrSelectOptionRegistration } from './tokens';\n\nlet listboxUid = 0;\n\ninterface SelectedChip {\n readonly value: unknown;\n readonly label: string;\n}\n\n/**\n * Combobox primitive. Renders a button that opens a CDK overlay\n * containing the projected `<wr-option>` (and optionally\n * `<wr-option-group>`) children. Every shape is the same component\n * with a different `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger; clicking an option\n * toggles instead of closing, Backspace removes the last chip.\n * - `'search'` — type-ahead with sync `[options]` filter or async\n * `[loader]`. Replaces the standalone `<wr-autocomplete>`.\n * - `'tag'` — free-text + chips with `[separators]` / `[validate]` /\n * `[allowDuplicates]`. Replaces `<wr-chips-input>`.\n *\n * Implements `ControlValueAccessor` — usable with `[(ngModel)]`,\n * `formControl`, or `formControlName`.\n *\n * @example\n * ```html\n * <!-- Single -->\n * <wr-select placeholder=\"Pick a size\" [(ngModel)]=\"size\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * <wr-option value=\"lg\">Large</wr-option>\n * </wr-select>\n *\n * <!-- Multi -->\n * <wr-select mode=\"multi\" placeholder=\"Pick tags\" [(ngModel)]=\"tags\">\n * <wr-option value=\"ts\">TypeScript</wr-option>\n * <wr-option value=\"ng\">Angular</wr-option>\n * </wr-select>\n * ```\n *\n * The legacy `[multi]=\"true\"` boolean is still accepted but is now an\n * alias for `[mode]=\"'multi'\"` — prefer the explicit mode.\n *\n * @see https://ngwr.dev/components/select\n */\n@Component({\n selector: 'wr-select',\n templateUrl: './select.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrOption],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n multi: true,\n },\n {\n provide: WR_SELECT,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n },\n ],\n})\nexport class WrSelect implements ControlValueAccessor, WrSelectContext {\n /** Placeholder shown when no option is selected. Falls back to `select.placeholder`. */\n readonly placeholder = input<string | null>(null);\n\n /** Clear-selection (×) button aria-label. Falls back to `select.clearSelection`. */\n readonly clearLabel = input<string | null>(null);\n\n protected readonly resolvedPlaceholder = useI18nText(this.placeholder, 'select.placeholder', '');\n protected readonly resolvedClear = useI18nText(this.clearLabel, 'select.clearSelection', 'Clear selection');\n\n /** Per-chip ARIA label — interpolates `{{label}}`. @internal */\n protected readonly chipRemoveLabel = useI18nFormatter('select.removeItem', 'Remove {{label}}');\n\n /** Disable the select. Also set by Angular forms via `setDisabledState`. */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Pill-shaped corners on the trigger. @default false */\n readonly rounded = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Behavior mode. `<wr-select>` is the unified combobox primitive —\n * pick the shape via `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger.\n * - `'search'` *(planned)* — type-ahead with sync filter or async loader.\n * - `'tag'` *(planned)* — free-text + chips with optional `allowCreate`.\n *\n */\n readonly mode = input<WrSelectMode | null>(null);\n\n /** Resolved mode — `'single'` unless `[mode]` says otherwise. */\n protected readonly effectiveMode = computed<WrSelectMode>(() => this.mode() ?? 'single');\n\n /** Convenience — `effectiveMode() === 'multi'`. */\n protected readonly isMulti = computed(() => this.effectiveMode() === 'multi');\n\n /** Convenience — `effectiveMode() === 'tag'`. */\n protected readonly isTag = computed(() => this.effectiveMode() === 'tag');\n\n /** Convenience — `effectiveMode() === 'search'`. Exposed via context for options. */\n readonly isSearch = computed(() => this.effectiveMode() === 'search');\n\n /** WrSelectContext — resolved multi-selection flag for child options. */\n readonly multi = computed(() => this.effectiveMode() === 'multi' || this.effectiveMode() === 'tag');\n\n /** Both multi and tag render chips on the trigger. */\n protected readonly hasChips = computed(() => {\n const m = this.effectiveMode();\n return m === 'multi' || m === 'tag';\n });\n\n /**\n * Search-mode query. Empty string = no filter. Exposed via context so\n * each `<wr-option>` can self-hide non-matching rows.\n */\n readonly searchQuery = signal('');\n\n // Search-mode-only inputs (ignored in other modes)\n\n /**\n * Search mode: dynamic option array. Each item is rendered as a\n * `<wr-option>` whose label comes from `[displayWith]`. Works\n * alongside projected `<wr-option>` children — both lists are\n * filtered by the search query.\n */\n readonly options = input<readonly unknown[]>([]);\n\n /** Search mode: map a dynamic option item to its display label. @default String */\n readonly displayWith = input<(item: unknown) => string>((item: unknown) => String(item));\n\n /**\n * Search mode: async loader. When set, the loader is called on every\n * (debounced) keystroke and its result replaces `[options]`. Supports\n * Observables, Promises, and plain arrays.\n */\n readonly loader = input<WrSelectSearchLoader<unknown> | null>(null);\n\n /** Search mode: debounce (ms) applied to the loader. @default 250 */\n readonly debounceMs = input(250, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /** Search mode: minimum query length before the panel opens / loader fires. @default 0 */\n readonly minChars = input(0, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /**\n * Search mode: allow values not in the options list. Enter on an\n * unmatched query commits the raw text as the form value. @default false\n */\n readonly freeText = input(false, { transform: coerceBooleanProperty });\n\n /** Search mode: text shown when the filter / loader returns nothing. Falls back to `select.noResults`. */\n readonly noResultsText = input<string | null>(null);\n\n /** Search mode: text shown while the async loader is in flight. Falls back to `select.loading`. */\n readonly loadingText = input<string | null>(null);\n\n protected readonly resolvedNoResults = useI18nText(this.noResultsText, 'select.noResults', 'No results');\n protected readonly resolvedLoading = useI18nText(this.loadingText, 'select.loading', 'Loading…');\n\n /** Search mode: results returned by the async loader. @internal */\n protected readonly loadedOptions = signal<readonly unknown[]>([]);\n\n /** Search mode: true while the loader is in flight. @internal */\n protected readonly loading = signal(false);\n\n // Tag-mode-only inputs (ignored in other modes)\n\n /**\n * Tag mode: keys / characters that commit the current draft into a chip.\n * `'Enter'` is the key name; everything else is a literal character watched\n * in keypresses and pastes. @default ['Enter', ',']\n */\n readonly separators = input<readonly string[]>(['Enter', ',']);\n\n /** Tag mode: allow the same value to appear more than once. @default false */\n readonly allowDuplicates = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Tag mode: custom validator — return `true` to accept the value, `false`\n * to silently reject. Receives the trimmed draft + the existing chips.\n */\n readonly validate = input<WrSelectTagValidator | null>(null);\n\n /** Tag-mode draft (text currently typed in the inline input). @internal */\n protected readonly draft = signal('');\n\n /**\n * Show a clear-all (×) button at the end of the chip row when at\n * least one option is selected (multi mode only). @default true\n */\n readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Cap on selected items (multi mode). `0` = unlimited. Once reached,\n * additional clicks on unselected options are ignored. @default 0\n */\n readonly maxItems = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Maximum number of chips rendered before collapsing the rest into a\n * `+N more` indicator. `0` = render every chip. @default 0\n */\n readonly maxTagCount = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Unified value signal. Single mode holds `T | null`; multi mode\n * holds `readonly T[]`. Internal — consumers go through `[(ngModel)]`\n * or `[formControl]` via CVA.\n * @internal\n */\n readonly value = signal<unknown>(null);\n\n /** Listbox id used by the trigger's `aria-controls`. */\n protected readonly listboxId = `wr-select-listbox-${++listboxUid}`;\n\n /** Registered options (insertion order). Internal — distinct from the public `[options]` input. */\n private readonly registry = signal<readonly WrSelectOptionRegistration[]>([]);\n\n /** Keyboard cursor index into `options`. -1 = none. */\n private readonly activeIndex = signal(-1);\n\n /** Id of the active option (for `aria-activedescendant`). */\n readonly activeOptionId = computed<string | null>(() => {\n const idx = this.activeIndex();\n const list = this.registry();\n return idx >= 0 && idx < list.length ? list[idx].id : null;\n });\n\n protected readonly open = signal(false);\n protected readonly selectedLabel = signal<string | null>(null);\n\n /**\n * Selected chips (multi + tag modes). Multi reads labels from the\n * registered `<wr-option>` children; tag uses each raw string as\n * both value and label.\n */\n protected readonly selectedChips = computed<readonly SelectedChip[]>(() => {\n if (!this.hasChips()) return [];\n const arr = this.asArray(this.value());\n if (this.isTag()) {\n return arr.map<SelectedChip>(v => ({ value: v, label: String(v) }));\n }\n const list = this.registry();\n return arr.map<SelectedChip>(v => {\n const found = list.find(o => o.value === v);\n return { value: v, label: found?.getLabel() ?? String(v) };\n });\n });\n\n protected readonly visibleChips = computed<readonly SelectedChip[]>(() => {\n const cap = this.maxTagCount();\n const chips = this.selectedChips();\n return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n });\n\n protected readonly hiddenChipCount = computed(() => {\n const cap = this.maxTagCount();\n const total = this.selectedChips().length;\n return cap > 0 && total > cap ? total - cap : 0;\n });\n\n protected readonly hasSelection = computed(() => {\n if (this.hasChips()) return this.selectedChips().length > 0;\n return this.value() != null;\n });\n\n private readonly disabledFromCva = signal(false);\n\n /** Effective disabled state — input wins, CVA second. */\n readonly isDisabled = computed(() => this.disabled() || this.disabledFromCva());\n\n protected readonly classes = computed(() => {\n const parts = ['wr-select'];\n if (this.open()) parts.push('wr-select--open');\n if (this.rounded()) parts.push('wr-select--rounded');\n if (this.isMulti()) parts.push('wr-select--multi');\n if (this.isTag()) parts.push('wr-select--tag');\n if (this.isSearch()) parts.push('wr-select--search');\n if (this.isDisabled()) parts.push('wr-select--disabled');\n return parts.join(' ');\n });\n\n /**\n * Search-mode dynamic options. Loader results win when the loader is\n * set; otherwise the static `[options]` array. Each item is rendered\n * as an internal `<wr-option>` in the panel.\n */\n protected readonly dynamicOptions = computed<readonly unknown[]>(() =>\n this.loader() ? this.loadedOptions() : this.options()\n );\n\n /**\n * Count of registered options that pass the current search filter.\n * Hides the noResults state when the panel has at least one visible row.\n */\n protected readonly visibleCount = computed(() => {\n const list = this.registry();\n if (!this.isSearch()) return list.length;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return list.length;\n let count = 0;\n for (const o of list) {\n if (o.getLabel().toLowerCase().includes(q)) count++;\n }\n return count;\n });\n\n /** Search mode: show \"no results\" when the panel has nothing to offer. */\n protected readonly hasNoResults = computed(() => {\n if (!this.isSearch() || !this.open() || this.loading()) return false;\n if (this.searchQuery().trim().length < this.minChars()) return false;\n return this.visibleCount() === 0;\n });\n\n /** Search mode: is this option hidden by the current query? @internal */\n private isOptionHidden(label: string): boolean {\n if (!this.isSearch()) return false;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return false;\n return !label.toLowerCase().includes(q);\n }\n\n protected readonly panelTpl = viewChild.required('panelTpl', { read: TemplateRef });\n\n /** Tag-mode inline input. Present only when `mode=\"tag\"`. @internal */\n protected readonly tagInputEl = viewChild<ElementRef<HTMLInputElement>>('tagInput');\n\n /** Search-mode inline input. Present only when `mode=\"search\"`. @internal */\n protected readonly searchInputEl = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n protected focusTagInput(): void {\n this.tagInputEl()?.nativeElement.focus();\n }\n\n protected focusSearchInput(): void {\n this.searchInputEl()?.nativeElement.focus();\n }\n\n // Search-mode handlers\n\n protected onSearchInput(event: Event): void {\n if (this.isDisabled()) return;\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n if (!this.open()) this.open.set(true);\n }\n\n protected onSearchFocus(): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n this.seedActiveIndex();\n this.open.set(true);\n }\n }\n\n protected onSearchKey(event: KeyboardEvent): void {\n // freeText: Enter on an unmatched query commits the typed string\n // as the value. Skips when an active option is highlighted (the\n // normal Enter-selects behaviour wins).\n if (event.key === 'Enter' && this.freeText() && this.open()) {\n const q = this.searchQuery().trim();\n const idx = this.activeIndex();\n const list = this.registry();\n const hasActive =\n idx >= 0 && idx < list.length && !list[idx].disabled && !this.isOptionHidden(list[idx].getLabel());\n if (!hasActive && q) {\n event.preventDefault();\n this.value.set(q);\n this.onChange(q);\n this.onTouched();\n this.open.set(false);\n return;\n }\n }\n // Otherwise route through the same keyboard plumbing as the button trigger.\n this.onTriggerKey(event);\n }\n\n /**\n * Display text for the search input. Shows the selected option's\n * label when collapsed, or the live query while typing / panel open.\n * @internal\n */\n protected readonly searchDisplay = computed(() => {\n if (this.open()) return this.searchQuery();\n return this.selectedLabel() ?? '';\n });\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private overlayRef: OverlayRef | null = null;\n\n private onChange: (value: unknown) => void = noop;\n protected onTouched: () => void = noop;\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.openOverlay();\n } else {\n this.closeOverlay();\n // Reset the search query when the panel closes so a re-open\n // doesn't carry a stale filter.\n if (this.isSearch()) this.searchQuery.set('');\n }\n });\n\n // Async loader pipeline (search mode only). `switchMap` cancels\n // in-flight requests when a new keystroke arrives.\n toObservable(this.searchQuery)\n .pipe(\n debounceTime(this.debounceMs()),\n switchMap(query => {\n const loader = this.loader();\n if (!loader || !this.isSearch() || query.length < this.minChars()) {\n this.loading.set(false);\n return of<readonly unknown[]>([]);\n }\n this.loading.set(true);\n const result = loader(query);\n const source: Observable<readonly unknown[]> = isObservable(result) ? result : from(Promise.resolve(result));\n return source.pipe(finalize(() => this.loading.set(false)));\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(items => this.loadedOptions.set(items));\n\n // Resolve the single-mode trigger label whenever the value or\n // options change. Multi mode reads `selectedChips` instead and\n // doesn't need this.\n effect(() => {\n const v = this.value();\n const list = this.registry();\n if (this.isMulti()) {\n this.selectedLabel.set(null);\n return;\n }\n const match = list.find(o => o.value === v);\n this.selectedLabel.set(match ? match.getLabel() : null);\n });\n }\n\n // WrSelectContext\n\n isSelected(value: unknown): boolean {\n if (this.isMulti()) return this.asArray(this.value()).includes(value);\n return this.value() === value;\n }\n\n selectOption(value: unknown): void {\n if (this.isMulti()) {\n const current = this.asArray(this.value());\n const idx = current.indexOf(value);\n let next: readonly unknown[];\n if (idx >= 0) {\n next = [...current.slice(0, idx), ...current.slice(idx + 1)];\n } else {\n const cap = this.maxItems();\n if (cap > 0 && current.length >= cap) return;\n next = [...current, value];\n }\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n // Keep the panel open in multi mode so the user can keep picking.\n return;\n }\n this.value.set(value);\n this.onChange(value);\n this.onTouched();\n this.open.set(false);\n }\n\n registerOption(reg: WrSelectOptionRegistration): () => void {\n this.registry.update(list => [...list, reg]);\n return () => this.registry.update(list => list.filter(o => o.id !== reg.id));\n }\n\n // Chip handlers (multi + tag)\n\n /** Remove one selection (chip × button). Works for multi and tag modes. */\n protected removeChip(value: unknown, event: Event): void {\n event.stopPropagation();\n if (this.isDisabled() || !this.hasChips()) return;\n const next = this.asArray(this.value()).filter(v => v !== value);\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n /** Clear every selection (× button). Multi/tag → empty array; search → null. */\n protected clearAll(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n if (this.hasChips()) {\n this.value.set([]);\n this.onChange([]);\n } else if (this.isSearch()) {\n this.value.set(null);\n this.onChange(null);\n this.searchQuery.set('');\n } else {\n return;\n }\n this.onTouched();\n }\n\n // Tag-mode draft handlers\n\n /** Capacity check used by tag mode to refuse the next add. */\n protected readonly atCapacity = computed(() => {\n const cap = this.maxItems();\n return cap > 0 && this.asArray(this.value()).length >= cap;\n });\n\n protected onTagInput(event: Event): void {\n if (this.isDisabled()) return;\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onTagKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const seps = this.separators();\n\n if (seps.includes(event.key)) {\n event.preventDefault();\n this.commitDraft();\n return;\n }\n\n if (event.key === 'Backspace' && this.draft() === '') {\n const chips = this.selectedChips();\n if (chips.length > 0) {\n event.preventDefault();\n this.removeChip(chips[chips.length - 1].value, event);\n }\n }\n }\n\n protected onTagPaste(event: ClipboardEvent): void {\n if (this.isDisabled()) return;\n const text = event.clipboardData?.getData('text') ?? '';\n if (!text) return;\n\n const seps = this.separators().filter(s => s !== 'Enter');\n if (seps.length === 0) return;\n\n event.preventDefault();\n const escaped = seps.map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('');\n const splitRegex = new RegExp(`[${escaped}\\\\n]+`);\n for (const part of text.split(splitRegex)) this.tryAddTag(part);\n }\n\n protected onTagBlur(): void {\n if (this.draft().trim()) this.commitDraft();\n this.onTouched();\n }\n\n private commitDraft(): void {\n const v = this.draft().trim();\n this.draft.set('');\n if (v) this.tryAddTag(v);\n }\n\n private tryAddTag(raw: string): void {\n if (!this.isTag() || this.atCapacity()) return;\n const value = raw.trim();\n if (!value) return;\n\n const existing = this.asArray(this.value()).map(String);\n if (!this.allowDuplicates() && existing.includes(value)) return;\n\n const validator = this.validate();\n if (validator && !validator(value, existing)) return;\n\n const next = [...existing, value];\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n // ControlValueAccessor\n\n writeValue(value: unknown): void {\n if (this.hasChips()) {\n this.value.set(Array.isArray(value) ? (value as readonly unknown[]) : []);\n } else {\n this.value.set(value);\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledFromCva.set(coerceBooleanProperty(isDisabled));\n if (isDisabled) this.open.set(false);\n }\n\n // Template handlers\n\n protected onTriggerClick(): void {\n if (this.isDisabled()) return;\n // Tag mode has no panel — clicks should land on the inline input,\n // not toggle an overlay that's never created.\n if (this.isTag()) return;\n this.open.update(v => !v);\n }\n\n protected onTriggerKey(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n\n if (!this.open()) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.seedActiveIndex();\n this.open.set(true);\n return;\n }\n // Multi mode: Backspace on closed trigger removes last chip. Tag\n // mode has its own input handler — never reaches this branch.\n if (event.key === 'Backspace' && this.isMulti() && this.hasSelection()) {\n event.preventDefault();\n const chips = this.selectedChips();\n const last = chips[chips.length - 1];\n if (last) this.removeChip(last.value, event);\n }\n return;\n }\n\n // Open — navigation/selection.\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(this.firstEnabled());\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(this.lastEnabled());\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const idx = this.activeIndex();\n const list = this.registry();\n if (idx >= 0 && idx < list.length && !list[idx].disabled) {\n const id = list[idx].id;\n const el = this.overlayRef?.overlayElement.querySelector<HTMLElement>(`#${CSS.escape(id)}`);\n el?.click();\n }\n break;\n }\n default:\n break;\n }\n }\n\n private seedActiveIndex(): void {\n const list = this.registry();\n let selectedIdx = -1;\n if (this.isMulti()) {\n const arr = this.asArray(this.value());\n if (arr.length > 0) selectedIdx = list.findIndex(o => o.value === arr[0]);\n } else {\n selectedIdx = list.findIndex(o => o.value === this.value());\n }\n this.activeIndex.set(selectedIdx >= 0 ? selectedIdx : this.firstEnabled());\n }\n\n private moveActive(delta: number): void {\n const list = this.registry();\n if (list.length === 0) return;\n let i = this.activeIndex();\n let attempts = list.length;\n while (attempts-- > 0) {\n i = (i + delta + list.length) % list.length;\n const o = list[i];\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) {\n this.activeIndex.set(i);\n return;\n }\n }\n }\n\n private firstEnabled(): number {\n return this.registry().findIndex(o => !o.disabled && !this.isOptionHidden(o.getLabel()));\n }\n\n private lastEnabled(): number {\n const list = this.registry();\n let found = -1;\n list.forEach((o, i) => {\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) found = i;\n });\n return found;\n }\n\n /** Coerce the multi-mode value signal into an array (handles writeValue from non-array). */\n private asArray(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) return value as readonly unknown[];\n if (value == null) return [];\n return [value];\n }\n\n // Overlay\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.scrollStrategies.reposition(),\n width: this.host.nativeElement.getBoundingClientRect().width,\n panelClass: 'wr-select-overlay',\n });\n\n const portal = new TemplatePortal(this.panelTpl(), this.vcr);\n this.overlayRef.attach(portal);\n\n this.overlayRef\n .outsidePointerEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.open.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.open.set(false);\n }\n });\n }\n\n private closeOverlay(): void {\n if (!this.overlayRef) return;\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n}\n","@if (isSearch()) {\n <!-- Search mode: a real text input drives a filtered overlay panel.\n The wrapper isn't itself focusable — the input is the tabstop. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div class=\"wr-select__trigger wr-select__trigger--search\" (click)=\"focusSearchInput()\">\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n class=\"wr-select__search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"searchDisplay()\"\n (input)=\"onSearchInput($event)\"\n (focus)=\"onSearchFocus()\"\n (keydown)=\"onSearchKey($event)\"\n (blur)=\"onTouched()\"\n />\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n} @else if (isTag()) {\n <!-- Tag mode: a focusable input lives inside, so the wrapper itself\n only exists to host chips and forward whitespace clicks to the\n input. Keyboard users tab straight into the input — no need for a\n separate role. The click handler is a mouse-only convenience. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"wr-select__trigger wr-select__trigger--tag\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n (click)=\"focusTagInput()\"\n >\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n <input\n #tagInput\n type=\"text\"\n class=\"wr-select__tag-input\"\n [value]=\"draft()\"\n [disabled]=\"isDisabled() || atCapacity()\"\n [placeholder]=\"hasSelection() ? '' : resolvedPlaceholder()\"\n (input)=\"onTagInput($event)\"\n (keydown)=\"onTagKeydown($event)\"\n (paste)=\"onTagPaste($event)\"\n (blur)=\"onTagBlur()\"\n />\n </span>\n\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n </div>\n} @else {\n <button\n type=\"button\"\n class=\"wr-select__trigger\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKey($event)\"\n (blur)=\"onTouched()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n } @else {\n @if (selectedLabel(); as label) {\n <span class=\"wr-select__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n }\n\n @if (isMulti() && clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n}\n\n<ng-template #panelTpl>\n <div\n class=\"wr-select-panel\"\n role=\"listbox\"\n [attr.id]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n >\n @if (loading()) {\n <div class=\"wr-select-panel__loading\" aria-busy=\"true\">{{ resolvedLoading() }}</div>\n }\n\n <!-- Dynamic options from [options] or async [loader] (search mode).\n Rendered as wr-option so the standard registration / filter\n pipeline applies uniformly. -->\n @for (item of dynamicOptions(); track $index) {\n <wr-option [value]=\"item\">{{ displayWith()(item) }}</wr-option>\n }\n\n <!-- Projected static options. -->\n <ng-content />\n\n @if (hasNoResults()) {\n <div class=\"wr-select-panel__empty\">{{ resolvedNoResults() }}</div>\n }\n </div>\n</ng-template>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * Visually groups options under a label inside a `<wr-select>`.\n *\n * @example\n * ```html\n * <wr-option-group label=\"Sizes\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * </wr-option-group>\n * ```\n */\n@Component({\n selector: 'wr-option-group',\n templateUrl: './option-group.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-option-group', role: 'group' },\n})\nexport class WrOptionGroup {\n /** Section heading shown above the options. */\n readonly label = input.required<string>();\n}\n","<div class=\"wr-option-group__label\">{{ label() }}</div>\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-select.mjs","sources":["../../../projects/lib/select/tokens/select.token.ts","../../../projects/lib/select/option.ts","../../../projects/lib/select/select.ts","../../../projects/lib/select/select.html","../../../projects/lib/select/option-group.ts","../../../projects/lib/select/option-group.html","../../../projects/lib/select/ngwr-select.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken, type Signal } from '@angular/core';\n\n/** Per-option registration metadata. @internal */\nexport interface WrSelectOptionRegistration {\n readonly id: string;\n readonly value: unknown;\n readonly disabled: boolean;\n /**\n * Lazy label reader. Options render text via `<ng-content>`, so we\n * read it at call time once Angular has settled the projected content.\n */\n readonly getLabel: () => string;\n}\n\n/**\n * Contract a `<wr-option>` uses to talk to its parent `<wr-select>`.\n *\n * @internal\n */\nexport interface WrSelectContext {\n /**\n * Currently selected value. Single mode: `T | null`. Multi mode:\n * `readonly T[]`. Options consult {@link isSelected} instead of\n * reading this directly so the same option code works in both modes.\n */\n readonly value: Signal<unknown>;\n /** Whether the select is in multi-selection mode. */\n readonly multi: Signal<boolean>;\n /** Whether the select is disabled. */\n readonly isDisabled: Signal<boolean>;\n /** Id of the option currently highlighted by keyboard navigation. */\n readonly activeOptionId: Signal<string | null>;\n /**\n * Active search query (search mode only). Empty string when there is\n * no filter applied — options treat that as \"show me\".\n */\n readonly searchQuery: Signal<string>;\n /** True only when `mode=\"search\"`. Options gate filtering on this. */\n readonly isSearch: Signal<boolean>;\n /** Is the given option value currently selected? Handles both single and multi. */\n isSelected(value: unknown): boolean;\n /**\n * Called when a child option is clicked. The label is read lazily\n * via {@link WrSelectOptionRegistration.getLabel}, so callers don't\n * need to thread it through.\n */\n selectOption(value: unknown): void;\n /** Register an option; returns an unregister function. */\n registerOption(reg: WrSelectOptionRegistration): () => void;\n}\n\n/**\n * Token a `<wr-option>` injects to register itself with and notify its\n * parent `<wr-select>`.\n *\n * @internal\n */\nexport const WR_SELECT = new InjectionToken<WrSelectContext>('WR_SELECT');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, DestroyRef, ElementRef, ViewEncapsulation, computed, effect, inject, input } from '@angular/core';\n\nimport { WR_SELECT } from './tokens';\n\nlet uid = 0;\n\n/**\n * Single option inside a `<wr-select>`.\n *\n * The option's display label is taken from its projected text content;\n * the form value is its `value` input.\n *\n * @example\n * ```html\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option [value]=\"42\">Forty-two</wr-option>\n * ```\n */\n@Component({\n selector: 'wr-option',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'option',\n '[attr.id]': 'id',\n '[class]': 'classes()',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'disabled() ? true : null',\n '(click)': 'onClick()',\n },\n})\nexport class WrOption {\n /** The value contributed when this option is chosen. Required. */\n readonly value = input.required<unknown>();\n\n /** Disable this option. @default false */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Stable id used for `aria-activedescendant`. */\n readonly id = `wr-option-${++uid}`;\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly parent = inject(WR_SELECT, { optional: true });\n\n /**\n * @internal — true when this option is currently selected. Works for\n * both single and multi-select parents via `WrSelectContext.isSelected`.\n */\n protected readonly selected = computed(() => {\n const parent = this.parent;\n if (!parent) return false;\n // Re-read parent's value signal so the computed recomputes on change.\n parent.value();\n return parent.isSelected(this.value());\n });\n\n /** @internal — true when this option is the keyboard cursor target. */\n protected readonly active = computed(() => this.parent?.activeOptionId() === this.id);\n\n /**\n * @internal — search mode only. True when the parent has a query that\n * the option's text content does not match (case-insensitive substring).\n * Hidden options stay in the DOM so registration order survives but\n * collapse via CSS.\n */\n protected readonly hidden = computed(() => {\n const parent = this.parent;\n if (!parent?.isSearch()) return false;\n const q = parent.searchQuery().trim().toLowerCase();\n if (!q) return false;\n const label = (this.host.nativeElement.textContent ?? '').trim().toLowerCase();\n return !label.includes(q);\n });\n\n protected readonly classes = computed(() => {\n const parts = ['wr-option'];\n if (this.selected()) parts.push('wr-option--selected');\n if (this.active()) parts.push('wr-option--active');\n if (this.disabled()) parts.push('wr-option--disabled');\n if (this.hidden()) parts.push('wr-option--hidden');\n return parts.join(' ');\n });\n\n constructor() {\n if (this.parent) {\n const parent = this.parent;\n // Re-register when disabled or value changes so the parent has fresh metadata.\n effect(onCleanup => {\n const unreg = parent.registerOption({\n id: this.id,\n value: this.value(),\n disabled: this.disabled(),\n getLabel: () => this.host.nativeElement.textContent?.trim() ?? '',\n });\n onCleanup(() => unreg());\n });\n inject(DestroyRef);\n }\n }\n\n protected onClick(): void {\n if (this.disabled() || !this.parent) return;\n this.parent.selectOption(this.value());\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { type OverlayRef, ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n ViewEncapsulation,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { type ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { type Observable, debounceTime, finalize, from, isObservable, of, switchMap } from 'rxjs';\n\nimport { useI18nFormatter, useI18nText } from 'ngwr/i18n';\nimport { WR_OVERLAY, WR_RESPONSIVE_OVERLAYS, wrPresentAsSheet } from 'ngwr/overlay';\nimport { noop } from 'ngwr/utils';\n\nimport type { WrSelectMode, WrSelectSearchLoader, WrSelectTagValidator } from './interfaces';\nimport { WrOption } from './option';\nimport { WR_SELECT, type WrSelectContext, type WrSelectOptionRegistration } from './tokens';\n\nlet listboxUid = 0;\n\ninterface SelectedChip {\n readonly value: unknown;\n readonly label: string;\n}\n\n/**\n * Combobox primitive. Renders a button that opens a CDK overlay\n * containing the projected `<wr-option>` (and optionally\n * `<wr-option-group>`) children. Every shape is the same component\n * with a different `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger; clicking an option\n * toggles instead of closing, Backspace removes the last chip.\n * - `'search'` — type-ahead with sync `[options]` filter or async\n * `[loader]`. Replaces the standalone `<wr-autocomplete>`.\n * - `'tag'` — free-text + chips with `[separators]` / `[validate]` /\n * `[allowDuplicates]`. Replaces `<wr-chips-input>`.\n *\n * Implements `ControlValueAccessor` — usable with `[(ngModel)]`,\n * `formControl`, or `formControlName`.\n *\n * @example\n * ```html\n * <!-- Single -->\n * <wr-select placeholder=\"Pick a size\" [(ngModel)]=\"size\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * <wr-option value=\"lg\">Large</wr-option>\n * </wr-select>\n *\n * <!-- Multi -->\n * <wr-select mode=\"multi\" placeholder=\"Pick tags\" [(ngModel)]=\"tags\">\n * <wr-option value=\"ts\">TypeScript</wr-option>\n * <wr-option value=\"ng\">Angular</wr-option>\n * </wr-select>\n * ```\n *\n * The legacy `[multi]=\"true\"` boolean is still accepted but is now an\n * alias for `[mode]=\"'multi'\"` — prefer the explicit mode.\n *\n * @see https://ngwr.dev/components/select\n */\n@Component({\n selector: 'wr-select',\n templateUrl: './select.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n imports: [WrOption],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n multi: true,\n },\n {\n provide: WR_SELECT,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrSelect),\n },\n ],\n})\nexport class WrSelect implements ControlValueAccessor, WrSelectContext {\n /** Placeholder shown when no option is selected. Falls back to `select.placeholder`. */\n readonly placeholder = input<string | null>(null);\n\n /** Clear-selection (×) button aria-label. Falls back to `select.clearSelection`. */\n readonly clearLabel = input<string | null>(null);\n\n protected readonly resolvedPlaceholder = useI18nText(this.placeholder, 'select.placeholder', '');\n protected readonly resolvedClear = useI18nText(this.clearLabel, 'select.clearSelection', 'Clear selection');\n\n /** Per-chip ARIA label — interpolates `{{label}}`. @internal */\n protected readonly chipRemoveLabel = useI18nFormatter('select.removeItem', 'Remove {{label}}');\n\n /** Disable the select. Also set by Angular forms via `setDisabledState`. */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Pill-shaped corners on the trigger. @default false */\n readonly rounded = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Present the option panel as a full-width bottom-sheet on small\n * viewports instead of an anchored dropdown. `undefined` follows the\n * app-wide `provideWrResponsiveOverlays()` setting; `true`/`false`\n * overrides it. @default undefined\n */\n readonly responsive = input<boolean | undefined, BooleanInput>(undefined, {\n transform: (v: BooleanInput): boolean | undefined => (v == null ? undefined : coerceBooleanProperty(v)),\n });\n\n /**\n * Behavior mode. `<wr-select>` is the unified combobox primitive —\n * pick the shape via `[mode]`:\n *\n * - `'single'` (default) — one value, no input. Classic dropdown.\n * - `'multi'` — array value, chips on the trigger.\n * - `'search'` *(planned)* — type-ahead with sync filter or async loader.\n * - `'tag'` *(planned)* — free-text + chips with optional `allowCreate`.\n *\n */\n readonly mode = input<WrSelectMode | null>(null);\n\n /** Resolved mode — `'single'` unless `[mode]` says otherwise. */\n protected readonly effectiveMode = computed<WrSelectMode>(() => this.mode() ?? 'single');\n\n /** Convenience — `effectiveMode() === 'multi'`. */\n protected readonly isMulti = computed(() => this.effectiveMode() === 'multi');\n\n /** Convenience — `effectiveMode() === 'tag'`. */\n protected readonly isTag = computed(() => this.effectiveMode() === 'tag');\n\n /** Convenience — `effectiveMode() === 'search'`. Exposed via context for options. */\n readonly isSearch = computed(() => this.effectiveMode() === 'search');\n\n /** WrSelectContext — resolved multi-selection flag for child options. */\n readonly multi = computed(() => this.effectiveMode() === 'multi' || this.effectiveMode() === 'tag');\n\n /** Both multi and tag render chips on the trigger. */\n protected readonly hasChips = computed(() => {\n const m = this.effectiveMode();\n return m === 'multi' || m === 'tag';\n });\n\n /**\n * Search-mode query. Empty string = no filter. Exposed via context so\n * each `<wr-option>` can self-hide non-matching rows.\n */\n readonly searchQuery = signal('');\n\n // Search-mode-only inputs (ignored in other modes)\n\n /**\n * Search mode: dynamic option array. Each item is rendered as a\n * `<wr-option>` whose label comes from `[displayWith]`. Works\n * alongside projected `<wr-option>` children — both lists are\n * filtered by the search query.\n */\n readonly options = input<readonly unknown[]>([]);\n\n /** Search mode: map a dynamic option item to its display label. @default String */\n readonly displayWith = input<(item: unknown) => string>((item: unknown) => String(item));\n\n /**\n * Search mode: async loader. When set, the loader is called on every\n * (debounced) keystroke and its result replaces `[options]`. Supports\n * Observables, Promises, and plain arrays.\n */\n readonly loader = input<WrSelectSearchLoader<unknown> | null>(null);\n\n /** Search mode: debounce (ms) applied to the loader. @default 250 */\n readonly debounceMs = input(250, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /** Search mode: minimum query length before the panel opens / loader fires. @default 0 */\n readonly minChars = input(0, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /**\n * Search mode: allow values not in the options list. Enter on an\n * unmatched query commits the raw text as the form value. @default false\n */\n readonly freeText = input(false, { transform: coerceBooleanProperty });\n\n /** Search mode: text shown when the filter / loader returns nothing. Falls back to `select.noResults`. */\n readonly noResultsText = input<string | null>(null);\n\n /** Search mode: text shown while the async loader is in flight. Falls back to `select.loading`. */\n readonly loadingText = input<string | null>(null);\n\n protected readonly resolvedNoResults = useI18nText(this.noResultsText, 'select.noResults', 'No results');\n protected readonly resolvedLoading = useI18nText(this.loadingText, 'select.loading', 'Loading…');\n\n /** Search mode: results returned by the async loader. @internal */\n protected readonly loadedOptions = signal<readonly unknown[]>([]);\n\n /** Search mode: true while the loader is in flight. @internal */\n protected readonly loading = signal(false);\n\n // Tag-mode-only inputs (ignored in other modes)\n\n /**\n * Tag mode: keys / characters that commit the current draft into a chip.\n * `'Enter'` is the key name; everything else is a literal character watched\n * in keypresses and pastes. @default ['Enter', ',']\n */\n readonly separators = input<readonly string[]>(['Enter', ',']);\n\n /** Tag mode: allow the same value to appear more than once. @default false */\n readonly allowDuplicates = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Tag mode: custom validator — return `true` to accept the value, `false`\n * to silently reject. Receives the trimmed draft + the existing chips.\n */\n readonly validate = input<WrSelectTagValidator | null>(null);\n\n /** Tag-mode draft (text currently typed in the inline input). @internal */\n protected readonly draft = signal('');\n\n /**\n * Show a clear-all (×) button at the end of the chip row when at\n * least one option is selected (multi mode only). @default true\n */\n readonly clearable = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Cap on selected items (multi mode). `0` = unlimited. Once reached,\n * additional clicks on unselected options are ignored. @default 0\n */\n readonly maxItems = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Maximum number of chips rendered before collapsing the rest into a\n * `+N more` indicator. `0` = render every chip. @default 0\n */\n readonly maxTagCount = input(0, {\n transform: (v: unknown): number => Math.max(0, Number(v) || 0),\n });\n\n /**\n * Unified value signal. Single mode holds `T | null`; multi mode\n * holds `readonly T[]`. Internal — consumers go through `[(ngModel)]`\n * or `[formControl]` via CVA.\n * @internal\n */\n readonly value = signal<unknown>(null);\n\n /** Listbox id used by the trigger's `aria-controls`. */\n protected readonly listboxId = `wr-select-listbox-${++listboxUid}`;\n\n /** Registered options (insertion order). Internal — distinct from the public `[options]` input. */\n private readonly registry = signal<readonly WrSelectOptionRegistration[]>([]);\n\n /** Keyboard cursor index into `options`. -1 = none. */\n private readonly activeIndex = signal(-1);\n\n /** Id of the active option (for `aria-activedescendant`). */\n readonly activeOptionId = computed<string | null>(() => {\n const idx = this.activeIndex();\n const list = this.registry();\n return idx >= 0 && idx < list.length ? list[idx].id : null;\n });\n\n protected readonly open = signal(false);\n protected readonly selectedLabel = signal<string | null>(null);\n\n /**\n * Selected chips (multi + tag modes). Multi reads labels from the\n * registered `<wr-option>` children; tag uses each raw string as\n * both value and label.\n */\n protected readonly selectedChips = computed<readonly SelectedChip[]>(() => {\n if (!this.hasChips()) return [];\n const arr = this.asArray(this.value());\n if (this.isTag()) {\n return arr.map<SelectedChip>(v => ({ value: v, label: String(v) }));\n }\n const list = this.registry();\n return arr.map<SelectedChip>(v => {\n const found = list.find(o => o.value === v);\n return { value: v, label: found?.getLabel() ?? String(v) };\n });\n });\n\n protected readonly visibleChips = computed<readonly SelectedChip[]>(() => {\n const cap = this.maxTagCount();\n const chips = this.selectedChips();\n return cap > 0 && chips.length > cap ? chips.slice(0, cap) : chips;\n });\n\n protected readonly hiddenChipCount = computed(() => {\n const cap = this.maxTagCount();\n const total = this.selectedChips().length;\n return cap > 0 && total > cap ? total - cap : 0;\n });\n\n protected readonly hasSelection = computed(() => {\n if (this.hasChips()) return this.selectedChips().length > 0;\n return this.value() != null;\n });\n\n private readonly disabledFromCva = signal(false);\n\n /** Effective disabled state — input wins, CVA second. */\n readonly isDisabled = computed(() => this.disabled() || this.disabledFromCva());\n\n protected readonly classes = computed(() => {\n const parts = ['wr-select'];\n if (this.open()) parts.push('wr-select--open');\n if (this.rounded()) parts.push('wr-select--rounded');\n if (this.isMulti()) parts.push('wr-select--multi');\n if (this.isTag()) parts.push('wr-select--tag');\n if (this.isSearch()) parts.push('wr-select--search');\n if (this.isDisabled()) parts.push('wr-select--disabled');\n return parts.join(' ');\n });\n\n /**\n * Search-mode dynamic options. Loader results win when the loader is\n * set; otherwise the static `[options]` array. Each item is rendered\n * as an internal `<wr-option>` in the panel.\n */\n protected readonly dynamicOptions = computed<readonly unknown[]>(() =>\n this.loader() ? this.loadedOptions() : this.options()\n );\n\n /**\n * Count of registered options that pass the current search filter.\n * Hides the noResults state when the panel has at least one visible row.\n */\n protected readonly visibleCount = computed(() => {\n const list = this.registry();\n if (!this.isSearch()) return list.length;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return list.length;\n let count = 0;\n for (const o of list) {\n if (o.getLabel().toLowerCase().includes(q)) count++;\n }\n return count;\n });\n\n /** Search mode: show \"no results\" when the panel has nothing to offer. */\n protected readonly hasNoResults = computed(() => {\n if (!this.isSearch() || !this.open() || this.loading()) return false;\n if (this.searchQuery().trim().length < this.minChars()) return false;\n return this.visibleCount() === 0;\n });\n\n /** Search mode: is this option hidden by the current query? @internal */\n private isOptionHidden(label: string): boolean {\n if (!this.isSearch()) return false;\n const q = this.searchQuery().trim().toLowerCase();\n if (!q) return false;\n return !label.toLowerCase().includes(q);\n }\n\n protected readonly panelTpl = viewChild.required('panelTpl', { read: TemplateRef });\n\n /** Tag-mode inline input. Present only when `mode=\"tag\"`. @internal */\n protected readonly tagInputEl = viewChild<ElementRef<HTMLInputElement>>('tagInput');\n\n /** Search-mode inline input. Present only when `mode=\"search\"`. @internal */\n protected readonly searchInputEl = viewChild<ElementRef<HTMLInputElement>>('searchInput');\n\n protected focusTagInput(): void {\n this.tagInputEl()?.nativeElement.focus();\n }\n\n protected focusSearchInput(): void {\n this.searchInputEl()?.nativeElement.focus();\n }\n\n // Search-mode handlers\n\n protected onSearchInput(event: Event): void {\n if (this.isDisabled()) return;\n const value = (event.target as HTMLInputElement).value;\n this.searchQuery.set(value);\n if (!this.open()) this.open.set(true);\n }\n\n protected onSearchFocus(): void {\n if (this.isDisabled()) return;\n if (!this.open()) {\n this.seedActiveIndex();\n this.open.set(true);\n }\n }\n\n protected onSearchKey(event: KeyboardEvent): void {\n // freeText: Enter on an unmatched query commits the typed string\n // as the value. Skips when an active option is highlighted (the\n // normal Enter-selects behaviour wins).\n if (event.key === 'Enter' && this.freeText() && this.open()) {\n const q = this.searchQuery().trim();\n const idx = this.activeIndex();\n const list = this.registry();\n const hasActive =\n idx >= 0 && idx < list.length && !list[idx].disabled && !this.isOptionHidden(list[idx].getLabel());\n if (!hasActive && q) {\n event.preventDefault();\n this.value.set(q);\n this.onChange(q);\n this.onTouched();\n this.open.set(false);\n return;\n }\n }\n // Otherwise route through the same keyboard plumbing as the button trigger.\n this.onTriggerKey(event);\n }\n\n /**\n * Display text for the search input. Shows the selected option's\n * label when collapsed, or the live query while typing / panel open.\n * @internal\n */\n protected readonly searchDisplay = computed(() => {\n if (this.open()) return this.searchQuery();\n return this.selectedLabel() ?? '';\n });\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly overlay = inject(WR_OVERLAY);\n private readonly responsiveConfig = inject(WR_RESPONSIVE_OVERLAYS);\n private readonly vcr = inject(ViewContainerRef);\n private readonly scrollStrategies = inject(ScrollStrategyOptions);\n private readonly destroyRef = inject(DestroyRef);\n private overlayRef: OverlayRef | null = null;\n\n private onChange: (value: unknown) => void = noop;\n protected onTouched: () => void = noop;\n\n constructor() {\n effect(() => {\n if (this.open()) {\n this.openOverlay();\n } else {\n this.closeOverlay();\n // Reset the search query when the panel closes so a re-open\n // doesn't carry a stale filter.\n if (this.isSearch()) this.searchQuery.set('');\n }\n });\n\n // Async loader pipeline (search mode only). `switchMap` cancels\n // in-flight requests when a new keystroke arrives.\n toObservable(this.searchQuery)\n .pipe(\n debounceTime(this.debounceMs()),\n switchMap(query => {\n const loader = this.loader();\n if (!loader || !this.isSearch() || query.length < this.minChars()) {\n this.loading.set(false);\n return of<readonly unknown[]>([]);\n }\n this.loading.set(true);\n const result = loader(query);\n const source: Observable<readonly unknown[]> = isObservable(result) ? result : from(Promise.resolve(result));\n return source.pipe(finalize(() => this.loading.set(false)));\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(items => this.loadedOptions.set(items));\n\n // Resolve the single-mode trigger label whenever the value or\n // options change. Multi mode reads `selectedChips` instead and\n // doesn't need this.\n effect(() => {\n const v = this.value();\n const list = this.registry();\n if (this.isMulti()) {\n this.selectedLabel.set(null);\n return;\n }\n const match = list.find(o => o.value === v);\n this.selectedLabel.set(match ? match.getLabel() : null);\n });\n }\n\n // WrSelectContext\n\n isSelected(value: unknown): boolean {\n if (this.isMulti()) return this.asArray(this.value()).includes(value);\n return this.value() === value;\n }\n\n selectOption(value: unknown): void {\n if (this.isMulti()) {\n const current = this.asArray(this.value());\n const idx = current.indexOf(value);\n let next: readonly unknown[];\n if (idx >= 0) {\n next = [...current.slice(0, idx), ...current.slice(idx + 1)];\n } else {\n const cap = this.maxItems();\n if (cap > 0 && current.length >= cap) return;\n next = [...current, value];\n }\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n // Keep the panel open in multi mode so the user can keep picking.\n return;\n }\n this.value.set(value);\n this.onChange(value);\n this.onTouched();\n this.open.set(false);\n }\n\n registerOption(reg: WrSelectOptionRegistration): () => void {\n this.registry.update(list => [...list, reg]);\n return () => this.registry.update(list => list.filter(o => o.id !== reg.id));\n }\n\n // Chip handlers (multi + tag)\n\n /** Remove one selection (chip × button). Works for multi and tag modes. */\n protected removeChip(value: unknown, event: Event): void {\n event.stopPropagation();\n if (this.isDisabled() || !this.hasChips()) return;\n const next = this.asArray(this.value()).filter(v => v !== value);\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n /** Clear every selection (× button). Multi/tag → empty array; search → null. */\n protected clearAll(event: Event): void {\n event.stopPropagation();\n if (this.isDisabled()) return;\n if (this.hasChips()) {\n this.value.set([]);\n this.onChange([]);\n } else if (this.isSearch()) {\n this.value.set(null);\n this.onChange(null);\n this.searchQuery.set('');\n } else {\n return;\n }\n this.onTouched();\n }\n\n // Tag-mode draft handlers\n\n /** Capacity check used by tag mode to refuse the next add. */\n protected readonly atCapacity = computed(() => {\n const cap = this.maxItems();\n return cap > 0 && this.asArray(this.value()).length >= cap;\n });\n\n protected onTagInput(event: Event): void {\n if (this.isDisabled()) return;\n this.draft.set((event.target as HTMLInputElement).value);\n }\n\n protected onTagKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n const seps = this.separators();\n\n if (seps.includes(event.key)) {\n event.preventDefault();\n this.commitDraft();\n return;\n }\n\n if (event.key === 'Backspace' && this.draft() === '') {\n const chips = this.selectedChips();\n if (chips.length > 0) {\n event.preventDefault();\n this.removeChip(chips[chips.length - 1].value, event);\n }\n }\n }\n\n protected onTagPaste(event: ClipboardEvent): void {\n if (this.isDisabled()) return;\n const text = event.clipboardData?.getData('text') ?? '';\n if (!text) return;\n\n const seps = this.separators().filter(s => s !== 'Enter');\n if (seps.length === 0) return;\n\n event.preventDefault();\n const escaped = seps.map(s => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('');\n const splitRegex = new RegExp(`[${escaped}\\\\n]+`);\n for (const part of text.split(splitRegex)) this.tryAddTag(part);\n }\n\n protected onTagBlur(): void {\n if (this.draft().trim()) this.commitDraft();\n this.onTouched();\n }\n\n private commitDraft(): void {\n const v = this.draft().trim();\n this.draft.set('');\n if (v) this.tryAddTag(v);\n }\n\n private tryAddTag(raw: string): void {\n if (!this.isTag() || this.atCapacity()) return;\n const value = raw.trim();\n if (!value) return;\n\n const existing = this.asArray(this.value()).map(String);\n if (!this.allowDuplicates() && existing.includes(value)) return;\n\n const validator = this.validate();\n if (validator && !validator(value, existing)) return;\n\n const next = [...existing, value];\n this.value.set(next);\n this.onChange(next);\n this.onTouched();\n }\n\n // ControlValueAccessor\n\n writeValue(value: unknown): void {\n if (this.hasChips()) {\n this.value.set(Array.isArray(value) ? (value as readonly unknown[]) : []);\n } else {\n this.value.set(value);\n }\n }\n\n registerOnChange(fn: (value: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabledFromCva.set(coerceBooleanProperty(isDisabled));\n if (isDisabled) this.open.set(false);\n }\n\n // Template handlers\n\n protected onTriggerClick(): void {\n if (this.isDisabled()) return;\n // Tag mode has no panel — clicks should land on the inline input,\n // not toggle an overlay that's never created.\n if (this.isTag()) return;\n this.open.update(v => !v);\n }\n\n protected onTriggerKey(event: KeyboardEvent): void {\n if (this.isDisabled()) return;\n\n if (!this.open()) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n this.seedActiveIndex();\n this.open.set(true);\n return;\n }\n // Multi mode: Backspace on closed trigger removes last chip. Tag\n // mode has its own input handler — never reaches this branch.\n if (event.key === 'Backspace' && this.isMulti() && this.hasSelection()) {\n event.preventDefault();\n const chips = this.selectedChips();\n const last = chips[chips.length - 1];\n if (last) this.removeChip(last.value, event);\n }\n return;\n }\n\n // Open — navigation/selection.\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.moveActive(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveActive(-1);\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(this.firstEnabled());\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(this.lastEnabled());\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const idx = this.activeIndex();\n const list = this.registry();\n if (idx >= 0 && idx < list.length && !list[idx].disabled) {\n const id = list[idx].id;\n const el = this.overlayRef?.overlayElement.querySelector<HTMLElement>(`#${CSS.escape(id)}`);\n el?.click();\n }\n break;\n }\n default:\n break;\n }\n }\n\n private seedActiveIndex(): void {\n const list = this.registry();\n let selectedIdx = -1;\n if (this.isMulti()) {\n const arr = this.asArray(this.value());\n if (arr.length > 0) selectedIdx = list.findIndex(o => o.value === arr[0]);\n } else {\n selectedIdx = list.findIndex(o => o.value === this.value());\n }\n this.activeIndex.set(selectedIdx >= 0 ? selectedIdx : this.firstEnabled());\n }\n\n private moveActive(delta: number): void {\n const list = this.registry();\n if (list.length === 0) return;\n let i = this.activeIndex();\n let attempts = list.length;\n while (attempts-- > 0) {\n i = (i + delta + list.length) % list.length;\n const o = list[i];\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) {\n this.activeIndex.set(i);\n return;\n }\n }\n }\n\n private firstEnabled(): number {\n return this.registry().findIndex(o => !o.disabled && !this.isOptionHidden(o.getLabel()));\n }\n\n private lastEnabled(): number {\n const list = this.registry();\n let found = -1;\n list.forEach((o, i) => {\n if (!o.disabled && !this.isOptionHidden(o.getLabel())) found = i;\n });\n return found;\n }\n\n /** Coerce the multi-mode value signal into an array (handles writeValue from non-array). */\n private asArray(value: unknown): readonly unknown[] {\n if (Array.isArray(value)) return value as readonly unknown[];\n if (value == null) return [];\n return [value];\n }\n\n // Overlay\n\n private openOverlay(): void {\n if (this.overlayRef) return;\n\n // On small viewports (when opted in) detach from the trigger and present\n // the panel as a full-width slide-up sheet pinned to the bottom edge.\n const asSheet = wrPresentAsSheet(this.responsive(), this.responsiveConfig);\n\n const positionStrategy = asSheet\n ? this.overlay.position().global().centerHorizontally().bottom('0')\n : this.overlay\n .position()\n .flexibleConnectedTo(this.host)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ])\n .withPush(true);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: asSheet ? this.scrollStrategies.block() : this.scrollStrategies.reposition(),\n width: asSheet ? '100%' : this.host.nativeElement.getBoundingClientRect().width,\n hasBackdrop: asSheet,\n backdropClass: asSheet ? 'wr-select-backdrop' : undefined,\n panelClass: asSheet ? ['wr-select-overlay', 'wr-overlay-sheet'] : 'wr-select-overlay',\n });\n\n const portal = new TemplatePortal(this.panelTpl(), this.vcr);\n this.overlayRef.attach(portal);\n\n if (asSheet) {\n this.overlayRef\n .backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.open.set(false));\n }\n\n this.overlayRef\n .outsidePointerEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (this.host.nativeElement.contains(event.target as Node)) return;\n this.open.set(false);\n });\n\n this.overlayRef\n .keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.open.set(false);\n }\n });\n }\n\n private closeOverlay(): void {\n if (!this.overlayRef) return;\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n}\n","@if (isSearch()) {\n <!-- Search mode: a real text input drives a filtered overlay panel.\n The wrapper isn't itself focusable — the input is the tabstop. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div class=\"wr-select__trigger wr-select__trigger--search\" (click)=\"focusSearchInput()\">\n <input\n #searchInput\n type=\"text\"\n role=\"combobox\"\n class=\"wr-select__search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"searchDisplay()\"\n (input)=\"onSearchInput($event)\"\n (focus)=\"onSearchFocus()\"\n (keydown)=\"onSearchKey($event)\"\n (blur)=\"onTouched()\"\n />\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </div>\n} @else if (isTag()) {\n <!-- Tag mode: a focusable input lives inside, so the wrapper itself\n only exists to host chips and forward whitespace clicks to the\n input. Keyboard users tab straight into the input — no need for a\n separate role. The click handler is a mouse-only convenience. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div\n class=\"wr-select__trigger wr-select__trigger--tag\"\n [attr.aria-disabled]=\"isDisabled() || null\"\n (click)=\"focusTagInput()\"\n >\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n <input\n #tagInput\n type=\"text\"\n class=\"wr-select__tag-input\"\n [value]=\"draft()\"\n [disabled]=\"isDisabled() || atCapacity()\"\n [placeholder]=\"hasSelection() ? '' : resolvedPlaceholder()\"\n (input)=\"onTagInput($event)\"\n (keydown)=\"onTagKeydown($event)\"\n (paste)=\"onTagPaste($event)\"\n (blur)=\"onTagBlur()\"\n />\n </span>\n\n @if (clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n </div>\n} @else {\n <button\n type=\"button\"\n class=\"wr-select__trigger\"\n role=\"combobox\"\n [disabled]=\"isDisabled()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n [attr.aria-activedescendant]=\"open() ? activeOptionId() || null : null\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKey($event)\"\n (blur)=\"onTouched()\"\n >\n @if (isMulti()) {\n @if (hasSelection()) {\n <span class=\"wr-select__chips\">\n @for (chip of visibleChips(); track $index) {\n <span class=\"wr-select__chip\">\n <span class=\"wr-select__chip-label\">{{ chip.label }}</span>\n <span\n class=\"wr-select__chip-remove\"\n role=\"button\"\n [attr.aria-label]=\"chipRemoveLabel({ label: chip.label })\"\n tabindex=\"-1\"\n (click)=\"removeChip(chip.value, $event)\"\n (keydown.enter)=\"removeChip(chip.value, $event)\"\n (keydown.space)=\"removeChip(chip.value, $event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n </span>\n }\n @if (hiddenChipCount(); as extra) {\n <span class=\"wr-select__chip wr-select__chip--more\">+{{ extra }} more</span>\n }\n </span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n } @else {\n @if (selectedLabel(); as label) {\n <span class=\"wr-select__value\">{{ label }}</span>\n } @else {\n <span class=\"wr-select__placeholder\">{{ resolvedPlaceholder() }}</span>\n }\n }\n\n @if (isMulti() && clearable() && hasSelection() && !isDisabled()) {\n <span\n class=\"wr-select__clear\"\n role=\"button\"\n [attr.aria-label]=\"resolvedClear()\"\n tabindex=\"-1\"\n (click)=\"clearAll($event)\"\n (keydown.enter)=\"clearAll($event)\"\n (keydown.space)=\"clearAll($event)\"\n >\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n </span>\n }\n\n <svg\n class=\"wr-icon__svg wr-select__chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n}\n\n<ng-template #panelTpl>\n <div\n class=\"wr-select-panel\"\n role=\"listbox\"\n [attr.id]=\"listboxId\"\n [attr.aria-multiselectable]=\"isMulti() ? 'true' : null\"\n >\n @if (loading()) {\n <div class=\"wr-select-panel__loading\" aria-busy=\"true\">{{ resolvedLoading() }}</div>\n }\n\n <!-- Dynamic options from [options] or async [loader] (search mode).\n Rendered as wr-option so the standard registration / filter\n pipeline applies uniformly. -->\n @for (item of dynamicOptions(); track $index) {\n <wr-option [value]=\"item\">{{ displayWith()(item) }}</wr-option>\n }\n\n <!-- Projected static options. -->\n <ng-content />\n\n @if (hasNoResults()) {\n <div class=\"wr-select-panel__empty\">{{ resolvedNoResults() }}</div>\n }\n </div>\n</ng-template>\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * Visually groups options under a label inside a `<wr-select>`.\n *\n * @example\n * ```html\n * <wr-option-group label=\"Sizes\">\n * <wr-option value=\"sm\">Small</wr-option>\n * <wr-option value=\"md\">Medium</wr-option>\n * </wr-option-group>\n * ```\n */\n@Component({\n selector: 'wr-option-group',\n templateUrl: './option-group.html',\n encapsulation: ViewEncapsulation.None,\n host: { class: 'wr-option-group', role: 'group' },\n})\nexport class WrOptionGroup {\n /** Section heading shown above the options. */\n readonly label = input.required<string>();\n}\n","<div class=\"wr-option-group__label\">{{ label() }}</div>\n<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -104,12 +104,21 @@ class WrStepper {
104
104
  ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
105
105
  /** Lock steps after the latest completed one. @default false */
106
106
  linear = input(false, { ...(ngDevMode ? { debugName: "linear" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
107
+ /**
108
+ * Drop a horizontal stepper to a vertical layout when its own box is too
109
+ * narrow for the row (a container query on its own width, not the
110
+ * viewport — so it adapts inside a narrow column or side panel). No effect
111
+ * when `orientation` is already `vertical`. @default false
112
+ */
113
+ responsive = input(false, { ...(ngDevMode ? { debugName: "responsive" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
107
114
  steps = contentChildren(WrStep, /* @ts-ignore */
108
115
  ...(ngDevMode ? [{ debugName: "steps" }] : /* istanbul ignore next */ []));
109
116
  classes = computed(() => {
110
117
  const parts = ['wr-stepper', `wr-stepper--${this.orientation()}`];
111
118
  if (this.linear())
112
119
  parts.push('wr-stepper--linear');
120
+ if (this.responsive())
121
+ parts.push('wr-stepper--responsive');
113
122
  return parts.join(' ');
114
123
  }, /* @ts-ignore */
115
124
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
@@ -159,7 +168,7 @@ class WrStepper {
159
168
  this.goTo(this.active() - 1);
160
169
  }
161
170
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrStepper, deps: [], target: i0.ɵɵFactoryTarget.Component });
162
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrStepper, isStandalone: true, selector: "wr-stepper", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { properties: { "class": "classes()" } }, providers: [
171
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrStepper, isStandalone: true, selector: "wr-stepper", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, linear: { classPropertyName: "linear", publicName: "linear", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { properties: { "class": "classes()" } }, providers: [
163
172
  {
164
173
  provide: WR_STEPPER,
165
174
  // eslint-disable-next-line @angular-eslint/no-forward-ref
@@ -176,7 +185,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImpor
176
185
  useExisting: forwardRef(() => WrStepper),
177
186
  },
178
187
  ], template: "<ol class=\"wr-stepper__headers\" role=\"list\">\n @for (step of steps(); track $index) {\n <li\n class=\"wr-stepper__header\"\n [class.wr-stepper__header--active]=\"$index === active()\"\n [class.wr-stepper__header--completed]=\"isCompleted($index)\"\n [class.wr-stepper__header--reachable]=\"isReachable($index)\"\n [class.wr-stepper__header--disabled]=\"step.disabled()\"\n >\n <button\n type=\"button\"\n class=\"wr-stepper__header-button\"\n [disabled]=\"!isReachable($index) || step.disabled()\"\n [attr.aria-current]=\"$index === active() ? 'step' : null\"\n (click)=\"onHeaderClick($index)\"\n >\n <span class=\"wr-stepper__indicator\" aria-hidden=\"true\">\n @if (isCompleted($index)) {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <path\n d=\"M3 7.5 L6 10.5 L11 4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n } @else {\n {{ $index + 1 }}\n }\n </span>\n <span class=\"wr-stepper__label\">\n {{ step.label() }}\n @if (step.optional()) {\n <small class=\"wr-stepper__optional\">optional</small>\n }\n @if (step.description()) {\n <small class=\"wr-stepper__description\">{{ step.description() }}</small>\n }\n </span>\n </button>\n @if (!$last) {\n <span class=\"wr-stepper__connector\" aria-hidden=\"true\"></span>\n }\n </li>\n }\n</ol>\n\n<div class=\"wr-stepper__body\">\n <ng-content />\n</div>\n" }]
179
- }], ctorParameters: () => [], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }, { type: i0.Output, args: ["activeChange"] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], linear: [{ type: i0.Input, args: [{ isSignal: true, alias: "linear", required: false }] }], steps: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => WrStep), { isSignal: true }] }] } });
188
+ }], ctorParameters: () => [], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }, { type: i0.Output, args: ["activeChange"] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], linear: [{ type: i0.Input, args: [{ isSignal: true, alias: "linear", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], steps: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => WrStep), { isSignal: true }] }] } });
180
189
 
181
190
  /**
182
191
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-stepper.mjs","sources":["../../../projects/lib/stepper/tokens.ts","../../../projects/lib/stepper/step.ts","../../../projects/lib/stepper/stepper.ts","../../../projects/lib/stepper/stepper.html","../../../projects/lib/stepper/ngwr-stepper.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken, type Signal } from '@angular/core';\n\n/** Surface a {@link WrStepper} provides for its child `<wr-step>`s. */\nexport interface WrStepperContext {\n /** Index of the currently visible step. */\n readonly active: Signal<number>;\n /** Linear mode — steps after the latest completed one are locked. */\n readonly linear: Signal<boolean>;\n}\n\nexport const WR_STEPPER = new InjectionToken<WrStepperContext>('WR_STEPPER');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, inject, input, signal } from '@angular/core';\n\nimport { WR_STEPPER } from './tokens';\n\n/**\n * One step in a {@link WrStepper}. Project as a child:\n *\n * ```html\n * <wr-stepper>\n * <wr-step label=\"Account\"> … </wr-step>\n * <wr-step label=\"Profile\" description=\"Optional\"> … </wr-step>\n * </wr-stepper>\n * ```\n *\n * The stepper hides every step except the active one via a host class —\n * each step still mounts once, so component state survives navigation.\n *\n * @see https://ngwr.dev/components/stepper\n */\n@Component({\n selector: 'wr-step',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-step',\n '[class.wr-step--active]': 'isActive()',\n },\n})\nexport class WrStep {\n /** Header label. */\n readonly label = input<string>('');\n\n /** Secondary text shown under the label. */\n readonly description = input<string>('');\n\n /** Marks the step as optional in the header. */\n readonly optional = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Override completion state. When unset, the stepper auto-derives it\n * from the active index (any step before `active` is completed).\n */\n readonly completed = input<boolean | null>(null);\n\n /** Disables the header — also blocks header clicks. */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Stepper-assigned index. Set by the parent when contentChildren updates. */\n readonly _index = signal(-1);\n\n private readonly stepper = inject(WR_STEPPER);\n\n protected readonly isActive = computed(() => this._index() === this.stepper.active());\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ViewEncapsulation,\n computed,\n contentChildren,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\n\nimport { WrStep } from './step';\nimport { WR_STEPPER, type WrStepperContext } from './tokens';\n\n/**\n * Multi-step wizard container. Children are `<wr-step>` components — the\n * stepper renders one numbered header per step (with connectors) and the\n * body of the currently active one.\n *\n * Two-way bind `[(active)]` to the active step index. Set `linear=\"true\"`\n * to forbid jumping past incomplete steps.\n *\n * @example\n * ```html\n * <wr-stepper [(active)]=\"step\" linear>\n * <wr-step label=\"Account\">…</wr-step>\n * <wr-step label=\"Profile\">…</wr-step>\n * <wr-step label=\"Confirm\">…</wr-step>\n * </wr-stepper>\n * ```\n *\n * @see https://ngwr.dev/components/stepper\n */\n@Component({\n selector: 'wr-stepper',\n templateUrl: './stepper.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n providers: [\n {\n provide: WR_STEPPER,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrStepper),\n },\n ],\n})\nexport class WrStepper implements WrStepperContext {\n /** Index of the currently visible step. */\n readonly active = model(0);\n\n /** Layout direction. @default 'horizontal' */\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /** Lock steps after the latest completed one. @default false */\n readonly linear = input(false, { transform: coerceBooleanProperty });\n\n protected readonly steps = contentChildren(WrStep);\n\n protected readonly classes = computed(() => {\n const parts = ['wr-stepper', `wr-stepper--${this.orientation()}`];\n if (this.linear()) parts.push('wr-stepper--linear');\n return parts.join(' ');\n });\n\n constructor() {\n // Push each step's index down so it can compute its own active state.\n effect(() => {\n this.steps().forEach((step, i) => step._index.set(i));\n });\n }\n\n /** Is the step at `index` considered completed? */\n protected isCompleted(index: number): boolean {\n const override = this.steps()[index]?.completed();\n if (override !== null && override !== undefined) return override;\n return index < this.active();\n }\n\n /** Is the step at `index` reachable for direct header clicks? */\n protected isReachable(index: number): boolean {\n if (this.steps()[index]?.disabled()) return false;\n if (!this.linear()) return true;\n if (index <= this.active()) return true;\n for (let i = 0; i < index; i++) {\n if (!this.isCompleted(i)) return false;\n }\n return true;\n }\n\n protected onHeaderClick(index: number): void {\n if (this.isReachable(index)) this.goTo(index);\n }\n\n // Imperative API\n\n goTo(index: number): void {\n const last = this.steps().length - 1;\n if (last < 0) return;\n const clamped = Math.min(Math.max(0, index), last);\n this.active.set(clamped);\n }\n\n next(): void {\n this.goTo(this.active() + 1);\n }\n\n prev(): void {\n this.goTo(this.active() - 1);\n }\n}\n","<ol class=\"wr-stepper__headers\" role=\"list\">\n @for (step of steps(); track $index) {\n <li\n class=\"wr-stepper__header\"\n [class.wr-stepper__header--active]=\"$index === active()\"\n [class.wr-stepper__header--completed]=\"isCompleted($index)\"\n [class.wr-stepper__header--reachable]=\"isReachable($index)\"\n [class.wr-stepper__header--disabled]=\"step.disabled()\"\n >\n <button\n type=\"button\"\n class=\"wr-stepper__header-button\"\n [disabled]=\"!isReachable($index) || step.disabled()\"\n [attr.aria-current]=\"$index === active() ? 'step' : null\"\n (click)=\"onHeaderClick($index)\"\n >\n <span class=\"wr-stepper__indicator\" aria-hidden=\"true\">\n @if (isCompleted($index)) {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <path\n d=\"M3 7.5 L6 10.5 L11 4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n } @else {\n {{ $index + 1 }}\n }\n </span>\n <span class=\"wr-stepper__label\">\n {{ step.label() }}\n @if (step.optional()) {\n <small class=\"wr-stepper__optional\">optional</small>\n }\n @if (step.description()) {\n <small class=\"wr-stepper__description\">{{ step.description() }}</small>\n }\n </span>\n </button>\n @if (!$last) {\n <span class=\"wr-stepper__connector\" aria-hidden=\"true\"></span>\n }\n </li>\n }\n</ol>\n\n<div class=\"wr-stepper__body\">\n <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngwr-stepper.mjs","sources":["../../../projects/lib/stepper/tokens.ts","../../../projects/lib/stepper/step.ts","../../../projects/lib/stepper/stepper.ts","../../../projects/lib/stepper/stepper.html","../../../projects/lib/stepper/ngwr-stepper.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken, type Signal } from '@angular/core';\n\n/** Surface a {@link WrStepper} provides for its child `<wr-step>`s. */\nexport interface WrStepperContext {\n /** Index of the currently visible step. */\n readonly active: Signal<number>;\n /** Linear mode — steps after the latest completed one are locked. */\n readonly linear: Signal<boolean>;\n}\n\nexport const WR_STEPPER = new InjectionToken<WrStepperContext>('WR_STEPPER');\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ViewEncapsulation, computed, inject, input, signal } from '@angular/core';\n\nimport { WR_STEPPER } from './tokens';\n\n/**\n * One step in a {@link WrStepper}. Project as a child:\n *\n * ```html\n * <wr-stepper>\n * <wr-step label=\"Account\"> … </wr-step>\n * <wr-step label=\"Profile\" description=\"Optional\"> … </wr-step>\n * </wr-stepper>\n * ```\n *\n * The stepper hides every step except the active one via a host class —\n * each step still mounts once, so component state survives navigation.\n *\n * @see https://ngwr.dev/components/stepper\n */\n@Component({\n selector: 'wr-step',\n template: '<ng-content />',\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'wr-step',\n '[class.wr-step--active]': 'isActive()',\n },\n})\nexport class WrStep {\n /** Header label. */\n readonly label = input<string>('');\n\n /** Secondary text shown under the label. */\n readonly description = input<string>('');\n\n /** Marks the step as optional in the header. */\n readonly optional = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Override completion state. When unset, the stepper auto-derives it\n * from the active index (any step before `active` is completed).\n */\n readonly completed = input<boolean | null>(null);\n\n /** Disables the header — also blocks header clicks. */\n readonly disabled = input(false, { transform: coerceBooleanProperty });\n\n /** Stepper-assigned index. Set by the parent when contentChildren updates. */\n readonly _index = signal(-1);\n\n private readonly stepper = inject(WR_STEPPER);\n\n protected readonly isActive = computed(() => this._index() === this.stepper.active());\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ViewEncapsulation,\n computed,\n contentChildren,\n effect,\n forwardRef,\n input,\n model,\n} from '@angular/core';\n\nimport { WrStep } from './step';\nimport { WR_STEPPER, type WrStepperContext } from './tokens';\n\n/**\n * Multi-step wizard container. Children are `<wr-step>` components — the\n * stepper renders one numbered header per step (with connectors) and the\n * body of the currently active one.\n *\n * Two-way bind `[(active)]` to the active step index. Set `linear=\"true\"`\n * to forbid jumping past incomplete steps.\n *\n * @example\n * ```html\n * <wr-stepper [(active)]=\"step\" linear>\n * <wr-step label=\"Account\">…</wr-step>\n * <wr-step label=\"Profile\">…</wr-step>\n * <wr-step label=\"Confirm\">…</wr-step>\n * </wr-stepper>\n * ```\n *\n * @see https://ngwr.dev/components/stepper\n */\n@Component({\n selector: 'wr-stepper',\n templateUrl: './stepper.html',\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()' },\n providers: [\n {\n provide: WR_STEPPER,\n // eslint-disable-next-line @angular-eslint/no-forward-ref\n useExisting: forwardRef(() => WrStepper),\n },\n ],\n})\nexport class WrStepper implements WrStepperContext {\n /** Index of the currently visible step. */\n readonly active = model(0);\n\n /** Layout direction. @default 'horizontal' */\n readonly orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /** Lock steps after the latest completed one. @default false */\n readonly linear = input(false, { transform: coerceBooleanProperty });\n\n /**\n * Drop a horizontal stepper to a vertical layout when its own box is too\n * narrow for the row (a container query on its own width, not the\n * viewport — so it adapts inside a narrow column or side panel). No effect\n * when `orientation` is already `vertical`. @default false\n */\n readonly responsive = input(false, { transform: coerceBooleanProperty });\n\n protected readonly steps = contentChildren(WrStep);\n\n protected readonly classes = computed(() => {\n const parts = ['wr-stepper', `wr-stepper--${this.orientation()}`];\n if (this.linear()) parts.push('wr-stepper--linear');\n if (this.responsive()) parts.push('wr-stepper--responsive');\n return parts.join(' ');\n });\n\n constructor() {\n // Push each step's index down so it can compute its own active state.\n effect(() => {\n this.steps().forEach((step, i) => step._index.set(i));\n });\n }\n\n /** Is the step at `index` considered completed? */\n protected isCompleted(index: number): boolean {\n const override = this.steps()[index]?.completed();\n if (override !== null && override !== undefined) return override;\n return index < this.active();\n }\n\n /** Is the step at `index` reachable for direct header clicks? */\n protected isReachable(index: number): boolean {\n if (this.steps()[index]?.disabled()) return false;\n if (!this.linear()) return true;\n if (index <= this.active()) return true;\n for (let i = 0; i < index; i++) {\n if (!this.isCompleted(i)) return false;\n }\n return true;\n }\n\n protected onHeaderClick(index: number): void {\n if (this.isReachable(index)) this.goTo(index);\n }\n\n // Imperative API\n\n goTo(index: number): void {\n const last = this.steps().length - 1;\n if (last < 0) return;\n const clamped = Math.min(Math.max(0, index), last);\n this.active.set(clamped);\n }\n\n next(): void {\n this.goTo(this.active() + 1);\n }\n\n prev(): void {\n this.goTo(this.active() - 1);\n }\n}\n","<ol class=\"wr-stepper__headers\" role=\"list\">\n @for (step of steps(); track $index) {\n <li\n class=\"wr-stepper__header\"\n [class.wr-stepper__header--active]=\"$index === active()\"\n [class.wr-stepper__header--completed]=\"isCompleted($index)\"\n [class.wr-stepper__header--reachable]=\"isReachable($index)\"\n [class.wr-stepper__header--disabled]=\"step.disabled()\"\n >\n <button\n type=\"button\"\n class=\"wr-stepper__header-button\"\n [disabled]=\"!isReachable($index) || step.disabled()\"\n [attr.aria-current]=\"$index === active() ? 'step' : null\"\n (click)=\"onHeaderClick($index)\"\n >\n <span class=\"wr-stepper__indicator\" aria-hidden=\"true\">\n @if (isCompleted($index)) {\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\">\n <path\n d=\"M3 7.5 L6 10.5 L11 4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n } @else {\n {{ $index + 1 }}\n }\n </span>\n <span class=\"wr-stepper__label\">\n {{ step.label() }}\n @if (step.optional()) {\n <small class=\"wr-stepper__optional\">optional</small>\n }\n @if (step.description()) {\n <small class=\"wr-stepper__description\">{{ step.description() }}</small>\n }\n </span>\n </button>\n @if (!$last) {\n <span class=\"wr-stepper__connector\" aria-hidden=\"true\"></span>\n }\n </li>\n }\n</ol>\n\n<div class=\"wr-stepper__body\">\n <ng-content />\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -91,7 +91,7 @@ class WrTableFilter {
91
91
  this.selectionChange.emit(this.items().filter(i => i.selected));
92
92
  }
93
93
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrTableFilter, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrTableFilter, isStandalone: true, selector: "wr-table-filter", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: "<button type=\"button\" class=\"wr-table-filter__trigger\" [wrDropdown]=\"menu\" aria-label=\"Filter column\">\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\"\n />\n </svg>\n @if (selectedCount() > 0) {\n <span class=\"wr-table-filter__count\">{{ selectedCount() }}</span>\n }\n</button>\n\n<wr-dropdown-menu #menu>\n <div class=\"wr-table-filter__panel\">\n <input\n class=\"wr-table-filter__search\"\n type=\"search\"\n placeholder=\"Search\"\n [value]=\"query()\"\n (input)=\"onSearchInput($event)\"\n />\n\n <div class=\"wr-table-filter__list\">\n @for (item of visible(); track item.value) {\n <button\n type=\"button\"\n class=\"wr-table-filter__item\"\n [class.wr-table-filter__item--selected]=\"item.selected\"\n (click)=\"onToggle(item)\"\n >\n <span class=\"wr-table-filter__check\">\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </span>\n <span class=\"wr-table-filter__title\">{{ item.title }}</span>\n </button>\n } @empty {\n <div class=\"wr-table-filter__empty\">No matches</div>\n }\n </div>\n\n @if (selectedCount() > 0) {\n <button type=\"button\" class=\"wr-table-filter__reset\" (click)=\"onReset()\">Reset</button>\n }\n </div>\n</wr-dropdown-menu>\n", dependencies: [{ kind: "directive", type: WrDropdown, selector: "[wrDropdown]", inputs: ["wrDropdown", "trigger", "position"], outputs: ["opened", "closed"] }, { kind: "component", type: WrDropdownMenu, selector: "wr-dropdown-menu", exportAs: ["wrDropdownMenu"] }], encapsulation: i0.ViewEncapsulation.None });
94
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrTableFilter, isStandalone: true, selector: "wr-table-filter", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { selectionChange: "selectionChange" }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: "<button type=\"button\" class=\"wr-table-filter__trigger\" [wrDropdown]=\"menu\" aria-label=\"Filter column\">\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\"\n />\n </svg>\n @if (selectedCount() > 0) {\n <span class=\"wr-table-filter__count\">{{ selectedCount() }}</span>\n }\n</button>\n\n<wr-dropdown-menu #menu>\n <div class=\"wr-table-filter__panel\">\n <input\n class=\"wr-table-filter__search\"\n type=\"search\"\n placeholder=\"Search\"\n [value]=\"query()\"\n (input)=\"onSearchInput($event)\"\n />\n\n <div class=\"wr-table-filter__list\">\n @for (item of visible(); track item.value) {\n <button\n type=\"button\"\n class=\"wr-table-filter__item\"\n [class.wr-table-filter__item--selected]=\"item.selected\"\n (click)=\"onToggle(item)\"\n >\n <span class=\"wr-table-filter__check\">\n <svg\n class=\"wr-icon__svg\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </span>\n <span class=\"wr-table-filter__title\">{{ item.title }}</span>\n </button>\n } @empty {\n <div class=\"wr-table-filter__empty\">No matches</div>\n }\n </div>\n\n @if (selectedCount() > 0) {\n <button type=\"button\" class=\"wr-table-filter__reset\" (click)=\"onReset()\">Reset</button>\n }\n </div>\n</wr-dropdown-menu>\n", dependencies: [{ kind: "directive", type: WrDropdown, selector: "[wrDropdown]", inputs: ["wrDropdown", "trigger", "position", "responsive"], outputs: ["opened", "closed"] }, { kind: "component", type: WrDropdownMenu, selector: "wr-dropdown-menu", exportAs: ["wrDropdownMenu"] }], encapsulation: i0.ViewEncapsulation.None });
95
95
  }
96
96
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrTableFilter, decorators: [{
97
97
  type: Component,
@@ -172,6 +172,12 @@ class WrTable {
172
172
  ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
173
173
  /** Show the loading spinner overlay. @default false */
174
174
  loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
175
+ /**
176
+ * Collapse each row to a labelled card when the table's own box is too narrow
177
+ * for columns (a container query on its own width, not the viewport). Every
178
+ * cell shows its column title as a label. @default false
179
+ */
180
+ responsive = input(false, { ...(ngDevMode ? { debugName: "responsive" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
175
181
  /** Two-way bindable sort array. Order in array = application order. */
176
182
  sort = model([], /* @ts-ignore */
177
183
  ...(ngDevMode ? [{ debugName: "sort" }] : /* istanbul ignore next */ []));
@@ -254,12 +260,12 @@ class WrTable {
254
260
  return this.cellMap().get(String(key));
255
261
  }
256
262
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
257
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrTable, isStandalone: true, selector: "wr-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filterChange: "filterChange", page: "pageChange" }, host: { classAttribute: "wr-table" }, queries: [{ propertyName: "cellTemplates", predicate: WrTableCell, isSignal: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"wr-table__loading\">\n <wr-spinner size=\"lg\" />\n </div>\n}\n\n<div class=\"wr-table__scroll\">\n <table class=\"wr-table__table\">\n <thead>\n <tr>\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <th class=\"wr-table__th\">\n <div class=\"wr-table__th-inner\">\n <span class=\"wr-table__title\">{{ entry.value.title }}</span>\n\n @if (entry.value.sortable) {\n <button\n type=\"button\"\n class=\"wr-table__sort-btn\"\n aria-label=\"Sort column\"\n (click)=\"cycleSort(entry.key)\"\n >\n <wr-table-sort [direction]=\"directionFor(entry.key)\" />\n </button>\n }\n\n @if (entry.value.filterItems; as filterItems) {\n @if (filterItems.length) {\n <wr-table-filter [items]=\"filterItems\" (selectionChange)=\"onFilter(entry.key, $event)\" />\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (visibleItems(); as rows) {\n @for (row of rows; track $index) {\n <tr class=\"wr-table__tr\">\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <td class=\"wr-table__td\">\n @if (templateFor(entry.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, entry.key, entry.value)\"\n />\n } @else {\n {{ getValue(row, entry.key) }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"wr-table__empty\" [attr.colspan]=\"(columns() | keyvalue).length\">No data</td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (showPager()) {\n <div class=\"wr-table__pager\">\n <wr-pagination [(currentPage)]=\"page\" [pageSize]=\"pageSize()\" [total]=\"resolvedTotal()\" />\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: WrPagination, selector: "wr-pagination", inputs: ["currentPage", "pageSize", "total", "pageSizeOptions", "showSizeChanger", "showTotal", "align", "size", "shape", "disabled", "ofLabel", "prevLabel", "nextLabel", "itemsPerPageLabel"], outputs: ["currentPageChange", "pageSizeChange"] }, { kind: "component", type: WrSpinner, selector: "wr-spinner", inputs: ["size"] }, { kind: "component", type: WrTableSort, selector: "wr-table-sort", inputs: ["direction"] }, { kind: "component", type: WrTableFilter, selector: "wr-table-filter", inputs: ["items"], outputs: ["selectionChange"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None });
263
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: WrTable, isStandalone: true, selector: "wr-table", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null }, sort: { classPropertyName: "sort", publicName: "sort", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, page: { classPropertyName: "page", publicName: "page", isSignal: true, isRequired: false, transformFunction: null }, totalItems: { classPropertyName: "totalItems", publicName: "totalItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sort: "sortChange", filterChange: "filterChange", page: "pageChange" }, host: { properties: { "class.wr-table--responsive": "responsive()" }, classAttribute: "wr-table" }, queries: [{ propertyName: "cellTemplates", predicate: WrTableCell, isSignal: true }], ngImport: i0, template: "@if (loading()) {\n <div class=\"wr-table__loading\">\n <wr-spinner size=\"lg\" />\n </div>\n}\n\n<div class=\"wr-table__scroll\">\n <table class=\"wr-table__table\">\n <thead>\n <tr>\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <th class=\"wr-table__th\">\n <div class=\"wr-table__th-inner\">\n <span class=\"wr-table__title\">{{ entry.value.title }}</span>\n\n @if (entry.value.sortable) {\n <button\n type=\"button\"\n class=\"wr-table__sort-btn\"\n aria-label=\"Sort column\"\n (click)=\"cycleSort(entry.key)\"\n >\n <wr-table-sort [direction]=\"directionFor(entry.key)\" />\n </button>\n }\n\n @if (entry.value.filterItems; as filterItems) {\n @if (filterItems.length) {\n <wr-table-filter [items]=\"filterItems\" (selectionChange)=\"onFilter(entry.key, $event)\" />\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (visibleItems(); as rows) {\n @for (row of rows; track $index) {\n <tr class=\"wr-table__tr\">\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <td class=\"wr-table__td\" [attr.data-label]=\"entry.value.title\">\n @if (templateFor(entry.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, entry.key, entry.value)\"\n />\n } @else {\n {{ getValue(row, entry.key) }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"wr-table__empty\" [attr.colspan]=\"(columns() | keyvalue).length\">No data</td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (showPager()) {\n <div class=\"wr-table__pager\">\n <wr-pagination [(currentPage)]=\"page\" [pageSize]=\"pageSize()\" [total]=\"resolvedTotal()\" />\n </div>\n}\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: WrPagination, selector: "wr-pagination", inputs: ["currentPage", "pageSize", "total", "pageSizeOptions", "showSizeChanger", "showTotal", "align", "size", "shape", "disabled", "responsive", "ofLabel", "prevLabel", "nextLabel", "itemsPerPageLabel"], outputs: ["currentPageChange", "pageSizeChange"] }, { kind: "component", type: WrSpinner, selector: "wr-spinner", inputs: ["size"] }, { kind: "component", type: WrTableSort, selector: "wr-table-sort", inputs: ["direction"] }, { kind: "component", type: WrTableFilter, selector: "wr-table-filter", inputs: ["items"], outputs: ["selectionChange"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None });
258
264
  }
259
265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: WrTable, decorators: [{
260
266
  type: Component,
261
- args: [{ selector: 'wr-table', encapsulation: ViewEncapsulation.None, host: { class: 'wr-table' }, imports: [NgTemplateOutlet, KeyValuePipe, WrPagination, WrSpinner, WrTableSort, WrTableFilter], template: "@if (loading()) {\n <div class=\"wr-table__loading\">\n <wr-spinner size=\"lg\" />\n </div>\n}\n\n<div class=\"wr-table__scroll\">\n <table class=\"wr-table__table\">\n <thead>\n <tr>\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <th class=\"wr-table__th\">\n <div class=\"wr-table__th-inner\">\n <span class=\"wr-table__title\">{{ entry.value.title }}</span>\n\n @if (entry.value.sortable) {\n <button\n type=\"button\"\n class=\"wr-table__sort-btn\"\n aria-label=\"Sort column\"\n (click)=\"cycleSort(entry.key)\"\n >\n <wr-table-sort [direction]=\"directionFor(entry.key)\" />\n </button>\n }\n\n @if (entry.value.filterItems; as filterItems) {\n @if (filterItems.length) {\n <wr-table-filter [items]=\"filterItems\" (selectionChange)=\"onFilter(entry.key, $event)\" />\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (visibleItems(); as rows) {\n @for (row of rows; track $index) {\n <tr class=\"wr-table__tr\">\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <td class=\"wr-table__td\">\n @if (templateFor(entry.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, entry.key, entry.value)\"\n />\n } @else {\n {{ getValue(row, entry.key) }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"wr-table__empty\" [attr.colspan]=\"(columns() | keyvalue).length\">No data</td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (showPager()) {\n <div class=\"wr-table__pager\">\n <wr-pagination [(currentPage)]=\"page\" [pageSize]=\"pageSize()\" [total]=\"resolvedTotal()\" />\n </div>\n}\n" }]
262
- }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], totalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalItems", required: false }] }], cellTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => WrTableCell), { isSignal: true }] }] } });
267
+ args: [{ selector: 'wr-table', encapsulation: ViewEncapsulation.None, host: { class: 'wr-table', '[class.wr-table--responsive]': 'responsive()' }, imports: [NgTemplateOutlet, KeyValuePipe, WrPagination, WrSpinner, WrTableSort, WrTableFilter], template: "@if (loading()) {\n <div class=\"wr-table__loading\">\n <wr-spinner size=\"lg\" />\n </div>\n}\n\n<div class=\"wr-table__scroll\">\n <table class=\"wr-table__table\">\n <thead>\n <tr>\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <th class=\"wr-table__th\">\n <div class=\"wr-table__th-inner\">\n <span class=\"wr-table__title\">{{ entry.value.title }}</span>\n\n @if (entry.value.sortable) {\n <button\n type=\"button\"\n class=\"wr-table__sort-btn\"\n aria-label=\"Sort column\"\n (click)=\"cycleSort(entry.key)\"\n >\n <wr-table-sort [direction]=\"directionFor(entry.key)\" />\n </button>\n }\n\n @if (entry.value.filterItems; as filterItems) {\n @if (filterItems.length) {\n <wr-table-filter [items]=\"filterItems\" (selectionChange)=\"onFilter(entry.key, $event)\" />\n }\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n\n <tbody>\n @if (visibleItems(); as rows) {\n @for (row of rows; track $index) {\n <tr class=\"wr-table__tr\">\n @for (entry of columns() | keyvalue: keepOrder; track entry.key) {\n <td class=\"wr-table__td\" [attr.data-label]=\"entry.value.title\">\n @if (templateFor(entry.key); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"cellContext(row, entry.key, entry.value)\"\n />\n } @else {\n {{ getValue(row, entry.key) }}\n }\n </td>\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"wr-table__empty\" [attr.colspan]=\"(columns() | keyvalue).length\">No data</td>\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n@if (showPager()) {\n <div class=\"wr-table__pager\">\n <wr-pagination [(currentPage)]=\"page\" [pageSize]=\"pageSize()\" [total]=\"resolvedTotal()\" />\n </div>\n}\n" }]
268
+ }], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], sort: [{ type: i0.Input, args: [{ isSignal: true, alias: "sort", required: false }] }, { type: i0.Output, args: ["sortChange"] }], filterChange: [{ type: i0.Output, args: ["filterChange"] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], page: [{ type: i0.Input, args: [{ isSignal: true, alias: "page", required: false }] }, { type: i0.Output, args: ["pageChange"] }], totalItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "totalItems", required: false }] }], cellTemplates: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => WrTableCell), { isSignal: true }] }] } });
263
269
 
264
270
  /**
265
271
  * Generated bundle index. Do not edit.