@ngstarter-ui/components 21.0.18 → 21.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/ai/component-registry.json +25 -11
  2. package/fesm2022/ngstarter-ui-components-chips.mjs +72 -38
  3. package/fesm2022/ngstarter-ui-components-chips.mjs.map +1 -1
  4. package/fesm2022/ngstarter-ui-components-color-picker.mjs +1 -1
  5. package/fesm2022/ngstarter-ui-components-color-picker.mjs.map +1 -1
  6. package/fesm2022/ngstarter-ui-components-comment-editor.mjs +2 -2
  7. package/fesm2022/ngstarter-ui-components-comment-editor.mjs.map +1 -1
  8. package/fesm2022/{ngstarter-ui-components-content-editor-code-block.component-CpZ5gJOc.mjs → ngstarter-ui-components-content-editor-code-block.component-Czb0bvcr.mjs} +2 -2
  9. package/fesm2022/{ngstarter-ui-components-content-editor-code-block.component-CpZ5gJOc.mjs.map → ngstarter-ui-components-content-editor-code-block.component-Czb0bvcr.mjs.map} +1 -1
  10. package/fesm2022/{ngstarter-ui-components-content-editor-embed-block-ghm0_0AF.mjs → ngstarter-ui-components-content-editor-embed-block-c8Pq0Jdq.mjs} +3 -3
  11. package/fesm2022/{ngstarter-ui-components-content-editor-embed-block-ghm0_0AF.mjs.map → ngstarter-ui-components-content-editor-embed-block-c8Pq0Jdq.mjs.map} +1 -1
  12. package/fesm2022/{ngstarter-ui-components-content-editor-heading-block.component-C1FH89Sj.mjs → ngstarter-ui-components-content-editor-heading-block.component-CT5g3MLZ.mjs} +2 -2
  13. package/fesm2022/{ngstarter-ui-components-content-editor-heading-block.component-C1FH89Sj.mjs.map → ngstarter-ui-components-content-editor-heading-block.component-CT5g3MLZ.mjs.map} +1 -1
  14. package/fesm2022/{ngstarter-ui-components-content-editor-image-block.component-ahCIfpvQ.mjs → ngstarter-ui-components-content-editor-image-block.component-Cp_Yo7zI.mjs} +3 -3
  15. package/fesm2022/{ngstarter-ui-components-content-editor-image-block.component-ahCIfpvQ.mjs.map → ngstarter-ui-components-content-editor-image-block.component-Cp_Yo7zI.mjs.map} +1 -1
  16. package/fesm2022/{ngstarter-ui-components-content-editor-list-block.component-guhW_EyK.mjs → ngstarter-ui-components-content-editor-list-block.component-BvineUWy.mjs} +2 -2
  17. package/fesm2022/{ngstarter-ui-components-content-editor-list-block.component-guhW_EyK.mjs.map → ngstarter-ui-components-content-editor-list-block.component-BvineUWy.mjs.map} +1 -1
  18. package/fesm2022/{ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-DNLTNGYa.mjs → ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-4_TqxgpH.mjs} +13 -13
  19. package/fesm2022/{ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-DNLTNGYa.mjs.map → ngstarter-ui-components-content-editor-ngstarter-ui-components-content-editor-4_TqxgpH.mjs.map} +1 -1
  20. package/fesm2022/{ngstarter-ui-components-content-editor-paragraph-block.component-DjgGUc7s.mjs → ngstarter-ui-components-content-editor-paragraph-block.component-sH44U1I8.mjs} +2 -2
  21. package/fesm2022/{ngstarter-ui-components-content-editor-paragraph-block.component-DjgGUc7s.mjs.map → ngstarter-ui-components-content-editor-paragraph-block.component-sH44U1I8.mjs.map} +1 -1
  22. package/fesm2022/{ngstarter-ui-components-content-editor-quote-block.component-B3pek1H6.mjs → ngstarter-ui-components-content-editor-quote-block.component-CA3KoZ-u.mjs} +2 -2
  23. package/fesm2022/{ngstarter-ui-components-content-editor-quote-block.component-B3pek1H6.mjs.map → ngstarter-ui-components-content-editor-quote-block.component-CA3KoZ-u.mjs.map} +1 -1
  24. package/fesm2022/{ngstarter-ui-components-content-editor-table-block.component-bgBNjf4d.mjs → ngstarter-ui-components-content-editor-table-block.component-GTZiYUjU.mjs} +2 -2
  25. package/fesm2022/{ngstarter-ui-components-content-editor-table-block.component-bgBNjf4d.mjs.map → ngstarter-ui-components-content-editor-table-block.component-GTZiYUjU.mjs.map} +1 -1
  26. package/fesm2022/{ngstarter-ui-components-content-editor-video-block.component-DPlYe-_8.mjs → ngstarter-ui-components-content-editor-video-block.component-CzMZ1s6C.mjs} +3 -3
  27. package/fesm2022/{ngstarter-ui-components-content-editor-video-block.component-DPlYe-_8.mjs.map → ngstarter-ui-components-content-editor-video-block.component-CzMZ1s6C.mjs.map} +1 -1
  28. package/fesm2022/ngstarter-ui-components-content-editor.mjs +1 -1
  29. package/fesm2022/ngstarter-ui-components-country-select.mjs +1 -1
  30. package/fesm2022/ngstarter-ui-components-country-select.mjs.map +1 -1
  31. package/fesm2022/ngstarter-ui-components-currency-select.mjs +1 -1
  32. package/fesm2022/ngstarter-ui-components-currency-select.mjs.map +1 -1
  33. package/fesm2022/ngstarter-ui-components-date-format-select.mjs +1 -1
  34. package/fesm2022/ngstarter-ui-components-date-format-select.mjs.map +1 -1
  35. package/fesm2022/ngstarter-ui-components-filter-builder.mjs +1 -1
  36. package/fesm2022/ngstarter-ui-components-filter-builder.mjs.map +1 -1
  37. package/fesm2022/ngstarter-ui-components-form-field.mjs +9 -9
  38. package/fesm2022/ngstarter-ui-components-form-field.mjs.map +1 -1
  39. package/fesm2022/{ngstarter-ui-components-form-renderer-autocomplete-many-field-BZBE7KSU.mjs → ngstarter-ui-components-form-renderer-autocomplete-many-field-BLhfO1zC.mjs} +3 -3
  40. package/fesm2022/ngstarter-ui-components-form-renderer-autocomplete-many-field-BLhfO1zC.mjs.map +1 -0
  41. package/fesm2022/{ngstarter-ui-components-form-renderer-datepicker-field-Bzc0TPO9.mjs → ngstarter-ui-components-form-renderer-datepicker-field-DRSVe0gK.mjs} +2 -2
  42. package/fesm2022/{ngstarter-ui-components-form-renderer-datepicker-field-Bzc0TPO9.mjs.map → ngstarter-ui-components-form-renderer-datepicker-field-DRSVe0gK.mjs.map} +1 -1
  43. package/fesm2022/{ngstarter-ui-components-form-renderer-input-field-UaMfHCtj.mjs → ngstarter-ui-components-form-renderer-input-field-DpGLKZjz.mjs} +2 -2
  44. package/fesm2022/{ngstarter-ui-components-form-renderer-input-field-UaMfHCtj.mjs.map → ngstarter-ui-components-form-renderer-input-field-DpGLKZjz.mjs.map} +1 -1
  45. package/fesm2022/{ngstarter-ui-components-form-renderer-select-field-Dvg--xrB.mjs → ngstarter-ui-components-form-renderer-select-field-CCbpYyZo.mjs} +2 -2
  46. package/fesm2022/{ngstarter-ui-components-form-renderer-select-field-Dvg--xrB.mjs.map → ngstarter-ui-components-form-renderer-select-field-CCbpYyZo.mjs.map} +1 -1
  47. package/fesm2022/{ngstarter-ui-components-form-renderer-textarea-field-4zH7FTQ1.mjs → ngstarter-ui-components-form-renderer-textarea-field-D89GlMDO.mjs} +2 -2
  48. package/fesm2022/{ngstarter-ui-components-form-renderer-textarea-field-4zH7FTQ1.mjs.map → ngstarter-ui-components-form-renderer-textarea-field-D89GlMDO.mjs.map} +1 -1
  49. package/fesm2022/{ngstarter-ui-components-form-renderer-timezone-field-BpH65Hd-.mjs → ngstarter-ui-components-form-renderer-timezone-field-C9wz7zPg.mjs} +2 -2
  50. package/fesm2022/{ngstarter-ui-components-form-renderer-timezone-field-BpH65Hd-.mjs.map → ngstarter-ui-components-form-renderer-timezone-field-C9wz7zPg.mjs.map} +1 -1
  51. package/fesm2022/ngstarter-ui-components-form-renderer.mjs +6 -6
  52. package/fesm2022/ngstarter-ui-components-image-designer.mjs +1 -1
  53. package/fesm2022/ngstarter-ui-components-image-designer.mjs.map +1 -1
  54. package/fesm2022/ngstarter-ui-components-paginator.mjs +1 -1
  55. package/fesm2022/ngstarter-ui-components-paginator.mjs.map +1 -1
  56. package/fesm2022/ngstarter-ui-components-panel.mjs +8 -4
  57. package/fesm2022/ngstarter-ui-components-panel.mjs.map +1 -1
  58. package/fesm2022/ngstarter-ui-components-pin-input.mjs +1 -1
  59. package/fesm2022/ngstarter-ui-components-pin-input.mjs.map +1 -1
  60. package/fesm2022/ngstarter-ui-components-select.mjs +19 -4
  61. package/fesm2022/ngstarter-ui-components-select.mjs.map +1 -1
  62. package/fesm2022/ngstarter-ui-components-text-editor.mjs +2 -2
  63. package/fesm2022/ngstarter-ui-components-text-editor.mjs.map +1 -1
  64. package/fesm2022/ngstarter-ui-components-timezone-select.mjs +1 -1
  65. package/fesm2022/ngstarter-ui-components-timezone-select.mjs.map +1 -1
  66. package/package.json +1 -1
  67. package/types/ngstarter-ui-components-chips.d.ts +15 -6
  68. package/types/ngstarter-ui-components-form-field.d.ts +3 -2
  69. package/types/ngstarter-ui-components-panel.d.ts +3 -1
  70. package/types/ngstarter-ui-components-select.d.ts +5 -1
  71. package/fesm2022/ngstarter-ui-components-form-renderer-autocomplete-many-field-BZBE7KSU.mjs.map +0 -1
@@ -1603,7 +1603,7 @@
1603
1603
  "name": "chips-autocomplete-example",
1604
1604
  "title": "Chips autocomplete",
1605
1605
  "file": "projects/docs/src/app/components/chips/_examples/chips-autocomplete-example/chips-autocomplete-example.html",
1606
- "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite Fruits</ngs-label>\n <ngs-chip-grid #chipGrid aria-label=\"Fruit selection\">\n @for (fruit of fruits; track fruit) {\n <ngs-chip-row (removed)=\"remove(fruit)\">\n {{fruit}}\n <button ngsChipRemove>\n <ngs-icon name=\"fluent:dismiss-20-regular\"/>\n </button>\n </ngs-chip-row>\n }\n </ngs-chip-grid>\n <input ngsInput\n placeholder=\"New Fruit...\" #fruitInput\n [formControl]=\"fruitCtrl\"\n [ngsChipInputFor]=\"chipGrid\"\n [ngsAutocomplete]=\"auto\"\n [ngsChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (chipInputTokenEnd)=\"add($event)\">\n <ngs-autocomplete #auto=\"ngsAutocomplete\" (optionSelected)=\"selected($event)\">\n @for (fruit of filteredFruits | async; track fruit) {\n <ngs-option [value]=\"fruit\">{{ fruit }}</ngs-option>\n }\n </ngs-autocomplete>\n</ngs-form-field>"
1606
+ "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite Fruits</ngs-label>\n <ngs-chip-grid #chipGrid aria-label=\"Fruit selection\">\n @for (fruit of fruits; track fruit) {\n <ngs-chip-row (removed)=\"remove(fruit)\">\n {{fruit}}\n <button ngsChipRemove>\n <ngs-icon name=\"fluent:dismiss-20-regular\"/>\n </button>\n </ngs-chip-row>\n }\n <input ngsInput\n placeholder=\"New Fruit...\" #fruitInput\n [formControl]=\"fruitCtrl\"\n [ngsChipInputFor]=\"chipGrid\"\n [ngsAutocomplete]=\"auto\"\n [ngsChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n (chipInputTokenEnd)=\"add($event)\">\n </ngs-chip-grid>\n <ngs-autocomplete #auto=\"ngsAutocomplete\" (optionSelected)=\"selected($event)\">\n @for (fruit of filteredFruits | async; track fruit) {\n <ngs-option [value]=\"fruit\">{{ fruit }}</ngs-option>\n }\n </ngs-autocomplete>\n</ngs-form-field>"
1607
1607
  }
1608
1608
  ],
1609
1609
  "previewAsset": "projects/components/chips/preview.svg",
@@ -1663,15 +1663,18 @@
1663
1663
  "valueChange"
1664
1664
  ],
1665
1665
  "cssTokens": [
1666
- "--ngs-chip-bg",
1666
+ "--ngs-avatar-size",
1667
+ "--ngs-chip-background",
1668
+ "--ngs-chip-border-color",
1667
1669
  "--ngs-chip-color",
1668
1670
  "--ngs-chip-font-size",
1669
1671
  "--ngs-chip-font-weight",
1670
1672
  "--ngs-chip-height",
1673
+ "--ngs-chip-input-height",
1671
1674
  "--ngs-chip-outline-color",
1672
1675
  "--ngs-chip-padding",
1673
1676
  "--ngs-chip-radius",
1674
- "--ngs-chip-selected-bg",
1677
+ "--ngs-chip-selected-background",
1675
1678
  "--ngs-chip-selected-color",
1676
1679
  "--ngs-chip-set-gap",
1677
1680
  "--ngs-chip-set-spacing",
@@ -1681,7 +1684,9 @@
1681
1684
  "--ngs-color-outline-variant",
1682
1685
  "--ngs-color-primary",
1683
1686
  "--ngs-color-surface-container-high",
1687
+ "--ngs-field-input-height",
1684
1688
  "--ngs-font-size-xs",
1689
+ "--ngs-form-field-input-height",
1685
1690
  "--ngs-icon-size",
1686
1691
  "--ngs-radius-xl"
1687
1692
  ],
@@ -4149,6 +4154,7 @@
4149
4154
  ],
4150
4155
  "inputs": [
4151
4156
  "align",
4157
+ "sameHeightAsButton",
4152
4158
  "subscriptHiddenIfEmpty"
4153
4159
  ],
4154
4160
  "outputs": [],
@@ -7531,6 +7537,7 @@
7531
7537
  "useWhen": "Use ngs-select inside one ngs-form-field when a form, filter, setting, table filter, DataView filter, or admin configuration field should choose from predefined options. Use ngs-option for options, ngs-optgroup for visible grouping, multiple for array values, placeholder, required, disabled, Angular forms, value, and selectionChange for state. Use ngs-select-trigger to customize the closed label, and ngs-select-header, ngs-select-body, or ngs-select-footer when the dropdown panel needs search, custom scrolling, or supporting controls. Do not use Select as a command menu or action list; use Menu. Do not use for route or page navigation; use Navigation, Tabs, Sidebar, Sidenav, or RailNav. Do not use for compact visible mode switching; use Segmented. Do not use for simple visible choices or rich card choices; use Radio or RadioCard. Do not use for arbitrary free text or large remote search suggestion flows; use Autocomplete or a dedicated async picker. Do not use generic Select when a domain-specific control exists, such as CountrySelect, CurrencySelect, DateFormatSelect, or TimezoneSelect.",
7532
7538
  "exampleTopics": [
7533
7539
  "Basic Select",
7540
+ "Clearable Select",
7534
7541
  "Getting and setting the select value",
7535
7542
  "Form Field Features",
7536
7543
  "Disabled",
@@ -7544,25 +7551,25 @@
7544
7551
  "Custom trigger",
7545
7552
  "Select search"
7546
7553
  ],
7547
- "minimalExample": "<p>Basic mat-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>",
7554
+ "minimalExample": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>",
7548
7555
  "exampleFiles": [
7549
7556
  {
7550
7557
  "name": "basic-select-example",
7551
7558
  "title": "Basic select",
7552
7559
  "file": "projects/docs/src/app/forms/select/_examples/basic-select-example/basic-select-example.html",
7553
- "source": "<p>Basic mat-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
7560
+ "source": "<p>Basic ngs-select</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Favorite food</ngs-label>\n <ngs-select>\n @for (food of foods; track food) {\n <ngs-option [value]=\"food.value\">{{food.viewValue}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
7561
+ },
7562
+ {
7563
+ "name": "clearable-select-example",
7564
+ "title": "Clearable select",
7565
+ "file": "projects/docs/src/app/forms/select/_examples/clearable-select-example/clearable-select-example.html",
7566
+ "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Status</ngs-label>\n <ngs-select [formControl]=\"status()\" clearable>\n @for (statusOption of statuses(); track statusOption.value) {\n <ngs-option [value]=\"statusOption.value\">{{ statusOption.label }}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
7554
7567
  },
7555
7568
  {
7556
7569
  "name": "custom-trigger-example",
7557
7570
  "title": "Custom trigger",
7558
7571
  "file": "projects/docs/src/app/forms/select/_examples/custom-trigger-example/custom-trigger-example.html",
7559
7572
  "source": "<ngs-form-field class=\"w-1/2\">\n <ngs-label>Toppings</ngs-label>\n <ngs-select [formControl]=\"toppings\" multiple>\n <ngs-select-trigger>\n {{ toppings.value?.[0] || '' }}\n @if ((toppings.value?.length || 0) > 1) {\n <span class=\"opacity-75 text-sm\">\n (+{{ (toppings.value?.length || 0) - 1 }} {{ toppings.value?.length === 2 ? 'other' : 'others' }})\n </span>\n }\n </ngs-select-trigger>\n @for (topping of toppingList; track topping) {\n <ngs-option [value]=\"topping\">{{topping}}</ngs-option>\n }\n </ngs-select>\n</ngs-form-field>"
7560
- },
7561
- {
7562
- "name": "disabled-example",
7563
- "title": "Disabled",
7564
- "file": "projects/docs/src/app/forms/select/_examples/disabled-example/disabled-example.html",
7565
- "source": "<p>\n <ngs-checkbox [formControl]=\"disableSelect\">Disable select</ngs-checkbox>\n</p>\n<ngs-form-field class=\"w-1/2\">\n <ngs-label>Choose an option</ngs-label>\n <ngs-select [disabled]=\"disableSelect.value\">\n <ngs-option value=\"option1\">Option 1</ngs-option>\n <ngs-option value=\"option2\" disabled>Option 2 (disabled)</ngs-option>\n <ngs-option value=\"option3\">Option 3</ngs-option>\n </ngs-select>\n</ngs-form-field>"
7566
7573
  }
7567
7574
  ],
7568
7575
  "previewAsset": "projects/components/select/preview.svg",
@@ -7590,6 +7597,7 @@
7590
7597
  "inputs": [
7591
7598
  "aria-describedby",
7592
7599
  "aria-label",
7600
+ "clearable",
7593
7601
  "disabled",
7594
7602
  "hideCheckIcon",
7595
7603
  "id",
@@ -7607,6 +7615,7 @@
7607
7615
  "selectionChange"
7608
7616
  ],
7609
7617
  "cssTokens": [
7618
+ "--ngs-color-danger",
7610
7619
  "--ngs-color-on-primary",
7611
7620
  "--ngs-color-on-surface",
7612
7621
  "--ngs-color-on-surface-variant",
@@ -7640,6 +7649,11 @@
7640
7649
  "--ngs-select-arrow-container-width",
7641
7650
  "--ngs-select-arrow-size",
7642
7651
  "--ngs-select-border-color",
7652
+ "--ngs-select-clear-color",
7653
+ "--ngs-select-clear-container-width",
7654
+ "--ngs-select-clear-hover-color",
7655
+ "--ngs-select-clear-icon-size",
7656
+ "--ngs-select-clear-overlap",
7643
7657
  "--ngs-select-content-padding",
7644
7658
  "--ngs-select-font-size",
7645
7659
  "--ngs-select-min-width",
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, input, booleanAttribute, output, ViewEncapsulation, ChangeDetectionStrategy, Component, ChangeDetectorRef, viewChild, signal, forwardRef, computed, contentChildren, effect, Directive } from '@angular/core';
2
+ import { inject, ElementRef, input, booleanAttribute, output, ChangeDetectionStrategy, Component, ChangeDetectorRef, viewChild, signal, forwardRef, computed, contentChildren, effect, ViewEncapsulation, Directive } from '@angular/core';
3
3
  import { toObservable } from '@angular/core/rxjs-interop';
4
4
  import { NgControl, NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import { AutoFocusDirective } from '@ngstarter-ui/components/core';
@@ -26,18 +26,18 @@ class Chip {
26
26
  _handleBlur() {
27
27
  }
28
28
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Chip, deps: [], target: i0.ɵɵFactoryTarget.Component });
29
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: Chip, isStandalone: true, selector: "ngs-chip", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { destroyed: "destroyed", removed: "removed" }, host: { properties: { "class.ngs-chip-disabled": "disabled()", "attr.appearance": "appearance()", "attr.aria-disabled": "disabled()" }, classAttribute: "ngs-chip" }, ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
29
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.4", type: Chip, isStandalone: true, selector: "ngs-chip", inputs: { appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { destroyed: "destroyed", removed: "removed" }, host: { properties: { "class.ngs-chip-disabled": "disabled()", "attr.appearance": "appearance()", "attr.aria-disabled": "disabled()" }, classAttribute: "ngs-chip" }, exportAs: ["ngsChip"], ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
30
30
  }
31
31
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Chip, decorators: [{
32
32
  type: Component,
33
- args: [{ selector: 'ngs-chip', host: {
33
+ args: [{ selector: 'ngs-chip', exportAs: 'ngsChip', imports: [
34
+ AutoFocusDirective
35
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
34
36
  'class': 'ngs-chip',
35
37
  '[class.ngs-chip-disabled]': 'disabled()',
36
38
  '[attr.appearance]': 'appearance()',
37
39
  '[attr.aria-disabled]': 'disabled()',
38
- }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
39
- AutoFocusDirective
40
- ], template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
40
+ }, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
41
41
  }], propDecorators: { appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], destroyed: [{ type: i0.Output, args: ["destroyed"] }], removed: [{ type: i0.Output, args: ["removed"] }] } });
42
42
 
43
43
  class ChipRow extends Chip {
@@ -99,7 +99,7 @@ class ChipRow extends Chip {
99
99
  provide: Chip,
100
100
  useExisting: forwardRef(() => ChipRow)
101
101
  }
102
- ], viewQueries: [{ propertyName: "_editInput", first: true, predicate: ["editInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
102
+ ], viewQueries: [{ propertyName: "_editInput", first: true, predicate: ["editInput"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
103
103
  }
104
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ChipRow, decorators: [{
105
105
  type: Component,
@@ -114,14 +114,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
114
114
  'role': 'row',
115
115
  '(keydown)': '_handleKeydown($event)',
116
116
  '(click)': '_handleClick($event)',
117
- }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
117
+ }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
118
118
  AutoFocusDirective
119
119
  ], providers: [
120
120
  {
121
121
  provide: Chip,
122
122
  useExisting: forwardRef(() => ChipRow)
123
123
  }
124
- ], template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
124
+ ], template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
125
125
  }], propDecorators: { _editInput: [{ type: i0.ViewChild, args: ['editInput', { isSignal: true }] }], editable: [{ type: i0.Input, args: [{ isSignal: true, alias: "editable", required: false }] }], edited: [{ type: i0.Output, args: ["edited"] }] } });
126
126
 
127
127
  let nextId = 0;
@@ -146,6 +146,7 @@ class ChipGrid {
146
146
  stateChanges = signal(undefined, ...(ngDevMode ? [{ debugName: "stateChanges" }] : /* istanbul ignore next */ []));
147
147
  _focused = signal(false, ...(ngDevMode ? [{ debugName: "_focused" }] : /* istanbul ignore next */ []));
148
148
  get focused() { return this._focused(); }
149
+ get multiline() { return this._chipsLength() > 0; }
149
150
  _errorState = signal(false, ...(ngDevMode ? [{ debugName: "_errorState" }] : /* istanbul ignore next */ []));
150
151
  get errorState() { return this._errorState(); }
151
152
  _chipsLength = signal(0, ...(ngDevMode ? [{ debugName: "_chipsLength" }] : /* istanbul ignore next */ []));
@@ -235,7 +236,7 @@ class ChipGrid {
235
236
  provide: FormFieldControl,
236
237
  useExisting: forwardRef(() => ChipGrid),
237
238
  },
238
- ], queries: [{ propertyName: "_chips", predicate: ChipRow, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content />\n", styles: [":host{--ngs-chip-set-gap: var(--ngs-chip-set-spacing, calc(var(--spacing, .25rem) * 2));display:flex;flex-wrap:wrap;gap:var(--ngs-chip-set-gap)}:host ::ng-deep .ngs-chip-input{outline:none;width:100%}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
239
+ ], queries: [{ propertyName: "_chips", predicate: ChipRow, descendants: true, isSignal: true }], ngImport: i0, template: "<ng-content />\n", styles: [":host{--ngs-chip-set-gap: var(--ngs-chip-set-spacing, calc(var(--spacing, .25rem) * 2));--ngs-chip-input-height: var(--ngs-form-field-input-height, var(--ngs-field-input-height, 1.25rem));display:flex;flex-wrap:wrap;align-items:center;gap:var(--ngs-chip-set-gap);width:100%}:host ::ng-deep .ngs-chip-input{outline:none;flex:1 0 100%;min-width:0;max-width:100%;width:100%!important;height:var(--ngs-chip-input-height);min-height:var(--ngs-chip-input-height);box-sizing:border-box}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
239
240
  }
240
241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ChipGrid, decorators: [{
241
242
  type: Component,
@@ -249,12 +250,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
249
250
  provide: FormFieldControl,
250
251
  useExisting: forwardRef(() => ChipGrid),
251
252
  },
252
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{--ngs-chip-set-gap: var(--ngs-chip-set-spacing, calc(var(--spacing, .25rem) * 2));display:flex;flex-wrap:wrap;gap:var(--ngs-chip-set-gap)}:host ::ng-deep .ngs-chip-input{outline:none;width:100%}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
253
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{--ngs-chip-set-gap: var(--ngs-chip-set-spacing, calc(var(--spacing, .25rem) * 2));--ngs-chip-input-height: var(--ngs-form-field-input-height, var(--ngs-field-input-height, 1.25rem));display:flex;flex-wrap:wrap;align-items:center;gap:var(--ngs-chip-set-gap);width:100%}:host ::ng-deep .ngs-chip-input{outline:none;flex:1 0 100%;min-width:0;max-width:100%;width:100%!important;height:var(--ngs-chip-input-height);min-height:var(--ngs-chip-input-height);box-sizing:border-box}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
253
254
  }], ctorParameters: () => [], propDecorators: { _id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], _disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _chips: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => ChipRow), { ...{ descendants: true }, isSignal: true }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }] } });
254
255
 
255
256
  class ChipOption extends Chip {
256
257
  selected = input(false, { ...(ngDevMode ? { debugName: "selected" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
257
- _internalSelected = false;
258
+ _internalSelected = signal(false, ...(ngDevMode ? [{ debugName: "_internalSelected" }] : /* istanbul ignore next */ []));
258
259
  constructor() {
259
260
  super();
260
261
  effect(() => {
@@ -262,10 +263,10 @@ class ChipOption extends Chip {
262
263
  });
263
264
  }
264
265
  get isSelected() {
265
- return this._internalSelected;
266
+ return this._internalSelected();
266
267
  }
267
268
  _setSelected(value) {
268
- this._internalSelected = value;
269
+ this._internalSelected.set(value);
269
270
  }
270
271
  selectionChange = output();
271
272
  toggleSelected() {
@@ -280,11 +281,18 @@ class ChipOption extends Chip {
280
281
  provide: Chip,
281
282
  useExisting: forwardRef(() => ChipOption)
282
283
  }
283
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
284
+ ], exportAs: ["ngsChipOption"], usesInheritance: true, ngImport: i0, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: AutoFocusDirective, selector: "[ngsAutoFocus]", inputs: ["ngsAutoFocus"], exportAs: ["ngsAutoFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
284
285
  }
285
286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ChipOption, decorators: [{
286
287
  type: Component,
287
- args: [{ selector: 'ngs-chip-option', host: {
288
+ args: [{ selector: 'ngs-chip-option', exportAs: 'ngsChipOption', imports: [
289
+ AutoFocusDirective
290
+ ], providers: [
291
+ {
292
+ provide: Chip,
293
+ useExisting: forwardRef(() => ChipOption)
294
+ }
295
+ ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
288
296
  'class': 'ngs-chip ngs-chip-option',
289
297
  '[class.ngs-chip-selected]': 'isSelected',
290
298
  '[class.ngs-chip-disabled]': 'disabled()',
@@ -293,21 +301,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
293
301
  '[attr.aria-selected]': 'isSelected',
294
302
  '[attr.aria-disabled]': 'disabled()',
295
303
  '(click)': 'toggleSelected()',
296
- }, standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
297
- AutoFocusDirective
298
- ], providers: [
299
- {
300
- provide: Chip,
301
- useExisting: forwardRef(() => ChipOption)
302
- }
303
- ], template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [".ngs-chip{--ngs-chip-bg: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}.ngs-chip[appearance=filled]{background:var(--ngs-chip-bg);color:var(--ngs-chip-color)}.ngs-chip[appearance=outlined]{background:transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-outline-color, var(--ngs-color-outline-variant))}.ngs-chip[appearance=outlined].ngs-chip-selected{border-color:var(--ngs-chip-selected-bg, var(--ngs-color-primary))}.ngs-chip:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}.ngs-chip:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1.5)}.ngs-chip .avatar:empty{display:none}.ngs-chip .avatar img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}.ngs-chip .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}.ngs-chip .shape:empty{display:none}.ngs-chip.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}.ngs-chip .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}.ngs-chip .controls:empty{display:none}.ngs-chip .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ngs-chip .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}.ngs-chip .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}.ngs-chip .ngs-chip-edit,.ngs-chip .ngs-chip-remove{line-height:0;--ngs-icon-size: calc(var(--spacing, .25rem) * 5);cursor:pointer;opacity:.55}.ngs-chip .ngs-chip-edit:hover,.ngs-chip .ngs-chip-remove:hover{opacity:1}.ngs-chip .ngs-chip-remove:hover{color:var(--ngs-color-danger)}.ngs-chip.ngs-chip-editing .avatar,.ngs-chip.ngs-chip-editing .controls{display:none}.ngs-chip.ngs-chip-selected{--ngs-chip-bg: var(--ngs-chip-selected-bg, var(--ngs-color-primary));--ngs-chip-color: var(--ngs-chip-selected-color, var(--ngs-color-on-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
304
+ }, template: "<div class=\"ngs-chip-content\">\n <span class=\"avatar\">\n <ng-content select=\"ngs-chip-avatar, [ngsChipAvatar]\"/>\n </span>\n <span class=\"shape\">\n <ng-content select=\"ngs-chip-shape, [ngsChipShape]\"/>\n </span>\n <span\n #editInput\n class=\"ngs-chip-label\"\n [attr.contenteditable]=\"_editing || null\"\n (blur)=\"_handleBlur()\"\n (keydown)=\"_handleKeydown($event)\"\n [ngsAutoFocus]=\"_editing\"\n >\n <ng-content/>\n </span>\n <div class=\"controls\">\n <ng-content select=\"ngs-chip-remove, [ngsChipRemove], [ngsChipControl], [ngsChipEdit]\"/>\n </div>\n</div>\n", styles: [":host{--ngs-chip-background: var(--ngs-color-surface-container-high);--ngs-chip-color: var(--ngs-color-on-surface);--ngs-chip-radius: var(--ngs-radius-xl);--ngs-chip-padding: 0 calc(var(--spacing, .25rem) * 3);--ngs-chip-font-size: var(--ngs-font-size-xs);--ngs-chip-font-weight: 500;--ngs-chip-height: calc(var(--spacing, .25rem) * 8);--ngs-chip-border-color: var(--ngs-chip-outline-color, var(--ngs-color-outline-variant));--ngs-chip-selected-background: var(--ngs-color-primary);--ngs-chip-selected-color: var(--ngs-color-on-primary);display:inline-flex;align-items:center;border-radius:var(--ngs-chip-radius);padding:var(--ngs-chip-padding);font-size:var(--ngs-chip-font-size);font-weight:var(--ngs-chip-font-weight);height:var(--ngs-chip-height);box-sizing:border-box;vertical-align:middle;white-space:nowrap;position:relative;overflow:hidden;cursor:pointer}:host[appearance=filled],:host.ngs-chip-filled{background:var(--ngs-chip-background);color:var(--ngs-chip-color)}:host[appearance=outlined],:host.ngs-chip-outlined{--ngs-chip-background: transparent;color:var(--ngs-chip-color);border:1px solid var(--ngs-chip-border-color)}:host[appearance=outlined].ngs-chip-selected,:host.ngs-chip-outlined.ngs-chip-selected{border-color:var(--ngs-chip-selected-background)}:host:not(.ngs-chip-selected):not(.ngs-chip-editing):hover{filter:brightness(97%)}:host:has(.avatar:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.shape:not(:empty)){padding-left:calc(var(--spacing, .25rem) * 1.5)}:host:has(.ngs-chip-remove:not(:empty)){padding-right:calc(var(--spacing, .25rem) * 1.5)}:host .avatar{position:relative;margin-right:calc(var(--spacing, .25rem) * 1);display:flex;height:100%;justify-content:center;align-items:center}:host .avatar:empty{display:none}:host .avatar ::ng-deep ngs-avatar,:host .avatar ::ng-deep ngs-dicebear{--ngs-avatar-size: calc(var(--spacing, .25rem) * 6)}:host .avatar ::ng-deep img{width:calc(var(--spacing, .25rem) * 6);height:calc(var(--spacing, .25rem) * 6);border-radius:50%}:host .shape{position:relative;max-height:max-content;display:flex;align-items:center;justify-content:center}:host .shape:empty{display:none}:host.ngs-chip-disabled{opacity:.4;cursor:default;pointer-events:none}:host .ngs-chip-content{display:flex;align-items:center;width:100%;height:100%;gap:calc(var(--spacing, .25rem) * 1)}:host .controls{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * .5)}:host .controls:empty{display:none}:host .controls ::ng-deep .ngs-chip-edit,:host .controls ::ng-deep .ngs-chip-remove{--ngs-icon-size: calc(var(--spacing, .25rem) * 4);appearance:none;display:inline-flex;align-items:center;justify-content:center;flex:none;width:calc(var(--spacing, .25rem) * 5);height:calc(var(--spacing, .25rem) * 5);padding:0;margin:0;border:0;border-radius:50%;background:transparent;color:inherit;font:inherit;line-height:1;vertical-align:middle;cursor:pointer;opacity:.65}:host .controls ::ng-deep .ngs-chip-edit:hover,:host .controls ::ng-deep .ngs-chip-remove:hover{opacity:1}:host .controls ::ng-deep .ngs-chip-remove:hover{color:var(--ngs-color-danger)}:host .ngs-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-chip-label[contenteditable=true]{display:inline-block;min-width:calc(var(--spacing, .25rem) * 5);outline:none;margin-inline-end:calc(var(--spacing, .25rem) * 2)}:host .ngs-chip-avatar{margin-right:calc(var(--spacing, .25rem) * 2);display:flex;align-items:center;justify-content:center}:host.ngs-chip-editing .avatar,:host.ngs-chip-editing .controls{display:none}:host.ngs-chip-selected{--ngs-chip-background: var(--ngs-chip-selected-background);--ngs-chip-color: var(--ngs-chip-selected-color)}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
304
305
  }], ctorParameters: () => [], propDecorators: { selected: [{ type: i0.Input, args: [{ isSignal: true, alias: "selected", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
305
306
 
306
307
  class ChipListbox {
307
308
  multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
308
309
  disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
310
+ _disabledByControl = signal(false, ...(ngDevMode ? [{ debugName: "_disabledByControl" }] : /* istanbul ignore next */ []));
311
+ isDisabled = computed(() => this.disabled() || this._disabledByControl(), ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
309
312
  _chips = contentChildren(ChipOption, { ...(ngDevMode ? { debugName: "_chips" } : /* istanbul ignore next */ {}), descendants: true });
310
313
  _chips$ = toObservable(this._chips);
314
+ _chipSelectionSubscriptions = [];
315
+ _syncTimeout = null;
311
316
  _value;
312
317
  onChange = () => { };
313
318
  onTouched = () => { };
@@ -316,11 +321,11 @@ class ChipListbox {
316
321
  }
317
322
  set value(value) {
318
323
  this._value = value;
319
- this._updateChips();
324
+ this._syncChipsAsync();
320
325
  }
321
326
  writeValue(value) {
322
327
  this._value = value;
323
- this._updateChips();
328
+ this._syncChipsAsync();
324
329
  }
325
330
  registerOnChange(fn) {
326
331
  this.onChange = fn;
@@ -329,10 +334,11 @@ class ChipListbox {
329
334
  this.onTouched = fn;
330
335
  }
331
336
  setDisabledState(isDisabled) {
337
+ this._disabledByControl.set(isDisabled);
332
338
  }
333
339
  ngAfterContentInit() {
334
340
  this._chips$.subscribe(() => {
335
- this._updateChips();
341
+ this._syncChipsAsync();
336
342
  });
337
343
  if (this._value === undefined) {
338
344
  const selectedChips = this._chips().filter(chip => chip.isSelected);
@@ -344,16 +350,20 @@ class ChipListbox {
344
350
  this._value = lastSelected ? (lastSelected.value() !== undefined ? lastSelected.value() : lastSelected) : undefined;
345
351
  }
346
352
  }
347
- Promise.resolve().then(() => {
348
- this._updateChips();
349
- });
350
- this._chips().forEach(chip => {
351
- chip.selectionChange.subscribe(() => {
352
- this._onSelectionChange(chip);
353
- });
354
- });
353
+ this._syncChipsAsync();
354
+ }
355
+ ngOnDestroy() {
356
+ if (this._syncTimeout !== null) {
357
+ clearTimeout(this._syncTimeout);
358
+ this._syncTimeout = null;
359
+ }
360
+ this._clearChipSelectionSubscriptions();
355
361
  }
356
362
  _onSelectionChange(chip) {
363
+ if (this.isDisabled()) {
364
+ this._updateChips();
365
+ return;
366
+ }
357
367
  const value = chip.value() !== undefined ? chip.value() : chip;
358
368
  if (this.multiple()) {
359
369
  if (!Array.isArray(this._value)) {
@@ -383,6 +393,26 @@ class ChipListbox {
383
393
  this.onChange(this._value);
384
394
  this.onTouched();
385
395
  }
396
+ _watchChips() {
397
+ this._clearChipSelectionSubscriptions();
398
+ this._chipSelectionSubscriptions = this._chips().map(chip => chip.selectionChange.subscribe(() => {
399
+ this._onSelectionChange(chip);
400
+ }));
401
+ }
402
+ _clearChipSelectionSubscriptions() {
403
+ this._chipSelectionSubscriptions.forEach(subscription => subscription.unsubscribe());
404
+ this._chipSelectionSubscriptions = [];
405
+ }
406
+ _syncChipsAsync() {
407
+ if (this._syncTimeout !== null) {
408
+ clearTimeout(this._syncTimeout);
409
+ }
410
+ this._syncTimeout = setTimeout(() => {
411
+ this._syncTimeout = null;
412
+ this._watchChips();
413
+ this._updateChips();
414
+ });
415
+ }
386
416
  _updateChips() {
387
417
  const _chips = this._chips();
388
418
  if (!_chips || this._value === undefined) {
@@ -399,7 +429,7 @@ class ChipListbox {
399
429
  });
400
430
  }
401
431
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ChipListbox, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.4", type: ChipListbox, isStandalone: true, selector: "ngs-chip-listbox", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listbox" }, properties: { "attr.aria-multiselectable": "multiple()", "attr.aria-disabled": "disabled()" }, classAttribute: "ngs-chip-listbox ngs-chip-set" }, providers: [
432
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.4", type: ChipListbox, isStandalone: true, selector: "ngs-chip-listbox", inputs: { multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "listbox" }, properties: { "attr.aria-multiselectable": "multiple()", "attr.aria-disabled": "isDisabled()" }, classAttribute: "ngs-chip-listbox ngs-chip-set" }, providers: [
403
433
  {
404
434
  provide: NG_VALUE_ACCESSOR,
405
435
  useExisting: forwardRef(() => ChipListbox),
@@ -413,7 +443,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
413
443
  'class': 'ngs-chip-listbox ngs-chip-set',
414
444
  'role': 'listbox',
415
445
  '[attr.aria-multiselectable]': 'multiple()',
416
- '[attr.aria-disabled]': 'disabled()',
446
+ '[attr.aria-disabled]': 'isDisabled()',
417
447
  }, standalone: true, providers: [
418
448
  {
419
449
  provide: NG_VALUE_ACCESSOR,
@@ -531,7 +561,11 @@ class ChipInput {
531
561
  if (event.defaultPrevented) {
532
562
  return;
533
563
  }
534
- if (this.chipInputSeparatorKeyCodes() && this.chipInputSeparatorKeyCodes().includes(event.keyCode)) {
564
+ const separatorKeyCodes = this.chipInputSeparatorKeyCodes();
565
+ const isSeparatorKey = Array.isArray(separatorKeyCodes)
566
+ ? separatorKeyCodes.includes(event.keyCode)
567
+ : !!separatorKeyCodes && 'has' in separatorKeyCodes && separatorKeyCodes.has(event.keyCode);
568
+ if (isSeparatorKey) {
535
569
  this.chipInputTokenEnd.emit({
536
570
  chipInput: this,
537
571
  value: this._elementRef.nativeElement.value,