ngwr 14.0.1 → 14.1.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.
@@ -3,6 +3,8 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
3
  import { isPlatformBrowser } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
5
  import { input, model, output, signal, viewChild, computed, inject, DestroyRef, PLATFORM_ID, effect, afterNextRender, ViewEncapsulation, Component } from '@angular/core';
6
+ import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { skip, debounce, timer } from 'rxjs';
6
8
  import { WrHotkey } from 'ngwr/hotkey';
7
9
  import { useI18nText, readI18nText } from 'ngwr/i18n';
8
10
  import { WrIcon } from 'ngwr/icon';
@@ -78,8 +80,15 @@ class WrCommandPalette {
78
80
  /** Text shown when no items match. Falls back to `commandPalette.noResults`. */
79
81
  emptyText = input(null, /* @ts-ignore */
80
82
  ...(ngDevMode ? [{ debugName: "emptyText" }] : /* istanbul ignore next */ []));
83
+ /**
84
+ * Overrides the `commandPalette.loading` catalog string, shown instead of
85
+ * {@link emptyText} while {@link loading} is true.
86
+ */
87
+ loadingText = input(null, /* @ts-ignore */
88
+ ...(ngDevMode ? [{ debugName: "loadingText" }] : /* istanbul ignore next */ []));
81
89
  resolvedPlaceholder = useI18nText(this.placeholder, 'commandPalette.placeholder', 'Type a command or search…');
82
90
  resolvedEmpty = useI18nText(this.emptyText, 'commandPalette.noResults', 'No results');
91
+ resolvedLoading = useI18nText(this.loadingText, 'commandPalette.loading', 'Searching…');
83
92
  /**
84
93
  * The key-cap chip beside the search field. It was the literal `esc` in the
85
94
  * template — the one string on this component no catalog could reach, so a
@@ -98,8 +107,48 @@ class WrCommandPalette {
98
107
  responsive = input(undefined, { ...(ngDevMode ? { debugName: "responsive" } : /* istanbul ignore next */ {}), transform: (v) => (v == null ? undefined : coerceBooleanProperty(v)) });
99
108
  /** Fires when the user commits an item (Enter / click). */
100
109
  picked = output();
101
- query = signal('', /* @ts-ignore */
110
+ /**
111
+ * The search text. Two-way, so a host can seed it, clear it, or read what the
112
+ * user is looking for — the palette used to keep this to itself, which is what
113
+ * made it impossible to back with anything but a static `items` array.
114
+ *
115
+ * Writing it does NOT re-run a host's search on its own: the debounced
116
+ * {@link searchChange} output is what fires, on exactly the cadence
117
+ * {@link debounceMs} sets.
118
+ */
119
+ query = model('', /* @ts-ignore */
102
120
  ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
121
+ /**
122
+ * The item list is already scoped to the query upstream — skip the built-in
123
+ * client-side filter. Set it when `[items]` is fed from a server via the
124
+ * {@link searchChange} output.
125
+ *
126
+ * Without this, a backend that ranks or tolerates typos (returning rows whose
127
+ * labels do not literally contain the query) would have those rows hidden
128
+ * again on the client — the same rule `wr-select` follows, and the same
129
+ * reason. @default false
130
+ */
131
+ serverSearch = input(false, { ...(ngDevMode ? { debugName: "serverSearch" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
132
+ /**
133
+ * A host-driven search is in flight. Swaps the empty row for
134
+ * {@link loadingText} — an async palette that says "No results" between every
135
+ * keystroke and its answer is stating something false. @default false
136
+ */
137
+ loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: coerceBooleanProperty });
138
+ /**
139
+ * How long the query must settle before {@link searchChange} fires, in ms.
140
+ * A search request per keystroke is what exhausts a metered search backend:
141
+ * typing `select` is six requests at 0 and roughly one at 250. @default 250
142
+ */
143
+ debounceMs = input(250, { ...(ngDevMode ? { debugName: "debounceMs" } : /* istanbul ignore next */ {}), transform: (v) => Math.max(0, Number(v) || 0) });
144
+ /**
145
+ * The settled query. This is the hook for a server-backed palette: dispatch
146
+ * on it, then feed the result into `[items]` with `[serverSearch]` set.
147
+ *
148
+ * Fires on the {@link debounceMs} cadence, NOT per keystroke — `queryChange`
149
+ * is the per-keystroke signal if that is what you want.
150
+ */
151
+ searchChange = output();
103
152
  activeIndex = signal(0, /* @ts-ignore */
104
153
  ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
105
154
  /** Whether the current opening is presented full-screen. Decided on open. */
@@ -146,8 +195,21 @@ class WrCommandPalette {
146
195
  * and holds it, so that is retained DOM, not just a stray object.
147
196
  */
148
197
  destroyed = false;
198
+ /** Whether this palette filters `items` itself. */
199
+ clientFilter = computed(() => !this.serverSearch(), /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "clientFilter" }] : /* istanbul ignore next */ []));
201
+ /**
202
+ * Nothing has been asked yet, so there is nothing to report as missing.
203
+ *
204
+ * A client-filtered palette cannot reach this state — an empty query matches
205
+ * every item, so the list is never empty on open. A server-backed one opens
206
+ * with no items by construction, and saying "No results" before a single
207
+ * keystroke answers a question nobody asked.
208
+ */
209
+ awaitingQuery = computed(() => this.serverSearch() && this.query().trim().length === 0, /* @ts-ignore */
210
+ ...(ngDevMode ? [{ debugName: "awaitingQuery" }] : /* istanbul ignore next */ []));
149
211
  /** Grouped view — what the template renders. */
150
- buckets = computed(() => bucketize(this.items().filter(item => matches(item, this.query()))), /* @ts-ignore */
212
+ buckets = computed(() => bucketize(this.clientFilter() ? this.items().filter(item => matches(item, this.query())) : this.items()), /* @ts-ignore */
151
213
  ...(ngDevMode ? [{ debugName: "buckets" }] : /* istanbul ignore next */ []));
152
214
  /**
153
215
  * Flat list in RENDER order — what keyboard navigation walks, and what every
@@ -160,6 +222,21 @@ class WrCommandPalette {
160
222
  filtered = computed(() => this.buckets().flatMap(bucket => bucket.items), /* @ts-ignore */
161
223
  ...(ngDevMode ? [{ debugName: "filtered" }] : /* istanbul ignore next */ []));
162
224
  constructor() {
225
+ // The settled query, for a host-driven search. `debounce(() => timer(...))`
226
+ // rather than `debounceTime(this.debounceMs())`: this runs in the
227
+ // constructor, where inputs are not bound yet, so reading the input eagerly
228
+ // would pin the delay to the default and ignore `[debounceMs]` for good.
229
+ //
230
+ // `skip(1)` sits BEFORE the debounce so it drops the mount-time replay of
231
+ // the empty query and nothing else. Downstream it would instead drop the
232
+ // first SETTLED emission — and when a fast typist's opening keystrokes
233
+ // coalesce with that initial `''`, the dropped emission is their query.
234
+ //
235
+ // Both rules are `wr-select`'s, arrived at there the hard way; this is the
236
+ // same pipeline minus the async loader, which the palette does not own.
237
+ toObservable(this.query)
238
+ .pipe(skip(1), debounce(() => timer(this.debounceMs())), takeUntilDestroyed(this.destroyRef))
239
+ .subscribe(query => this.searchChange.emit(query));
163
240
  // Bind / re-bind the global trigger whenever the spec changes.
164
241
  effect(() => {
165
242
  this.bindingHandle?.unbind();
@@ -345,12 +422,12 @@ class WrCommandPalette {
345
422
  this.close();
346
423
  }
347
424
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: WrCommandPalette, deps: [], target: i0.ɵɵFactoryTarget.Component });
348
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: WrCommandPalette, isStandalone: true, selector: "wr-command-palette", inputs: { paletteLabel: { classPropertyName: "paletteLabel", publicName: "paletteLabel", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, closeOnPick: { classPropertyName: "closeOnPick", publicName: "closeOnPick", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", picked: "picked" }, viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable \u2014 keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children \u2014 the same rule\n the buckets already follow \u2014 so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (filtered().length === 0) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n", dependencies: [{ kind: "component", type: WrIcon, selector: "wr-icon", inputs: ["name"] }], encapsulation: i0.ViewEncapsulation.None });
425
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: WrCommandPalette, isStandalone: true, selector: "wr-command-palette", inputs: { paletteLabel: { classPropertyName: "paletteLabel", publicName: "paletteLabel", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "trigger", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, emptyText: { classPropertyName: "emptyText", publicName: "emptyText", isSignal: true, isRequired: false, transformFunction: null }, loadingText: { classPropertyName: "loadingText", publicName: "loadingText", isSignal: true, isRequired: false, transformFunction: null }, closeOnPick: { classPropertyName: "closeOnPick", publicName: "closeOnPick", isSignal: true, isRequired: false, transformFunction: null }, responsive: { classPropertyName: "responsive", publicName: "responsive", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, serverSearch: { classPropertyName: "serverSearch", publicName: "serverSearch", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, debounceMs: { classPropertyName: "debounceMs", publicName: "debounceMs", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange", picked: "picked", query: "queryChange", searchChange: "searchChange" }, viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["input"], descendants: true, isSignal: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable \u2014 keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children \u2014 the same rule\n the buckets already follow \u2014 so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (loading()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedLoading() }}</div>\n } @else if (filtered().length === 0 && !awaitingQuery()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n", dependencies: [{ kind: "component", type: WrIcon, selector: "wr-icon", inputs: ["name"] }], encapsulation: i0.ViewEncapsulation.None });
349
426
  }
350
427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: WrCommandPalette, decorators: [{
351
428
  type: Component,
352
- args: [{ selector: 'wr-command-palette', encapsulation: ViewEncapsulation.None, imports: [WrIcon], template: "@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable \u2014 keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children \u2014 the same rule\n the buckets already follow \u2014 so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (filtered().length === 0) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n" }]
353
- }], ctorParameters: () => [], propDecorators: { paletteLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "paletteLabel", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], trigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "trigger", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], closeOnPick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnPick", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], picked: [{ type: i0.Output, args: ["picked"] }], inputEl: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], panelEl: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
429
+ args: [{ selector: 'wr-command-palette', encapsulation: ViewEncapsulation.None, imports: [WrIcon], template: "@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable \u2014 keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children \u2014 the same rule\n the buckets already follow \u2014 so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (loading()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedLoading() }}</div>\n } @else if (filtered().length === 0 && !awaitingQuery()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n" }]
430
+ }], ctorParameters: () => [], propDecorators: { paletteLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "paletteLabel", required: false }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], trigger: [{ type: i0.Input, args: [{ isSignal: true, alias: "trigger", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], emptyText: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyText", required: false }] }], loadingText: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingText", required: false }] }], closeOnPick: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnPick", required: false }] }], responsive: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsive", required: false }] }], picked: [{ type: i0.Output, args: ["picked"] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }, { type: i0.Output, args: ["queryChange"] }], serverSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "serverSearch", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], debounceMs: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceMs", required: false }] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], inputEl: [{ type: i0.ViewChild, args: ['input', { isSignal: true }] }], panelEl: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
354
431
 
355
432
  /**
356
433
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-command-palette.mjs","sources":["../../../projects/lib/command-palette/command-palette.ts","../../../projects/lib/command-palette/command-palette.html","../../../projects/lib/command-palette/ngwr-command-palette.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 { type ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\nimport { type BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n type ElementRef,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\n\nimport { WrHotkey, type WrHotkeyHandle, type WrHotkeySpec } from 'ngwr/hotkey';\nimport { readI18nText, useI18nText } from 'ngwr/i18n';\nimport { WrIcon } from 'ngwr/icon';\nimport { WR_RESPONSIVE_OVERLAYS, wrPresentAsSheet } from 'ngwr/overlay';\nimport { isComposing } from 'ngwr/utils';\n\nimport type { WrCommandItem } from './interfaces';\n\ninterface Bucket {\n readonly title: string | null;\n readonly items: readonly WrCommandItem[];\n}\n\nlet listboxUid = 0;\n\nfunction bucketize(items: readonly WrCommandItem[]): readonly Bucket[] {\n const map = new Map<string | null, WrCommandItem[]>();\n for (const item of items) {\n const key = item.group ?? null;\n const bucket = map.get(key);\n if (bucket) bucket.push(item);\n else map.set(key, [item]);\n }\n return [...map.entries()].map(([title, items]) => ({ title, items }));\n}\n\nfunction matches(item: WrCommandItem, query: string): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n if (item.label.toLowerCase().includes(q)) return true;\n if (item.description?.toLowerCase().includes(q)) return true;\n if (item.group?.toLowerCase().includes(q)) return true;\n if (item.keywords?.some(k => k.toLowerCase().includes(q))) return true;\n return false;\n}\n\n/**\n * `⌘K`-style command palette — a centred modal with a search input and\n * filtered list of actions. Items can be grouped, have icons, descriptions,\n * and visual shortcut hints.\n *\n * Drop one at the root of the app, pass it the list of commands, and bind\n * a global hotkey (default `'mod+k'`). Use `[(open)]` for controlled\n * visibility, or let it manage itself.\n *\n * @example\n * ```html\n * <wr-command-palette [items]=\"commands\" trigger=\"mod+k\" (picked)=\"onPicked($event)\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/command-palette\n */\n@Component({\n selector: 'wr-command-palette',\n templateUrl: './command-palette.html',\n encapsulation: ViewEncapsulation.None,\n imports: [WrIcon],\n})\nexport class WrCommandPalette {\n /** Accessible name. Falls back to `commandPalette.label`, then `'Command palette'`. */\n readonly paletteLabel = input<string | null>(null);\n\n protected readonly resolvedPaletteLabel = useI18nText(this.paletteLabel, 'commandPalette.label', 'Command palette');\n\n /** Items shown in the palette. */\n readonly items = input<readonly WrCommandItem[]>([]);\n\n /** Controlled open state (two-way bindable). @default false */\n readonly open = model(false);\n\n /** Global hotkey that opens the palette. `null` disables auto-binding. @default 'mod+k' */\n readonly trigger = input<WrHotkeySpec | null>('mod+k');\n\n /** Search input placeholder. Falls back to `commandPalette.placeholder`. */\n readonly placeholder = input<string | null>(null);\n\n /** Text shown when no items match. Falls back to `commandPalette.noResults`. */\n readonly emptyText = input<string | null>(null);\n\n protected readonly resolvedPlaceholder = useI18nText(\n this.placeholder,\n 'commandPalette.placeholder',\n 'Type a command or search…'\n );\n protected readonly resolvedEmpty = useI18nText(this.emptyText, 'commandPalette.noResults', 'No results');\n\n /**\n * The key-cap chip beside the search field. It was the literal `esc` in the\n * template — the one string on this component no catalog could reach, so a\n * fully Russian palette still hinted in English.\n */\n protected readonly resolvedEscHint = readI18nText('commandPalette.escHint', 'esc');\n\n /** Auto-close on `(picked)`. Set false to keep open. @default true */\n readonly closeOnPick = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Present the palette full-screen on small viewports instead of a centred\n * modal. `undefined` follows the app-wide `provideWrResponsiveOverlays()`\n * setting; `true`/`false` overrides it. The palette docks to the top (it\n * auto-focuses its input, so the on-screen keyboard stays clear).\n * @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 /** Fires when the user commits an item (Enter / click). */\n readonly picked = output<WrCommandItem>();\n\n protected readonly query = signal('');\n protected readonly activeIndex = signal(0);\n\n /** Whether the current opening is presented full-screen. Decided on open. */\n protected readonly presentAsSheet = signal(false);\n protected readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('input');\n protected readonly panelEl = viewChild<ElementRef<HTMLElement>>('panel');\n\n /** Listbox id (referenced by the input's `aria-controls`). */\n protected readonly listboxId = `wr-command-palette-listbox-${++listboxUid}`;\n\n /** @internal Build a stable option id for a given flat index. */\n protected optionId(i: number): string {\n return `${this.listboxId}-opt-${i}`;\n }\n\n /**\n * A `role=\"listbox\"` may only own `option` and `group` children, so a titled\n * bucket becomes a labelled group and an untitled one drops out of the tree\n * entirely — leaving its options as the listbox's own children rather than as\n * role-less wrappers ARIA has no rule for.\n */\n protected groupTitleId(index: number): string {\n return `${this.listboxId}-group-${index}`;\n }\n\n /** Id of the active option for `aria-activedescendant`. */\n protected readonly activeOptionId = computed<string | null>(() => {\n const i = this.activeIndex();\n return i >= 0 && i < this.filtered().length ? this.optionId(i) : null;\n });\n\n private readonly hotkeys = inject(WrHotkey);\n private readonly responsiveConfig = inject(WR_RESPONSIVE_OVERLAYS);\n private readonly destroyRef = inject(DestroyRef);\n private readonly focusTrapFactory = inject(ConfigurableFocusTrapFactory);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private bindingHandle: WrHotkeyHandle | null = null;\n private focusTrap: ConfigurableFocusTrap | null = null;\n private previouslyFocused: HTMLElement | null = null;\n\n /**\n * The open branch below builds the trap inside a `queueMicrotask`, so a\n * palette destroyed while open — in the same task that opened it — runs its\n * destroy hook first and then constructs a fresh trap nothing will ever\n * destroy. A `ConfigurableFocusTrap` plants two anchor elements in the panel\n * and holds it, so that is retained DOM, not just a stray object.\n */\n private destroyed = false;\n\n /** Grouped view — what the template renders. */\n protected readonly buckets = computed<readonly Bucket[]>(() =>\n bucketize(this.items().filter(item => matches(item, this.query())))\n );\n\n /**\n * Flat list in RENDER order — what keyboard navigation walks, and what every\n * index in this component means. Derived FROM the buckets rather than from the\n * filter: `bucketize` collects each group as it first appears, so a flat\n * source-order list disagrees with the screen the moment two groups interleave.\n * It did, and one ArrowDown moved the highlight two rows while Enter fired the\n * command below the one that looked selected.\n */\n protected readonly filtered = computed<readonly WrCommandItem[]>(() =>\n this.buckets().flatMap(bucket => bucket.items)\n );\n\n constructor() {\n // Bind / re-bind the global trigger whenever the spec changes.\n effect(() => {\n this.bindingHandle?.unbind();\n const spec = this.trigger();\n if (!spec) return;\n this.bindingHandle = this.hotkeys.bind(\n spec,\n event => {\n // CLAIM the chord, and the distinction is the whole point: the\n // `preventDefault` OPTION suppresses the browser, while a handler\n // calling `preventDefault()` is how `WrHotkey` is documented to learn\n // that a binding took the chord and the lower-priority ones should be\n // skipped. A palette that only toggled left the chord unclaimed, so\n // two palettes on one page would both open on `mod+k`.\n event.preventDefault();\n this.open.update(v => !v);\n },\n { allowInInput: true }\n );\n });\n\n // Reset query + active index whenever we open.\n effect(() => {\n if (!this.open()) return;\n this.query.set('');\n this.activeIndex.set(0);\n });\n\n // Sheet presentation, kept OUT of the reset above: reading `responsive()` there\n // made the reset depend on it, so a `[responsive]` bound to a signal that\n // flipped while the palette was open wiped whatever the user had typed.\n effect(() => {\n this.presentAsSheet.set(wrPresentAsSheet(this.responsive(), this.responsiveConfig));\n });\n\n // Focus trap + restore.\n effect(() => {\n if (!this.isBrowser) return;\n if (this.open()) {\n const active = document.activeElement;\n this.previouslyFocused = active instanceof HTMLElement ? active : null;\n queueMicrotask(() => {\n if (this.destroyed) return;\n const host = this.panelEl()?.nativeElement;\n if (!host) return;\n this.focusTrap?.destroy();\n this.focusTrap = this.focusTrapFactory.create(host);\n void this.focusTrap.focusInitialElementWhenReady();\n });\n } else {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n const restore = this.previouslyFocused;\n this.previouslyFocused = null;\n if (restore && typeof restore.focus === 'function') restore.focus();\n }\n });\n\n afterNextRender(() => {\n if (this.open()) this.inputEl()?.nativeElement.focus();\n });\n\n // Auto-focus the input when opened.\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => this.inputEl()?.nativeElement.focus());\n });\n\n // Clamp the active index when the filtered list shrinks.\n effect(() => {\n const max = Math.max(0, this.filtered().length - 1);\n if (this.activeIndex() > max) this.activeIndex.set(max);\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.bindingHandle?.unbind();\n // The trap is torn down in the close branch of the effect above, which never\n // runs when the component itself goes away while still open — leaving a live\n // trap holding the removed panel and its document listeners.\n this.focusTrap?.destroy();\n this.focusTrap = null;\n });\n }\n\n // Template handlers\n\n protected onQueryInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n // Every key below belongs to the input method while it is converting: Enter\n // accepts a candidate, Escape cancels the conversion, the arrows walk the\n // candidate list. Acting on them closed the palette — and threw the query\n // away — the first time a Japanese user pressed Escape to undo a reading.\n if (isComposing(event)) return;\n\n const list = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (list.length > 0) this.activeIndex.set((this.activeIndex() + 1) % list.length);\n this.revealActive();\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (list.length > 0) this.activeIndex.set((this.activeIndex() - 1 + list.length) % list.length);\n this.revealActive();\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n this.revealActive();\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(Math.max(0, list.length - 1));\n this.revealActive();\n break;\n case 'Enter': {\n event.preventDefault();\n const item = list[this.activeIndex()];\n if (item) this.commit(item);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n default:\n break;\n }\n }\n\n protected onBackdropClick(): void {\n this.close();\n }\n\n protected onItemClick(item: WrCommandItem, event: MouseEvent): void {\n event.preventDefault();\n this.commit(item);\n }\n\n protected onItemHover(item: WrCommandItem): void {\n const i = this.filtered().indexOf(item);\n if (i >= 0) this.activeIndex.set(i);\n }\n\n /** Flat index of an item within the filtered list — for highlight checks. */\n protected indexOf(item: WrCommandItem): number {\n return this.filtered().indexOf(item);\n }\n\n // Public API\n\n /** Open the palette. */\n show(): void {\n this.open.set(true);\n }\n\n /** Close the palette. */\n close(): void {\n this.open.set(false);\n }\n\n // Internals\n\n /**\n * Keep the highlighted option on screen. The body is a fixed-height scroller and\n * the options are not focusable, so nothing moves it on the browser's behalf —\n * arrow keys walked the highlight straight off the bottom and out of sight.\n * Keyboard only: doing it on hover would fight the pointer that caused it.\n * `wr-select` and `wr-tree` keep the same promise through their own\n * `ensureVisible`; theirs is index maths because they are virtualized.\n */\n private revealActive(): void {\n if (!this.isBrowser) return;\n const id = this.activeOptionId();\n if (!id) return;\n // Ids are position-based and stable, so the element is findable straight away —\n // no need to wait for change detection to re-mark the active row.\n this.panelEl()?.nativeElement.querySelector<HTMLElement>(`#${id}`)?.scrollIntoView({ block: 'nearest' });\n }\n\n private commit(item: WrCommandItem): void {\n item.action?.();\n this.picked.emit(item);\n if (this.closeOnPick()) this.close();\n }\n}\n","@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable — keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children — the same rule\n the buckets already follow — so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (filtered().length === 0) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\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-command-palette.mjs","sources":["../../../projects/lib/command-palette/command-palette.ts","../../../projects/lib/command-palette/command-palette.html","../../../projects/lib/command-palette/ngwr-command-palette.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 { type ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\nimport { type BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Component,\n DestroyRef,\n type ElementRef,\n PLATFORM_ID,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\n\nimport { debounce, skip, timer } from 'rxjs';\n\nimport { WrHotkey, type WrHotkeyHandle, type WrHotkeySpec } from 'ngwr/hotkey';\nimport { readI18nText, useI18nText } from 'ngwr/i18n';\nimport { WrIcon } from 'ngwr/icon';\nimport { WR_RESPONSIVE_OVERLAYS, wrPresentAsSheet } from 'ngwr/overlay';\nimport { isComposing } from 'ngwr/utils';\n\nimport type { WrCommandItem } from './interfaces';\n\ninterface Bucket {\n readonly title: string | null;\n readonly items: readonly WrCommandItem[];\n}\n\nlet listboxUid = 0;\n\nfunction bucketize(items: readonly WrCommandItem[]): readonly Bucket[] {\n const map = new Map<string | null, WrCommandItem[]>();\n for (const item of items) {\n const key = item.group ?? null;\n const bucket = map.get(key);\n if (bucket) bucket.push(item);\n else map.set(key, [item]);\n }\n return [...map.entries()].map(([title, items]) => ({ title, items }));\n}\n\nfunction matches(item: WrCommandItem, query: string): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n if (item.label.toLowerCase().includes(q)) return true;\n if (item.description?.toLowerCase().includes(q)) return true;\n if (item.group?.toLowerCase().includes(q)) return true;\n if (item.keywords?.some(k => k.toLowerCase().includes(q))) return true;\n return false;\n}\n\n/**\n * `⌘K`-style command palette — a centred modal with a search input and\n * filtered list of actions. Items can be grouped, have icons, descriptions,\n * and visual shortcut hints.\n *\n * Drop one at the root of the app, pass it the list of commands, and bind\n * a global hotkey (default `'mod+k'`). Use `[(open)]` for controlled\n * visibility, or let it manage itself.\n *\n * @example\n * ```html\n * <wr-command-palette [items]=\"commands\" trigger=\"mod+k\" (picked)=\"onPicked($event)\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/command-palette\n */\n@Component({\n selector: 'wr-command-palette',\n templateUrl: './command-palette.html',\n encapsulation: ViewEncapsulation.None,\n imports: [WrIcon],\n})\nexport class WrCommandPalette {\n /** Accessible name. Falls back to `commandPalette.label`, then `'Command palette'`. */\n readonly paletteLabel = input<string | null>(null);\n\n protected readonly resolvedPaletteLabel = useI18nText(this.paletteLabel, 'commandPalette.label', 'Command palette');\n\n /** Items shown in the palette. */\n readonly items = input<readonly WrCommandItem[]>([]);\n\n /** Controlled open state (two-way bindable). @default false */\n readonly open = model(false);\n\n /** Global hotkey that opens the palette. `null` disables auto-binding. @default 'mod+k' */\n readonly trigger = input<WrHotkeySpec | null>('mod+k');\n\n /** Search input placeholder. Falls back to `commandPalette.placeholder`. */\n readonly placeholder = input<string | null>(null);\n\n /** Text shown when no items match. Falls back to `commandPalette.noResults`. */\n readonly emptyText = input<string | null>(null);\n\n /**\n * Overrides the `commandPalette.loading` catalog string, shown instead of\n * {@link emptyText} while {@link loading} is true.\n */\n readonly loadingText = input<string | null>(null);\n\n protected readonly resolvedPlaceholder = useI18nText(\n this.placeholder,\n 'commandPalette.placeholder',\n 'Type a command or search…'\n );\n protected readonly resolvedEmpty = useI18nText(this.emptyText, 'commandPalette.noResults', 'No results');\n protected readonly resolvedLoading = useI18nText(this.loadingText, 'commandPalette.loading', 'Searching…');\n\n /**\n * The key-cap chip beside the search field. It was the literal `esc` in the\n * template — the one string on this component no catalog could reach, so a\n * fully Russian palette still hinted in English.\n */\n protected readonly resolvedEscHint = readI18nText('commandPalette.escHint', 'esc');\n\n /** Auto-close on `(picked)`. Set false to keep open. @default true */\n readonly closeOnPick = input(true, { transform: coerceBooleanProperty });\n\n /**\n * Present the palette full-screen on small viewports instead of a centred\n * modal. `undefined` follows the app-wide `provideWrResponsiveOverlays()`\n * setting; `true`/`false` overrides it. The palette docks to the top (it\n * auto-focuses its input, so the on-screen keyboard stays clear).\n * @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 /** Fires when the user commits an item (Enter / click). */\n readonly picked = output<WrCommandItem>();\n\n /**\n * The search text. Two-way, so a host can seed it, clear it, or read what the\n * user is looking for — the palette used to keep this to itself, which is what\n * made it impossible to back with anything but a static `items` array.\n *\n * Writing it does NOT re-run a host's search on its own: the debounced\n * {@link searchChange} output is what fires, on exactly the cadence\n * {@link debounceMs} sets.\n */\n readonly query = model('');\n\n /**\n * The item list is already scoped to the query upstream — skip the built-in\n * client-side filter. Set it when `[items]` is fed from a server via the\n * {@link searchChange} output.\n *\n * Without this, a backend that ranks or tolerates typos (returning rows whose\n * labels do not literally contain the query) would have those rows hidden\n * again on the client — the same rule `wr-select` follows, and the same\n * reason. @default false\n */\n readonly serverSearch = input(false, { transform: coerceBooleanProperty });\n\n /**\n * A host-driven search is in flight. Swaps the empty row for\n * {@link loadingText} — an async palette that says \"No results\" between every\n * keystroke and its answer is stating something false. @default false\n */\n readonly loading = input(false, { transform: coerceBooleanProperty });\n\n /**\n * How long the query must settle before {@link searchChange} fires, in ms.\n * A search request per keystroke is what exhausts a metered search backend:\n * typing `select` is six requests at 0 and roughly one at 250. @default 250\n */\n readonly debounceMs = input(250, { transform: (v: unknown): number => Math.max(0, Number(v) || 0) });\n\n /**\n * The settled query. This is the hook for a server-backed palette: dispatch\n * on it, then feed the result into `[items]` with `[serverSearch]` set.\n *\n * Fires on the {@link debounceMs} cadence, NOT per keystroke — `queryChange`\n * is the per-keystroke signal if that is what you want.\n */\n readonly searchChange = output<string>();\n\n protected readonly activeIndex = signal(0);\n\n /** Whether the current opening is presented full-screen. Decided on open. */\n protected readonly presentAsSheet = signal(false);\n protected readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('input');\n protected readonly panelEl = viewChild<ElementRef<HTMLElement>>('panel');\n\n /** Listbox id (referenced by the input's `aria-controls`). */\n protected readonly listboxId = `wr-command-palette-listbox-${++listboxUid}`;\n\n /** @internal Build a stable option id for a given flat index. */\n protected optionId(i: number): string {\n return `${this.listboxId}-opt-${i}`;\n }\n\n /**\n * A `role=\"listbox\"` may only own `option` and `group` children, so a titled\n * bucket becomes a labelled group and an untitled one drops out of the tree\n * entirely — leaving its options as the listbox's own children rather than as\n * role-less wrappers ARIA has no rule for.\n */\n protected groupTitleId(index: number): string {\n return `${this.listboxId}-group-${index}`;\n }\n\n /** Id of the active option for `aria-activedescendant`. */\n protected readonly activeOptionId = computed<string | null>(() => {\n const i = this.activeIndex();\n return i >= 0 && i < this.filtered().length ? this.optionId(i) : null;\n });\n\n private readonly hotkeys = inject(WrHotkey);\n private readonly responsiveConfig = inject(WR_RESPONSIVE_OVERLAYS);\n private readonly destroyRef = inject(DestroyRef);\n private readonly focusTrapFactory = inject(ConfigurableFocusTrapFactory);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private bindingHandle: WrHotkeyHandle | null = null;\n private focusTrap: ConfigurableFocusTrap | null = null;\n private previouslyFocused: HTMLElement | null = null;\n\n /**\n * The open branch below builds the trap inside a `queueMicrotask`, so a\n * palette destroyed while open — in the same task that opened it — runs its\n * destroy hook first and then constructs a fresh trap nothing will ever\n * destroy. A `ConfigurableFocusTrap` plants two anchor elements in the panel\n * and holds it, so that is retained DOM, not just a stray object.\n */\n private destroyed = false;\n\n /** Whether this palette filters `items` itself. */\n protected readonly clientFilter = computed(() => !this.serverSearch());\n\n /**\n * Nothing has been asked yet, so there is nothing to report as missing.\n *\n * A client-filtered palette cannot reach this state — an empty query matches\n * every item, so the list is never empty on open. A server-backed one opens\n * with no items by construction, and saying \"No results\" before a single\n * keystroke answers a question nobody asked.\n */\n protected readonly awaitingQuery = computed(() => this.serverSearch() && this.query().trim().length === 0);\n\n /** Grouped view — what the template renders. */\n protected readonly buckets = computed<readonly Bucket[]>(() =>\n bucketize(this.clientFilter() ? this.items().filter(item => matches(item, this.query())) : this.items())\n );\n\n /**\n * Flat list in RENDER order — what keyboard navigation walks, and what every\n * index in this component means. Derived FROM the buckets rather than from the\n * filter: `bucketize` collects each group as it first appears, so a flat\n * source-order list disagrees with the screen the moment two groups interleave.\n * It did, and one ArrowDown moved the highlight two rows while Enter fired the\n * command below the one that looked selected.\n */\n protected readonly filtered = computed<readonly WrCommandItem[]>(() =>\n this.buckets().flatMap(bucket => bucket.items)\n );\n\n constructor() {\n // The settled query, for a host-driven search. `debounce(() => timer(...))`\n // rather than `debounceTime(this.debounceMs())`: this runs in the\n // constructor, where inputs are not bound yet, so reading the input eagerly\n // would pin the delay to the default and ignore `[debounceMs]` for good.\n //\n // `skip(1)` sits BEFORE the debounce so it drops the mount-time replay of\n // the empty query and nothing else. Downstream it would instead drop the\n // first SETTLED emission — and when a fast typist's opening keystrokes\n // coalesce with that initial `''`, the dropped emission is their query.\n //\n // Both rules are `wr-select`'s, arrived at there the hard way; this is the\n // same pipeline minus the async loader, which the palette does not own.\n toObservable(this.query)\n .pipe(\n skip(1),\n debounce(() => timer(this.debounceMs())),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(query => this.searchChange.emit(query));\n\n // Bind / re-bind the global trigger whenever the spec changes.\n effect(() => {\n this.bindingHandle?.unbind();\n const spec = this.trigger();\n if (!spec) return;\n this.bindingHandle = this.hotkeys.bind(\n spec,\n event => {\n // CLAIM the chord, and the distinction is the whole point: the\n // `preventDefault` OPTION suppresses the browser, while a handler\n // calling `preventDefault()` is how `WrHotkey` is documented to learn\n // that a binding took the chord and the lower-priority ones should be\n // skipped. A palette that only toggled left the chord unclaimed, so\n // two palettes on one page would both open on `mod+k`.\n event.preventDefault();\n this.open.update(v => !v);\n },\n { allowInInput: true }\n );\n });\n\n // Reset query + active index whenever we open.\n effect(() => {\n if (!this.open()) return;\n this.query.set('');\n this.activeIndex.set(0);\n });\n\n // Sheet presentation, kept OUT of the reset above: reading `responsive()` there\n // made the reset depend on it, so a `[responsive]` bound to a signal that\n // flipped while the palette was open wiped whatever the user had typed.\n effect(() => {\n this.presentAsSheet.set(wrPresentAsSheet(this.responsive(), this.responsiveConfig));\n });\n\n // Focus trap + restore.\n effect(() => {\n if (!this.isBrowser) return;\n if (this.open()) {\n const active = document.activeElement;\n this.previouslyFocused = active instanceof HTMLElement ? active : null;\n queueMicrotask(() => {\n if (this.destroyed) return;\n const host = this.panelEl()?.nativeElement;\n if (!host) return;\n this.focusTrap?.destroy();\n this.focusTrap = this.focusTrapFactory.create(host);\n void this.focusTrap.focusInitialElementWhenReady();\n });\n } else {\n this.focusTrap?.destroy();\n this.focusTrap = null;\n const restore = this.previouslyFocused;\n this.previouslyFocused = null;\n if (restore && typeof restore.focus === 'function') restore.focus();\n }\n });\n\n afterNextRender(() => {\n if (this.open()) this.inputEl()?.nativeElement.focus();\n });\n\n // Auto-focus the input when opened.\n effect(() => {\n if (!this.open()) return;\n queueMicrotask(() => this.inputEl()?.nativeElement.focus());\n });\n\n // Clamp the active index when the filtered list shrinks.\n effect(() => {\n const max = Math.max(0, this.filtered().length - 1);\n if (this.activeIndex() > max) this.activeIndex.set(max);\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyed = true;\n this.bindingHandle?.unbind();\n // The trap is torn down in the close branch of the effect above, which never\n // runs when the component itself goes away while still open — leaving a live\n // trap holding the removed panel and its document listeners.\n this.focusTrap?.destroy();\n this.focusTrap = null;\n });\n }\n\n // Template handlers\n\n protected onQueryInput(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.activeIndex.set(0);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n // Every key below belongs to the input method while it is converting: Enter\n // accepts a candidate, Escape cancels the conversion, the arrows walk the\n // candidate list. Acting on them closed the palette — and threw the query\n // away — the first time a Japanese user pressed Escape to undo a reading.\n if (isComposing(event)) return;\n\n const list = this.filtered();\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (list.length > 0) this.activeIndex.set((this.activeIndex() + 1) % list.length);\n this.revealActive();\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (list.length > 0) this.activeIndex.set((this.activeIndex() - 1 + list.length) % list.length);\n this.revealActive();\n break;\n case 'Home':\n event.preventDefault();\n this.activeIndex.set(0);\n this.revealActive();\n break;\n case 'End':\n event.preventDefault();\n this.activeIndex.set(Math.max(0, list.length - 1));\n this.revealActive();\n break;\n case 'Enter': {\n event.preventDefault();\n const item = list[this.activeIndex()];\n if (item) this.commit(item);\n break;\n }\n case 'Escape':\n event.preventDefault();\n this.close();\n break;\n default:\n break;\n }\n }\n\n protected onBackdropClick(): void {\n this.close();\n }\n\n protected onItemClick(item: WrCommandItem, event: MouseEvent): void {\n event.preventDefault();\n this.commit(item);\n }\n\n protected onItemHover(item: WrCommandItem): void {\n const i = this.filtered().indexOf(item);\n if (i >= 0) this.activeIndex.set(i);\n }\n\n /** Flat index of an item within the filtered list — for highlight checks. */\n protected indexOf(item: WrCommandItem): number {\n return this.filtered().indexOf(item);\n }\n\n // Public API\n\n /** Open the palette. */\n show(): void {\n this.open.set(true);\n }\n\n /** Close the palette. */\n close(): void {\n this.open.set(false);\n }\n\n // Internals\n\n /**\n * Keep the highlighted option on screen. The body is a fixed-height scroller and\n * the options are not focusable, so nothing moves it on the browser's behalf —\n * arrow keys walked the highlight straight off the bottom and out of sight.\n * Keyboard only: doing it on hover would fight the pointer that caused it.\n * `wr-select` and `wr-tree` keep the same promise through their own\n * `ensureVisible`; theirs is index maths because they are virtualized.\n */\n private revealActive(): void {\n if (!this.isBrowser) return;\n const id = this.activeOptionId();\n if (!id) return;\n // Ids are position-based and stable, so the element is findable straight away —\n // no need to wait for change detection to re-mark the active row.\n this.panelEl()?.nativeElement.querySelector<HTMLElement>(`#${id}`)?.scrollIntoView({ block: 'nearest' });\n }\n\n private commit(item: WrCommandItem): void {\n item.action?.();\n this.picked.emit(item);\n if (this.closeOnPick()) this.close();\n }\n}\n","@if (open()) {\n <div\n class=\"wr-command-palette\"\n [class.wr-command-palette--sheet]=\"presentAsSheet()\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-label]=\"resolvedPaletteLabel()\"\n >\n <!-- Backdrop captures clicks to close. Not focusable — keyboard users use\n Esc on the panel below. -->\n\n <div class=\"wr-command-palette__backdrop\" aria-hidden=\"true\" (click)=\"onBackdropClick()\"></div>\n\n <!-- Keydown is delegated from the search input; tabindex enables Esc when\n the input is unfocused. -->\n <div #panel class=\"wr-command-palette__panel\" tabindex=\"-1\" (keydown)=\"onKeydown($event)\">\n <div class=\"wr-command-palette__search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <circle cx=\"7\" cy=\"7\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"M11 11 L14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n <input\n #input\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"listboxId\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeOptionId() || null\"\n [placeholder]=\"resolvedPlaceholder()\"\n [value]=\"query()\"\n (input)=\"onQueryInput($event)\"\n />\n <kbd class=\"wr-command-palette__hint\">{{ resolvedEscHint() }}</kbd>\n </div>\n\n <!-- The empty row sits OUTSIDE the listbox below, and is a live region.\n A listbox may only own `option` and `group` children — the same rule\n the buckets already follow — so this row inside it was an\n `aria-required-children` critical for every query that matched\n nothing, and an empty listbox on its own is not. `role=\"status\"` also\n gets the message spoken while focus stays in the search input. -->\n @if (loading()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedLoading() }}</div>\n } @else if (filtered().length === 0 && !awaitingQuery()) {\n <div class=\"wr-command-palette__empty\" role=\"status\">{{ resolvedEmpty() }}</div>\n }\n\n <div class=\"wr-command-palette__body\" role=\"listbox\" [attr.id]=\"listboxId\">\n @for (bucket of buckets(); track bucket.title; let groupIndex = $index) {\n <!-- A listbox may only own `option` and `group` children, so a titled\n bucket is a labelled group and an untitled one leaves the tree with\n `role=\"none\"`, promoting its options to the listbox's own. -->\n <div\n class=\"wr-command-palette__group\"\n [attr.role]=\"bucket.title ? 'group' : 'none'\"\n [attr.aria-labelledby]=\"bucket.title ? groupTitleId(groupIndex) : null\"\n >\n @if (bucket.title) {\n <div class=\"wr-command-palette__group-title\" [attr.id]=\"groupTitleId(groupIndex)\">\n {{ bucket.title }}\n </div>\n }\n @for (item of bucket.items; track item.id) {\n <div\n class=\"wr-command-palette__option\"\n role=\"option\"\n [attr.id]=\"optionId(indexOf(item))\"\n [class.wr-command-palette__option--active]=\"indexOf(item) === activeIndex()\"\n [attr.aria-selected]=\"indexOf(item) === activeIndex()\"\n (mouseenter)=\"onItemHover(item)\"\n (mousedown)=\"onItemClick(item, $event)\"\n >\n @if (item.icon) {\n <wr-icon class=\"wr-command-palette__option-icon\" [name]=\"item.icon\" size=\"16\" />\n } @else {\n <span class=\"wr-command-palette__option-icon\" aria-hidden=\"true\"></span>\n }\n <div class=\"wr-command-palette__option-body\">\n <div class=\"wr-command-palette__option-label\">{{ item.label }}</div>\n @if (item.description) {\n <div class=\"wr-command-palette__option-description\">{{ item.description }}</div>\n }\n </div>\n @if (item.shortcut) {\n <kbd class=\"wr-command-palette__option-shortcut\">{{ item.shortcut }}</kbd>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -159,6 +159,10 @@ const wrEn = {
159
159
  label: 'Command palette',
160
160
  placeholder: 'Type a command or search…',
161
161
  noResults: 'No results',
162
+ // Shown INSTEAD of `noResults` while a host-driven search is in flight.
163
+ // Without it an async palette reads "No results" between every keystroke
164
+ // and its answer, which states something false about the query.
165
+ loading: 'Searching…',
162
166
  // The key-cap chip in the search row. A key NAME rather than prose, so most
163
167
  // locales will leave it alone — but a keyboard whose key is not labelled
164
168
  // "esc" had no way to say so.
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-i18n-en.mjs","sources":["../../../projects/lib/i18n/en/public-api.ts","../../../projects/lib/i18n/en/ngwr-i18n-en.ts"],"sourcesContent":["import { type WrI18nCatalog } from 'ngwr/i18n';\n\n/**\n * Base English catalog for ngwr built-in component strings. Spread this\n * into your root catalog or pass it to `provideWrI18nStaticLoader`.\n *\n * @example\n * ```ts\n * import { wrEn } from 'ngwr/i18n/en';\n *\n * provideWrI18nStaticLoader({\n * en: { ...wrEn, app: { title: 'My app' } },\n * });\n * ```\n */\nexport const wrEn: WrI18nCatalog = {\n common: {\n ok: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n confirm: 'Confirm',\n delete: 'Delete',\n save: 'Save',\n edit: 'Edit',\n add: 'Add',\n remove: 'Remove',\n clear: 'Clear',\n search: 'Search',\n loading: 'Loading…',\n select: 'Select',\n next: 'Next',\n previous: 'Previous',\n back: 'Back',\n today: 'Today',\n yesterday: 'Yesterday',\n tomorrow: 'Tomorrow',\n of: 'of',\n },\n pagination: {\n prev: 'Previous page',\n next: 'Next page',\n itemsPerPage: 'Items per page',\n perPage: '{{size}} / page',\n goToPage: 'Go to page {{page}}',\n label: 'Pagination',\n pageOf: 'Page {{current}} of {{total}}',\n // The whole \"1–10 of 235\" line, as ONE template. It used to be assembled in\n // TypeScript around `of` above, which localised the word in the middle and\n // froze everything else: an ASCII hyphen between the bounds, and an operand\n // order many languages do not use. `of` stays because removing a shipped key\n // breaks catalogs that override it; nothing in the library reads it now.\n range: '{{from}}–{{to}} of {{total}}',\n // The compact pager's own text, for the same reason: it was\n // `{{ page() }} / {{ totalPages() }}` in the template.\n compact: '{{current}} / {{total}}',\n },\n table: {\n empty: 'No data',\n loading: 'Loading…',\n sort: 'Sort column',\n filter: 'Filter column',\n selectAll: 'Select all rows',\n selectRow: 'Select row',\n expandRow: 'Toggle row details',\n toggleRow: 'Toggle child rows',\n selectGroup: 'Select group',\n toggleGroup: 'Toggle group',\n noMatches: 'No matches',\n // The filter panel's search box has no visible label, so `search` is both its\n // placeholder AND its accessible name.\n search: 'Search',\n reset: 'Reset',\n },\n eventCalendar: {\n today: 'Today',\n previous: 'Previous',\n next: 'Next',\n month: 'Month',\n week: 'Week',\n day: 'Day',\n time: 'Time',\n allDay: 'All day',\n label: 'Calendar',\n more: '+{{count}} more',\n },\n tour: {\n next: 'Next',\n back: 'Back',\n done: 'Done',\n skip: 'Skip tour',\n progress: 'Step {{current}} of {{total}}',\n },\n splitter: {\n divider: 'Resize panes',\n },\n stepper: {\n // Rendered as a badge beside the step's own label, so it reads as part of the\n // header rather than as a sentence — lowercase on purpose.\n optional: 'optional',\n },\n transfer: {\n source: 'Available',\n target: 'Selected',\n search: 'Search',\n empty: 'Nothing here',\n selectAll: 'Select all',\n toTarget: 'Move to selected',\n toSource: 'Move to available',\n count: '{{checked}} / {{total}}',\n },\n form: {\n // Rendered inside the label's parentheses — `(optional)` — so it is a bare\n // lowercase word and no locale has to repeat the punctuation. Same shape as\n // `stepper.optional`, and unlike the `*` marker this one is NOT `aria-hidden`.\n optional: 'optional',\n },\n validation: {\n required: 'This field is required.',\n requiredTrue: 'This field must be checked.',\n email: 'Enter a valid email address.',\n minlength: 'Enter at least {{requiredLength}} characters.',\n maxlength: 'Enter at most {{requiredLength}} characters.',\n min: 'Enter {{min}} or more.',\n max: 'Enter {{max}} or less.',\n pattern: 'This value is not in the expected format.',\n noWhitespace: 'This value cannot contain spaces.',\n hexColor: 'Enter a hex colour, e.g. #1a2b3c.',\n url: 'Enter a valid URL.',\n cardNumber: 'Enter a valid card number.',\n cvc: 'Enter the {{length}}-digit security code.',\n iban: 'Enter a valid IBAN.',\n match: 'The two values do not match.',\n matchFields: 'These fields do not match.',\n oneOf: 'Choose one of the allowed values.',\n minDate: 'Choose a later date.',\n maxDate: 'Choose an earlier date.',\n },\n select: {\n label: 'Select',\n placeholder: 'Select…',\n empty: 'No options',\n clearSelection: 'Clear selection',\n removeItem: 'Remove {{label}}',\n noResults: 'No results',\n loading: 'Loading…',\n more: '+{{count}} more',\n },\n // `tree` covers both inline display and combobox-mode pickers\n // (replaces the dropped `treeSelect` namespace).\n tree: {\n expand: 'Expand',\n collapse: 'Collapse',\n placeholder: 'Select…',\n clearSelection: 'Clear selection',\n removeItem: 'Remove {{label}}',\n // Same string and same shape as `select.more` — the two components render\n // the identical overflow chip, and only one of them could be translated.\n more: '+{{count}} more',\n },\n commandPalette: {\n label: 'Command palette',\n placeholder: 'Type a command or search…',\n noResults: 'No results',\n // The key-cap chip in the search row. A key NAME rather than prose, so most\n // locales will leave it alone — but a keyboard whose key is not labelled\n // \"esc\" had no way to say so.\n escHint: 'esc',\n },\n empty: {\n noData: 'No data',\n },\n fileUpload: {\n browse: 'Click to browse',\n dropZone: 'or drop files here',\n dropZoneLabel: 'File upload drop zone — click or drop files',\n removeFile: 'Remove file',\n invalid: 'Unsupported file type',\n tooBig: 'File too large',\n // File size, as a template plus a unit table. The number itself goes through\n // `Intl.NumberFormat`, so the decimal separator follows `LOCALE_ID`; what a\n // catalog owns here is the unit abbreviation and whether a space sits before\n // it. Binary units (1024), which is what the component counts in.\n size: '{{value}} {{unit}}',\n unitByte: 'B',\n unitKb: 'KB',\n unitMb: 'MB',\n unitGb: 'GB',\n unitTb: 'TB',\n },\n popconfirm: {\n label: 'Confirm action',\n confirm: 'Confirm',\n cancel: 'Cancel',\n },\n toast: {\n region: 'Notifications',\n close: 'Close',\n copy: 'Copy',\n copied: 'Copied',\n closeAll: 'Close all',\n },\n input: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n },\n inputNumber: {\n increment: 'Increment',\n decrement: 'Decrement',\n },\n // Two names for one box, chosen by `mode`: only the numeric strip holds digits.\n // One key saying \"Digit\" would be a lie on the alphanumeric and text modes, which\n // accept letters — a wrong name is worse than an untranslated one.\n inputOtp: {\n label: 'Verification code',\n digit: 'Digit {{index}}',\n character: 'Character {{index}}',\n },\n anchor: {\n label: 'Table of contents',\n },\n avatar: {\n alt: 'Avatar',\n },\n backTop: {\n label: 'Back to top',\n },\n breadcrumbs: {\n label: 'Breadcrumbs',\n },\n burger: {\n label: 'Toggle menu',\n },\n calendar: {\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevYears: 'Previous 12 years',\n nextYears: 'Next 12 years',\n // The header above the grid, as ONE template. It was `${month} ${year}` in\n // TypeScript, which is English word order with an English separator: ja-JP\n // writes 2026年3月 and cannot get there by translating a word.\n header: '{{month}} {{year}}',\n // The year view's header, same reason — the en dash was hardcoded too.\n yearRange: '{{from}} – {{to}}',\n // A day cell's accessible name. `{{date}}` is the adapter's `longDate`, so\n // the date itself is `Intl`-ordered and `Intl`-punctuated; the catalog owns\n // only where the weekday goes relative to it.\n dayLabel: '{{weekday}}, {{date}}',\n },\n imageCropper: {\n empty: 'No image',\n window: 'Crop region',\n keyHelp:\n 'Arrow keys move the crop. Hold Alt with an arrow key to resize it, and Shift for larger steps. ' +\n 'The crop is announced as left, top, width and height in image pixels.',\n },\n sortableList: {\n keyHelp:\n 'Press Space to pick this item up, then use the arrow keys to move it. ' +\n 'Press Space again to drop it, or Escape to put it back.',\n grabbed: 'Grabbed. {{index}} of {{total}}.',\n moved: '{{index}} of {{total}}.',\n dropped: 'Dropped. {{index}} of {{total}}.',\n cancelled: 'Move cancelled.',\n },\n colorPicker: {\n // The saturation / brightness canvas is a `role=\"group\"`, which has no\n // `aria-valuenow` — so its two values ride in its name.\n area: 'Saturation and brightness, {{saturation}}% and {{brightness}}%',\n hue: 'Hue',\n alpha: 'Opacity',\n // The format strip. Three initialisms most locales keep as they are — which\n // is the reason they were left as literals, and not a reason a locale should\n // be unable to change them.\n formatHex: 'HEX',\n formatRgb: 'RGB',\n formatHsl: 'HSL',\n // Channel field labels. Each `<span>` is inside the `<label>` that names its\n // number input, so these are accessible names, not decoration. The `%` is\n // part of the string on purpose: a locale that spaces it differently, or\n // spells the channel with a different letter, needs to move both together.\n channelHex: 'HEX',\n channelRed: 'R',\n channelGreen: 'G',\n channelBlue: 'B',\n channelHue: 'H',\n channelSaturation: 'S%',\n channelLightness: 'L%',\n channelAlpha: 'A%',\n },\n calendarHeatmap: {\n label: 'Calendar heatmap',\n },\n lineChart: {\n label: 'Line chart',\n },\n donutChart: {\n label: 'Donut chart',\n },\n compare: {\n label: 'Comparison divider',\n },\n // The two `roledescription` values are spoken INSTEAD of the role name, so they\n // are lowercase nouns (\"carousel\", \"slide\") the way a role name would be — not\n // sentence-case labels like the ones above them.\n carousel: {\n label: 'Carousel',\n goToSlide: 'Go to slide {{index}}',\n prev: 'Previous slide',\n next: 'Next slide',\n pagination: 'Carousel pagination',\n roledescription: 'carousel',\n slideRoledescription: 'slide',\n },\n actionSheet: {\n label: 'Actions',\n },\n alert: {\n close: 'Close alert',\n },\n qr: {\n label: 'QR code',\n },\n image: {\n viewer: 'Image preview',\n open: 'Open preview',\n close: 'Close preview',\n },\n window: {\n close: 'Close',\n minimize: 'Minimize',\n maximize: 'Maximize',\n restore: 'Restore',\n restoreDown: 'Restore down',\n restoreWindow: 'Restore {{title}}',\n closeWindow: 'Close window',\n untitled: 'Untitled',\n taskbar: 'Minimized windows',\n },\n dialog: {\n close: 'Close dialog',\n },\n // Deliberately generic: a popover panel has no universal name, and an unnamed\n // `role=\"dialog\"` announces as nothing at all. Override per instance with\n // `[ariaLabel]`.\n popover: {\n label: 'Popover',\n },\n markdown: {\n copy: 'Copy code',\n copied: 'Copied',\n // Read before a task item's text, so a screen reader gets the state that the\n // checkbox glyph carries visually.\n taskDone: 'Done:',\n taskTodo: 'To do:',\n },\n // Count-neutral on purpose: `wrInterpolate` does `{{name}}` substitution only,\n // with no plural support, so \"Matches available: 1\" has to read correctly too.\n marquee: {\n label: 'Marquee',\n link: 'link',\n },\n mention: {\n listbox: 'Mentions',\n available: 'Matches available: {{count}}',\n inserted: 'Inserted: {{label}}',\n },\n drawer: {\n close: 'Close drawer',\n },\n datePicker: {\n open: 'Open calendar',\n openTime: 'Open time picker',\n openDateTime: 'Open date and time picker',\n openRange: 'Open range calendar',\n panel: 'Choose date',\n panelTime: 'Choose time',\n panelDateTime: 'Choose date and time',\n panelRange: 'Choose date range',\n panelRangeDateTime: 'Choose date and time range',\n rangeStart: 'Range start',\n rangeEnd: 'Range end',\n startTime: 'Start time',\n endTime: 'End time',\n hours: 'Hours',\n minutes: 'Minutes',\n seconds: 'Seconds',\n incrementHours: 'Increment hours',\n decrementHours: 'Decrement hours',\n incrementMinutes: 'Increment minutes',\n decrementMinutes: 'Decrement minutes',\n incrementSeconds: 'Increment seconds',\n decrementSeconds: 'Decrement seconds',\n toggleAmPm: 'Toggle AM / PM',\n // Rendered in the meridiem column and re-announced by its `aria-live` span on\n // every toggle, so it is a translated word rather than a fixed glyph — `wrRu`\n // spells these ДП / ПП.\n am: 'AM',\n pm: 'PM',\n },\n sidebar: {\n label: 'Sidebar',\n },\n spinner: {\n label: 'Loading',\n },\n rating: {\n label: 'Rating',\n },\n gauge: {\n label: 'Gauge',\n },\n progress: {\n label: 'Progress',\n },\n meterGroup: {\n label: 'Meter',\n },\n knob: {\n label: 'Value',\n },\n slider: {\n label: 'Value',\n // Range mode gives each end its own thumb, and each thumb its own name — a\n // screen reader otherwise reads the same word twice for two different values.\n lower: 'Lower value',\n upper: 'Upper value',\n },\n speedDial: {\n label: 'Actions',\n },\n statistic: {\n // The delta chip, e.g. `+12.4%`. The number is formatted through\n // `Intl.NumberFormat` (so its sign, digits and decimal separator follow\n // `LOCALE_ID`, matching the value above it), and this template owns whether\n // a space sits between it and the unit.\n delta: '{{value}}{{suffix}}',\n // The unit the component appends when the consumer binds no `deltaSuffix`.\n deltaSuffix: '%',\n },\n result: {\n notFound: 'Sorry, the page you visited does not exist.',\n forbidden: 'Sorry, you are not authorized to access this page.',\n serverError: 'Sorry, something went wrong.',\n },\n date: {\n months: {\n jan: 'January',\n feb: 'February',\n mar: 'March',\n apr: 'April',\n may: 'May',\n jun: 'June',\n jul: 'July',\n aug: 'August',\n sep: 'September',\n oct: 'October',\n nov: 'November',\n dec: 'December',\n },\n },\n};\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-i18n-en.mjs","sources":["../../../projects/lib/i18n/en/public-api.ts","../../../projects/lib/i18n/en/ngwr-i18n-en.ts"],"sourcesContent":["import { type WrI18nCatalog } from 'ngwr/i18n';\n\n/**\n * Base English catalog for ngwr built-in component strings. Spread this\n * into your root catalog or pass it to `provideWrI18nStaticLoader`.\n *\n * @example\n * ```ts\n * import { wrEn } from 'ngwr/i18n/en';\n *\n * provideWrI18nStaticLoader({\n * en: { ...wrEn, app: { title: 'My app' } },\n * });\n * ```\n */\nexport const wrEn: WrI18nCatalog = {\n common: {\n ok: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n confirm: 'Confirm',\n delete: 'Delete',\n save: 'Save',\n edit: 'Edit',\n add: 'Add',\n remove: 'Remove',\n clear: 'Clear',\n search: 'Search',\n loading: 'Loading…',\n select: 'Select',\n next: 'Next',\n previous: 'Previous',\n back: 'Back',\n today: 'Today',\n yesterday: 'Yesterday',\n tomorrow: 'Tomorrow',\n of: 'of',\n },\n pagination: {\n prev: 'Previous page',\n next: 'Next page',\n itemsPerPage: 'Items per page',\n perPage: '{{size}} / page',\n goToPage: 'Go to page {{page}}',\n label: 'Pagination',\n pageOf: 'Page {{current}} of {{total}}',\n // The whole \"1–10 of 235\" line, as ONE template. It used to be assembled in\n // TypeScript around `of` above, which localised the word in the middle and\n // froze everything else: an ASCII hyphen between the bounds, and an operand\n // order many languages do not use. `of` stays because removing a shipped key\n // breaks catalogs that override it; nothing in the library reads it now.\n range: '{{from}}–{{to}} of {{total}}',\n // The compact pager's own text, for the same reason: it was\n // `{{ page() }} / {{ totalPages() }}` in the template.\n compact: '{{current}} / {{total}}',\n },\n table: {\n empty: 'No data',\n loading: 'Loading…',\n sort: 'Sort column',\n filter: 'Filter column',\n selectAll: 'Select all rows',\n selectRow: 'Select row',\n expandRow: 'Toggle row details',\n toggleRow: 'Toggle child rows',\n selectGroup: 'Select group',\n toggleGroup: 'Toggle group',\n noMatches: 'No matches',\n // The filter panel's search box has no visible label, so `search` is both its\n // placeholder AND its accessible name.\n search: 'Search',\n reset: 'Reset',\n },\n eventCalendar: {\n today: 'Today',\n previous: 'Previous',\n next: 'Next',\n month: 'Month',\n week: 'Week',\n day: 'Day',\n time: 'Time',\n allDay: 'All day',\n label: 'Calendar',\n more: '+{{count}} more',\n },\n tour: {\n next: 'Next',\n back: 'Back',\n done: 'Done',\n skip: 'Skip tour',\n progress: 'Step {{current}} of {{total}}',\n },\n splitter: {\n divider: 'Resize panes',\n },\n stepper: {\n // Rendered as a badge beside the step's own label, so it reads as part of the\n // header rather than as a sentence — lowercase on purpose.\n optional: 'optional',\n },\n transfer: {\n source: 'Available',\n target: 'Selected',\n search: 'Search',\n empty: 'Nothing here',\n selectAll: 'Select all',\n toTarget: 'Move to selected',\n toSource: 'Move to available',\n count: '{{checked}} / {{total}}',\n },\n form: {\n // Rendered inside the label's parentheses — `(optional)` — so it is a bare\n // lowercase word and no locale has to repeat the punctuation. Same shape as\n // `stepper.optional`, and unlike the `*` marker this one is NOT `aria-hidden`.\n optional: 'optional',\n },\n validation: {\n required: 'This field is required.',\n requiredTrue: 'This field must be checked.',\n email: 'Enter a valid email address.',\n minlength: 'Enter at least {{requiredLength}} characters.',\n maxlength: 'Enter at most {{requiredLength}} characters.',\n min: 'Enter {{min}} or more.',\n max: 'Enter {{max}} or less.',\n pattern: 'This value is not in the expected format.',\n noWhitespace: 'This value cannot contain spaces.',\n hexColor: 'Enter a hex colour, e.g. #1a2b3c.',\n url: 'Enter a valid URL.',\n cardNumber: 'Enter a valid card number.',\n cvc: 'Enter the {{length}}-digit security code.',\n iban: 'Enter a valid IBAN.',\n match: 'The two values do not match.',\n matchFields: 'These fields do not match.',\n oneOf: 'Choose one of the allowed values.',\n minDate: 'Choose a later date.',\n maxDate: 'Choose an earlier date.',\n },\n select: {\n label: 'Select',\n placeholder: 'Select…',\n empty: 'No options',\n clearSelection: 'Clear selection',\n removeItem: 'Remove {{label}}',\n noResults: 'No results',\n loading: 'Loading…',\n more: '+{{count}} more',\n },\n // `tree` covers both inline display and combobox-mode pickers\n // (replaces the dropped `treeSelect` namespace).\n tree: {\n expand: 'Expand',\n collapse: 'Collapse',\n placeholder: 'Select…',\n clearSelection: 'Clear selection',\n removeItem: 'Remove {{label}}',\n // Same string and same shape as `select.more` — the two components render\n // the identical overflow chip, and only one of them could be translated.\n more: '+{{count}} more',\n },\n commandPalette: {\n label: 'Command palette',\n placeholder: 'Type a command or search…',\n noResults: 'No results',\n // Shown INSTEAD of `noResults` while a host-driven search is in flight.\n // Without it an async palette reads \"No results\" between every keystroke\n // and its answer, which states something false about the query.\n loading: 'Searching…',\n // The key-cap chip in the search row. A key NAME rather than prose, so most\n // locales will leave it alone — but a keyboard whose key is not labelled\n // \"esc\" had no way to say so.\n escHint: 'esc',\n },\n empty: {\n noData: 'No data',\n },\n fileUpload: {\n browse: 'Click to browse',\n dropZone: 'or drop files here',\n dropZoneLabel: 'File upload drop zone — click or drop files',\n removeFile: 'Remove file',\n invalid: 'Unsupported file type',\n tooBig: 'File too large',\n // File size, as a template plus a unit table. The number itself goes through\n // `Intl.NumberFormat`, so the decimal separator follows `LOCALE_ID`; what a\n // catalog owns here is the unit abbreviation and whether a space sits before\n // it. Binary units (1024), which is what the component counts in.\n size: '{{value}} {{unit}}',\n unitByte: 'B',\n unitKb: 'KB',\n unitMb: 'MB',\n unitGb: 'GB',\n unitTb: 'TB',\n },\n popconfirm: {\n label: 'Confirm action',\n confirm: 'Confirm',\n cancel: 'Cancel',\n },\n toast: {\n region: 'Notifications',\n close: 'Close',\n copy: 'Copy',\n copied: 'Copied',\n closeAll: 'Close all',\n },\n input: {\n showPassword: 'Show password',\n hidePassword: 'Hide password',\n },\n inputNumber: {\n increment: 'Increment',\n decrement: 'Decrement',\n },\n // Two names for one box, chosen by `mode`: only the numeric strip holds digits.\n // One key saying \"Digit\" would be a lie on the alphanumeric and text modes, which\n // accept letters — a wrong name is worse than an untranslated one.\n inputOtp: {\n label: 'Verification code',\n digit: 'Digit {{index}}',\n character: 'Character {{index}}',\n },\n anchor: {\n label: 'Table of contents',\n },\n avatar: {\n alt: 'Avatar',\n },\n backTop: {\n label: 'Back to top',\n },\n breadcrumbs: {\n label: 'Breadcrumbs',\n },\n burger: {\n label: 'Toggle menu',\n },\n calendar: {\n prevMonth: 'Previous month',\n nextMonth: 'Next month',\n prevYear: 'Previous year',\n nextYear: 'Next year',\n prevYears: 'Previous 12 years',\n nextYears: 'Next 12 years',\n // The header above the grid, as ONE template. It was `${month} ${year}` in\n // TypeScript, which is English word order with an English separator: ja-JP\n // writes 2026年3月 and cannot get there by translating a word.\n header: '{{month}} {{year}}',\n // The year view's header, same reason — the en dash was hardcoded too.\n yearRange: '{{from}} – {{to}}',\n // A day cell's accessible name. `{{date}}` is the adapter's `longDate`, so\n // the date itself is `Intl`-ordered and `Intl`-punctuated; the catalog owns\n // only where the weekday goes relative to it.\n dayLabel: '{{weekday}}, {{date}}',\n },\n imageCropper: {\n empty: 'No image',\n window: 'Crop region',\n keyHelp:\n 'Arrow keys move the crop. Hold Alt with an arrow key to resize it, and Shift for larger steps. ' +\n 'The crop is announced as left, top, width and height in image pixels.',\n },\n sortableList: {\n keyHelp:\n 'Press Space to pick this item up, then use the arrow keys to move it. ' +\n 'Press Space again to drop it, or Escape to put it back.',\n grabbed: 'Grabbed. {{index}} of {{total}}.',\n moved: '{{index}} of {{total}}.',\n dropped: 'Dropped. {{index}} of {{total}}.',\n cancelled: 'Move cancelled.',\n },\n colorPicker: {\n // The saturation / brightness canvas is a `role=\"group\"`, which has no\n // `aria-valuenow` — so its two values ride in its name.\n area: 'Saturation and brightness, {{saturation}}% and {{brightness}}%',\n hue: 'Hue',\n alpha: 'Opacity',\n // The format strip. Three initialisms most locales keep as they are — which\n // is the reason they were left as literals, and not a reason a locale should\n // be unable to change them.\n formatHex: 'HEX',\n formatRgb: 'RGB',\n formatHsl: 'HSL',\n // Channel field labels. Each `<span>` is inside the `<label>` that names its\n // number input, so these are accessible names, not decoration. The `%` is\n // part of the string on purpose: a locale that spaces it differently, or\n // spells the channel with a different letter, needs to move both together.\n channelHex: 'HEX',\n channelRed: 'R',\n channelGreen: 'G',\n channelBlue: 'B',\n channelHue: 'H',\n channelSaturation: 'S%',\n channelLightness: 'L%',\n channelAlpha: 'A%',\n },\n calendarHeatmap: {\n label: 'Calendar heatmap',\n },\n lineChart: {\n label: 'Line chart',\n },\n donutChart: {\n label: 'Donut chart',\n },\n compare: {\n label: 'Comparison divider',\n },\n // The two `roledescription` values are spoken INSTEAD of the role name, so they\n // are lowercase nouns (\"carousel\", \"slide\") the way a role name would be — not\n // sentence-case labels like the ones above them.\n carousel: {\n label: 'Carousel',\n goToSlide: 'Go to slide {{index}}',\n prev: 'Previous slide',\n next: 'Next slide',\n pagination: 'Carousel pagination',\n roledescription: 'carousel',\n slideRoledescription: 'slide',\n },\n actionSheet: {\n label: 'Actions',\n },\n alert: {\n close: 'Close alert',\n },\n qr: {\n label: 'QR code',\n },\n image: {\n viewer: 'Image preview',\n open: 'Open preview',\n close: 'Close preview',\n },\n window: {\n close: 'Close',\n minimize: 'Minimize',\n maximize: 'Maximize',\n restore: 'Restore',\n restoreDown: 'Restore down',\n restoreWindow: 'Restore {{title}}',\n closeWindow: 'Close window',\n untitled: 'Untitled',\n taskbar: 'Minimized windows',\n },\n dialog: {\n close: 'Close dialog',\n },\n // Deliberately generic: a popover panel has no universal name, and an unnamed\n // `role=\"dialog\"` announces as nothing at all. Override per instance with\n // `[ariaLabel]`.\n popover: {\n label: 'Popover',\n },\n markdown: {\n copy: 'Copy code',\n copied: 'Copied',\n // Read before a task item's text, so a screen reader gets the state that the\n // checkbox glyph carries visually.\n taskDone: 'Done:',\n taskTodo: 'To do:',\n },\n // Count-neutral on purpose: `wrInterpolate` does `{{name}}` substitution only,\n // with no plural support, so \"Matches available: 1\" has to read correctly too.\n marquee: {\n label: 'Marquee',\n link: 'link',\n },\n mention: {\n listbox: 'Mentions',\n available: 'Matches available: {{count}}',\n inserted: 'Inserted: {{label}}',\n },\n drawer: {\n close: 'Close drawer',\n },\n datePicker: {\n open: 'Open calendar',\n openTime: 'Open time picker',\n openDateTime: 'Open date and time picker',\n openRange: 'Open range calendar',\n panel: 'Choose date',\n panelTime: 'Choose time',\n panelDateTime: 'Choose date and time',\n panelRange: 'Choose date range',\n panelRangeDateTime: 'Choose date and time range',\n rangeStart: 'Range start',\n rangeEnd: 'Range end',\n startTime: 'Start time',\n endTime: 'End time',\n hours: 'Hours',\n minutes: 'Minutes',\n seconds: 'Seconds',\n incrementHours: 'Increment hours',\n decrementHours: 'Decrement hours',\n incrementMinutes: 'Increment minutes',\n decrementMinutes: 'Decrement minutes',\n incrementSeconds: 'Increment seconds',\n decrementSeconds: 'Decrement seconds',\n toggleAmPm: 'Toggle AM / PM',\n // Rendered in the meridiem column and re-announced by its `aria-live` span on\n // every toggle, so it is a translated word rather than a fixed glyph — `wrRu`\n // spells these ДП / ПП.\n am: 'AM',\n pm: 'PM',\n },\n sidebar: {\n label: 'Sidebar',\n },\n spinner: {\n label: 'Loading',\n },\n rating: {\n label: 'Rating',\n },\n gauge: {\n label: 'Gauge',\n },\n progress: {\n label: 'Progress',\n },\n meterGroup: {\n label: 'Meter',\n },\n knob: {\n label: 'Value',\n },\n slider: {\n label: 'Value',\n // Range mode gives each end its own thumb, and each thumb its own name — a\n // screen reader otherwise reads the same word twice for two different values.\n lower: 'Lower value',\n upper: 'Upper value',\n },\n speedDial: {\n label: 'Actions',\n },\n statistic: {\n // The delta chip, e.g. `+12.4%`. The number is formatted through\n // `Intl.NumberFormat` (so its sign, digits and decimal separator follow\n // `LOCALE_ID`, matching the value above it), and this template owns whether\n // a space sits between it and the unit.\n delta: '{{value}}{{suffix}}',\n // The unit the component appends when the consumer binds no `deltaSuffix`.\n deltaSuffix: '%',\n },\n result: {\n notFound: 'Sorry, the page you visited does not exist.',\n forbidden: 'Sorry, you are not authorized to access this page.',\n serverError: 'Sorry, something went wrong.',\n },\n date: {\n months: {\n jan: 'January',\n feb: 'February',\n mar: 'March',\n apr: 'April',\n may: 'May',\n jun: 'June',\n jul: 'July',\n aug: 'August',\n sep: 'September',\n oct: 'October',\n nov: 'November',\n dec: 'December',\n },\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -131,6 +131,7 @@ const wrRu = {
131
131
  label: 'Палитра команд',
132
132
  placeholder: 'Введите команду или поиск…',
133
133
  noResults: 'Ничего не найдено',
134
+ loading: 'Идёт поиск…',
134
135
  escHint: 'esc',
135
136
  },
136
137
  empty: {
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-i18n-ru.mjs","sources":["../../../projects/lib/i18n/ru/public-api.ts","../../../projects/lib/i18n/ru/ngwr-i18n-ru.ts"],"sourcesContent":["import { type WrI18nCatalog } from 'ngwr/i18n';\n\n/** Base Russian catalog for ngwr built-in component strings. */\nexport const wrRu: WrI18nCatalog = {\n common: {\n ok: 'OK',\n cancel: 'Отмена',\n close: 'Закрыть',\n confirm: 'Подтвердить',\n delete: 'Удалить',\n save: 'Сохранить',\n edit: 'Изменить',\n add: 'Добавить',\n remove: 'Удалить',\n clear: 'Очистить',\n search: 'Поиск',\n loading: 'Загрузка…',\n select: 'Выбрать',\n next: 'Далее',\n previous: 'Назад',\n back: 'Назад',\n today: 'Сегодня',\n yesterday: 'Вчера',\n tomorrow: 'Завтра',\n of: 'из',\n },\n pagination: {\n prev: 'Предыдущая страница',\n next: 'Следующая страница',\n itemsPerPage: 'Записей на страницу',\n perPage: '{{size}} / стр.',\n goToPage: 'Перейти на страницу {{page}}',\n label: 'Пагинация',\n pageOf: 'Страница {{current}} из {{total}}',\n range: '{{from}}–{{to}} из {{total}}',\n compact: '{{current}} / {{total}}',\n },\n table: {\n empty: 'Нет данных',\n loading: 'Загрузка…',\n sort: 'Сортировать столбец',\n filter: 'Фильтр столбца',\n selectAll: 'Выбрать все строки',\n selectRow: 'Выбрать строку',\n expandRow: 'Показать детали строки',\n toggleRow: 'Показать вложенные строки',\n selectGroup: 'Выбрать группу',\n toggleGroup: 'Свернуть группу',\n noMatches: 'Ничего не найдено',\n search: 'Поиск',\n reset: 'Сбросить',\n },\n eventCalendar: {\n today: 'Сегодня',\n previous: 'Назад',\n next: 'Вперёд',\n month: 'Месяц',\n week: 'Неделя',\n day: 'День',\n time: 'Время',\n allDay: 'Весь день',\n label: 'Календарь',\n more: 'ещё {{count}}',\n },\n tour: {\n next: 'Далее',\n back: 'Назад',\n done: 'Готово',\n skip: 'Пропустить',\n progress: 'Шаг {{current}} из {{total}}',\n },\n splitter: {\n divider: 'Изменить размер областей',\n },\n stepper: {\n optional: 'необязательно',\n },\n transfer: {\n source: 'Доступно',\n target: 'Выбрано',\n search: 'Поиск',\n empty: 'Пусто',\n selectAll: 'Выбрать все',\n toTarget: 'Перенести в выбранные',\n toSource: 'Вернуть в доступные',\n count: '{{checked}} / {{total}}',\n },\n form: {\n optional: 'необязательно',\n },\n validation: {\n required: 'Обязательное поле.',\n requiredTrue: 'Нужно поставить отметку.',\n email: 'Введите корректный адрес почты.',\n minlength: 'Не короче {{requiredLength}} символов.',\n maxlength: 'Не длиннее {{requiredLength}} символов.',\n min: 'Не меньше {{min}}.',\n max: 'Не больше {{max}}.',\n pattern: 'Значение не соответствует формату.',\n noWhitespace: 'Значение не может содержать пробелы.',\n hexColor: 'Введите цвет в формате #1a2b3c.',\n url: 'Введите корректный адрес.',\n cardNumber: 'Введите корректный номер карты.',\n cvc: 'Введите {{length}}-значный код проверки.',\n iban: 'Введите корректный IBAN.',\n match: 'Значения не совпадают.',\n matchFields: 'Значения полей не совпадают.',\n oneOf: 'Выберите одно из допустимых значений.',\n minDate: 'Выберите более позднюю дату.',\n maxDate: 'Выберите более раннюю дату.',\n },\n select: {\n label: 'Выбрать',\n placeholder: 'Выберите…',\n empty: 'Нет вариантов',\n clearSelection: 'Очистить выбор',\n removeItem: 'Удалить {{label}}',\n noResults: 'Ничего не найдено',\n loading: 'Загрузка…',\n more: 'ещё {{count}}',\n },\n // `tree` covers both inline display and combobox-mode pickers\n // (replaces the dropped `treeSelect` namespace).\n tree: {\n expand: 'Развернуть',\n collapse: 'Свернуть',\n placeholder: 'Выберите…',\n clearSelection: 'Очистить выбор',\n removeItem: 'Удалить {{label}}',\n more: 'ещё {{count}}',\n },\n commandPalette: {\n label: 'Палитра команд',\n placeholder: 'Введите команду или поиск…',\n noResults: 'Ничего не найдено',\n escHint: 'esc',\n },\n empty: {\n noData: 'Нет данных',\n },\n fileUpload: {\n browse: 'Нажмите, чтобы выбрать',\n dropZone: 'или перетащите файлы сюда',\n dropZoneLabel: 'Зона загрузки файлов — нажмите или перетащите',\n removeFile: 'Удалить файл',\n invalid: 'Неподдерживаемый тип файла',\n tooBig: 'Файл слишком большой',\n size: '{{value}} {{unit}}',\n unitByte: 'Б',\n unitKb: 'КБ',\n unitMb: 'МБ',\n unitGb: 'ГБ',\n unitTb: 'ТБ',\n },\n popconfirm: {\n label: 'Подтверждение действия',\n confirm: 'Подтвердить',\n cancel: 'Отмена',\n },\n toast: {\n region: 'Уведомления',\n close: 'Закрыть',\n copy: 'Копировать',\n copied: 'Скопировано',\n closeAll: 'Закрыть все',\n },\n input: {\n showPassword: 'Показать пароль',\n hidePassword: 'Скрыть пароль',\n },\n inputNumber: {\n increment: 'Увеличить',\n decrement: 'Уменьшить',\n },\n inputOtp: {\n label: 'Код подтверждения',\n digit: 'Цифра {{index}}',\n character: 'Символ {{index}}',\n },\n anchor: {\n label: 'Содержание',\n },\n avatar: {\n alt: 'Аватар',\n },\n backTop: {\n label: 'Наверх',\n },\n breadcrumbs: {\n label: 'Хлебные крошки',\n },\n burger: {\n label: 'Переключить меню',\n },\n calendar: {\n prevMonth: 'Предыдущий месяц',\n nextMonth: 'Следующий месяц',\n prevYear: 'Предыдущий год',\n nextYear: 'Следующий год',\n prevYears: 'Предыдущие 12 лет',\n nextYears: 'Следующие 12 лет',\n header: '{{month}} {{year}}',\n yearRange: '{{from}} – {{to}}',\n dayLabel: '{{weekday}}, {{date}}',\n },\n imageCropper: {\n empty: 'Нет изображения',\n window: 'Область обрезки',\n keyHelp:\n 'Стрелки перемещают область обрезки. Alt со стрелкой изменяет её размер, Shift увеличивает шаг. ' +\n 'Область объявляется как отступ слева, отступ сверху, ширина и высота в пикселях изображения.',\n },\n sortableList: {\n keyHelp:\n 'Нажмите пробел, чтобы взять элемент, затем перемещайте его стрелками. ' +\n 'Пробел ещё раз — отпустить, Escape — вернуть на место.',\n grabbed: 'Взят. {{index}} из {{total}}.',\n moved: '{{index}} из {{total}}.',\n dropped: 'Отпущен. {{index}} из {{total}}.',\n cancelled: 'Перемещение отменено.',\n },\n colorPicker: {\n area: 'Насыщенность и яркость, {{saturation}}% и {{brightness}}%',\n hue: 'Оттенок',\n alpha: 'Непрозрачность',\n formatHex: 'HEX',\n formatRgb: 'RGB',\n formatHsl: 'HSL',\n channelHex: 'HEX',\n channelRed: 'R',\n channelGreen: 'G',\n channelBlue: 'B',\n channelHue: 'H',\n channelSaturation: 'S%',\n channelLightness: 'L%',\n channelAlpha: 'A%',\n },\n calendarHeatmap: {\n label: 'Календарная тепловая карта',\n },\n lineChart: {\n label: 'Линейный график',\n },\n donutChart: {\n label: 'Круговая диаграмма',\n },\n compare: {\n label: 'Разделитель сравнения',\n },\n // Два `roledescription` произносятся ВМЕСТО названия роли, поэтому это строчные\n // существительные — «карусель», «слайд», — а не подписи с заглавной, как выше.\n carousel: {\n label: 'Карусель',\n goToSlide: 'Перейти к слайду {{index}}',\n prev: 'Предыдущий слайд',\n next: 'Следующий слайд',\n pagination: 'Пагинация карусели',\n roledescription: 'карусель',\n slideRoledescription: 'слайд',\n },\n actionSheet: {\n label: 'Действия',\n },\n alert: {\n close: 'Закрыть оповещение',\n },\n qr: {\n label: 'QR-код',\n },\n image: {\n viewer: 'Просмотр изображения',\n open: 'Открыть превью',\n close: 'Закрыть превью',\n },\n window: {\n close: 'Закрыть',\n minimize: 'Свернуть',\n maximize: 'Развернуть',\n restore: 'Восстановить',\n restoreDown: 'Восстановить размер',\n restoreWindow: 'Восстановить {{title}}',\n closeWindow: 'Закрыть окно',\n untitled: 'Без названия',\n taskbar: 'Свёрнутые окна',\n },\n dialog: {\n close: 'Закрыть диалог',\n },\n // Намеренно обобщённо: у панели поповера нет универсального имени, а\n // `role=\"dialog\"` без имени не озвучивается вовсе. Переопределяется на месте\n // через `[ariaLabel]`.\n popover: {\n label: 'Всплывающая панель',\n },\n markdown: {\n copy: 'Скопировать код',\n copied: 'Скопировано',\n taskDone: 'Сделано:',\n taskTodo: 'Не сделано:',\n },\n // Существительное впереди — «Вставлено: Ада», а не «Ада вставлена»: род имени\n // заранее неизвестен, а интерполятор согласовывать его не умеет. По той же\n // причине счётчик без склонения — форм множественного числа в нём нет.\n marquee: {\n label: 'Бегущая строка',\n link: 'ссылка',\n },\n mention: {\n listbox: 'Упоминания',\n available: 'Найдено совпадений: {{count}}',\n inserted: 'Вставлено: {{label}}',\n },\n drawer: {\n close: 'Закрыть панель',\n },\n datePicker: {\n open: 'Открыть календарь',\n openTime: 'Открыть выбор времени',\n openDateTime: 'Открыть выбор даты и времени',\n openRange: 'Открыть календарь периода',\n panel: 'Выбор даты',\n panelTime: 'Выбор времени',\n panelDateTime: 'Выбор даты и времени',\n panelRange: 'Выбор периода',\n panelRangeDateTime: 'Выбор периода и времени',\n rangeStart: 'Начало периода',\n rangeEnd: 'Конец периода',\n startTime: 'Время начала',\n endTime: 'Время окончания',\n hours: 'Часы',\n minutes: 'Минуты',\n seconds: 'Секунды',\n incrementHours: 'Увеличить часы',\n decrementHours: 'Уменьшить часы',\n incrementMinutes: 'Увеличить минуты',\n decrementMinutes: 'Уменьшить минуты',\n incrementSeconds: 'Увеличить секунды',\n decrementSeconds: 'Уменьшить секунды',\n toggleAmPm: 'Переключить ДП / ПП',\n am: 'ДП',\n pm: 'ПП',\n },\n sidebar: {\n label: 'Боковая панель',\n },\n spinner: {\n label: 'Загрузка',\n },\n rating: {\n label: 'Рейтинг',\n },\n gauge: {\n label: 'Индикатор',\n },\n progress: {\n label: 'Прогресс',\n },\n meterGroup: {\n label: 'Шкала',\n },\n knob: {\n label: 'Значение',\n },\n slider: {\n label: 'Значение',\n lower: 'Нижнее значение',\n upper: 'Верхнее значение',\n },\n speedDial: {\n label: 'Действия',\n },\n statistic: {\n delta: '{{value}}{{suffix}}',\n deltaSuffix: '%',\n },\n result: {\n notFound: 'Извините, страница не найдена.',\n forbidden: 'Извините, доступ к этой странице ограничен.',\n serverError: 'Извините, что-то пошло не так.',\n },\n date: {\n months: {\n jan: 'Январь',\n feb: 'Февраль',\n mar: 'Март',\n apr: 'Апрель',\n may: 'Май',\n jun: 'Июнь',\n jul: 'Июль',\n aug: 'Август',\n sep: 'Сентябрь',\n oct: 'Октябрь',\n nov: 'Ноябрь',\n dec: 'Декабрь',\n },\n },\n};\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-i18n-ru.mjs","sources":["../../../projects/lib/i18n/ru/public-api.ts","../../../projects/lib/i18n/ru/ngwr-i18n-ru.ts"],"sourcesContent":["import { type WrI18nCatalog } from 'ngwr/i18n';\n\n/** Base Russian catalog for ngwr built-in component strings. */\nexport const wrRu: WrI18nCatalog = {\n common: {\n ok: 'OK',\n cancel: 'Отмена',\n close: 'Закрыть',\n confirm: 'Подтвердить',\n delete: 'Удалить',\n save: 'Сохранить',\n edit: 'Изменить',\n add: 'Добавить',\n remove: 'Удалить',\n clear: 'Очистить',\n search: 'Поиск',\n loading: 'Загрузка…',\n select: 'Выбрать',\n next: 'Далее',\n previous: 'Назад',\n back: 'Назад',\n today: 'Сегодня',\n yesterday: 'Вчера',\n tomorrow: 'Завтра',\n of: 'из',\n },\n pagination: {\n prev: 'Предыдущая страница',\n next: 'Следующая страница',\n itemsPerPage: 'Записей на страницу',\n perPage: '{{size}} / стр.',\n goToPage: 'Перейти на страницу {{page}}',\n label: 'Пагинация',\n pageOf: 'Страница {{current}} из {{total}}',\n range: '{{from}}–{{to}} из {{total}}',\n compact: '{{current}} / {{total}}',\n },\n table: {\n empty: 'Нет данных',\n loading: 'Загрузка…',\n sort: 'Сортировать столбец',\n filter: 'Фильтр столбца',\n selectAll: 'Выбрать все строки',\n selectRow: 'Выбрать строку',\n expandRow: 'Показать детали строки',\n toggleRow: 'Показать вложенные строки',\n selectGroup: 'Выбрать группу',\n toggleGroup: 'Свернуть группу',\n noMatches: 'Ничего не найдено',\n search: 'Поиск',\n reset: 'Сбросить',\n },\n eventCalendar: {\n today: 'Сегодня',\n previous: 'Назад',\n next: 'Вперёд',\n month: 'Месяц',\n week: 'Неделя',\n day: 'День',\n time: 'Время',\n allDay: 'Весь день',\n label: 'Календарь',\n more: 'ещё {{count}}',\n },\n tour: {\n next: 'Далее',\n back: 'Назад',\n done: 'Готово',\n skip: 'Пропустить',\n progress: 'Шаг {{current}} из {{total}}',\n },\n splitter: {\n divider: 'Изменить размер областей',\n },\n stepper: {\n optional: 'необязательно',\n },\n transfer: {\n source: 'Доступно',\n target: 'Выбрано',\n search: 'Поиск',\n empty: 'Пусто',\n selectAll: 'Выбрать все',\n toTarget: 'Перенести в выбранные',\n toSource: 'Вернуть в доступные',\n count: '{{checked}} / {{total}}',\n },\n form: {\n optional: 'необязательно',\n },\n validation: {\n required: 'Обязательное поле.',\n requiredTrue: 'Нужно поставить отметку.',\n email: 'Введите корректный адрес почты.',\n minlength: 'Не короче {{requiredLength}} символов.',\n maxlength: 'Не длиннее {{requiredLength}} символов.',\n min: 'Не меньше {{min}}.',\n max: 'Не больше {{max}}.',\n pattern: 'Значение не соответствует формату.',\n noWhitespace: 'Значение не может содержать пробелы.',\n hexColor: 'Введите цвет в формате #1a2b3c.',\n url: 'Введите корректный адрес.',\n cardNumber: 'Введите корректный номер карты.',\n cvc: 'Введите {{length}}-значный код проверки.',\n iban: 'Введите корректный IBAN.',\n match: 'Значения не совпадают.',\n matchFields: 'Значения полей не совпадают.',\n oneOf: 'Выберите одно из допустимых значений.',\n minDate: 'Выберите более позднюю дату.',\n maxDate: 'Выберите более раннюю дату.',\n },\n select: {\n label: 'Выбрать',\n placeholder: 'Выберите…',\n empty: 'Нет вариантов',\n clearSelection: 'Очистить выбор',\n removeItem: 'Удалить {{label}}',\n noResults: 'Ничего не найдено',\n loading: 'Загрузка…',\n more: 'ещё {{count}}',\n },\n // `tree` covers both inline display and combobox-mode pickers\n // (replaces the dropped `treeSelect` namespace).\n tree: {\n expand: 'Развернуть',\n collapse: 'Свернуть',\n placeholder: 'Выберите…',\n clearSelection: 'Очистить выбор',\n removeItem: 'Удалить {{label}}',\n more: 'ещё {{count}}',\n },\n commandPalette: {\n label: 'Палитра команд',\n placeholder: 'Введите команду или поиск…',\n noResults: 'Ничего не найдено',\n loading: 'Идёт поиск…',\n escHint: 'esc',\n },\n empty: {\n noData: 'Нет данных',\n },\n fileUpload: {\n browse: 'Нажмите, чтобы выбрать',\n dropZone: 'или перетащите файлы сюда',\n dropZoneLabel: 'Зона загрузки файлов — нажмите или перетащите',\n removeFile: 'Удалить файл',\n invalid: 'Неподдерживаемый тип файла',\n tooBig: 'Файл слишком большой',\n size: '{{value}} {{unit}}',\n unitByte: 'Б',\n unitKb: 'КБ',\n unitMb: 'МБ',\n unitGb: 'ГБ',\n unitTb: 'ТБ',\n },\n popconfirm: {\n label: 'Подтверждение действия',\n confirm: 'Подтвердить',\n cancel: 'Отмена',\n },\n toast: {\n region: 'Уведомления',\n close: 'Закрыть',\n copy: 'Копировать',\n copied: 'Скопировано',\n closeAll: 'Закрыть все',\n },\n input: {\n showPassword: 'Показать пароль',\n hidePassword: 'Скрыть пароль',\n },\n inputNumber: {\n increment: 'Увеличить',\n decrement: 'Уменьшить',\n },\n inputOtp: {\n label: 'Код подтверждения',\n digit: 'Цифра {{index}}',\n character: 'Символ {{index}}',\n },\n anchor: {\n label: 'Содержание',\n },\n avatar: {\n alt: 'Аватар',\n },\n backTop: {\n label: 'Наверх',\n },\n breadcrumbs: {\n label: 'Хлебные крошки',\n },\n burger: {\n label: 'Переключить меню',\n },\n calendar: {\n prevMonth: 'Предыдущий месяц',\n nextMonth: 'Следующий месяц',\n prevYear: 'Предыдущий год',\n nextYear: 'Следующий год',\n prevYears: 'Предыдущие 12 лет',\n nextYears: 'Следующие 12 лет',\n header: '{{month}} {{year}}',\n yearRange: '{{from}} – {{to}}',\n dayLabel: '{{weekday}}, {{date}}',\n },\n imageCropper: {\n empty: 'Нет изображения',\n window: 'Область обрезки',\n keyHelp:\n 'Стрелки перемещают область обрезки. Alt со стрелкой изменяет её размер, Shift увеличивает шаг. ' +\n 'Область объявляется как отступ слева, отступ сверху, ширина и высота в пикселях изображения.',\n },\n sortableList: {\n keyHelp:\n 'Нажмите пробел, чтобы взять элемент, затем перемещайте его стрелками. ' +\n 'Пробел ещё раз — отпустить, Escape — вернуть на место.',\n grabbed: 'Взят. {{index}} из {{total}}.',\n moved: '{{index}} из {{total}}.',\n dropped: 'Отпущен. {{index}} из {{total}}.',\n cancelled: 'Перемещение отменено.',\n },\n colorPicker: {\n area: 'Насыщенность и яркость, {{saturation}}% и {{brightness}}%',\n hue: 'Оттенок',\n alpha: 'Непрозрачность',\n formatHex: 'HEX',\n formatRgb: 'RGB',\n formatHsl: 'HSL',\n channelHex: 'HEX',\n channelRed: 'R',\n channelGreen: 'G',\n channelBlue: 'B',\n channelHue: 'H',\n channelSaturation: 'S%',\n channelLightness: 'L%',\n channelAlpha: 'A%',\n },\n calendarHeatmap: {\n label: 'Календарная тепловая карта',\n },\n lineChart: {\n label: 'Линейный график',\n },\n donutChart: {\n label: 'Круговая диаграмма',\n },\n compare: {\n label: 'Разделитель сравнения',\n },\n // Два `roledescription` произносятся ВМЕСТО названия роли, поэтому это строчные\n // существительные — «карусель», «слайд», — а не подписи с заглавной, как выше.\n carousel: {\n label: 'Карусель',\n goToSlide: 'Перейти к слайду {{index}}',\n prev: 'Предыдущий слайд',\n next: 'Следующий слайд',\n pagination: 'Пагинация карусели',\n roledescription: 'карусель',\n slideRoledescription: 'слайд',\n },\n actionSheet: {\n label: 'Действия',\n },\n alert: {\n close: 'Закрыть оповещение',\n },\n qr: {\n label: 'QR-код',\n },\n image: {\n viewer: 'Просмотр изображения',\n open: 'Открыть превью',\n close: 'Закрыть превью',\n },\n window: {\n close: 'Закрыть',\n minimize: 'Свернуть',\n maximize: 'Развернуть',\n restore: 'Восстановить',\n restoreDown: 'Восстановить размер',\n restoreWindow: 'Восстановить {{title}}',\n closeWindow: 'Закрыть окно',\n untitled: 'Без названия',\n taskbar: 'Свёрнутые окна',\n },\n dialog: {\n close: 'Закрыть диалог',\n },\n // Намеренно обобщённо: у панели поповера нет универсального имени, а\n // `role=\"dialog\"` без имени не озвучивается вовсе. Переопределяется на месте\n // через `[ariaLabel]`.\n popover: {\n label: 'Всплывающая панель',\n },\n markdown: {\n copy: 'Скопировать код',\n copied: 'Скопировано',\n taskDone: 'Сделано:',\n taskTodo: 'Не сделано:',\n },\n // Существительное впереди — «Вставлено: Ада», а не «Ада вставлена»: род имени\n // заранее неизвестен, а интерполятор согласовывать его не умеет. По той же\n // причине счётчик без склонения — форм множественного числа в нём нет.\n marquee: {\n label: 'Бегущая строка',\n link: 'ссылка',\n },\n mention: {\n listbox: 'Упоминания',\n available: 'Найдено совпадений: {{count}}',\n inserted: 'Вставлено: {{label}}',\n },\n drawer: {\n close: 'Закрыть панель',\n },\n datePicker: {\n open: 'Открыть календарь',\n openTime: 'Открыть выбор времени',\n openDateTime: 'Открыть выбор даты и времени',\n openRange: 'Открыть календарь периода',\n panel: 'Выбор даты',\n panelTime: 'Выбор времени',\n panelDateTime: 'Выбор даты и времени',\n panelRange: 'Выбор периода',\n panelRangeDateTime: 'Выбор периода и времени',\n rangeStart: 'Начало периода',\n rangeEnd: 'Конец периода',\n startTime: 'Время начала',\n endTime: 'Время окончания',\n hours: 'Часы',\n minutes: 'Минуты',\n seconds: 'Секунды',\n incrementHours: 'Увеличить часы',\n decrementHours: 'Уменьшить часы',\n incrementMinutes: 'Увеличить минуты',\n decrementMinutes: 'Уменьшить минуты',\n incrementSeconds: 'Увеличить секунды',\n decrementSeconds: 'Уменьшить секунды',\n toggleAmPm: 'Переключить ДП / ПП',\n am: 'ДП',\n pm: 'ПП',\n },\n sidebar: {\n label: 'Боковая панель',\n },\n spinner: {\n label: 'Загрузка',\n },\n rating: {\n label: 'Рейтинг',\n },\n gauge: {\n label: 'Индикатор',\n },\n progress: {\n label: 'Прогресс',\n },\n meterGroup: {\n label: 'Шкала',\n },\n knob: {\n label: 'Значение',\n },\n slider: {\n label: 'Значение',\n lower: 'Нижнее значение',\n upper: 'Верхнее значение',\n },\n speedDial: {\n label: 'Действия',\n },\n statistic: {\n delta: '{{value}}{{suffix}}',\n deltaSuffix: '%',\n },\n result: {\n notFound: 'Извините, страница не найдена.',\n forbidden: 'Извините, доступ к этой странице ограничен.',\n serverError: 'Извините, что-то пошло не так.',\n },\n date: {\n months: {\n jan: 'Январь',\n feb: 'Февраль',\n mar: 'Март',\n apr: 'Апрель',\n may: 'Май',\n jun: 'Июнь',\n jul: 'Июль',\n aug: 'Август',\n sep: 'Сентябрь',\n oct: 'Октябрь',\n nov: 'Ноябрь',\n dec: 'Декабрь',\n },\n },\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.
18
18
  */
19
- const NGWR_VERSION = '14.0.1';
19
+ const NGWR_VERSION = '14.1.0';
20
20
 
21
21
  /**
22
22
  * @license
@@ -1 +1 @@
1
- {"version":3,"file":"ngwr-version.mjs","sources":["../../../projects/lib/version/version.ts","../../../projects/lib/version/version.token.ts","../../../projects/lib/version/ngwr-version.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\n/**\n * The ngwr library version string, kept in sync with\n * `projects/lib/package.json` by `scripts/release-prepare.ts`.\n *\n * Prefer this over reading `package.json` at runtime — that requires a JSON\n * import or `require`, neither of which tree-shakes well in Angular builds.\n *\n * Distinct from `Version` exported by `@angular/core`, which reports the\n * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.\n */\nexport const NGWR_VERSION = '14.0.1';\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 { InjectionToken } from '@angular/core';\n\nimport { NGWR_VERSION } from './version';\n\n/**\n * Injection token holding the ngwr library version string.\n *\n * Default factory returns {@link NGWR_VERSION}. Override it in tests or in\n * apps that want to surface a custom build identifier.\n *\n * @example\n * ```ts\n * @Component({...})\n * export class FooterComponent {\n * readonly version = inject(NGWR_VERSION_TOKEN);\n * }\n * ```\n */\nexport const NGWR_VERSION_TOKEN = new InjectionToken<string>('NGWR_VERSION_TOKEN', {\n providedIn: 'root',\n factory: () => NGWR_VERSION,\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAEH;;;;;;;;;AASG;AACI,MAAM,YAAY,GAAG;;ACjB5B;;;;;AAKG;AAMH;;;;;;;;;;;;;AAaG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAS,oBAAoB,EAAE;AACjF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,YAAY;AAC5B,CAAA;;AC5BD;;AAEG;;;;"}
1
+ {"version":3,"file":"ngwr-version.mjs","sources":["../../../projects/lib/version/version.ts","../../../projects/lib/version/version.token.ts","../../../projects/lib/version/ngwr-version.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\n/**\n * The ngwr library version string, kept in sync with\n * `projects/lib/package.json` by `scripts/release-prepare.ts`.\n *\n * Prefer this over reading `package.json` at runtime — that requires a JSON\n * import or `require`, neither of which tree-shakes well in Angular builds.\n *\n * Distinct from `Version` exported by `@angular/core`, which reports the\n * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.\n */\nexport const NGWR_VERSION = '14.1.0';\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 { InjectionToken } from '@angular/core';\n\nimport { NGWR_VERSION } from './version';\n\n/**\n * Injection token holding the ngwr library version string.\n *\n * Default factory returns {@link NGWR_VERSION}. Override it in tests or in\n * apps that want to surface a custom build identifier.\n *\n * @example\n * ```ts\n * @Component({...})\n * export class FooterComponent {\n * readonly version = inject(NGWR_VERSION_TOKEN);\n * }\n * ```\n */\nexport const NGWR_VERSION_TOKEN = new InjectionToken<string>('NGWR_VERSION_TOKEN', {\n providedIn: 'root',\n factory: () => NGWR_VERSION,\n});\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;;AAKG;AAEH;;;;;;;;;AASG;AACI,MAAM,YAAY,GAAG;;ACjB5B;;;;;AAKG;AAMH;;;;;;;;;;;;;AAaG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAS,oBAAoB,EAAE;AACjF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,YAAY;AAC5B,CAAA;;AC5BD;;AAEG;;;;"}
package/i18n/en.json CHANGED
@@ -128,6 +128,7 @@
128
128
  "label": "Command palette",
129
129
  "placeholder": "Type a command or search…",
130
130
  "noResults": "No results",
131
+ "loading": "Searching…",
131
132
  "escHint": "esc"
132
133
  },
133
134
  "empty": {
package/i18n/ru.json CHANGED
@@ -128,6 +128,7 @@
128
128
  "label": "Палитра команд",
129
129
  "placeholder": "Введите команду или поиск…",
130
130
  "noResults": "Ничего не найдено",
131
+ "loading": "Идёт поиск…",
131
132
  "escHint": "esc"
132
133
  },
133
134
  "empty": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngwr",
3
- "version": "14.0.1",
3
+ "version": "14.1.0",
4
4
  "bin": {
5
5
  "ngwr-mcp": "mcp/server.js"
6
6
  },
@@ -69,8 +69,14 @@ declare class WrCommandPalette {
69
69
  readonly placeholder: _angular_core.InputSignal<string | null>;
70
70
  /** Text shown when no items match. Falls back to `commandPalette.noResults`. */
71
71
  readonly emptyText: _angular_core.InputSignal<string | null>;
72
+ /**
73
+ * Overrides the `commandPalette.loading` catalog string, shown instead of
74
+ * {@link emptyText} while {@link loading} is true.
75
+ */
76
+ readonly loadingText: _angular_core.InputSignal<string | null>;
72
77
  protected readonly resolvedPlaceholder: _angular_core.Signal<string>;
73
78
  protected readonly resolvedEmpty: _angular_core.Signal<string>;
79
+ protected readonly resolvedLoading: _angular_core.Signal<string>;
74
80
  /**
75
81
  * The key-cap chip beside the search field. It was the literal `esc` in the
76
82
  * template — the one string on this component no catalog could reach, so a
@@ -89,7 +95,47 @@ declare class WrCommandPalette {
89
95
  readonly responsive: _angular_core.InputSignalWithTransform<boolean | undefined, BooleanInput>;
90
96
  /** Fires when the user commits an item (Enter / click). */
91
97
  readonly picked: _angular_core.OutputEmitterRef<WrCommandItem>;
92
- protected readonly query: _angular_core.WritableSignal<string>;
98
+ /**
99
+ * The search text. Two-way, so a host can seed it, clear it, or read what the
100
+ * user is looking for — the palette used to keep this to itself, which is what
101
+ * made it impossible to back with anything but a static `items` array.
102
+ *
103
+ * Writing it does NOT re-run a host's search on its own: the debounced
104
+ * {@link searchChange} output is what fires, on exactly the cadence
105
+ * {@link debounceMs} sets.
106
+ */
107
+ readonly query: _angular_core.ModelSignal<string>;
108
+ /**
109
+ * The item list is already scoped to the query upstream — skip the built-in
110
+ * client-side filter. Set it when `[items]` is fed from a server via the
111
+ * {@link searchChange} output.
112
+ *
113
+ * Without this, a backend that ranks or tolerates typos (returning rows whose
114
+ * labels do not literally contain the query) would have those rows hidden
115
+ * again on the client — the same rule `wr-select` follows, and the same
116
+ * reason. @default false
117
+ */
118
+ readonly serverSearch: _angular_core.InputSignalWithTransform<boolean, any>;
119
+ /**
120
+ * A host-driven search is in flight. Swaps the empty row for
121
+ * {@link loadingText} — an async palette that says "No results" between every
122
+ * keystroke and its answer is stating something false. @default false
123
+ */
124
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, any>;
125
+ /**
126
+ * How long the query must settle before {@link searchChange} fires, in ms.
127
+ * A search request per keystroke is what exhausts a metered search backend:
128
+ * typing `select` is six requests at 0 and roughly one at 250. @default 250
129
+ */
130
+ readonly debounceMs: _angular_core.InputSignalWithTransform<number, unknown>;
131
+ /**
132
+ * The settled query. This is the hook for a server-backed palette: dispatch
133
+ * on it, then feed the result into `[items]` with `[serverSearch]` set.
134
+ *
135
+ * Fires on the {@link debounceMs} cadence, NOT per keystroke — `queryChange`
136
+ * is the per-keystroke signal if that is what you want.
137
+ */
138
+ readonly searchChange: _angular_core.OutputEmitterRef<string>;
93
139
  protected readonly activeIndex: _angular_core.WritableSignal<number>;
94
140
  /** Whether the current opening is presented full-screen. Decided on open. */
95
141
  protected readonly presentAsSheet: _angular_core.WritableSignal<boolean>;
@@ -124,6 +170,17 @@ declare class WrCommandPalette {
124
170
  * and holds it, so that is retained DOM, not just a stray object.
125
171
  */
126
172
  private destroyed;
173
+ /** Whether this palette filters `items` itself. */
174
+ protected readonly clientFilter: _angular_core.Signal<boolean>;
175
+ /**
176
+ * Nothing has been asked yet, so there is nothing to report as missing.
177
+ *
178
+ * A client-filtered palette cannot reach this state — an empty query matches
179
+ * every item, so the list is never empty on open. A server-backed one opens
180
+ * with no items by construction, and saying "No results" before a single
181
+ * keystroke answers a question nobody asked.
182
+ */
183
+ protected readonly awaitingQuery: _angular_core.Signal<boolean>;
127
184
  /** Grouped view — what the template renders. */
128
185
  protected readonly buckets: _angular_core.Signal<readonly Bucket[]>;
129
186
  /**
@@ -158,7 +215,7 @@ declare class WrCommandPalette {
158
215
  private revealActive;
159
216
  private commit;
160
217
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<WrCommandPalette, never>;
161
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCommandPalette, "wr-command-palette", never, { "paletteLabel": { "alias": "paletteLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "closeOnPick": { "alias": "closeOnPick"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; }, never, never, true, never>;
218
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<WrCommandPalette, "wr-command-palette", never, { "paletteLabel": { "alias": "paletteLabel"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "trigger": { "alias": "trigger"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "loadingText": { "alias": "loadingText"; "required": false; "isSignal": true; }; "closeOnPick": { "alias": "closeOnPick"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "query": { "alias": "query"; "required": false; "isSignal": true; }; "serverSearch": { "alias": "serverSearch"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "picked": "picked"; "query": "queryChange"; "searchChange": "searchChange"; }, never, never, true, never>;
162
219
  }
163
220
 
164
221
  export { WrCommandPalette };
@@ -16,7 +16,7 @@ import { InjectionToken } from '@angular/core';
16
16
  * Distinct from `Version` exported by `@angular/core`, which reports the
17
17
  * loaded Angular runtime version (e.g. `'22.0.0'`), not ngwr's.
18
18
  */
19
- declare const NGWR_VERSION = "14.0.1";
19
+ declare const NGWR_VERSION = "14.1.0";
20
20
 
21
21
  /**
22
22
  * @license