@egose/shadcn-theme-ng-tw 0.0.14

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 (123) hide show
  1. package/README.md +2 -0
  2. package/accordion/README.md +64 -0
  3. package/accordion/fesm2022/accordion.mjs +155 -0
  4. package/accordion/fesm2022/accordion.mjs.map +1 -0
  5. package/accordion/index.d.ts +49 -0
  6. package/alert/README.md +64 -0
  7. package/alert/fesm2022/alert.mjs +189 -0
  8. package/alert/fesm2022/alert.mjs.map +1 -0
  9. package/alert/index.d.ts +49 -0
  10. package/autocomplete/README.md +64 -0
  11. package/autocomplete/fesm2022/autocomplete.mjs +543 -0
  12. package/autocomplete/fesm2022/autocomplete.mjs.map +1 -0
  13. package/autocomplete/index.d.ts +162 -0
  14. package/badge/README.md +64 -0
  15. package/badge/fesm2022/badge.mjs +137 -0
  16. package/badge/fesm2022/badge.mjs.map +1 -0
  17. package/badge/index.d.ts +33 -0
  18. package/basic-alert/README.md +64 -0
  19. package/basic-alert/fesm2022/basic-alert.mjs +103 -0
  20. package/basic-alert/fesm2022/basic-alert.mjs.map +1 -0
  21. package/basic-alert/index.d.ts +14 -0
  22. package/button/README.md +64 -0
  23. package/button/fesm2022/button.mjs +282 -0
  24. package/button/fesm2022/button.mjs.map +1 -0
  25. package/button/index.d.ts +52 -0
  26. package/calendar/README.md +64 -0
  27. package/calendar/fesm2022/calendar.mjs +637 -0
  28. package/calendar/fesm2022/calendar.mjs.map +1 -0
  29. package/calendar/index.d.ts +111 -0
  30. package/confirmation-dialog/README.md +64 -0
  31. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +93 -0
  32. package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +1 -0
  33. package/confirmation-dialog/index.d.ts +24 -0
  34. package/date-picker/README.md +64 -0
  35. package/date-picker/fesm2022/date-picker.mjs +599 -0
  36. package/date-picker/fesm2022/date-picker.mjs.map +1 -0
  37. package/date-picker/index.d.ts +227 -0
  38. package/dialog/README.md +64 -0
  39. package/dialog/fesm2022/dialog.mjs +278 -0
  40. package/dialog/fesm2022/dialog.mjs.map +1 -0
  41. package/dialog/index.d.ts +89 -0
  42. package/exports.json +1 -0
  43. package/form-date-picker/README.md +64 -0
  44. package/form-date-picker/fesm2022/form-date-picker.mjs +146 -0
  45. package/form-date-picker/fesm2022/form-date-picker.mjs.map +1 -0
  46. package/form-date-picker/index.d.ts +32 -0
  47. package/form-field/README.md +64 -0
  48. package/form-field/fesm2022/form-field.mjs +112 -0
  49. package/form-field/fesm2022/form-field.mjs.map +1 -0
  50. package/form-field/index.d.ts +37 -0
  51. package/form-searchable-multiselect/README.md +64 -0
  52. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +124 -0
  53. package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +1 -0
  54. package/form-searchable-multiselect/index.d.ts +28 -0
  55. package/form-select/README.md +64 -0
  56. package/form-select/fesm2022/form-select.mjs +165 -0
  57. package/form-select/fesm2022/form-select.mjs.map +1 -0
  58. package/form-select/index.d.ts +33 -0
  59. package/form-text-input/README.md +64 -0
  60. package/form-text-input/fesm2022/form-text-input.mjs +197 -0
  61. package/form-text-input/fesm2022/form-text-input.mjs.map +1 -0
  62. package/form-text-input/index.d.ts +47 -0
  63. package/form-textarea/README.md +64 -0
  64. package/form-textarea/fesm2022/form-textarea.mjs +156 -0
  65. package/form-textarea/fesm2022/form-textarea.mjs.map +1 -0
  66. package/form-textarea/index.d.ts +33 -0
  67. package/icon/README.md +64 -0
  68. package/icon/fesm2022/icon.mjs +71 -0
  69. package/icon/fesm2022/icon.mjs.map +1 -0
  70. package/icon/index.d.ts +27 -0
  71. package/input/README.md +64 -0
  72. package/input/fesm2022/input.mjs +97 -0
  73. package/input/fesm2022/input.mjs.map +1 -0
  74. package/input/index.d.ts +41 -0
  75. package/label/README.md +64 -0
  76. package/label/fesm2022/label.mjs +51 -0
  77. package/label/fesm2022/label.mjs.map +1 -0
  78. package/label/index.d.ts +19 -0
  79. package/package.json +139 -0
  80. package/popover/README.md +64 -0
  81. package/popover/fesm2022/popover.mjs +69 -0
  82. package/popover/fesm2022/popover.mjs.map +1 -0
  83. package/popover/index.d.ts +30 -0
  84. package/radio-group/README.md +64 -0
  85. package/radio-group/fesm2022/radio-group.mjs +170 -0
  86. package/radio-group/fesm2022/radio-group.mjs.map +1 -0
  87. package/radio-group/index.d.ts +63 -0
  88. package/searchable-multiselect/README.md +64 -0
  89. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +221 -0
  90. package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +1 -0
  91. package/searchable-multiselect/index.d.ts +50 -0
  92. package/select/README.md +64 -0
  93. package/select/fesm2022/select.mjs +281 -0
  94. package/select/fesm2022/select.mjs.map +1 -0
  95. package/select/index.d.ts +92 -0
  96. package/separator/README.md +64 -0
  97. package/separator/fesm2022/separator.mjs +46 -0
  98. package/separator/fesm2022/separator.mjs.map +1 -0
  99. package/separator/index.d.ts +19 -0
  100. package/sonner/README.md +64 -0
  101. package/sonner/fesm2022/sonner.mjs +110 -0
  102. package/sonner/fesm2022/sonner.mjs.map +1 -0
  103. package/sonner/index.d.ts +32 -0
  104. package/spinner/README.md +64 -0
  105. package/spinner/fesm2022/spinner.mjs +67 -0
  106. package/spinner/fesm2022/spinner.mjs.map +1 -0
  107. package/spinner/index.d.ts +25 -0
  108. package/switch/README.md +64 -0
  109. package/switch/fesm2022/switch.mjs +139 -0
  110. package/switch/fesm2022/switch.mjs.map +1 -0
  111. package/switch/index.d.ts +56 -0
  112. package/tabs/README.md +64 -0
  113. package/tabs/fesm2022/tabs.mjs +258 -0
  114. package/tabs/fesm2022/tabs.mjs.map +1 -0
  115. package/tabs/index.d.ts +71 -0
  116. package/tooltip/README.md +64 -0
  117. package/tooltip/fesm2022/tooltip.mjs +93 -0
  118. package/tooltip/fesm2022/tooltip.mjs.map +1 -0
  119. package/tooltip/index.d.ts +21 -0
  120. package/utils/README.md +64 -0
  121. package/utils/fesm2022/utils.mjs +17 -0
  122. package/utils/fesm2022/utils.mjs.map +1 -0
  123. package/utils/index.d.ts +5 -0
@@ -0,0 +1,64 @@
1
+ # RadioGroup
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.2.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build radio-group
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+
35
+ ```bash
36
+ cd dist/radio-group
37
+ ```
38
+
39
+ 2. Run the `npm publish` command to publish your library to the npm registry:
40
+ ```bash
41
+ npm publish
42
+ ```
43
+
44
+ ## Running unit tests
45
+
46
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
47
+
48
+ ```bash
49
+ ng test
50
+ ```
51
+
52
+ ## Running end-to-end tests
53
+
54
+ For end-to-end (e2e) testing, run:
55
+
56
+ ```bash
57
+ ng e2e
58
+ ```
59
+
60
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
61
+
62
+ ## Additional Resources
63
+
64
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,170 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Renderer2, ElementRef, PLATFORM_ID, input, computed, booleanAttribute, signal, output, effect, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
4
+ import * as i1 from '@spartan-ng/brain/radio-group';
5
+ import { BrnRadio, BrnRadioGroup } from '@spartan-ng/brain/radio-group';
6
+ import { hlm } from '@egose/shadcn-theme-ng/utils';
7
+
8
+ class HlmRadio {
9
+ _document = inject(DOCUMENT);
10
+ _renderer = inject(Renderer2);
11
+ _elementRef = inject(ElementRef);
12
+ _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
13
+ userClass = input('', ...(ngDevMode ? [{ debugName: "userClass", alias: 'class' }] : [{ alias: 'class' }]));
14
+ _computedClass = computed(() => hlm('tw:group tw:flex tw:items-center tw:gap-x-3', this.userClass(), this._state().disabled() ? 'tw:cursor-not-allowed tw:opacity-50' : ''), ...(ngDevMode ? [{ debugName: "_computedClass" }] : []));
15
+ /** Used to set the id on the underlying brn element. */
16
+ id = input(undefined, ...(ngDevMode ? [{ debugName: "id" }] : []));
17
+ /** Used to set the aria-label attribute on the underlying brn element. */
18
+ ariaLabel = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabel", alias: 'aria-label' }] : [{ alias: 'aria-label' }]));
19
+ /** Used to set the aria-labelledby attribute on the underlying brn element. */
20
+ ariaLabelledby = input(undefined, ...(ngDevMode ? [{ debugName: "ariaLabelledby", alias: 'aria-labelledby' }] : [{ alias: 'aria-labelledby' }]));
21
+ /** Used to set the aria-describedby attribute on the underlying brn element. */
22
+ ariaDescribedby = input(undefined, ...(ngDevMode ? [{ debugName: "ariaDescribedby", alias: 'aria-describedby' }] : [{ alias: 'aria-describedby' }]));
23
+ /**
24
+ * The value this radio button represents.
25
+ */
26
+ value = input.required(...(ngDevMode ? [{ debugName: "value" }] : []));
27
+ /** Whether the checkbox is required. */
28
+ required = input(false, ...(ngDevMode ? [{ debugName: "required", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
29
+ /** Whether the checkbox is disabled. */
30
+ disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
31
+ _state = computed(() => {
32
+ const id = this.id();
33
+ return {
34
+ disabled: signal(this.disabled()),
35
+ id: id ? id : null,
36
+ };
37
+ }, ...(ngDevMode ? [{ debugName: "_state" }] : []));
38
+ /**
39
+ * Event emitted when the checked state of this radio button changes.
40
+ */
41
+ // eslint-disable-next-line @angular-eslint/no-output-native
42
+ change = output();
43
+ constructor() {
44
+ effect(() => {
45
+ const state = this._state();
46
+ const isDisabled = state.disabled();
47
+ if (!this._elementRef.nativeElement || !this._isBrowser)
48
+ return;
49
+ const labelElement = this._elementRef.nativeElement.closest('label') ?? this._document.querySelector(`label[for="${state.id}"]`);
50
+ if (!labelElement)
51
+ return;
52
+ this._renderer.setAttribute(labelElement, 'data-disabled', isDisabled ? 'true' : 'false');
53
+ });
54
+ }
55
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadio, deps: [], target: i0.ɵɵFactoryTarget.Component });
56
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.1", type: HlmRadio, isStandalone: true, selector: "hlm-radio", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change" }, host: { properties: { "attr.id": "null", "attr.aria-label": "null", "attr.aria-labelledby": "null", "attr.aria-describedby": "null", "attr.data-disabled": "_state().disabled() ? \"\" : null" } }, ngImport: i0, template: `
57
+ <brn-radio
58
+ [id]="id()"
59
+ [class]="_computedClass()"
60
+ [value]="value()"
61
+ [required]="required()"
62
+ [disabled]="disabled()"
63
+ [aria-label]="ariaLabel()"
64
+ [aria-labelledby]="ariaLabelledby()"
65
+ [aria-describedby]="ariaDescribedby()"
66
+ (change)="change.emit($event)"
67
+ >
68
+ <ng-content select="[target],[indicator],hlm-radio-indicator" indicator />
69
+ <ng-content />
70
+ </brn-radio>
71
+ `, isInline: true, dependencies: [{ kind: "component", type: BrnRadio, selector: "brn-radio", inputs: ["disabled", "id", "aria-label", "aria-labelledby", "aria-describedby", "value", "required"], outputs: ["change"], exportAs: ["brnRadio"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
72
+ }
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadio, decorators: [{
74
+ type: Component,
75
+ args: [{
76
+ selector: 'hlm-radio',
77
+ imports: [BrnRadio],
78
+ template: `
79
+ <brn-radio
80
+ [id]="id()"
81
+ [class]="_computedClass()"
82
+ [value]="value()"
83
+ [required]="required()"
84
+ [disabled]="disabled()"
85
+ [aria-label]="ariaLabel()"
86
+ [aria-labelledby]="ariaLabelledby()"
87
+ [aria-describedby]="ariaDescribedby()"
88
+ (change)="change.emit($event)"
89
+ >
90
+ <ng-content select="[target],[indicator],hlm-radio-indicator" indicator />
91
+ <ng-content />
92
+ </brn-radio>
93
+ `,
94
+ changeDetection: ChangeDetectionStrategy.OnPush,
95
+ host: {
96
+ '[attr.id]': 'null',
97
+ '[attr.aria-label]': 'null',
98
+ '[attr.aria-labelledby]': 'null',
99
+ '[attr.aria-describedby]': 'null',
100
+ '[attr.data-disabled]': '_state().disabled() ? "" : null',
101
+ },
102
+ }]
103
+ }], ctorParameters: () => [] });
104
+
105
+ class HlmRadioGroup {
106
+ userClass = input('', ...(ngDevMode ? [{ debugName: "userClass", alias: 'class' }] : [{ alias: 'class' }]));
107
+ _computedClass = computed(() => hlm('tw:grid tw:gap-3', this.userClass()), ...(ngDevMode ? [{ debugName: "_computedClass" }] : []));
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.1", type: HlmRadioGroup, isStandalone: true, selector: "hlm-radio-group", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, hostDirectives: [{ directive: i1.BrnRadioGroup, inputs: ["name", "name", "value", "value", "disabled", "disabled", "required", "required", "direction", "direction"], outputs: ["valueChange", "valueChange"] }], ngImport: i0, template: '<ng-content />', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
110
+ }
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroup, decorators: [{
112
+ type: Component,
113
+ args: [{
114
+ selector: 'hlm-radio-group',
115
+ hostDirectives: [
116
+ {
117
+ directive: BrnRadioGroup,
118
+ inputs: ['name', 'value', 'disabled', 'required', 'direction'],
119
+ outputs: ['valueChange'],
120
+ },
121
+ ],
122
+ host: {
123
+ '[class]': '_computedClass()',
124
+ },
125
+ template: '<ng-content />',
126
+ changeDetection: ChangeDetectionStrategy.OnPush,
127
+ }]
128
+ }] });
129
+
130
+ class HlmRadioIndicator {
131
+ userClass = input('', ...(ngDevMode ? [{ debugName: "userClass", alias: 'class' }] : [{ alias: 'class' }]));
132
+ _computedClass = computed(() => hlm('tw:border-input tw:text-primary tw:group-has-[:focus-visible]:border-ring tw:group-has-[:focus-visible]:ring-ring/50 tw:dark:bg-input/10 tw:shadow-xs tw:group-data=[disabled=true]:cursor-not-allowed tw:group-data=[disabled=true]:opacity-50 tw:relative tw:flex tw:aspect-square tw:size-4 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-full tw:border tw:outline-none tw:transition-[color,box-shadow] tw:group-has-[:focus-visible]:ring-[3px]', this.userClass()), ...(ngDevMode ? [{ debugName: "_computedClass" }] : []));
133
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
134
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.1", type: HlmRadioIndicator, isStandalone: true, selector: "hlm-radio-indicator", inputs: { userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "_computedClass()" } }, ngImport: i0, template: ` <div class="tw:group-data-[checked=true]:bg-primary tw:size-2 tw:rounded-full tw:bg-transparent"></div> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
135
+ }
136
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioIndicator, decorators: [{
137
+ type: Component,
138
+ args: [{
139
+ selector: 'hlm-radio-indicator',
140
+ host: {
141
+ '[class]': '_computedClass()',
142
+ },
143
+ template: ` <div class="tw:group-data-[checked=true]:bg-primary tw:size-2 tw:rounded-full tw:bg-transparent"></div> `,
144
+ changeDetection: ChangeDetectionStrategy.OnPush,
145
+ }]
146
+ }] });
147
+
148
+ /*
149
+ * Public API Surface of radio-group
150
+ */
151
+ const HlmRadioGroupImports = [HlmRadioGroup, HlmRadio, HlmRadioIndicator];
152
+ class HlmRadioGroupModule {
153
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroupModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
154
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroupModule, imports: [HlmRadioGroup, HlmRadio, HlmRadioIndicator], exports: [HlmRadioGroup, HlmRadio, HlmRadioIndicator] });
155
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroupModule, imports: [HlmRadio] });
156
+ }
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: HlmRadioGroupModule, decorators: [{
158
+ type: NgModule,
159
+ args: [{
160
+ imports: [...HlmRadioGroupImports],
161
+ exports: [...HlmRadioGroupImports],
162
+ }]
163
+ }] });
164
+
165
+ /**
166
+ * Generated bundle index. Do not edit.
167
+ */
168
+
169
+ export { HlmRadio, HlmRadioGroup, HlmRadioGroupImports, HlmRadioGroupModule, HlmRadioIndicator };
170
+ //# sourceMappingURL=radio-group.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radio-group.mjs","sources":["../../../projects/radio-group/src/lib/radio.ts","../../../projects/radio-group/src/lib/radio-group.ts","../../../projects/radio-group/src/lib/radio-indicator.ts","../../../projects/radio-group/src/public-api.ts","../../../projects/radio-group/src/radio-group.ts"],"sourcesContent":["import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n output,\n PLATFORM_ID,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { BrnRadio, BrnRadioChange } from '@spartan-ng/brain/radio-group';\nimport { hlm } from '@egose/shadcn-theme-ng/utils';\nimport { ClassValue } from 'clsx';\n\n@Component({\n selector: 'hlm-radio',\n imports: [BrnRadio],\n template: `\n <brn-radio\n [id]=\"id()\"\n [class]=\"_computedClass()\"\n [value]=\"value()\"\n [required]=\"required()\"\n [disabled]=\"disabled()\"\n [aria-label]=\"ariaLabel()\"\n [aria-labelledby]=\"ariaLabelledby()\"\n [aria-describedby]=\"ariaDescribedby()\"\n (change)=\"change.emit($event)\"\n >\n <ng-content select=\"[target],[indicator],hlm-radio-indicator\" indicator />\n <ng-content />\n </brn-radio>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[attr.id]': 'null',\n '[attr.aria-label]': 'null',\n '[attr.aria-labelledby]': 'null',\n '[attr.aria-describedby]': 'null',\n '[attr.data-disabled]': '_state().disabled() ? \"\" : null',\n },\n})\nexport class HlmRadio<T = unknown> {\n private readonly _document = inject(DOCUMENT);\n private readonly _renderer = inject(Renderer2);\n private readonly _elementRef = inject(ElementRef);\n private readonly _isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n public readonly userClass = input<ClassValue>('', { alias: 'class' });\n protected readonly _computedClass = computed(() =>\n hlm(\n 'tw:group tw:flex tw:items-center tw:gap-x-3',\n this.userClass(),\n this._state().disabled() ? 'tw:cursor-not-allowed tw:opacity-50' : '',\n ),\n );\n\n /** Used to set the id on the underlying brn element. */\n public readonly id = input<string | undefined>(undefined);\n\n /** Used to set the aria-label attribute on the underlying brn element. */\n public readonly ariaLabel = input<string | undefined>(undefined, { alias: 'aria-label' });\n\n /** Used to set the aria-labelledby attribute on the underlying brn element. */\n public readonly ariaLabelledby = input<string | undefined>(undefined, { alias: 'aria-labelledby' });\n\n /** Used to set the aria-describedby attribute on the underlying brn element. */\n public readonly ariaDescribedby = input<string | undefined>(undefined, { alias: 'aria-describedby' });\n\n /**\n * The value this radio button represents.\n */\n public readonly value = input.required<T>();\n\n /** Whether the checkbox is required. */\n public readonly required = input(false, { transform: booleanAttribute });\n\n /** Whether the checkbox is disabled. */\n public readonly disabled = input(false, { transform: booleanAttribute });\n\n protected readonly _state = computed(() => {\n const id = this.id();\n return {\n disabled: signal(this.disabled()),\n id: id ? id : null,\n };\n });\n /**\n * Event emitted when the checked state of this radio button changes.\n */\n // eslint-disable-next-line @angular-eslint/no-output-native\n public readonly change = output<BrnRadioChange<T>>();\n\n constructor() {\n effect(() => {\n const state = this._state();\n const isDisabled = state.disabled();\n\n if (!this._elementRef.nativeElement || !this._isBrowser) return;\n\n const labelElement =\n this._elementRef.nativeElement.closest('label') ?? this._document.querySelector(`label[for=\"${state.id}\"]`);\n\n if (!labelElement) return;\n this._renderer.setAttribute(labelElement, 'data-disabled', isDisabled ? 'true' : 'false');\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { BrnRadioGroup } from '@spartan-ng/brain/radio-group';\nimport { hlm } from '@egose/shadcn-theme-ng/utils';\nimport type { ClassValue } from 'clsx';\n\n@Component({\n selector: 'hlm-radio-group',\n hostDirectives: [\n {\n directive: BrnRadioGroup,\n inputs: ['name', 'value', 'disabled', 'required', 'direction'],\n outputs: ['valueChange'],\n },\n ],\n host: {\n '[class]': '_computedClass()',\n },\n template: '<ng-content />',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HlmRadioGroup {\n public readonly userClass = input<ClassValue>('', { alias: 'class' });\n protected readonly _computedClass = computed(() => hlm('tw:grid tw:gap-3', this.userClass()));\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { hlm } from '@egose/shadcn-theme-ng/utils';\nimport type { ClassValue } from 'clsx';\n\n@Component({\n selector: 'hlm-radio-indicator',\n host: {\n '[class]': '_computedClass()',\n },\n template: ` <div class=\"tw:group-data-[checked=true]:bg-primary tw:size-2 tw:rounded-full tw:bg-transparent\"></div> `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HlmRadioIndicator {\n public readonly userClass = input<ClassValue>('', { alias: 'class' });\n protected readonly _computedClass = computed(() =>\n hlm(\n 'tw:border-input tw:text-primary tw:group-has-[:focus-visible]:border-ring tw:group-has-[:focus-visible]:ring-ring/50 tw:dark:bg-input/10 tw:shadow-xs tw:group-data=[disabled=true]:cursor-not-allowed tw:group-data=[disabled=true]:opacity-50 tw:relative tw:flex tw:aspect-square tw:size-4 tw:shrink-0 tw:items-center tw:justify-center tw:rounded-full tw:border tw:outline-none tw:transition-[color,box-shadow] tw:group-has-[:focus-visible]:ring-[3px]',\n this.userClass(),\n ),\n );\n}\n","/*\n * Public API Surface of radio-group\n */\n\nimport { NgModule } from '@angular/core';\n\nimport { HlmRadio } from './lib/radio';\nimport { HlmRadioGroup } from './lib/radio-group';\nimport { HlmRadioIndicator } from './lib/radio-indicator';\n\nexport * from './lib/radio';\nexport * from './lib/radio-group';\nexport * from './lib/radio-indicator';\n\nexport const HlmRadioGroupImports = [HlmRadioGroup, HlmRadio, HlmRadioIndicator];\n\n@NgModule({\n imports: [...HlmRadioGroupImports],\n exports: [...HlmRadioGroupImports],\n})\nexport class HlmRadioGroupModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import * as i1 from '@spartan-ng/brain/radio-group';
3
+ import { BrnRadioChange } from '@spartan-ng/brain/radio-group';
4
+ import { ClassValue } from 'clsx';
5
+
6
+ declare class HlmRadio<T = unknown> {
7
+ private readonly _document;
8
+ private readonly _renderer;
9
+ private readonly _elementRef;
10
+ private readonly _isBrowser;
11
+ readonly userClass: _angular_core.InputSignal<ClassValue>;
12
+ protected readonly _computedClass: _angular_core.Signal<string>;
13
+ /** Used to set the id on the underlying brn element. */
14
+ readonly id: _angular_core.InputSignal<string | undefined>;
15
+ /** Used to set the aria-label attribute on the underlying brn element. */
16
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
17
+ /** Used to set the aria-labelledby attribute on the underlying brn element. */
18
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
19
+ /** Used to set the aria-describedby attribute on the underlying brn element. */
20
+ readonly ariaDescribedby: _angular_core.InputSignal<string | undefined>;
21
+ /**
22
+ * The value this radio button represents.
23
+ */
24
+ readonly value: _angular_core.InputSignal<T>;
25
+ /** Whether the checkbox is required. */
26
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
27
+ /** Whether the checkbox is disabled. */
28
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
29
+ protected readonly _state: _angular_core.Signal<{
30
+ disabled: _angular_core.WritableSignal<boolean>;
31
+ id: string | null;
32
+ }>;
33
+ /**
34
+ * Event emitted when the checked state of this radio button changes.
35
+ */
36
+ readonly change: _angular_core.OutputEmitterRef<BrnRadioChange<T>>;
37
+ constructor();
38
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HlmRadio<any>, never>;
39
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HlmRadio<any>, "hlm-radio", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "aria-labelledby"; "required": false; "isSignal": true; }; "ariaDescribedby": { "alias": "aria-describedby"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "change": "change"; }, never, ["[target],[indicator],hlm-radio-indicator", "*"], true, never>;
40
+ }
41
+
42
+ declare class HlmRadioGroup {
43
+ readonly userClass: _angular_core.InputSignal<ClassValue>;
44
+ protected readonly _computedClass: _angular_core.Signal<string>;
45
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HlmRadioGroup, never>;
46
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HlmRadioGroup, "hlm-radio-group", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, [{ directive: typeof i1.BrnRadioGroup; inputs: { "name": "name"; "value": "value"; "disabled": "disabled"; "required": "required"; "direction": "direction"; }; outputs: { "valueChange": "valueChange"; }; }]>;
47
+ }
48
+
49
+ declare class HlmRadioIndicator {
50
+ readonly userClass: _angular_core.InputSignal<ClassValue>;
51
+ protected readonly _computedClass: _angular_core.Signal<string>;
52
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HlmRadioIndicator, never>;
53
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<HlmRadioIndicator, "hlm-radio-indicator", never, { "userClass": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
54
+ }
55
+
56
+ declare const HlmRadioGroupImports: (typeof HlmRadio | typeof HlmRadioGroup | typeof HlmRadioIndicator)[];
57
+ declare class HlmRadioGroupModule {
58
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<HlmRadioGroupModule, never>;
59
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<HlmRadioGroupModule, never, [typeof HlmRadioGroup, typeof HlmRadio, typeof HlmRadioIndicator], [typeof HlmRadioGroup, typeof HlmRadio, typeof HlmRadioIndicator]>;
60
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<HlmRadioGroupModule>;
61
+ }
62
+
63
+ export { HlmRadio, HlmRadioGroup, HlmRadioGroupImports, HlmRadioGroupModule, HlmRadioIndicator };
@@ -0,0 +1,64 @@
1
+ # MultiselectAutocomplete
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.3.0.
4
+
5
+ ## Code scaffolding
6
+
7
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
8
+
9
+ ```bash
10
+ ng generate component component-name
11
+ ```
12
+
13
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
14
+
15
+ ```bash
16
+ ng generate --help
17
+ ```
18
+
19
+ ## Building
20
+
21
+ To build the library, run:
22
+
23
+ ```bash
24
+ ng build searchable-multiselect
25
+ ```
26
+
27
+ This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
28
+
29
+ ### Publishing the Library
30
+
31
+ Once the project is built, you can publish your library by following these steps:
32
+
33
+ 1. Navigate to the `dist` directory:
34
+
35
+ ```bash
36
+ cd dist/searchable-multiselect
37
+ ```
38
+
39
+ 2. Run the `npm publish` command to publish your library to the npm registry:
40
+ ```bash
41
+ npm publish
42
+ ```
43
+
44
+ ## Running unit tests
45
+
46
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
47
+
48
+ ```bash
49
+ ng test
50
+ ```
51
+
52
+ ## Running end-to-end tests
53
+
54
+ For end-to-end (e2e) testing, run:
55
+
56
+ ```bash
57
+ ng e2e
58
+ ```
59
+
60
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
61
+
62
+ ## Additional Resources
63
+
64
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
@@ -0,0 +1,221 @@
1
+ import * as i0 from '@angular/core';
2
+ import { viewChild, input, output, signal, computed, effect, forwardRef, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { HlmAutocomplete } from '@egose/shadcn-theme-ng/autocomplete';
5
+
6
+ class EgSearchableMultiselect {
7
+ autoComplete = viewChild(HlmAutocomplete, ...(ngDevMode ? [{ debugName: "autoComplete" }] : []));
8
+ /** Full option list with labels/values */
9
+ options = input([], ...(ngDevMode ? [{ debugName: "options" }] : []));
10
+ placeholder = input('Start typing to add…', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
11
+ /** Value: array of selected values (string[]) */
12
+ value = input([], ...(ngDevMode ? [{ debugName: "value" }] : []));
13
+ valueChange = output(); // emits string[] of values
14
+ /** Internal state */
15
+ search = signal('', ...(ngDevMode ? [{ debugName: "search" }] : []));
16
+ selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : [])); // full objects for display
17
+ isDisabled = false;
18
+ isFormBound = false;
19
+ /** Filtered **labels** for hlm-autocomplete */
20
+ filteredOptionLabels = computed(() => (this.options() || [])
21
+ .filter((opt) => opt.label.toLowerCase().includes(this.search().toLowerCase()) &&
22
+ !this.selectedItems().some((sel) => sel.value === opt.value))
23
+ .map((opt) => opt.label), ...(ngDevMode ? [{ debugName: "filteredOptionLabels" }] : []));
24
+ /** Form callbacks */
25
+ onChange = () => { };
26
+ onTouched = () => { };
27
+ constructor() {
28
+ // Sync `value` input to selectedItems for standalone usage
29
+ effect(() => {
30
+ if (!this.isFormBound) {
31
+ this.updateSelectedFromValues(this.value() || []);
32
+ }
33
+ });
34
+ }
35
+ /** Add by label string (from autocomplete) */
36
+ addItemByLabel(label) {
37
+ const opt = this.options()?.find((o) => o.label === label);
38
+ if (opt) {
39
+ this.addItem(opt.value);
40
+ }
41
+ }
42
+ /** Add by value string */
43
+ addItem(value) {
44
+ if (!this.selectedItems().some((sel) => sel.value === value)) {
45
+ const opt = this.options()?.find((o) => o.value === value);
46
+ if (!opt)
47
+ return;
48
+ const updatedItems = [...this.selectedItems(), opt];
49
+ this.updateValueFromSelected(updatedItems);
50
+ }
51
+ }
52
+ /** Remove by value string */
53
+ removeItem(value) {
54
+ const updatedItems = this.selectedItems().filter((i) => i.value !== value);
55
+ this.updateValueFromSelected(updatedItems);
56
+ }
57
+ /** Clear autocomplete text */
58
+ clearAutocompleteText() {
59
+ this.autoComplete()?.clearText();
60
+ if (this.options().length === this.selectedItems().length) {
61
+ this.autoComplete()?.setPopoverState('closed');
62
+ }
63
+ }
64
+ handleSelect(label) {
65
+ this.clearAutocompleteText();
66
+ }
67
+ /** Map string[] values → full objects */
68
+ updateSelectedFromValues(values) {
69
+ const opts = this.options() || [];
70
+ const matched = opts.filter((o) => values.includes(o.value));
71
+ this.selectedItems.set(matched);
72
+ }
73
+ /** Map full objects → string[] values and emit */
74
+ updateValueFromSelected(items) {
75
+ this.selectedItems.set(items);
76
+ const values = items.map((i) => i.value);
77
+ this.valueChange.emit(values);
78
+ this.onChange(values);
79
+ this.onTouched();
80
+ }
81
+ // --- ControlValueAccessor ---
82
+ writeValue(values) {
83
+ this.isFormBound = true;
84
+ this.updateSelectedFromValues(values || []);
85
+ }
86
+ registerOnChange(fn) {
87
+ this.onChange = fn;
88
+ }
89
+ registerOnTouched(fn) {
90
+ this.onTouched = fn;
91
+ }
92
+ setDisabledState(isDisabled) {
93
+ this.isDisabled = isDisabled;
94
+ }
95
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: EgSearchableMultiselect, deps: [], target: i0.ɵɵFactoryTarget.Component });
96
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.1", type: EgSearchableMultiselect, isStandalone: true, selector: "eg-searchable-multiselect", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, providers: [
97
+ {
98
+ provide: NG_VALUE_ACCESSOR,
99
+ useExisting: forwardRef(() => EgSearchableMultiselect),
100
+ multi: true,
101
+ },
102
+ ], viewQueries: [{ propertyName: "autoComplete", first: true, predicate: HlmAutocomplete, descendants: true, isSignal: true }], ngImport: i0, template: `
103
+ <div class="tw:flex tw:flex-col tw:gap-2 tw:w-full">
104
+ <!-- Selected items -->
105
+ <div
106
+ class="tw:flex tw:gap-2 tw:overflow-x-auto tw:whitespace-nowrap
107
+ tw:[scrollbar-width:none] tw:[-ms-overflow-style:none]
108
+ tw:[&::-webkit-scrollbar]:hidden"
109
+ >
110
+ @if (selectedItems().length === 0) {
111
+ <span
112
+ class="tw:bg-gray-100 tw:text-gray-400 tw:rounded-full
113
+ tw:px-2 tw:py-1 tw:inline-flex tw:items-center tw:text-xs"
114
+ >
115
+ {{ placeholder() }}
116
+ </span>
117
+ } @else {
118
+ @for (item of selectedItems(); track item.value) {
119
+ <span
120
+ class="tw:bg-gray-200 tw:rounded-full tw:px-2 tw:py-1
121
+ tw:inline-flex tw:items-center tw:gap-2 tw:text-xs"
122
+ >
123
+ {{ item.label }}
124
+ <button
125
+ type="button"
126
+ (click)="removeItem(item.value)"
127
+ class="tw:bg-transparent tw:border-0 tw:text-gray-600
128
+ tw:hover:text-red-500 tw:cursor-pointer"
129
+ >
130
+ ✕
131
+ </button>
132
+ </span>
133
+ }
134
+ }
135
+ </div>
136
+
137
+ <!-- Autocomplete -->
138
+ <hlm-autocomplete
139
+ [filteredOptions]="filteredOptionLabels()"
140
+ [(search)]="search"
141
+ (valueChange)="addItemByLabel($event)"
142
+ [searchPlaceholderText]="this.selectedItems().length.toString() + ' of ' + this.options().length + ' selected'"
143
+ [onSelect]="handleSelect.bind(this)"
144
+ [disabled]="isDisabled"
145
+ />
146
+ </div>
147
+ `, isInline: true, dependencies: [{ kind: "component", type: HlmAutocomplete, selector: "hlm-autocomplete", inputs: ["onSelect", "class", "autocompleteListClass", "autocompleteEmptyClass", "filteredOptions", "value", "search", "transformValueToSearch", "optionTemplate", "loading", "searchPlaceholderText", "loadingText", "emptyText", "ariaLabelToggleButton", "inputId", "disabled"], outputs: ["valueChange", "searchChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: EgSearchableMultiselect, decorators: [{
150
+ type: Component,
151
+ args: [{
152
+ selector: 'eg-searchable-multiselect',
153
+ standalone: true,
154
+ imports: [HlmAutocomplete],
155
+ changeDetection: ChangeDetectionStrategy.OnPush,
156
+ providers: [
157
+ {
158
+ provide: NG_VALUE_ACCESSOR,
159
+ useExisting: forwardRef(() => EgSearchableMultiselect),
160
+ multi: true,
161
+ },
162
+ ],
163
+ template: `
164
+ <div class="tw:flex tw:flex-col tw:gap-2 tw:w-full">
165
+ <!-- Selected items -->
166
+ <div
167
+ class="tw:flex tw:gap-2 tw:overflow-x-auto tw:whitespace-nowrap
168
+ tw:[scrollbar-width:none] tw:[-ms-overflow-style:none]
169
+ tw:[&::-webkit-scrollbar]:hidden"
170
+ >
171
+ @if (selectedItems().length === 0) {
172
+ <span
173
+ class="tw:bg-gray-100 tw:text-gray-400 tw:rounded-full
174
+ tw:px-2 tw:py-1 tw:inline-flex tw:items-center tw:text-xs"
175
+ >
176
+ {{ placeholder() }}
177
+ </span>
178
+ } @else {
179
+ @for (item of selectedItems(); track item.value) {
180
+ <span
181
+ class="tw:bg-gray-200 tw:rounded-full tw:px-2 tw:py-1
182
+ tw:inline-flex tw:items-center tw:gap-2 tw:text-xs"
183
+ >
184
+ {{ item.label }}
185
+ <button
186
+ type="button"
187
+ (click)="removeItem(item.value)"
188
+ class="tw:bg-transparent tw:border-0 tw:text-gray-600
189
+ tw:hover:text-red-500 tw:cursor-pointer"
190
+ >
191
+ ✕
192
+ </button>
193
+ </span>
194
+ }
195
+ }
196
+ </div>
197
+
198
+ <!-- Autocomplete -->
199
+ <hlm-autocomplete
200
+ [filteredOptions]="filteredOptionLabels()"
201
+ [(search)]="search"
202
+ (valueChange)="addItemByLabel($event)"
203
+ [searchPlaceholderText]="this.selectedItems().length.toString() + ' of ' + this.options().length + ' selected'"
204
+ [onSelect]="handleSelect.bind(this)"
205
+ [disabled]="isDisabled"
206
+ />
207
+ </div>
208
+ `,
209
+ }]
210
+ }], ctorParameters: () => [] });
211
+
212
+ /*
213
+ * Public API Surface of searchable-multiselect
214
+ */
215
+
216
+ /**
217
+ * Generated bundle index. Do not edit.
218
+ */
219
+
220
+ export { EgSearchableMultiselect };
221
+ //# sourceMappingURL=searchable-multiselect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchable-multiselect.mjs","sources":["../../../projects/searchable-multiselect/src/lib/searchable-multiselect.ts","../../../projects/searchable-multiselect/src/public-api.ts","../../../projects/searchable-multiselect/src/searchable-multiselect.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n computed,\n signal,\n input,\n output,\n viewChild,\n effect,\n forwardRef,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { HlmAutocomplete } from '@egose/shadcn-theme-ng/autocomplete';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\n@Component({\n selector: 'eg-searchable-multiselect',\n standalone: true,\n imports: [HlmAutocomplete],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EgSearchableMultiselect),\n multi: true,\n },\n ],\n template: `\n <div class=\"tw:flex tw:flex-col tw:gap-2 tw:w-full\">\n <!-- Selected items -->\n <div\n class=\"tw:flex tw:gap-2 tw:overflow-x-auto tw:whitespace-nowrap\n tw:[scrollbar-width:none] tw:[-ms-overflow-style:none]\n tw:[&::-webkit-scrollbar]:hidden\"\n >\n @if (selectedItems().length === 0) {\n <span\n class=\"tw:bg-gray-100 tw:text-gray-400 tw:rounded-full\n tw:px-2 tw:py-1 tw:inline-flex tw:items-center tw:text-xs\"\n >\n {{ placeholder() }}\n </span>\n } @else {\n @for (item of selectedItems(); track item.value) {\n <span\n class=\"tw:bg-gray-200 tw:rounded-full tw:px-2 tw:py-1\n tw:inline-flex tw:items-center tw:gap-2 tw:text-xs\"\n >\n {{ item.label }}\n <button\n type=\"button\"\n (click)=\"removeItem(item.value)\"\n class=\"tw:bg-transparent tw:border-0 tw:text-gray-600\n tw:hover:text-red-500 tw:cursor-pointer\"\n >\n ✕\n </button>\n </span>\n }\n }\n </div>\n\n <!-- Autocomplete -->\n <hlm-autocomplete\n [filteredOptions]=\"filteredOptionLabels()\"\n [(search)]=\"search\"\n (valueChange)=\"addItemByLabel($event)\"\n [searchPlaceholderText]=\"this.selectedItems().length.toString() + ' of ' + this.options().length + ' selected'\"\n [onSelect]=\"handleSelect.bind(this)\"\n [disabled]=\"isDisabled\"\n />\n </div>\n `,\n})\nexport class EgSearchableMultiselect implements ControlValueAccessor {\n autoComplete = viewChild(HlmAutocomplete);\n\n /** Full option list with labels/values */\n options = input<SelectOption[]>([]);\n placeholder = input<string>('Start typing to add…');\n\n /** Value: array of selected values (string[]) */\n value = input<string[]>([]);\n valueChange = output<string[]>(); // emits string[] of values\n\n /** Internal state */\n search = signal<string>('');\n selectedItems = signal<SelectOption[]>([]); // full objects for display\n isDisabled = false;\n private isFormBound = false;\n\n /** Filtered **labels** for hlm-autocomplete */\n filteredOptionLabels = computed(\n () =>\n (this.options() || [])\n .filter(\n (opt) =>\n opt.label.toLowerCase().includes(this.search().toLowerCase()) &&\n !this.selectedItems().some((sel) => sel.value === opt.value),\n )\n .map((opt) => opt.label), // convert to string[] for hlm-autocomplete\n );\n\n /** Form callbacks */\n private onChange: (value: string[]) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor() {\n // Sync `value` input to selectedItems for standalone usage\n effect(() => {\n if (!this.isFormBound) {\n this.updateSelectedFromValues(this.value() || []);\n }\n });\n }\n\n /** Add by label string (from autocomplete) */\n addItemByLabel(label: string) {\n const opt = this.options()?.find((o) => o.label === label);\n if (opt) {\n this.addItem(opt.value);\n }\n }\n\n /** Add by value string */\n addItem(value: string) {\n if (!this.selectedItems().some((sel) => sel.value === value)) {\n const opt = this.options()?.find((o) => o.value === value);\n if (!opt) return;\n const updatedItems = [...this.selectedItems(), opt];\n this.updateValueFromSelected(updatedItems);\n }\n }\n\n /** Remove by value string */\n removeItem(value: string) {\n const updatedItems = this.selectedItems().filter((i) => i.value !== value);\n this.updateValueFromSelected(updatedItems);\n }\n\n /** Clear autocomplete text */\n clearAutocompleteText() {\n this.autoComplete()?.clearText();\n\n if (this.options().length === this.selectedItems().length) {\n this.autoComplete()?.setPopoverState('closed');\n }\n }\n\n handleSelect(label: string) {\n this.clearAutocompleteText();\n }\n\n /** Map string[] values → full objects */\n private updateSelectedFromValues(values: string[]) {\n const opts = this.options() || [];\n const matched = opts.filter((o) => values.includes(o.value));\n this.selectedItems.set(matched);\n }\n\n /** Map full objects → string[] values and emit */\n private updateValueFromSelected(items: SelectOption[]) {\n this.selectedItems.set(items);\n const values = items.map((i) => i.value);\n this.valueChange.emit(values);\n this.onChange(values);\n this.onTouched();\n }\n\n // --- ControlValueAccessor ---\n writeValue(values: string[] | null): void {\n this.isFormBound = true;\n this.updateSelectedFromValues(values || []);\n }\n\n registerOnChange(fn: (value: string[]) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n}\n","/*\n * Public API Surface of searchable-multiselect\n */\n\nexport * from './lib/searchable-multiselect';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MA8Ea,uBAAuB,CAAA;AAClC,IAAA,YAAY,GAAG,SAAS,CAAC,eAAe,wDAAC;;AAGzC,IAAA,OAAO,GAAG,KAAK,CAAiB,EAAE,mDAAC;AACnC,IAAA,WAAW,GAAG,KAAK,CAAS,sBAAsB,uDAAC;;AAGnD,IAAA,KAAK,GAAG,KAAK,CAAW,EAAE,iDAAC;AAC3B,IAAA,WAAW,GAAG,MAAM,EAAY,CAAC;;AAGjC,IAAA,MAAM,GAAG,MAAM,CAAS,EAAE,kDAAC;AAC3B,IAAA,aAAa,GAAG,MAAM,CAAiB,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC,CAAC;IAC3C,UAAU,GAAG,KAAK;IACV,WAAW,GAAG,KAAK;;AAG3B,IAAA,oBAAoB,GAAG,QAAQ,CAC7B,MACE,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;SAClB,MAAM,CACL,CAAC,GAAG,KACF,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7D,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC;SAE/D,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC7B;;AAGO,IAAA,QAAQ,GAA8B,MAAK,EAAE,CAAC;AAC9C,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAExC,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YACnD;AACF,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;QAC1D,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;;AAGA,IAAA,OAAO,CAAC,KAAa,EAAA;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;YAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AAC1D,YAAA,IAAI,CAAC,GAAG;gBAAE;YACV,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,CAAC;AACnD,YAAA,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC;QAC5C;IACF;;AAGA,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC;AAC1E,QAAA,IAAI,CAAC,uBAAuB,CAAC,YAAY,CAAC;IAC5C;;IAGA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE;YACzD,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC;QAChD;IACF;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,IAAI,CAAC,qBAAqB,EAAE;IAC9B;;AAGQ,IAAA,wBAAwB,CAAC,MAAgB,EAAA;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;IACjC;;AAGQ,IAAA,uBAAuB,CAAC,KAAqB,EAAA;AACnD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,EAAE;IAClB;;AAGA,IAAA,UAAU,CAAC,MAAuB,EAAA;AAChC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,wBAAwB,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7C;AAEA,IAAA,gBAAgB,CAAC,EAA6B,EAAA;AAC5C,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;uGA/GW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAtDvB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,uBAAuB,CAAC;AACtD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAiDwB,eAAe,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhD9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAtDS,eAAe,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,WAAA,EAAA,uBAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,cAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAwDd,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA3DnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,eAAe,CAAC;oBAC1B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,6BAA6B,CAAC;AACtD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CT,EAAA,CAAA;AACF,iBAAA;;;AC7ED;;AAEG;;ACFH;;AAEG;;;;"}