@spartan-ng/cli 0.0.1-alpha.509 → 0.0.1-alpha.511

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 (25) hide show
  1. package/package.json +1 -1
  2. package/src/generators/ui/libs/ui-autocomplete-helm/files/index.ts.template +36 -0
  3. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-empty.ts.template +14 -0
  4. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-group.ts.template +27 -0
  5. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-item.ts.template +33 -0
  6. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-list.ts.template +27 -0
  7. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-search-input.ts.template +26 -0
  8. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-search.ts.template +28 -0
  9. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-trigger.ts.template +32 -0
  10. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete.token.ts.template +23 -0
  11. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete.ts.template +286 -0
  12. package/src/generators/ui/libs/ui-autocomplete-helm/generator.d.ts +3 -0
  13. package/src/generators/ui/libs/ui-autocomplete-helm/generator.js +14 -0
  14. package/src/generators/ui/libs/ui-autocomplete-helm/generator.js.map +1 -0
  15. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-group-label.ts.template +2 -2
  16. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-group.ts.template +2 -2
  17. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-item.ts.template +3 -15
  18. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-search-input.ts.template +2 -2
  19. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-search.ts.template +2 -2
  20. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command-separator.ts.template +2 -2
  21. package/src/generators/ui/libs/ui-command-helm/files/lib/hlm-command.ts.template +2 -2
  22. package/src/generators/ui/primitive-deps.js +1 -0
  23. package/src/generators/ui/primitive-deps.js.map +1 -1
  24. package/src/generators/ui/primitives.d.ts +1 -1
  25. package/src/generators/ui/supported-ui-libraries.json +40 -28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spartan-ng/cli",
3
- "version": "0.0.1-alpha.509",
3
+ "version": "0.0.1-alpha.511",
4
4
  "type": "commonjs",
5
5
  "dependencies": {
6
6
  "@nx/angular": ">=20.0.0",
@@ -0,0 +1,36 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { HlmAutocomplete } from './lib/hlm-autocomplete';
3
+ import { HlmAutocompleteEmpty } from './lib/hlm-autocomplete-empty';
4
+ import { HlmAutocompleteGroup } from './lib/hlm-autocomplete-group';
5
+ import { HlmAutocompleteItem } from './lib/hlm-autocomplete-item';
6
+ import { HlmAutocompleteList } from './lib/hlm-autocomplete-list';
7
+ import { HlmAutocompleteSearch } from './lib/hlm-autocomplete-search';
8
+ import { HlmAutocompleteSearchInput } from './lib/hlm-autocomplete-search-input';
9
+ import { HlmAutocompleteTrigger } from './lib/hlm-autocomplete-trigger';
10
+
11
+ export * from './lib/hlm-autocomplete';
12
+ export * from './lib/hlm-autocomplete-empty';
13
+ export * from './lib/hlm-autocomplete-group';
14
+ export * from './lib/hlm-autocomplete-item';
15
+ export * from './lib/hlm-autocomplete-list';
16
+ export * from './lib/hlm-autocomplete-search';
17
+ export * from './lib/hlm-autocomplete-search-input';
18
+ export * from './lib/hlm-autocomplete-trigger';
19
+ export * from './lib/hlm-autocomplete.token';
20
+
21
+ export const HlmAutocompleteImports = [
22
+ HlmAutocomplete,
23
+ HlmAutocompleteEmpty,
24
+ HlmAutocompleteGroup,
25
+ HlmAutocompleteItem,
26
+ HlmAutocompleteList,
27
+ HlmAutocompleteSearch,
28
+ HlmAutocompleteSearchInput,
29
+ HlmAutocompleteTrigger,
30
+ ] as const;
31
+
32
+ @NgModule({
33
+ imports: [...HlmAutocompleteImports],
34
+ exports: [...HlmAutocompleteImports],
35
+ })
36
+ export class HlmAutocompleteModule {}
@@ -0,0 +1,14 @@
1
+ import { Directive, computed, input } from '@angular/core';
2
+ import { hlm } from '<%- importAlias %>/utils';
3
+ import type { ClassValue } from 'clsx';
4
+
5
+ @Directive({
6
+ selector: '[hlmAutocompleteEmpty]',
7
+ host: {
8
+ '[class]': '_computedClass()',
9
+ },
10
+ })
11
+ export class HlmAutocompleteEmpty {
12
+ public readonly userClass = input<ClassValue>('', { alias: 'class' });
13
+ protected readonly _computedClass = computed(() => hlm('py-6 text-center text-sm', this.userClass()));
14
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { BrnAutocompleteGroup } from '@spartan-ng/brain/autocomplete';
3
+ import { hlm } from '<%- importAlias %>/utils';
4
+
5
+ @Component({
6
+ selector: 'hlm-autocomplete-group',
7
+ template: '<ng-content />',
8
+ hostDirectives: [
9
+ {
10
+ directive: BrnAutocompleteGroup,
11
+ inputs: ['id'],
12
+ },
13
+ ],
14
+ host: {
15
+ '[class]': '_computedClass()',
16
+ },
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ })
19
+ export class HlmAutocompleteGroup {
20
+ /** The user defined class */
21
+ public readonly userClass = input<string>('', { alias: 'class' });
22
+
23
+ /** The styles to apply */
24
+ protected readonly _computedClass = computed(() =>
25
+ hlm('text-foreground block overflow-hidden p-1', this.userClass()),
26
+ );
27
+ }
@@ -0,0 +1,33 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { BrnAutocompleteItem } from '@spartan-ng/brain/autocomplete';
3
+ import { hlm } from '<%- importAlias %>/utils';
4
+
5
+ @Component({
6
+ selector: 'button[hlm-autocomplete-item]',
7
+ template: `
8
+ <ng-content />
9
+ `,
10
+ hostDirectives: [
11
+ {
12
+ directive: BrnAutocompleteItem,
13
+ inputs: ['value', 'disabled', 'id'],
14
+ outputs: ['selected'],
15
+ },
16
+ ],
17
+ host: {
18
+ '[class]': '_computedClass()',
19
+ },
20
+ changeDetection: ChangeDetectionStrategy.OnPush,
21
+ })
22
+ export class HlmAutocompleteItem {
23
+ /** The user defined class */
24
+ public readonly userClass = input<string>('', { alias: 'class' });
25
+
26
+ /** The styles to apply */
27
+ protected readonly _computedClass = computed(() =>
28
+ hlm(
29
+ 'data-[selected]:bg-accent data-[selected=true]:text-accent-foreground [&>ng-icon]:text-muted-foreground outline-hidden relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm data-[disabled]:pointer-events-none data-[hidden]:hidden data-[disabled]:opacity-50 [&>ng-icon]:pointer-events-none [&>ng-icon]:shrink-0 [&>ng-icon]:text-base',
30
+ this.userClass(),
31
+ ),
32
+ );
33
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { BrnAutocompleteList } from '@spartan-ng/brain/autocomplete';
3
+ import { hlm } from '<%- importAlias %>/utils';
4
+
5
+ @Component({
6
+ selector: 'hlm-autocomplete-list',
7
+ template: '<ng-content />',
8
+ host: {
9
+ '[class]': '_computedClass()',
10
+ },
11
+ hostDirectives: [
12
+ {
13
+ directive: BrnAutocompleteList,
14
+ inputs: ['id'],
15
+ },
16
+ ],
17
+ changeDetection: ChangeDetectionStrategy.OnPush,
18
+ })
19
+ export class HlmAutocompleteList {
20
+ /** The user defined class */
21
+ public readonly userClass = input<string>('', { alias: 'class' });
22
+
23
+ /** The styles to apply */
24
+ protected readonly _computedClass = computed(() =>
25
+ hlm('block max-h-60 overflow-y-auto overflow-x-hidden', this.userClass()),
26
+ );
27
+ }
@@ -0,0 +1,26 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { BrnAutocompleteSearchInput } from '@spartan-ng/brain/autocomplete';
3
+ import { hlm } from '<%- importAlias %>/utils';
4
+ import type { ClassValue } from 'clsx';
5
+
6
+ @Component({
7
+ selector: 'input[hlm-autocomplete-search-input]',
8
+ template: '',
9
+ hostDirectives: [{ directive: BrnAutocompleteSearchInput, inputs: ['value'] }],
10
+ host: {
11
+ '[class]': '_computedClass()',
12
+ },
13
+ changeDetection: ChangeDetectionStrategy.OnPush,
14
+ })
15
+ export class HlmAutocompleteSearchInput {
16
+ /** The user defined class */
17
+ public readonly userClass = input<ClassValue>('', { alias: 'class' });
18
+
19
+ /** The styles to apply */
20
+ protected readonly _computedClass = computed(() =>
21
+ hlm(
22
+ 'placeholder:text-muted-foreground flex h-9 w-full bg-transparent py-1 text-base outline-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
23
+ this.userClass(),
24
+ ),
25
+ );
26
+ }
@@ -0,0 +1,28 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
2
+ import { provideHlmIconConfig } from '<%- importAlias %>/icon';
3
+ import { hlm } from '<%- importAlias %>/utils';
4
+ import type { ClassValue } from 'clsx';
5
+
6
+ @Component({
7
+ selector: 'hlm-autocomplete-search',
8
+ template: `
9
+ <ng-content />
10
+ `,
11
+ host: {
12
+ '[class]': '_computedClass()',
13
+ },
14
+ providers: [provideHlmIconConfig({ size: 'sm' })],
15
+ changeDetection: ChangeDetectionStrategy.OnPush,
16
+ })
17
+ export class HlmAutocompleteSearch {
18
+ /** The user defined class */
19
+ public readonly userClass = input<ClassValue>('', { alias: 'class' });
20
+
21
+ /** The styles to apply */
22
+ protected readonly _computedClass = computed(() =>
23
+ hlm(
24
+ 'border-input focus-within:border-ring bg-background focus-within:ring-ring/50 shadow-xs dark:bg-input/30 flex h-9 min-w-0 items-center gap-2 rounded-md border px-3 focus-within:ring-[3px] [&>_ng-icon]:flex-none [&>_ng-icon]:opacity-50',
25
+ this.userClass(),
26
+ ),
27
+ );
28
+ }
@@ -0,0 +1,32 @@
1
+ import { BooleanInput } from '@angular/cdk/coercion';
2
+ import { booleanAttribute, Directive, ElementRef, inject, input } from '@angular/core';
3
+ import { BrnDialog } from '@spartan-ng/brain/dialog';
4
+
5
+ @Directive({
6
+ selector: '[hlmAutocompleteTrigger]',
7
+ host: {
8
+ '(click)': 'open()',
9
+ },
10
+ })
11
+ export class HlmAutocompleteTrigger {
12
+ private readonly _host = inject(ElementRef, { host: true });
13
+
14
+ private readonly _brnDialog = inject(BrnDialog, { optional: true });
15
+
16
+ /** Whether the trigger is disabled. */
17
+ public readonly disabledTrigger = input<boolean, BooleanInput>(false, {
18
+ transform: booleanAttribute,
19
+ });
20
+
21
+ constructor() {
22
+ if (!this._brnDialog) return;
23
+
24
+ this._brnDialog.mutableAttachTo.set(this._host.nativeElement);
25
+ }
26
+
27
+ open() {
28
+ if (this.disabledTrigger()) return;
29
+
30
+ this._brnDialog?.open();
31
+ }
32
+ }
@@ -0,0 +1,23 @@
1
+ import { inject, InjectionToken, ValueProvider } from '@angular/core';
2
+
3
+ export type TransformValueToString<T> = (value: T) => string;
4
+
5
+ export interface HlmAutocompleteConfig<T> {
6
+ transformValueToSearch: TransformValueToString<T>;
7
+ }
8
+
9
+ function getDefaultConfig<T>(): HlmAutocompleteConfig<T> {
10
+ return {
11
+ transformValueToSearch: (value: T) => (typeof value === 'string' ? value : String(value)),
12
+ };
13
+ }
14
+
15
+ const HlmAutocompleteConfigToken = new InjectionToken<HlmAutocompleteConfig<unknown>>('HlmAutocompleteConfig');
16
+
17
+ export function provideHlmAutocompleteConfig<T>(config: Partial<HlmAutocompleteConfig<T>>): ValueProvider {
18
+ return { provide: HlmAutocompleteConfigToken, useValue: { ...getDefaultConfig(), ...config } };
19
+ }
20
+
21
+ export function injectHlmAutocompleteConfig<T>(): HlmAutocompleteConfig<T> {
22
+ return inject(HlmAutocompleteConfigToken, { optional: true }) ?? getDefaultConfig();
23
+ }
@@ -0,0 +1,286 @@
1
+ import { BooleanInput } from '@angular/cdk/coercion';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import {
4
+ booleanAttribute,
5
+ ChangeDetectionStrategy,
6
+ Component,
7
+ computed,
8
+ ElementRef,
9
+ forwardRef,
10
+ inject,
11
+ input,
12
+ linkedSignal,
13
+ output,
14
+ TemplateRef,
15
+ viewChild,
16
+ } from '@angular/core';
17
+ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
18
+ import { NgIcon, provideIcons } from '@ng-icons/core';
19
+ import { lucideChevronDown, lucideSearch } from '@ng-icons/lucide';
20
+ import { BrnAutocomplete, BrnAutocompleteEmpty } from '@spartan-ng/brain/autocomplete';
21
+ import { ChangeFn, TouchFn } from '@spartan-ng/brain/forms';
22
+ import { BrnPopover, BrnPopoverContent } from '@spartan-ng/brain/popover';
23
+ import { HlmIcon } from '<%- importAlias %>/icon';
24
+ import { HlmPopoverContent } from '<%- importAlias %>/popover';
25
+ import { hlm } from '<%- importAlias %>/utils';
26
+ import type { ClassValue } from 'clsx';
27
+ import { HlmAutocompleteEmpty } from './hlm-autocomplete-empty';
28
+ import { HlmAutocompleteGroup } from './hlm-autocomplete-group';
29
+ import { HlmAutocompleteItem } from './hlm-autocomplete-item';
30
+ import { HlmAutocompleteList } from './hlm-autocomplete-list';
31
+ import { HlmAutocompleteSearch } from './hlm-autocomplete-search';
32
+ import { HlmAutocompleteSearchInput } from './hlm-autocomplete-search-input';
33
+ import { HlmAutocompleteTrigger } from './hlm-autocomplete-trigger';
34
+ import { injectHlmAutocompleteConfig } from './hlm-autocomplete.token';
35
+
36
+ export const HLM_AUTOCOMPLETE_VALUE_ACCESSOR = {
37
+ provide: NG_VALUE_ACCESSOR,
38
+ useExisting: forwardRef(() => HlmAutocomplete),
39
+ multi: true,
40
+ };
41
+
42
+ @Component({
43
+ selector: 'hlm-autocomplete',
44
+ imports: [
45
+ NgTemplateOutlet,
46
+
47
+ BrnPopover,
48
+ BrnPopoverContent,
49
+ HlmPopoverContent,
50
+
51
+ BrnAutocomplete,
52
+ BrnAutocompleteEmpty,
53
+ HlmAutocompleteEmpty,
54
+ HlmAutocompleteGroup,
55
+ HlmAutocompleteItem,
56
+ HlmAutocompleteList,
57
+ HlmAutocompleteSearch,
58
+ HlmAutocompleteSearchInput,
59
+ HlmAutocompleteTrigger,
60
+
61
+ NgIcon,
62
+ HlmIcon,
63
+ ],
64
+ providers: [HLM_AUTOCOMPLETE_VALUE_ACCESSOR, provideIcons({ lucideSearch, lucideChevronDown })],
65
+ template: `
66
+ <brn-popover
67
+ #popover
68
+ align="start"
69
+ autoFocus="first-heading"
70
+ sideOffset="5"
71
+ closeDelay="100"
72
+ [closeOnOutsidePointerEvents]="true"
73
+ >
74
+ <div brnAutocomplete>
75
+ <hlm-autocomplete-search hlmAutocompleteTrigger [disabledTrigger]="!_search()">
76
+ <ng-icon name="lucideSearch" hlm />
77
+ <input
78
+ #input
79
+ type="text"
80
+ autocomplete="off"
81
+ hlm-autocomplete-search-input
82
+ [id]="inputId()"
83
+ [placeholder]="searchPlaceholderText()"
84
+ [disabled]="_disabled()"
85
+ [value]="_search()"
86
+ (input)="_onSearchChanged($event)"
87
+ (keydown.arrowDown)="_openPopover()"
88
+ />
89
+
90
+ <button
91
+ class="flex items-center justify-center outline-none disabled:cursor-not-allowed [&>_ng-icon]:opacity-50"
92
+ tabindex="-1"
93
+ type="button"
94
+ [attr.aria-label]="ariaLabelToggleButton()"
95
+ [disabled]="_disabled()"
96
+ (click)="_toggleOptions()"
97
+ >
98
+ <ng-icon name="lucideChevronDown" hlm />
99
+ </button>
100
+ </hlm-autocomplete-search>
101
+
102
+ <div
103
+ *brnPopoverContent="let ctx"
104
+ hlmPopoverContent
105
+ class="p-0"
106
+ [style.width.px]="_elementRef.nativeElement.offsetWidth"
107
+ >
108
+ <hlm-autocomplete-list
109
+ [class]="_computedAutocompleteListClass()"
110
+ [class.hidden]="filteredOptions().length === 0"
111
+ >
112
+ <hlm-autocomplete-group>
113
+ @for (option of filteredOptions(); track option) {
114
+ <button hlm-autocomplete-item [value]="option" (selected)="_optionSelected(option)">
115
+ @if (optionTemplate(); as optionTemplate) {
116
+ <ng-container *ngTemplateOutlet="optionTemplate; context: { $implicit: option }" />
117
+ } @else {
118
+ {{ option }}
119
+ }
120
+ </button>
121
+ }
122
+ </hlm-autocomplete-group>
123
+ </hlm-autocomplete-list>
124
+
125
+ <div *brnAutocompleteEmpty hlmAutocompleteEmpty [class]="_computedAutocompleteEmptyClass()">
126
+ @if (loading()) {
127
+ <ng-content select="[loading]">{{ loadingText() }}</ng-content>
128
+ } @else {
129
+ <ng-content select="[empty]">{{ emptyText() }}</ng-content>
130
+ }
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </brn-popover>
135
+ `,
136
+ changeDetection: ChangeDetectionStrategy.OnPush,
137
+ host: {
138
+ '[class]': '_computedClass()',
139
+ },
140
+ })
141
+ export class HlmAutocomplete<T> implements ControlValueAccessor {
142
+ private static _id = 0;
143
+ private readonly _config = injectHlmAutocompleteConfig<T>();
144
+
145
+ private readonly _brnPopover = viewChild.required(BrnPopover);
146
+ private readonly _inputRef = viewChild.required('input', { read: ElementRef });
147
+
148
+ protected readonly _elementRef = inject(ElementRef<HTMLElement>);
149
+
150
+ /** The user defined class */
151
+ public readonly userClass = input<ClassValue>('', { alias: 'class' });
152
+ protected readonly _computedClass = computed(() => hlm('block w-full', this.userClass()));
153
+
154
+ /** Custom class for the autocomplete list. */
155
+ public readonly autocompleteListClass = input<ClassValue>('');
156
+ protected readonly _computedAutocompleteListClass = computed(() => hlm('', this.autocompleteListClass()));
157
+
158
+ /** Custom class for the empty and loading state container. */
159
+ public readonly autocompleteEmptyClass = input<ClassValue>('');
160
+ protected readonly _computedAutocompleteEmptyClass = computed(() => hlm('', this.autocompleteEmptyClass()));
161
+
162
+ /** The list of filtered options to display in the autocomplete. */
163
+ public readonly filteredOptions = input<T[]>([]);
164
+
165
+ /** The selected value. */
166
+ public readonly value = input<T>();
167
+ protected readonly _value = linkedSignal(() => this.value());
168
+
169
+ /** The search query. */
170
+ public readonly search = input<string>();
171
+ protected readonly _search = linkedSignal(() => this.search() || '');
172
+
173
+ /** Function to transform an option value to a search string. Defaults to identity function for strings. */
174
+ public readonly transformValueToSearch = input<(value: T) => string>(this._config.transformValueToSearch);
175
+
176
+ /** Optional template for rendering each option. */
177
+ public readonly optionTemplate = input<TemplateRef<HlmAutocompleteOption<T>>>();
178
+
179
+ /** Whether the autocomplete is in a loading state. */
180
+ public readonly loading = input<boolean, BooleanInput>(false, { transform: booleanAttribute });
181
+
182
+ /** Placeholder text for the input field. */
183
+ public readonly searchPlaceholderText = input('Select an option');
184
+
185
+ /** Text to display when loading options. */
186
+ public readonly loadingText = input('Loading options...');
187
+
188
+ /** Text to display when no options are found. */
189
+ public readonly emptyText = input('No options found');
190
+
191
+ /** Aria label for the toggle button. */
192
+ public readonly ariaLabelToggleButton = input<string>('Toggle options');
193
+
194
+ /** The id of the input field. */
195
+ public readonly inputId = input<string>(`hlm-autocomplete-input-${++HlmAutocomplete._id}`);
196
+
197
+ /** Whether the autocomplete is disabled. */
198
+ public readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });
199
+ protected readonly _disabled = linkedSignal(() => this.disabled());
200
+
201
+ /** Emitted when the selected value changes. */
202
+ public readonly valueChange = output<T | null>();
203
+
204
+ /** Emitted when the search query changes. */
205
+ public readonly searchChange = output<string>();
206
+
207
+ protected _onChange?: ChangeFn<T | null>;
208
+ protected _onTouched?: TouchFn;
209
+
210
+ protected _setPopoverState(state: 'open' | 'closed') {
211
+ if (state === 'open') {
212
+ this._brnPopover().open();
213
+ } else {
214
+ this._brnPopover().close();
215
+ }
216
+ }
217
+
218
+ protected _openPopover() {
219
+ if (this._search() || this.filteredOptions().length > 0) {
220
+ // only open if there's a search term or options to show
221
+ this._brnPopover().open();
222
+ }
223
+ }
224
+
225
+ protected _toggleOptions() {
226
+ if (this._search() || this.filteredOptions().length > 0) {
227
+ // only toggle if there's a search term or options to show
228
+ const state = this._brnPopover().stateComputed();
229
+ this._setPopoverState(state === 'open' ? 'closed' : 'open');
230
+ }
231
+
232
+ this._inputRef().nativeElement.focus();
233
+ }
234
+
235
+ protected _onSearchChanged(event: Event) {
236
+ const input = event.target as HTMLInputElement;
237
+ this._search.set(input.value);
238
+ this.searchChange.emit(input.value);
239
+
240
+ this._clearOption();
241
+
242
+ if (this._brnPopover().stateComputed() !== 'open' && input.value.length > 0) {
243
+ this._setPopoverState('open');
244
+ }
245
+ }
246
+
247
+ protected _clearOption() {
248
+ this._value.set(undefined);
249
+ this._onChange?.(null);
250
+ this.valueChange.emit(null);
251
+ }
252
+
253
+ protected _optionSelected(option: T) {
254
+ this._value.set(option);
255
+ this._onChange?.(option);
256
+ this.valueChange.emit(option);
257
+
258
+ const searchValue = this.transformValueToSearch()(option);
259
+
260
+ this._search.set(searchValue);
261
+ this.searchChange.emit(searchValue);
262
+
263
+ this._setPopoverState('closed');
264
+ }
265
+
266
+ /** CONTROL VALUE ACCESSOR */
267
+ public writeValue(value: T | null): void {
268
+ this._value.set(value ? value : undefined);
269
+ }
270
+
271
+ public registerOnChange(fn: ChangeFn<T | null>): void {
272
+ this._onChange = fn;
273
+ }
274
+
275
+ public registerOnTouched(fn: TouchFn): void {
276
+ this._onTouched = fn;
277
+ }
278
+
279
+ public setDisabledState(isDisabled: boolean): void {
280
+ this._disabled.set(isDisabled);
281
+ }
282
+ }
283
+
284
+ interface HlmAutocompleteOption<T> {
285
+ $implicit: T;
286
+ }
@@ -0,0 +1,3 @@
1
+ import { Tree } from '@nx/devkit';
2
+ import type { HlmBaseGeneratorSchema } from '../../../base/schema';
3
+ export declare function generator(tree: Tree, options: HlmBaseGeneratorSchema): Promise<import("@nx/devkit").GeneratorCallback>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generator = generator;
4
+ const tslib_1 = require("tslib");
5
+ const generator_1 = tslib_1.__importDefault(require("../../../base/generator"));
6
+ async function generator(tree, options) {
7
+ return await (0, generator_1.default)(tree, {
8
+ ...options,
9
+ primitiveName: 'autocomplete',
10
+ internalName: 'ui-autocomplete-helm',
11
+ publicName: 'ui-autocomplete-helm',
12
+ });
13
+ }
14
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../libs/cli/src/generators/ui/libs/ui-autocomplete-helm/generator.ts"],"names":[],"mappings":";;AAIA,8BAOC;;AAVD,gFAAuD;AAGhD,KAAK,UAAU,SAAS,CAAC,IAAU,EAAE,OAA+B;IAC1E,OAAO,MAAM,IAAA,mBAAgB,EAAC,IAAI,EAAE;QACnC,GAAG,OAAO;QACV,aAAa,EAAE,cAAc;QAC7B,YAAY,EAAE,sBAAsB;QACpC,UAAU,EAAE,sBAAsB;KAClC,CAAC,CAAC;AACJ,CAAC"}
@@ -11,10 +11,10 @@ import { hlm } from '<%- importAlias %>/utils';
11
11
  changeDetection: ChangeDetectionStrategy.OnPush,
12
12
  })
13
13
  export class HlmCommandGroupLabel {
14
- /*** The user defined class */
14
+ /** The user defined class */
15
15
  public readonly userClass = input<string>('', { alias: 'class' });
16
16
 
17
- /*** The styles to apply */
17
+ /** The styles to apply */
18
18
  protected readonly _computedClass = computed(() =>
19
19
  hlm('text-muted-foreground px-2 py-1.5 text-xs font-medium', this.userClass()),
20
20
  );
@@ -17,10 +17,10 @@ import { hlm } from '<%- importAlias %>/utils';
17
17
  changeDetection: ChangeDetectionStrategy.OnPush,
18
18
  })
19
19
  export class HlmCommandGroup {
20
- /*** The user defined class */
20
+ /** The user defined class */
21
21
  public readonly userClass = input<string>('', { alias: 'class' });
22
22
 
23
- /*** The styles to apply */
23
+ /** The styles to apply */
24
24
  protected readonly _computedClass = computed(() =>
25
25
  hlm('text-foreground block overflow-hidden p-1 data-[hidden]:hidden', this.userClass()),
26
26
  );
@@ -1,5 +1,4 @@
1
- import { BooleanInput } from '@angular/cdk/coercion';
2
- import { booleanAttribute, ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
3
2
  import { BrnCommandItem } from '@spartan-ng/brain/command';
4
3
  import { hlm } from '<%- importAlias %>/utils';
5
4
 
@@ -21,21 +20,10 @@ import { hlm } from '<%- importAlias %>/utils';
21
20
  changeDetection: ChangeDetectionStrategy.OnPush,
22
21
  })
23
22
  export class HlmCommandItem {
24
- /** The value this item represents. */
25
- public readonly value = input<string>();
26
-
27
- /** Whether the item is disabled. */
28
- public readonly disabled = input<boolean, BooleanInput>(false, {
29
- transform: booleanAttribute,
30
- });
31
-
32
- /** Emits when the item is selected. */
33
- public readonly selected = output<void>();
34
-
35
- /*** The user defined class */
23
+ /** The user defined class */
36
24
  public readonly userClass = input<string>('', { alias: 'class' });
37
25
 
38
- /*** The styles to apply */
26
+ /** The styles to apply */
39
27
  protected readonly _computedClass = computed(() =>
40
28
  hlm(
41
29
  'data-[selected]:bg-accent data-[selected=true]:text-accent-foreground [&>ng-icon]:text-muted-foreground outline-hidden relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm data-[disabled]:pointer-events-none data-[hidden]:hidden data-[disabled]:opacity-50 [&>ng-icon]:pointer-events-none [&>ng-icon]:shrink-0 [&>ng-icon]:text-base',
@@ -13,10 +13,10 @@ import type { ClassValue } from 'clsx';
13
13
  changeDetection: ChangeDetectionStrategy.OnPush,
14
14
  })
15
15
  export class HlmCommandSearchInput {
16
- /*** The user defined class */
16
+ /** The user defined class */
17
17
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
18
18
 
19
- /*** The styles to apply */
19
+ /** The styles to apply */
20
20
  protected readonly _computedClass = computed(() =>
21
21
  hlm(
22
22
  'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none disabled:cursor-not-allowed disabled:opacity-50',
@@ -15,10 +15,10 @@ import type { ClassValue } from 'clsx';
15
15
  changeDetection: ChangeDetectionStrategy.OnPush,
16
16
  })
17
17
  export class HlmCommandSearch {
18
- /*** The user defined class */
18
+ /** The user defined class */
19
19
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
20
20
 
21
- /*** The styles to apply */
21
+ /** The styles to apply */
22
22
  protected readonly _computedClass = computed(() =>
23
23
  hlm('flex h-9 items-center gap-2 border-b px-3 [&>_ng-icon]:flex-none [&>_ng-icon]:opacity-50', this.userClass()),
24
24
  );
@@ -11,9 +11,9 @@ import { hlm } from '<%- importAlias %>/utils';
11
11
  changeDetection: ChangeDetectionStrategy.OnPush,
12
12
  })
13
13
  export class HlmCommandSeparator {
14
- /*** The user defined class */
14
+ /** The user defined class */
15
15
  public readonly userClass = input<string>('', { alias: 'class' });
16
16
 
17
- /*** The styles to apply */
17
+ /** The styles to apply */
18
18
  protected readonly _computedClass = computed(() => hlm('bg-border -mx-1 block h-px', this.userClass()));
19
19
  }
@@ -21,10 +21,10 @@ import type { ClassValue } from 'clsx';
21
21
  changeDetection: ChangeDetectionStrategy.OnPush,
22
22
  })
23
23
  export class HlmCommand {
24
- /*** The user defined class */
24
+ /** The user defined class */
25
25
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
26
26
 
27
- /*** The styles to apply */
27
+ /** The styles to apply */
28
28
  protected readonly _computedClass = computed(() =>
29
29
  hlm('bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md', this.userClass()),
30
30
  );
@@ -6,6 +6,7 @@ exports.primitiveDependencies = {
6
6
  alert: ['utils', 'icon'],
7
7
  'alert-dialog': ['utils', 'button'],
8
8
  'aspect-ratio': ['utils'],
9
+ autocomplete: ['utils', 'popover', 'command', 'icon'],
9
10
  avatar: ['utils'],
10
11
  badge: ['utils'],
11
12
  breadcrumb: ['utils', 'icon'],
@@ -1 +1 @@
1
- {"version":3,"file":"primitive-deps.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/generators/ui/primitive-deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"primitive-deps.js","sourceRoot":"","sources":["../../../../../../libs/cli/src/generators/ui/primitive-deps.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export type Primitive = 'accordion' | 'alert' | 'alert-dialog' | 'aspect-ratio' | 'avatar' | 'badge' | 'breadcrumb' | 'button' | 'calendar' | 'card' | 'carousel' | 'checkbox' | 'collapsible' | 'command' | 'context-menu' | 'date-picker' | 'dialog' | 'form-field' | 'hover-card' | 'icon' | 'input' | 'input-otp' | 'label' | 'menu' | 'menubar' | 'pagination' | 'popover' | 'progress' | 'radio-group' | 'scroll-area' | 'select' | 'separator' | 'sheet' | 'skeleton' | 'slider' | 'sonner' | 'spinner' | 'switch' | 'table' | 'tabs' | 'toggle' | 'toggle-group' | 'tooltip' | 'utils';
1
+ export type Primitive = 'accordion' | 'alert' | 'alert-dialog' | 'aspect-ratio' | 'autocomplete' | 'avatar' | 'badge' | 'breadcrumb' | 'button' | 'calendar' | 'card' | 'carousel' | 'checkbox' | 'collapsible' | 'command' | 'context-menu' | 'date-picker' | 'dialog' | 'form-field' | 'hover-card' | 'icon' | 'input' | 'input-otp' | 'label' | 'menu' | 'menubar' | 'pagination' | 'popover' | 'progress' | 'radio-group' | 'scroll-area' | 'select' | 'separator' | 'sheet' | 'skeleton' | 'slider' | 'sonner' | 'spinner' | 'switch' | 'table' | 'tabs' | 'toggle' | 'toggle-group' | 'tooltip' | 'utils';
@@ -3,7 +3,7 @@
3
3
  "internalName": "ui-accordion-helm",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=19.0.0",
6
- "@spartan-ng/brain": "0.0.1-alpha.509",
6
+ "@spartan-ng/brain": "0.0.1-alpha.511",
7
7
  "clsx": "^2.1.1",
8
8
  "@ng-icons/core": ">=29.0.0",
9
9
  "@ng-icons/lucide": ">=29.0.0"
@@ -21,7 +21,7 @@
21
21
  "internalName": "ui-alert-dialog-helm",
22
22
  "peerDependencies": {
23
23
  "@angular/core": ">=19.0.0",
24
- "@spartan-ng/brain": "0.0.1-alpha.509",
24
+ "@spartan-ng/brain": "0.0.1-alpha.511",
25
25
  "clsx": "^2.1.1"
26
26
  }
27
27
  },
@@ -33,11 +33,24 @@
33
33
  "clsx": "^2.1.1"
34
34
  }
35
35
  },
36
+ "autocomplete": {
37
+ "internalName": "ui-autocomplete-helm",
38
+ "peerDependencies": {
39
+ "@angular/core": ">=19.0.0",
40
+ "clsx": "^2.1.1",
41
+ "@spartan-ng/brain": "0.0.1-alpha.511",
42
+ "@angular/cdk": ">=19.0.0",
43
+ "@angular/common": ">=19.0.0",
44
+ "@angular/forms": ">=19.0.0",
45
+ "@ng-icons/core": ">=29.0.0",
46
+ "@ng-icons/lucide": ">=29.0.0"
47
+ }
48
+ },
36
49
  "avatar": {
37
50
  "internalName": "ui-avatar-helm",
38
51
  "peerDependencies": {
39
52
  "@angular/core": ">=19.0.0",
40
- "@spartan-ng/brain": "0.0.1-alpha.509",
53
+ "@spartan-ng/brain": "0.0.1-alpha.511",
41
54
  "clsx": "^2.1.1"
42
55
  }
43
56
  },
@@ -63,7 +76,7 @@
63
76
  "internalName": "ui-button-helm",
64
77
  "peerDependencies": {
65
78
  "@angular/core": ">=19.0.0",
66
- "@spartan-ng/brain": "0.0.1-alpha.509",
79
+ "@spartan-ng/brain": "0.0.1-alpha.511",
67
80
  "class-variance-authority": "^0.7.0",
68
81
  "clsx": "^2.1.1"
69
82
  }
@@ -75,7 +88,7 @@
75
88
  "@angular/cdk": ">=19.0.0",
76
89
  "@ng-icons/core": ">=29.0.0",
77
90
  "@ng-icons/lucide": ">=29.0.0",
78
- "@spartan-ng/brain": "0.0.1-alpha.509",
91
+ "@spartan-ng/brain": "0.0.1-alpha.511",
79
92
  "clsx": "^2.1.1"
80
93
  }
81
94
  },
@@ -105,7 +118,7 @@
105
118
  "@angular/forms": ">=19.0.0",
106
119
  "@ng-icons/core": ">=29.0.0",
107
120
  "@ng-icons/lucide": ">=29.0.0",
108
- "@spartan-ng/brain": "0.0.1-alpha.509",
121
+ "@spartan-ng/brain": "0.0.1-alpha.511",
109
122
  "clsx": "^2.1.1"
110
123
  }
111
124
  },
@@ -113,9 +126,8 @@
113
126
  "internalName": "ui-command-helm",
114
127
  "peerDependencies": {
115
128
  "@angular/core": ">=19.0.0",
116
- "@spartan-ng/brain": "0.0.1-alpha.509",
117
- "clsx": "^2.1.1",
118
- "@angular/cdk": ">=19.0.0"
129
+ "@spartan-ng/brain": "0.0.1-alpha.511",
130
+ "clsx": "^2.1.1"
119
131
  }
120
132
  },
121
133
  "date-picker": {
@@ -126,7 +138,7 @@
126
138
  "@angular/forms": ">=19.0.0",
127
139
  "@ng-icons/core": ">=29.0.0",
128
140
  "@ng-icons/lucide": ">=29.0.0",
129
- "@spartan-ng/brain": "0.0.1-alpha.509",
141
+ "@spartan-ng/brain": "0.0.1-alpha.511",
130
142
  "clsx": "^2.1.1"
131
143
  }
132
144
  },
@@ -138,7 +150,7 @@
138
150
  "@angular/common": ">=19.0.0",
139
151
  "@ng-icons/core": ">=29.0.0",
140
152
  "@ng-icons/lucide": ">=29.0.0",
141
- "@spartan-ng/brain": "0.0.1-alpha.509",
153
+ "@spartan-ng/brain": "0.0.1-alpha.511",
142
154
  "@angular/cdk": ">=19.0.0"
143
155
  }
144
156
  },
@@ -147,7 +159,7 @@
147
159
  "peerDependencies": {
148
160
  "@angular/core": ">=19.0.0",
149
161
  "@angular/forms": ">=19.0.0",
150
- "@spartan-ng/brain": "0.0.1-alpha.509",
162
+ "@spartan-ng/brain": "0.0.1-alpha.511",
151
163
  "clsx": "^2.1.1"
152
164
  }
153
165
  },
@@ -155,7 +167,7 @@
155
167
  "internalName": "ui-hover-card-helm",
156
168
  "peerDependencies": {
157
169
  "@angular/core": ">=19.0.0",
158
- "@spartan-ng/brain": "0.0.1-alpha.509",
170
+ "@spartan-ng/brain": "0.0.1-alpha.511",
159
171
  "clsx": "^2.1.1"
160
172
  }
161
173
  },
@@ -174,7 +186,7 @@
174
186
  "class-variance-authority": "^0.7.0",
175
187
  "clsx": "^2.1.1",
176
188
  "@angular/forms": ">=19.0.0",
177
- "@spartan-ng/brain": "0.0.1-alpha.509"
189
+ "@spartan-ng/brain": "0.0.1-alpha.511"
178
190
  }
179
191
  },
180
192
  "input-otp": {
@@ -185,14 +197,14 @@
185
197
  "@ng-icons/core": ">=29.0.0",
186
198
  "@ng-icons/lucide": ">=29.0.0",
187
199
  "@angular/cdk": ">=19.0.0",
188
- "@spartan-ng/brain": "0.0.1-alpha.509"
200
+ "@spartan-ng/brain": "0.0.1-alpha.511"
189
201
  }
190
202
  },
191
203
  "label": {
192
204
  "internalName": "ui-label-helm",
193
205
  "peerDependencies": {
194
206
  "@angular/core": ">=19.0.0",
195
- "@spartan-ng/brain": "0.0.1-alpha.509",
207
+ "@spartan-ng/brain": "0.0.1-alpha.511",
196
208
  "clsx": "^2.1.1"
197
209
  }
198
210
  },
@@ -200,7 +212,7 @@
200
212
  "internalName": "ui-menu-helm",
201
213
  "peerDependencies": {
202
214
  "@angular/core": ">=19.0.0",
203
- "@spartan-ng/brain": "0.0.1-alpha.509",
215
+ "@spartan-ng/brain": "0.0.1-alpha.511",
204
216
  "clsx": "^2.1.1",
205
217
  "@ng-icons/core": ">=29.0.0",
206
218
  "@ng-icons/lucide": ">=29.0.0",
@@ -214,7 +226,7 @@
214
226
  "@angular/core": ">=19.0.0",
215
227
  "@angular/cdk": ">=19.0.0",
216
228
  "@angular/forms": ">=19.0.0",
217
- "@spartan-ng/brain": "0.0.1-alpha.509",
229
+ "@spartan-ng/brain": "0.0.1-alpha.511",
218
230
  "class-variance-authority": "^0.7.0",
219
231
  "clsx": "^2.1.1",
220
232
  "@ng-icons/core": ">=29.0.0",
@@ -227,14 +239,14 @@
227
239
  "peerDependencies": {
228
240
  "@angular/core": ">=19.0.0",
229
241
  "clsx": "^2.1.1",
230
- "@spartan-ng/brain": "0.0.1-alpha.509"
242
+ "@spartan-ng/brain": "0.0.1-alpha.511"
231
243
  }
232
244
  },
233
245
  "progress": {
234
246
  "internalName": "ui-progress-helm",
235
247
  "peerDependencies": {
236
248
  "@angular/core": ">=19.0.0",
237
- "@spartan-ng/brain": "0.0.1-alpha.509",
249
+ "@spartan-ng/brain": "0.0.1-alpha.511",
238
250
  "clsx": "^2.1.1"
239
251
  }
240
252
  },
@@ -242,7 +254,7 @@
242
254
  "internalName": "ui-radio-group-helm",
243
255
  "peerDependencies": {
244
256
  "@angular/core": ">=19.0.0",
245
- "@spartan-ng/brain": "0.0.1-alpha.509",
257
+ "@spartan-ng/brain": "0.0.1-alpha.511",
246
258
  "clsx": "^2.1.1",
247
259
  "@angular/common": ">=19.0.0"
248
260
  }
@@ -259,7 +271,7 @@
259
271
  "peerDependencies": {
260
272
  "@angular/core": ">=19.0.0",
261
273
  "@angular/cdk": ">=19.0.0",
262
- "@spartan-ng/brain": "0.0.1-alpha.509",
274
+ "@spartan-ng/brain": "0.0.1-alpha.511",
263
275
  "clsx": "^2.1.1",
264
276
  "@ng-icons/core": ">=29.0.0",
265
277
  "@ng-icons/lucide": ">=29.0.0",
@@ -270,7 +282,7 @@
270
282
  "internalName": "ui-separator-helm",
271
283
  "peerDependencies": {
272
284
  "@angular/core": ">=19.0.0",
273
- "@spartan-ng/brain": "0.0.1-alpha.509",
285
+ "@spartan-ng/brain": "0.0.1-alpha.511",
274
286
  "clsx": "^2.1.1"
275
287
  }
276
288
  },
@@ -281,7 +293,7 @@
281
293
  "clsx": "^2.1.1",
282
294
  "@ng-icons/core": ">=29.0.0",
283
295
  "@ng-icons/lucide": ">=29.0.0",
284
- "@spartan-ng/brain": "0.0.1-alpha.509",
296
+ "@spartan-ng/brain": "0.0.1-alpha.511",
285
297
  "class-variance-authority": "^0.7.0"
286
298
  }
287
299
  },
@@ -296,7 +308,7 @@
296
308
  "internalName": "ui-slider-helm",
297
309
  "peerDependencies": {
298
310
  "@angular/core": ">=19.0.0",
299
- "@spartan-ng/brain": "0.0.1-alpha.509",
311
+ "@spartan-ng/brain": "0.0.1-alpha.511",
300
312
  "clsx": "^2.1.1"
301
313
  }
302
314
  },
@@ -322,7 +334,7 @@
322
334
  "clsx": "^2.1.1",
323
335
  "@angular/cdk": ">=19.0.0",
324
336
  "@angular/forms": ">=19.0.0",
325
- "@spartan-ng/brain": "0.0.1-alpha.509"
337
+ "@spartan-ng/brain": "0.0.1-alpha.511"
326
338
  }
327
339
  },
328
340
  "table": {
@@ -336,7 +348,7 @@
336
348
  "internalName": "ui-tabs-helm",
337
349
  "peerDependencies": {
338
350
  "@angular/core": ">=19.0.0",
339
- "@spartan-ng/brain": "0.0.1-alpha.509",
351
+ "@spartan-ng/brain": "0.0.1-alpha.511",
340
352
  "clsx": "^2.1.1",
341
353
  "class-variance-authority": "^0.7.0",
342
354
  "@angular/cdk": ">=19.0.0",
@@ -365,7 +377,7 @@
365
377
  "internalName": "ui-tooltip-helm",
366
378
  "peerDependencies": {
367
379
  "@angular/core": ">=19.0.0",
368
- "@spartan-ng/brain": "0.0.1-alpha.509"
380
+ "@spartan-ng/brain": "0.0.1-alpha.511"
369
381
  }
370
382
  },
371
383
  "typography": {