@testgorilla/tgo-ui 11.21.1 → 11.22.1

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.
package/mcp/server.mjs CHANGED
@@ -3336,6 +3336,37 @@ var require_utils = __commonJS({
3336
3336
  }
3337
3337
  return output.join("");
3338
3338
  }
3339
+ function removeDotSegmentsRelative(path3) {
3340
+ if (path3 === "" || path3[0] === "/") {
3341
+ return removeDotSegments(path3);
3342
+ }
3343
+ const segments = path3.split("/");
3344
+ const last = segments.length - 1;
3345
+ const output = [];
3346
+ let trailingDirectory = false;
3347
+ for (let i = 0; i <= last; i++) {
3348
+ const segment = segments[i];
3349
+ if (segment === "." || segment === "..") {
3350
+ if (segment === "..") {
3351
+ if (output.length !== 0 && output[output.length - 1] !== "..") {
3352
+ output.pop();
3353
+ } else {
3354
+ output.push("..");
3355
+ }
3356
+ }
3357
+ trailingDirectory = i === last;
3358
+ } else {
3359
+ output.push(segment);
3360
+ }
3361
+ }
3362
+ if (trailingDirectory && output[output.length - 1] !== "..") {
3363
+ output.push("");
3364
+ }
3365
+ if (output.length === 0 || output[0] === "" || output[0].includes(":")) {
3366
+ output.unshift(".");
3367
+ }
3368
+ return output.join("/");
3369
+ }
3339
3370
  var HOST_DELIMS = { "@": "%40", "/": "%2F", "?": "%3F", "#": "%23", ":": "%3A" };
3340
3371
  var HOST_DELIM_RE = /[@/?#:]/g;
3341
3372
  var HOST_DELIM_NO_COLON_RE = /[@/?#]/g;
@@ -3596,6 +3627,7 @@ var require_utils = __commonJS({
3596
3627
  encodeFragment,
3597
3628
  escapePreservingEscapes,
3598
3629
  removeDotSegments,
3630
+ removeDotSegmentsRelative,
3599
3631
  isIPv4,
3600
3632
  isUUID,
3601
3633
  normalizeIPv6,
@@ -3819,16 +3851,18 @@ var require_schemes = __commonJS({
3819
3851
  var require_fast_uri = __commonJS({
3820
3852
  "node_modules/fast-uri/index.js"(exports, module) {
3821
3853
  "use strict";
3822
- var { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3854
+ var { normalizeIPv6, removeDotSegments, removeDotSegmentsRelative, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require_utils();
3823
3855
  var { SCHEMES, getSchemeHandler } = require_schemes();
3824
3856
  var VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u;
3825
3857
  var MALFORMED_SCHEME_ERROR = "URI scheme is malformed.";
3826
- function decodeValidScheme(scheme) {
3827
- const decodedScheme = unescape(String(scheme));
3828
- if (!VALID_SCHEME.test(decodedScheme)) {
3858
+ var MALFORMED_HOST_ERROR = "URI host is malformed.";
3859
+ var FORBIDDEN_DOMAIN_HOST_CHARACTER = /[\0-\x20"#/:<>?@[\\\]^`{|}\x7F]/u;
3860
+ function validateScheme(scheme) {
3861
+ const stringScheme = String(scheme);
3862
+ if (!VALID_SCHEME.test(stringScheme)) {
3829
3863
  throw new TypeError(MALFORMED_SCHEME_ERROR);
3830
3864
  }
3831
- return decodedScheme;
3865
+ return stringScheme;
3832
3866
  }
3833
3867
  function normalize2(uri, options) {
3834
3868
  if (typeof uri === "string") {
@@ -3865,6 +3899,9 @@ var require_fast_uri = __commonJS({
3865
3899
  const resolvedSchemeHandler = getSchemeHandler(options && options.scheme || resolved.scheme);
3866
3900
  const resolvedHost = resolved.host;
3867
3901
  const resolvedHostIsIP = resolvedHost !== void 0 && resolvedHost !== "" && (isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6);
3902
+ if (hasForbiddenDomainHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP)) {
3903
+ throw new Error(MALFORMED_HOST_ERROR);
3904
+ }
3868
3905
  canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP);
3869
3906
  const encodedASCIIHost = resolvedHost && resolvedHost.indexOf("%") !== -1 && !new RegExp("\\P{ASCII}", "u").test(resolvedHost);
3870
3907
  if (resolved.error && !encodedASCIIHost) {
@@ -3906,14 +3943,15 @@ var require_fast_uri = __commonJS({
3906
3943
  if (relative.path[0] === "/") {
3907
3944
  target.path = removeDotSegments(relative.path);
3908
3945
  } else {
3909
- if ((base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0) && !base.path) {
3946
+ const baseHasAuthority = base.userinfo !== void 0 || base.host !== void 0 || base.port !== void 0;
3947
+ if (baseHasAuthority && !base.path) {
3910
3948
  target.path = "/" + relative.path;
3911
3949
  } else if (!base.path) {
3912
3950
  target.path = relative.path;
3913
3951
  } else {
3914
3952
  target.path = base.path.slice(0, base.path.lastIndexOf("/") + 1) + relative.path;
3915
3953
  }
3916
- target.path = removeDotSegments(target.path);
3954
+ target.path = base.scheme === void 0 && !baseHasAuthority && target.path[0] !== "/" ? removeDotSegmentsRelative(target.path) : removeDotSegments(target.path);
3917
3955
  }
3918
3956
  target.query = relative.query;
3919
3957
  }
@@ -3951,12 +3989,13 @@ var require_fast_uri = __commonJS({
3951
3989
  const options = Object.assign({}, opts);
3952
3990
  const uriTokens = [];
3953
3991
  if (component.scheme) {
3954
- component.scheme = decodeValidScheme(component.scheme);
3992
+ component.scheme = validateScheme(component.scheme);
3955
3993
  }
3956
3994
  const schemeHandler = getSchemeHandler(options.scheme || component.scheme);
3957
3995
  if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options);
3958
3996
  const hasAuthority = component.userinfo !== void 0 || component.host !== void 0 || component.port !== void 0;
3959
- const pathNoScheme = !options.skipEscape && component.scheme === void 0 && !hasAuthority;
3997
+ const schemelessReference = (component.scheme === void 0 || options.reference === "suffix") && !hasAuthority;
3998
+ const pathNoScheme = !options.skipEscape && schemelessReference;
3960
3999
  if (component.path !== void 0) {
3961
4000
  if (!options.skipEscape) {
3962
4001
  component.path = serializePathEncoding(component.path, pathNoScheme);
@@ -3965,7 +4004,7 @@ var require_fast_uri = __commonJS({
3965
4004
  }
3966
4005
  }
3967
4006
  if (options.reference !== "suffix" && component.scheme) {
3968
- component.scheme = decodeValidScheme(component.scheme);
4007
+ component.scheme = validateScheme(component.scheme);
3969
4008
  uriTokens.push(component.scheme, ":");
3970
4009
  }
3971
4010
  const authority = recomposeAuthority(component);
@@ -3981,9 +4020,9 @@ var require_fast_uri = __commonJS({
3981
4020
  if (component.path !== void 0) {
3982
4021
  let s = component.path;
3983
4022
  if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {
3984
- s = removeDotSegments(s);
4023
+ s = schemelessReference && s[0] !== "/" ? removeDotSegmentsRelative(s) : removeDotSegments(s);
3985
4024
  }
3986
- if (pathNoScheme) {
4025
+ if (schemelessReference) {
3987
4026
  s = serializePathEncoding(s, true);
3988
4027
  }
3989
4028
  if (authority === void 0 && s[0] === "/" && s[1] === "/") {
@@ -4030,16 +4069,34 @@ var require_fast_uri = __commonJS({
4030
4069
  return hasMalformedPercentEncoding(matches[3]) || host !== void 0 && !isIPLiteral(host) && hasMalformedPercentEncoding(host) || hasMalformedPercentEncoding(matches[6]) || hasMalformedPercentEncoding(matches[7]) || hasMalformedPercentEncoding(matches[8]);
4031
4070
  }
4032
4071
  function canonicalizeHost(parsed, options, schemeHandler, isIP) {
4072
+ if (hasForbiddenDomainHost(parsed, options, schemeHandler, isIP)) {
4073
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4074
+ return true;
4075
+ }
4033
4076
  if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport) && parsed.host && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && isIP === false && nonSimpleDomain(parsed.host)) {
4077
+ let url;
4034
4078
  try {
4035
- parsed.host = new URL("http://" + parsed.host).hostname;
4079
+ url = new URL("http://" + parsed.host);
4036
4080
  } catch (e) {
4037
4081
  parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e;
4038
4082
  return true;
4039
4083
  }
4084
+ if (!isHostOnlyURL(url)) {
4085
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4086
+ return true;
4087
+ }
4088
+ parsed.host = url.hostname;
4040
4089
  }
4041
4090
  return false;
4042
4091
  }
4092
+ function hasForbiddenDomainHost(parsed, options, schemeHandler, isIP) {
4093
+ return Boolean(
4094
+ parsed.host && isIP === false && !isIPLiteral(parsed.host) && (options.domainHost || schemeHandler && schemeHandler.domainHost) && FORBIDDEN_DOMAIN_HOST_CHARACTER.test(parsed.host)
4095
+ );
4096
+ }
4097
+ function isHostOnlyURL(url) {
4098
+ return url.username === "" && url.password === "" && url.port === "" && url.pathname === "/" && url.search === "" && url.hash === "" && url.hostname !== "";
4099
+ }
4043
4100
  function parseWithStatus(uri, opts) {
4044
4101
  const options = Object.assign({}, opts);
4045
4102
  const parsed = {
@@ -4094,9 +4151,8 @@ var require_fast_uri = __commonJS({
4094
4151
  parsed.query = matches[7];
4095
4152
  parsed.fragment = matches[8];
4096
4153
  if (parsed.scheme !== void 0) {
4097
- const decodedScheme = unescape(parsed.scheme);
4098
- if (VALID_SCHEME.test(decodedScheme)) {
4099
- parsed.scheme = decodedScheme.toLowerCase();
4154
+ if (VALID_SCHEME.test(parsed.scheme)) {
4155
+ parsed.scheme = parsed.scheme.toLowerCase();
4100
4156
  } else {
4101
4157
  parsed.error = parsed.error || MALFORMED_SCHEME_ERROR;
4102
4158
  malformedScheme = true;
@@ -4124,7 +4180,7 @@ var require_fast_uri = __commonJS({
4124
4180
  malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true);
4125
4181
  parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase();
4126
4182
  if (malformedIPLiteral) {
4127
- parsed.error = parsed.error || "URI host is malformed.";
4183
+ parsed.error = parsed.error || MALFORMED_HOST_ERROR;
4128
4184
  malformedAuthorityOrPort = true;
4129
4185
  }
4130
4186
  } else {
@@ -4152,7 +4208,7 @@ var require_fast_uri = __commonJS({
4152
4208
  if (!isIP) {
4153
4209
  host = normalizePercentEncoding(host.toLowerCase());
4154
4210
  }
4155
- parsed.host = reescapeHostDelimiters(host, isIP);
4211
+ parsed.host = isIP || options.scheme !== "null" ? reescapeHostDelimiters(host, isIP) : host;
4156
4212
  }
4157
4213
  if (!schemeHandler || schemeHandler && !schemeHandler.skipNormalize) {
4158
4214
  if (parsed.path) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testgorilla/tgo-ui",
3
- "version": "11.21.1",
3
+ "version": "11.22.1",
4
4
  "license": "proprietary-license",
5
5
  "lint-staged": {
6
6
  "{projects,components}/**/*.ts": [
@@ -62,7 +62,7 @@
62
62
  "postcss": "^8.5.18"
63
63
  },
64
64
  "@angular/build": {
65
- "undici": "^7.29.0",
65
+ "undici": "^7.30.1",
66
66
  "vite": "~7.3.7"
67
67
  },
68
68
  "ng-packagr": {
@@ -74,7 +74,9 @@
74
74
  },
75
75
  "less": "^4.8.1",
76
76
  "webpack-dev-middleware": "^7.4.6",
77
- "piscina": "^5.3.2"
77
+ "piscina": "^5.3.2",
78
+ "undici@7": "^7.30.1",
79
+ "undici@6": "^6.29.1"
78
80
  },
79
81
  "module": "fesm2022/testgorilla-tgo-ui.mjs",
80
82
  "typings": "types/testgorilla-tgo-ui.d.ts",
@@ -1,10 +1,11 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { AfterViewInit, OnDestroy, DoCheck, ElementRef } from '@angular/core';
2
+ import { AfterViewInit, OnDestroy, TemplateRef, DoCheck, ElementRef } from '@angular/core';
3
3
  import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
4
4
  import { ControlValueAccessor, NgControl } from '@angular/forms';
5
5
  import { MatAutocompleteTrigger, MatAutocomplete, MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';
6
6
  import { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';
7
7
  export { ApplicationTheme } from '@testgorilla/tgo-ui/components/core';
8
+ import { IconName } from '@testgorilla/tgo-ui/components/icon';
8
9
  import { BehaviorSubject, ReplaySubject, Observable } from 'rxjs';
9
10
 
10
11
  declare class AutocompleteOverflowDetectDirective implements AfterViewInit, OnDestroy {
@@ -27,6 +28,29 @@ declare class AutocompleteOverflowDetectDirective implements AfterViewInit, OnDe
27
28
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AutocompleteOverflowDetectDirective, "[uiAutocompleteOverflowDetect]", ["autocompleteOverflowDetect"], { "measureContainer": { "alias": "measureContainer"; "required": false; "isSignal": true; }; "itemSelector": { "alias": "itemSelector"; "required": false; "isSignal": true; }; "reserveWidth": { "alias": "reserveWidth"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
28
29
  }
29
30
 
31
+ interface AutocompleteTagSuffixContext<T = Record<string, unknown>> {
32
+ /** The selected item the tag represents. */
33
+ $implicit: T;
34
+ /** The tag's position in the selection. */
35
+ index: number;
36
+ }
37
+ /**
38
+ * Marks an `ng-template` whose content is rendered inside each selected tag, after its label.
39
+ * Only applies with `tagsPosition="below"`.
40
+ *
41
+ * ```html
42
+ * <ui-autocomplete-v2 tagsPosition="below" ...>
43
+ * <ng-template uiAutocompleteTagSuffix let-item>{{ item.radius }}</ng-template>
44
+ * </ui-autocomplete-v2>
45
+ * ```
46
+ */
47
+ declare class AutocompleteTagSuffixDirective<T = Record<string, unknown>> {
48
+ readonly templateRef: TemplateRef<AutocompleteTagSuffixContext<T>>;
49
+ static ngTemplateContextGuard<T>(_dir: AutocompleteTagSuffixDirective<T>, ctx: unknown): ctx is AutocompleteTagSuffixContext<T>;
50
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutocompleteTagSuffixDirective<any>, never>;
51
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AutocompleteTagSuffixDirective<any>, "ng-template[uiAutocompleteTagSuffix]", never, {}, {}, never, never, true, never>;
52
+ }
53
+
30
54
  declare class AutocompleteFilterService<T extends Record<string, unknown> = Record<string, unknown>> implements OnDestroy {
31
55
  readonly textField: _angular_core.WritableSignal<string>;
32
56
  readonly flatItems: _angular_core.WritableSignal<T[]>;
@@ -158,6 +182,11 @@ declare class AutocompleteV2Component<T extends Record<string, unknown> = Record
158
182
  errors: _angular_core.InputSignal<string[]>;
159
183
  addOptionPosition: _angular_core.InputSignal<AddOptionPosition>;
160
184
  tagsPosition: _angular_core.InputSignal<TagsPosition>;
185
+ /**
186
+ * Icon shown before the label of each selected tag: one icon for every tag, or a function that picks
187
+ * it per item (return `''` for no icon). Only applies with `tagsPosition="below"`.
188
+ */
189
+ tagIcon: _angular_core.InputSignal<IconName | ((item: T) => IconName)>;
161
190
  selectionChange: _angular_core.OutputEmitterRef<T | T[]>;
162
191
  searchTextChange: _angular_core.OutputEmitterRef<string>;
163
192
  blur: _angular_core.OutputEmitterRef<void>;
@@ -172,6 +201,7 @@ declare class AutocompleteV2Component<T extends Record<string, unknown> = Record
172
201
  set cdkViewport(viewport: CdkVirtualScrollViewport);
173
202
  matAutocomplete: MatAutocomplete;
174
203
  matInput: ElementRef<HTMLInputElement>;
204
+ protected readonly tagSuffix: _angular_core.Signal<AutocompleteTagSuffixDirective<T> | undefined>;
175
205
  protected readonly valueManager: AutocompleteValueManager<T>;
176
206
  protected readonly filterService: AutocompleteFilterService<T>;
177
207
  private readonly scrollManager;
@@ -200,6 +230,8 @@ declare class AutocompleteV2Component<T extends Record<string, unknown> = Record
200
230
  protected readonly tagsBelow: _angular_core.Signal<boolean>;
201
231
  protected readonly suppressPlaceholder: _angular_core.Signal<boolean>;
202
232
  protected showClearButton: _angular_core.Signal<boolean>;
233
+ /** Icon per below-tag, in selection order */
234
+ protected readonly tagIcons: _angular_core.Signal<IconName[]>;
203
235
  protected safeErrors: _angular_core.Signal<string[]>;
204
236
  private readonly controlInvalid;
205
237
  protected hasError: _angular_core.Signal<boolean>;
@@ -219,6 +251,12 @@ declare class AutocompleteV2Component<T extends Record<string, unknown> = Record
219
251
  protected get isGrouped(): boolean;
220
252
  protected onOptionSelected(event: MatAutocompleteSelectedEvent): void;
221
253
  protected onOptionRemoved(option: T): void;
254
+ /**
255
+ * Makes the whole below-tag a hit area for the control in its `uiAutocompleteTagSuffix` content
256
+ * (e.g. a menu trigger). The remove icon keeps its own behavior, and presses inside the suffix never
257
+ * reach here because the tag stops them.
258
+ */
259
+ protected onTagActivate(event: Event): void;
222
260
  protected onInputChange(event: Event): void;
223
261
  protected onClear(): void;
224
262
  protected onBlur(): void;
@@ -233,8 +271,8 @@ declare class AutocompleteV2Component<T extends Record<string, unknown> = Record
233
271
  onKeydown($event: KeyboardEvent): void;
234
272
  protected getVirtualScrollHeight(itemCount: number): number;
235
273
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AutocompleteV2Component<any>, never>;
236
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AutocompleteV2Component<any>, "ui-autocomplete-v2", never, { "itemsList": { "alias": "itemsList"; "required": false; "isSignal": true; }; "suggestionsList": { "alias": "suggestionsList"; "required": false; "isSignal": true; }; "groupsList": { "alias": "groupsList"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "allowAdd": { "alias": "allowAdd"; "required": false; "isSignal": true; }; "textField": { "alias": "textField"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; "imageField": { "alias": "imageField"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "minCharactersSearch": { "alias": "minCharactersSearch"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": true; "isSignal": true; }; "showBottomContent": { "alias": "showBottomContent"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "dropdownPanelClass": { "alias": "dropdownPanelClass"; "required": false; "isSignal": true; }; "panelPosition": { "alias": "panelPosition"; "required": false; "isSignal": true; }; "hideSelectedSection": { "alias": "hideSelectedSection"; "required": false; "isSignal": true; }; "userAdditionsGroupLabel": { "alias": "userAdditionsGroupLabel"; "required": false; "isSignal": true; }; "closeOnScroll": { "alias": "closeOnScroll"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "allowUserInput": { "alias": "allowUserInput"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "dynamicFilterLoading": { "alias": "dynamicFilterLoading"; "required": false; "isSignal": true; }; "dynamicFilteredList": { "alias": "dynamicFilteredList"; "required": false; "isSignal": true; }; "infiniteScroll": { "alias": "infiniteScroll"; "required": false; "isSignal": true; }; "hasMoreOptionsForInfiniteScroll": { "alias": "hasMoreOptionsForInfiniteScroll"; "required": false; "isSignal": true; }; "itemValue": { "alias": "itemValue"; "required": false; "isSignal": true; }; "formErrorConfig": { "alias": "formErrorConfig"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "addOptionPosition": { "alias": "addOptionPosition"; "required": false; "isSignal": true; }; "tagsPosition": { "alias": "tagsPosition"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "searchTextChange": "searchTextChange"; "blur": "blur"; "focus": "focus"; "scrollViewportBottomReached": "scrollViewportBottomReached"; "scrollViewportBottomReachedFiltered": "scrollViewportBottomReachedFiltered"; }, never, ["[autocompleteTagsSuffix]"], true, never>;
274
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AutocompleteV2Component<any>, "ui-autocomplete-v2", never, { "itemsList": { "alias": "itemsList"; "required": false; "isSignal": true; }; "suggestionsList": { "alias": "suggestionsList"; "required": false; "isSignal": true; }; "groupsList": { "alias": "groupsList"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "allowAdd": { "alias": "allowAdd"; "required": false; "isSignal": true; }; "textField": { "alias": "textField"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; "imageField": { "alias": "imageField"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "minCharactersSearch": { "alias": "minCharactersSearch"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": true; "isSignal": true; }; "showBottomContent": { "alias": "showBottomContent"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; "isSignal": true; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "dropdownPanelClass": { "alias": "dropdownPanelClass"; "required": false; "isSignal": true; }; "panelPosition": { "alias": "panelPosition"; "required": false; "isSignal": true; }; "hideSelectedSection": { "alias": "hideSelectedSection"; "required": false; "isSignal": true; }; "userAdditionsGroupLabel": { "alias": "userAdditionsGroupLabel"; "required": false; "isSignal": true; }; "closeOnScroll": { "alias": "closeOnScroll"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "allowUserInput": { "alias": "allowUserInput"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "dynamicFilterLoading": { "alias": "dynamicFilterLoading"; "required": false; "isSignal": true; }; "dynamicFilteredList": { "alias": "dynamicFilteredList"; "required": false; "isSignal": true; }; "infiniteScroll": { "alias": "infiniteScroll"; "required": false; "isSignal": true; }; "hasMoreOptionsForInfiniteScroll": { "alias": "hasMoreOptionsForInfiniteScroll"; "required": false; "isSignal": true; }; "itemValue": { "alias": "itemValue"; "required": false; "isSignal": true; }; "formErrorConfig": { "alias": "formErrorConfig"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "addOptionPosition": { "alias": "addOptionPosition"; "required": false; "isSignal": true; }; "tagsPosition": { "alias": "tagsPosition"; "required": false; "isSignal": true; }; "tagIcon": { "alias": "tagIcon"; "required": false; "isSignal": true; }; }, { "selectionChange": "selectionChange"; "searchTextChange": "searchTextChange"; "blur": "blur"; "focus": "focus"; "scrollViewportBottomReached": "scrollViewportBottomReached"; "scrollViewportBottomReachedFiltered": "scrollViewportBottomReachedFiltered"; }, ["tagSuffix"], ["[autocompleteTagsSuffix]"], true, never>;
237
275
  }
238
276
 
239
- export { Autocomplete, AutocompleteFilterService, AutocompleteOverflowDetectDirective, AutocompleteV2Component, AutocompleteV2Utils, AutocompleteValueManager, DropdownVariation };
240
- export type { AddOptionPosition, AutocompleteGroup, AutocompleteSize, AutocompleteType, DropdownVariationType, TagsPosition };
277
+ export { Autocomplete, AutocompleteFilterService, AutocompleteOverflowDetectDirective, AutocompleteTagSuffixDirective, AutocompleteV2Component, AutocompleteV2Utils, AutocompleteValueManager, DropdownVariation };
278
+ export type { AddOptionPosition, AutocompleteGroup, AutocompleteSize, AutocompleteTagSuffixContext, AutocompleteType, DropdownVariationType, TagsPosition };
@@ -1,4 +1,4 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, OnInit, OnChanges, AfterViewInit, EventEmitter, QueryList, ElementRef, NgZone, SimpleChanges } from '@angular/core';
3
3
  import { FocusMonitor } from '@angular/cdk/a11y';
4
4
  import * as i4 from '@angular/material/menu';
@@ -130,7 +130,25 @@ declare class OverflowMenuComponent implements OnInit, OnChanges, AfterViewInit
130
130
  * @type {OverflowMenuSelectionMode}
131
131
  * @memberof OverflowMenuComponent
132
132
  */
133
- readonly selectionMode: i0.InputSignal<OverflowMenuSelectionMode>;
133
+ readonly selectionMode: _angular_core.InputSignal<OverflowMenuSelectionMode>;
134
+ /**
135
+ * Element the dropdown is positioned against, instead of the trigger: an element, or a selector
136
+ * resolved as the trigger's closest matching ancestor (e.g. `'ui-tag'` to open from the start of
137
+ * the tag the trigger sits in). Read when the dropdown is first opened.
138
+ *
139
+ * @type {string | HTMLElement | null}
140
+ * @memberof OverflowMenuComponent
141
+ */
142
+ readonly menuAnchor: _angular_core.InputSignal<string | HTMLElement | null>;
143
+ /**
144
+ * Makes the open dropdown as wide as its anchor (`menuAnchor`, or the trigger when none is set),
145
+ * instead of sizing it to its content. Measured each time it opens.
146
+ *
147
+ * @type {boolean}
148
+ * @default false
149
+ * @memberof OverflowMenuComponent
150
+ */
151
+ readonly shouldMatchAnchorWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
134
152
  isDynamicMenu: boolean;
135
153
  withRemovableOption: boolean;
136
154
  selectItem: EventEmitter<string>;
@@ -141,15 +159,26 @@ declare class OverflowMenuComponent implements OnInit, OnChanges, AfterViewInit
141
159
  buttonElement: ElementRef<HTMLElement>;
142
160
  menuItems: string[];
143
161
  submenus: Array<OverflowMenuButtonModify[]>;
144
- isMenuRendered: i0.WritableSignal<boolean>;
145
- isMenuOpened: i0.WritableSignal<boolean>;
146
- isFocused: i0.WritableSignal<boolean>;
162
+ isMenuRendered: _angular_core.WritableSignal<boolean>;
163
+ isMenuOpened: _angular_core.WritableSignal<boolean>;
164
+ isFocused: _angular_core.WritableSignal<boolean>;
147
165
  get menuItemHasHovered(): boolean;
148
166
  private readonly destroyRef;
167
+ private readonly anchoredTriggers;
168
+ private readonly document;
149
169
  constructor(defaultAppTheme: ApplicationTheme, focusMonitor: FocusMonitor, ngZone: NgZone);
150
170
  ngOnInit(): void;
151
171
  ngOnChanges(changes: SimpleChanges): void;
152
172
  ngAfterViewInit(): void;
173
+ /**
174
+ * MatMenuTrigger has no public way to position against another element: it takes its origin from
175
+ * the protected `_getOverlayOrigin()` when it first creates the overlay. Overriding it on the root
176
+ * trigger lets `menuAnchor` move the origin, falling back to the trigger itself.
177
+ */
178
+ private anchorTrigger;
179
+ private resolveMenuAnchor;
180
+ /** Sizes the open panel to the anchor (or the trigger), overriding Material's 112–280px panel limits. */
181
+ private matchPanelToAnchorWidth;
153
182
  /** Opens the dropdown programmatically, as if the trigger had been used. */
154
183
  openMenu(): void;
155
184
  /** Closes the dropdown, whichever way it was opened. */
@@ -167,14 +196,14 @@ declare class OverflowMenuComponent implements OnInit, OnChanges, AfterViewInit
167
196
  private reindex;
168
197
  private resetSubmenus;
169
198
  private createSubmenus;
170
- static ɵfac: i0.ɵɵFactoryDeclaration<OverflowMenuComponent, [{ optional: true; }, null, null]>;
171
- static ɵcmp: i0.ɵɵComponentDeclaration<OverflowMenuComponent, "ui-overflow-menu", never, { "buttons": { "alias": "buttons"; "required": false; }; "iconTrigger": { "alias": "iconTrigger"; "required": false; }; "menuLabel": { "alias": "menuLabel"; "required": false; }; "applicationTheme": { "alias": "applicationTheme"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "testId": { "alias": "testId"; "required": false; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; }; "describedby": { "alias": "describedby"; "required": false; }; "contentTemplateRef": { "alias": "contentTemplateRef"; "required": false; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; }; "buttonSize": { "alias": "buttonSize"; "required": false; }; "menuConfig": { "alias": "menuConfig"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "isDynamicMenu": { "alias": "isDynamicMenu"; "required": false; }; "withRemovableOption": { "alias": "withRemovableOption"; "required": false; }; }, { "selectItem": "selectItem"; "menuOpened": "menuOpened"; "menuClosed": "menuClosed"; }, never, ["[menu-content]"], true, never>;
199
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OverflowMenuComponent, [{ optional: true; }, null, null]>;
200
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OverflowMenuComponent, "ui-overflow-menu", never, { "buttons": { "alias": "buttons"; "required": false; }; "iconTrigger": { "alias": "iconTrigger"; "required": false; }; "menuLabel": { "alias": "menuLabel"; "required": false; }; "applicationTheme": { "alias": "applicationTheme"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "testId": { "alias": "testId"; "required": false; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; }; "describedby": { "alias": "describedby"; "required": false; }; "contentTemplateRef": { "alias": "contentTemplateRef"; "required": false; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; }; "buttonSize": { "alias": "buttonSize"; "required": false; }; "menuConfig": { "alias": "menuConfig"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; "isSignal": true; }; "menuAnchor": { "alias": "menuAnchor"; "required": false; "isSignal": true; }; "shouldMatchAnchorWidth": { "alias": "shouldMatchAnchorWidth"; "required": false; "isSignal": true; }; "isDynamicMenu": { "alias": "isDynamicMenu"; "required": false; }; "withRemovableOption": { "alias": "withRemovableOption"; "required": false; }; }, { "selectItem": "selectItem"; "menuOpened": "menuOpened"; "menuClosed": "menuClosed"; }, never, ["[menu-content]"], true, never>;
172
201
  }
173
202
 
174
203
  declare class OverflowMenuComponentModule {
175
- static ɵfac: i0.ɵɵFactoryDeclaration<OverflowMenuComponentModule, never>;
176
- static ɵmod: i0.ɵɵNgModuleDeclaration<OverflowMenuComponentModule, never, [typeof i1.CommonModule, typeof i2.ButtonComponentModule, typeof i3.IconComponentModule, typeof i4.MatMenuModule, typeof i5.MatButtonModule, typeof i6.MatTooltipModule, typeof i7.EllipseTextDirective, typeof i7.UiTranslatePipe, typeof OverflowMenuComponent], [typeof OverflowMenuComponent]>;
177
- static ɵinj: i0.ɵɵInjectorDeclaration<OverflowMenuComponentModule>;
204
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OverflowMenuComponentModule, never>;
205
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<OverflowMenuComponentModule, never, [typeof i1.CommonModule, typeof i2.ButtonComponentModule, typeof i3.IconComponentModule, typeof i4.MatMenuModule, typeof i5.MatButtonModule, typeof i6.MatTooltipModule, typeof i7.EllipseTextDirective, typeof i7.UiTranslatePipe, typeof OverflowMenuComponent], [typeof OverflowMenuComponent]>;
206
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<OverflowMenuComponentModule>;
178
207
  }
179
208
 
180
209
  export { OverflowMenuComponent, OverflowMenuComponentModule };
@@ -180,7 +180,7 @@ declare class TagComponent {
180
180
  readonly filled: _angular_core.Signal<boolean>;
181
181
  onKeydown($event: KeyboardEvent): void;
182
182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
183
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ui-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "allowClose": { "alias": "allowClose"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "isSelected": { "alias": "isSelected"; "required": false; "isSignal": true; }; "showIconWhenSelected": { "alias": "showIconWhenSelected"; "required": false; "isSignal": true; }; "pinnedBackground": { "alias": "pinnedBackground"; "required": false; "isSignal": true; }; "constrainWidth": { "alias": "constrainWidth"; "required": false; "isSignal": true; }; "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "applicationTheme": { "alias": "applicationTheme"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "notificationsAmount": { "alias": "notificationsAmount"; "required": false; "isSignal": true; }; }, { "isSelected": "isSelectedChange"; "close": "close"; "press": "press"; }, never, never, true, never>;
183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ui-tag", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "allowClose": { "alias": "allowClose"; "required": false; "isSignal": true; }; "readOnly": { "alias": "readOnly"; "required": false; "isSignal": true; }; "isSelected": { "alias": "isSelected"; "required": false; "isSignal": true; }; "showIconWhenSelected": { "alias": "showIconWhenSelected"; "required": false; "isSignal": true; }; "pinnedBackground": { "alias": "pinnedBackground"; "required": false; "isSignal": true; }; "constrainWidth": { "alias": "constrainWidth"; "required": false; "isSignal": true; }; "isDisabled": { "alias": "isDisabled"; "required": false; "isSignal": true; }; "applicationTheme": { "alias": "applicationTheme"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "testId": { "alias": "testId"; "required": false; "isSignal": true; }; "ariaRequired": { "alias": "ariaRequired"; "required": false; "isSignal": true; }; "showBadge": { "alias": "showBadge"; "required": false; "isSignal": true; }; "notificationsAmount": { "alias": "notificationsAmount"; "required": false; "isSignal": true; }; }, { "isSelected": "isSelectedChange"; "close": "close"; "press": "press"; }, never, ["[uiTagSuffix]"], true, never>;
184
184
  }
185
185
 
186
186
  declare class TagComponentModule {