@spartan-ng/cli 0.0.1-alpha.533 → 0.0.1-alpha.534

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 (54) hide show
  1. package/package.json +1 -1
  2. package/src/generators/base/generator.js +1 -1
  3. package/src/generators/base/generator.js.map +1 -1
  4. package/src/generators/base/lib/build-dependency-array.d.ts +3 -3
  5. package/src/generators/base/lib/build-dependency-array.js +4 -3
  6. package/src/generators/base/lib/build-dependency-array.js.map +1 -1
  7. package/src/generators/base/versions.d.ts +4 -5
  8. package/src/generators/base/versions.js +5 -6
  9. package/src/generators/base/versions.js.map +1 -1
  10. package/src/generators/theme/__snapshots__/generator.spec.ts.snap +142 -376
  11. package/src/generators/theme/generator.js +1 -1
  12. package/src/generators/theme/generator.js.map +1 -1
  13. package/src/generators/theme/libs/add-theme-to-application-styles.d.ts +1 -1
  14. package/src/generators/theme/libs/add-theme-to-application-styles.js +19 -14
  15. package/src/generators/theme/libs/add-theme-to-application-styles.js.map +1 -1
  16. package/src/generators/theme/libs/colors.d.ts +5 -10
  17. package/src/generators/theme/libs/colors.js +322 -195
  18. package/src/generators/theme/libs/colors.js.map +1 -1
  19. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-item.ts.template +1 -1
  20. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete-search-input.ts.template +1 -1
  21. package/src/generators/ui/libs/ui-autocomplete-helm/files/lib/hlm-autocomplete.ts.template +14 -27
  22. package/src/generators/ui/libs/ui-button-helm/files/lib/hlm-button.ts.template +2 -2
  23. package/src/generators/ui/libs/ui-calendar-helm/files/lib/hlm-calendar-multi.ts.template +4 -35
  24. package/src/generators/ui/libs/ui-calendar-helm/files/lib/hlm-calendar-range.ts.template +4 -35
  25. package/src/generators/ui/libs/ui-calendar-helm/files/lib/hlm-calendar.ts.template +4 -38
  26. package/src/generators/ui/libs/ui-checkbox-helm/files/lib/hlm-checkbox.ts.template +1 -1
  27. package/src/generators/ui/libs/ui-date-picker-helm/files/lib/hlm-date-picker-multi.ts.template +2 -2
  28. package/src/generators/ui/libs/ui-date-picker-helm/files/lib/hlm-date-picker.ts.template +2 -2
  29. package/src/generators/ui/libs/ui-date-picker-helm/files/lib/hlm-date-range-picker.ts.template +2 -2
  30. package/src/generators/ui/libs/ui-input-group-helm/files/lib/hlm-input-group-addon.ts.template +3 -3
  31. package/src/generators/ui/libs/ui-input-group-helm/files/lib/hlm-input-group-text.ts.template +1 -1
  32. package/src/generators/ui/libs/ui-input-group-helm/files/lib/hlm-input-group.ts.template +1 -1
  33. package/src/generators/ui/libs/ui-input-helm/files/lib/hlm-input.ts.template +1 -1
  34. package/src/generators/ui/libs/ui-input-otp-helm/files/lib/hlm-input-otp-slot.ts.template +1 -1
  35. package/src/generators/ui/libs/ui-input-otp-helm/files/lib/hlm-input-otp.ts.template +1 -1
  36. package/src/generators/ui/libs/ui-kbd-helm/files/lib/hlm-kbd.ts.template +1 -1
  37. package/src/generators/ui/libs/ui-menu-helm/files/lib/hlm-menu-bar.ts.template +1 -1
  38. package/src/generators/ui/libs/ui-menu-helm/files/lib/hlm-menu-item.ts.template +1 -1
  39. package/src/generators/ui/libs/ui-pagination-helm/files/lib/hlm-numbered-pagination-query-params.ts.template +1 -1
  40. package/src/generators/ui/libs/ui-pagination-helm/files/lib/hlm-numbered-pagination.ts.template +1 -1
  41. package/src/generators/ui/libs/ui-separator-helm/files/lib/hlm-separator.ts.template +1 -1
  42. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-group-action.ts.template +1 -1
  43. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-group-label.ts.template +1 -1
  44. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-menu-action.ts.template +1 -1
  45. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-menu-badge.ts.template +1 -1
  46. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-menu-button.ts.template +1 -1
  47. package/src/generators/ui/libs/ui-sidebar-helm/files/lib/hlm-sidebar-rail.ts.template +1 -1
  48. package/src/generators/ui/libs/ui-switch-helm/files/lib/hlm-switch.ts.template +1 -1
  49. package/src/generators/ui/libs/ui-textarea-helm/files/lib/hlm-textarea.ts.template +1 -1
  50. package/src/generators/ui/libs/ui-toggle-group-helm/files/lib/hlm-toggle-group.ts.template +1 -1
  51. package/src/generators/ui/supported-ui-libraries.json +31 -31
  52. package/src/utils/get-tailwind-version.d.ts +2 -0
  53. package/src/utils/get-tailwind-version.js +18 -0
  54. package/src/utils/get-tailwind-version.js.map +1 -0
@@ -26,7 +26,7 @@ export class HlmAutocompleteItem {
26
26
  /** The styles to apply */
27
27
  protected readonly _computedClass = computed(() =>
28
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-start 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',
29
+ 'data-[selected]:bg-accent data-[selected=true]:text-accent-foreground [&>ng-icon]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-start text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[hidden]:hidden [&>ng-icon]:pointer-events-none [&>ng-icon]:shrink-0 [&>ng-icon]:text-base',
30
30
  this.userClass(),
31
31
  ),
32
32
  );
@@ -6,7 +6,7 @@ import type { ClassValue } from 'clsx';
6
6
  @Component({
7
7
  selector: 'input[hlm-autocomplete-search-input]',
8
8
  template: '',
9
- hostDirectives: [{ directive: BrnAutocompleteSearchInput, inputs: ['value'] }],
9
+ hostDirectives: [{ directive: BrnAutocompleteSearchInput, inputs: ['value'], outputs: ['valueChange'] }],
10
10
  host: {
11
11
  '[class]': '_computedClass()',
12
12
  },
@@ -88,8 +88,7 @@ export const HLM_AUTOCOMPLETE_VALUE_ACCESSOR = {
88
88
  [placeholder]="searchPlaceholderText()"
89
89
  [disabled]="_disabled()"
90
90
  [value]="_search()"
91
- (input)="_onSearchChanged($event)"
92
- (keydown.arrowDown)="_openPopover()"
91
+ (valueChange)="_onSearchChanged($event)"
93
92
  />
94
93
 
95
94
  <button
@@ -152,7 +151,8 @@ export class HlmAutocomplete<T> implements ControlValueAccessor {
152
151
  private static _id = 0;
153
152
  private readonly _config = injectHlmAutocompleteConfig<T>();
154
153
 
155
- private readonly _brnPopover = viewChild.required(BrnPopover);
154
+ private readonly _brnAutocomplete = viewChild.required(BrnAutocomplete);
155
+
156
156
  private readonly _inputRef = viewChild.required('input', { read: ElementRef });
157
157
 
158
158
  protected readonly _elementRef = inject(ElementRef<HTMLElement>);
@@ -232,40 +232,23 @@ export class HlmAutocomplete<T> implements ControlValueAccessor {
232
232
  protected _onChange?: ChangeFn<T | null>;
233
233
  protected _onTouched?: TouchFn;
234
234
 
235
- protected _setPopoverState(state: 'open' | 'closed') {
236
- if (state === 'open') {
237
- this._brnPopover().open();
238
- } else {
239
- this._brnPopover().close();
240
- }
241
- }
242
-
243
- protected _openPopover() {
244
- if (this._search() || this.filteredOptions().length > 0) {
245
- // only open if there's a search term or options to show
246
- this._brnPopover().open();
247
- }
248
- }
249
-
250
235
  protected _toggleOptions() {
251
236
  if (this._search() || this.filteredOptions().length > 0) {
252
237
  // only toggle if there's a search term or options to show
253
- const state = this._brnPopover().stateComputed();
254
- this._setPopoverState(state === 'open' ? 'closed' : 'open');
238
+ this._brnAutocomplete().toggle();
255
239
  }
256
240
 
257
241
  this._inputRef().nativeElement.focus();
258
242
  }
259
243
 
260
- protected _onSearchChanged(event: Event) {
261
- const input = event.target as HTMLInputElement;
262
- this._search.set(input.value);
263
- this.searchChange.emit(input.value);
244
+ protected _onSearchChanged(value: string) {
245
+ this._search.set(value);
246
+ this.searchChange.emit(value);
264
247
 
265
248
  this._clearOption();
266
249
 
267
- if (this._brnPopover().stateComputed() !== 'open' && input.value.length > 0) {
268
- this._setPopoverState('open');
250
+ if (!this._brnAutocomplete().isExpanded() && value.length > 0) {
251
+ this._brnAutocomplete().open();
269
252
  }
270
253
  }
271
254
 
@@ -285,12 +268,16 @@ export class HlmAutocomplete<T> implements ControlValueAccessor {
285
268
  this._search.set(searchValue);
286
269
  this.searchChange.emit(searchValue);
287
270
 
288
- this._setPopoverState('closed');
271
+ this._brnAutocomplete().close();
289
272
  }
290
273
 
291
274
  /** CONTROL VALUE ACCESSOR */
292
275
  public writeValue(value: T | null): void {
293
276
  this._value.set(value ? value : undefined);
277
+
278
+ const searchValue = value ? this.transformValueToSearch()(value) : '';
279
+ this._search.set(searchValue);
280
+ this.searchChange.emit(searchValue);
294
281
  }
295
282
 
296
283
  public registerOnChange(fn: ChangeFn<T | null>): void {
@@ -6,7 +6,7 @@ import type { ClassValue } from 'clsx';
6
6
  import { injectBrnButtonConfig } from './hlm-button.token';
7
7
 
8
8
  export const buttonVariants = cva(
9
- "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hallo inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-all focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_ng-icon:not([class*='size-'])]:size-4 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0",
9
+ "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive hallo inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0 [&_ng-icon:not([class*='size-'])]:size-4",
10
10
  {
11
11
  variants: {
12
12
  variant: {
@@ -14,7 +14,7 @@ export const buttonVariants = cva(
14
14
  destructive:
15
15
  'bg-destructive hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white',
16
16
  outline:
17
- 'bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border',
17
+ 'bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs',
18
18
  secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
19
19
  ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
20
20
  link: 'text-primary underline-offset-4 hover:underline',
@@ -12,21 +12,7 @@ import {
12
12
  } from '@angular/core';
13
13
  import { NgIcon, provideIcons } from '@ng-icons/core';
14
14
  import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
15
- import {
16
- BrnCalendarCell,
17
- BrnCalendarCellButton,
18
- BrnCalendarGrid,
19
- BrnCalendarHeader,
20
- BrnCalendarMonthSelect,
21
- BrnCalendarMulti,
22
- BrnCalendarNextButton,
23
- BrnCalendarPreviousButton,
24
- BrnCalendarWeek,
25
- BrnCalendarWeekday,
26
- BrnCalendarYearSelect,
27
- injectBrnCalendarI18n,
28
- type Weekday,
29
- } from '@spartan-ng/brain/calendar';
15
+ import { BrnCalendarImports, BrnCalendarMulti, injectBrnCalendarI18n, type Weekday } from '@spartan-ng/brain/calendar';
30
16
  import { injectDateAdapter } from '@spartan-ng/brain/date-time';
31
17
  import { BrnSelectImports } from '@spartan-ng/brain/select';
32
18
  import { buttonVariants } from '<%- importAlias %>/button';
@@ -37,24 +23,7 @@ import type { ClassValue } from 'clsx';
37
23
 
38
24
  @Component({
39
25
  selector: 'hlm-calendar-multi',
40
- imports: [
41
- BrnCalendarMulti,
42
- BrnCalendarHeader,
43
- BrnCalendarNextButton,
44
- BrnCalendarPreviousButton,
45
- BrnCalendarWeekday,
46
- BrnCalendarWeek,
47
- BrnCalendarCellButton,
48
- BrnCalendarCell,
49
- BrnCalendarGrid,
50
- NgIcon,
51
- HlmIcon,
52
- BrnCalendarMonthSelect,
53
- NgTemplateOutlet,
54
- BrnSelectImports,
55
- HlmSelectImports,
56
- BrnCalendarYearSelect,
57
- ],
26
+ imports: [BrnCalendarImports, NgIcon, HlmIcon, NgTemplateOutlet, BrnSelectImports, HlmSelectImports],
58
27
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
59
28
  template: `
60
29
  <div
@@ -122,14 +91,14 @@ import type { ClassValue } from 'clsx';
122
91
  <div class="flex items-center space-x-1">
123
92
  <button
124
93
  brnCalendarPreviousButton
125
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
94
+ class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center rounded-md border bg-transparent p-0 text-sm font-medium whitespace-nowrap opacity-50 transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
126
95
  >
127
96
  <ng-icon hlm name="lucideChevronLeft" size="sm" />
128
97
  </button>
129
98
 
130
99
  <button
131
100
  brnCalendarNextButton
132
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
101
+ class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center rounded-md border bg-transparent p-0 text-sm font-medium whitespace-nowrap opacity-50 transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
133
102
  >
134
103
  <ng-icon hlm name="lucideChevronRight" size="sm" />
135
104
  </button>
@@ -12,21 +12,7 @@ import {
12
12
  } from '@angular/core';
13
13
  import { NgIcon, provideIcons } from '@ng-icons/core';
14
14
  import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
15
- import {
16
- BrnCalendarCell,
17
- BrnCalendarCellButton,
18
- BrnCalendarGrid,
19
- BrnCalendarHeader,
20
- BrnCalendarMonthSelect,
21
- BrnCalendarNextButton,
22
- BrnCalendarPreviousButton,
23
- BrnCalendarRange,
24
- BrnCalendarWeek,
25
- BrnCalendarWeekday,
26
- BrnCalendarYearSelect,
27
- injectBrnCalendarI18n,
28
- type Weekday,
29
- } from '@spartan-ng/brain/calendar';
15
+ import { BrnCalendarImports, BrnCalendarRange, injectBrnCalendarI18n, type Weekday } from '@spartan-ng/brain/calendar';
30
16
  import { injectDateAdapter } from '@spartan-ng/brain/date-time';
31
17
  import { BrnSelectImports } from '@spartan-ng/brain/select';
32
18
  import { buttonVariants } from '<%- importAlias %>/button';
@@ -37,24 +23,7 @@ import type { ClassValue } from 'clsx';
37
23
 
38
24
  @Component({
39
25
  selector: 'hlm-calendar-range',
40
- imports: [
41
- BrnCalendarHeader,
42
- BrnCalendarNextButton,
43
- BrnCalendarPreviousButton,
44
- BrnCalendarWeekday,
45
- BrnCalendarWeek,
46
- BrnCalendarCellButton,
47
- BrnCalendarCell,
48
- BrnCalendarGrid,
49
- NgIcon,
50
- HlmIcon,
51
- BrnCalendarRange,
52
- BrnCalendarMonthSelect,
53
- HlmSelectImports,
54
- BrnSelectImports,
55
- BrnCalendarYearSelect,
56
- NgTemplateOutlet,
57
- ],
26
+ imports: [BrnCalendarImports, NgIcon, HlmIcon, HlmSelectImports, BrnSelectImports, NgTemplateOutlet],
58
27
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
59
28
  template: `
60
29
  <div
@@ -121,14 +90,14 @@ import type { ClassValue } from 'clsx';
121
90
  <div class="flex items-center space-x-1">
122
91
  <button
123
92
  brnCalendarPreviousButton
124
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
93
+ class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute left-1 inline-flex h-7 w-7 items-center justify-center rounded-md border bg-transparent p-0 text-sm font-medium whitespace-nowrap opacity-50 transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
125
94
  >
126
95
  <ng-icon hlm name="lucideChevronLeft" size="sm" />
127
96
  </button>
128
97
 
129
98
  <button
130
99
  brnCalendarNextButton
131
- class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center whitespace-nowrap rounded-md border bg-transparent p-0 text-sm font-medium opacity-50 transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
100
+ class="ring-offset-background focus-visible:ring-ring border-input hover:bg-accent hover:text-accent-foreground absolute right-1 inline-flex h-7 w-7 items-center justify-center rounded-md border bg-transparent p-0 text-sm font-medium whitespace-nowrap opacity-50 transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
132
101
  >
133
102
  <ng-icon hlm name="lucideChevronRight" size="sm" />
134
103
  </button>
@@ -12,21 +12,7 @@ import {
12
12
  } from '@angular/core';
13
13
  import { NgIcon, provideIcons } from '@ng-icons/core';
14
14
  import { lucideChevronLeft, lucideChevronRight } from '@ng-icons/lucide';
15
- import {
16
- BrnCalendar,
17
- BrnCalendarCell,
18
- BrnCalendarCellButton,
19
- BrnCalendarGrid,
20
- BrnCalendarHeader,
21
- BrnCalendarMonthSelect,
22
- BrnCalendarNextButton,
23
- BrnCalendarPreviousButton,
24
- BrnCalendarWeek,
25
- BrnCalendarWeekday,
26
- BrnCalendarYearSelect,
27
- injectBrnCalendarI18n,
28
- type Weekday,
29
- } from '@spartan-ng/brain/calendar';
15
+ import { BrnCalendar, BrnCalendarImports, injectBrnCalendarI18n, type Weekday } from '@spartan-ng/brain/calendar';
30
16
  import { injectDateAdapter } from '@spartan-ng/brain/date-time';
31
17
  import { BrnSelectImports } from '@spartan-ng/brain/select';
32
18
  import { buttonVariants } from '<%- importAlias %>/button';
@@ -37,27 +23,7 @@ import type { ClassValue } from 'clsx';
37
23
 
38
24
  @Component({
39
25
  selector: 'hlm-calendar',
40
- imports: [
41
- BrnCalendar,
42
- BrnCalendarHeader,
43
- BrnCalendarNextButton,
44
- BrnCalendarPreviousButton,
45
- BrnCalendarWeekday,
46
- BrnCalendarWeek,
47
- BrnCalendarCellButton,
48
- BrnCalendarCell,
49
- BrnCalendarGrid,
50
- NgIcon,
51
- HlmIcon,
52
- BrnSelectImports,
53
- HlmSelectImports,
54
- BrnCalendarPreviousButton,
55
- BrnCalendarMonthSelect,
56
- BrnCalendarMonthSelect,
57
- BrnCalendarMonthSelect,
58
- BrnCalendarYearSelect,
59
- NgTemplateOutlet,
60
- ],
26
+ imports: [BrnCalendarImports, NgIcon, HlmIcon, BrnSelectImports, HlmSelectImports, NgTemplateOutlet],
61
27
  viewProviders: [provideIcons({ lucideChevronLeft, lucideChevronRight })],
62
28
  template: `
63
29
  <div
@@ -123,14 +89,14 @@ import type { ClassValue } from 'clsx';
123
89
  <div class="flex items-center space-x-1">
124
90
  <button
125
91
  brnCalendarPreviousButton
126
- class="focus-visible:ring-ring hover:bg-accent hover:text-accent-foreground text-popover-foreground absolute left-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
92
+ class="focus-visible:ring-ring hover:bg-accent hover:text-accent-foreground text-popover-foreground absolute left-1 inline-flex size-8 items-center justify-center rounded-md bg-transparent p-0 text-sm font-medium whitespace-nowrap transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
127
93
  >
128
94
  <ng-icon hlm name="lucideChevronLeft" size="sm" />
129
95
  </button>
130
96
 
131
97
  <button
132
98
  brnCalendarNextButton
133
- class="focus-visible:ring-ring hover:bg-accent hover:text-accent-foreground text-popover-foreground absolute right-1 inline-flex size-8 items-center justify-center whitespace-nowrap rounded-md bg-transparent p-0 text-sm font-medium transition-colors hover:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50"
99
+ class="focus-visible:ring-ring hover:bg-accent hover:text-accent-foreground text-popover-foreground absolute right-1 inline-flex size-8 items-center justify-center rounded-md bg-transparent p-0 text-sm font-medium whitespace-nowrap transition-colors hover:opacity-100 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50"
134
100
  >
135
101
  <ng-icon hlm name="lucideChevronRight" size="sm" />
136
102
  </button>
@@ -66,7 +66,7 @@ export class HlmCheckbox implements ControlValueAccessor {
66
66
 
67
67
  protected readonly _computedClass = computed(() =>
68
68
  hlm(
69
- 'border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shadow-xs peer size-4 shrink-0 cursor-default rounded-[4px] border outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
69
+ 'border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive peer size-4 shrink-0 cursor-default rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
70
70
  this.userClass(),
71
71
  this._state().disabled() ? 'cursor-not-allowed opacity-50' : '',
72
72
  ),
@@ -82,8 +82,8 @@ export class HlmDatePickerMulti<T> implements ControlValueAccessor {
82
82
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
83
83
  protected readonly _computedClass = computed(() =>
84
84
  hlm(
85
- 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 whitespace-nowrap rounded-md border px-3 py-2 text-left text-sm font-normal transition-all disabled:pointer-events-none disabled:opacity-50',
86
- 'focus-visible:ring-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
85
+ 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm font-normal whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50',
86
+ 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
87
87
  'disabled:pointer-events-none disabled:opacity-50',
88
88
  '[&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0',
89
89
  this.userClass(),
@@ -79,8 +79,8 @@ export class HlmDatePicker<T> implements ControlValueAccessor {
79
79
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
80
80
  protected readonly _computedClass = computed(() =>
81
81
  hlm(
82
- 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 whitespace-nowrap rounded-md border px-3 py-2 text-left text-sm font-normal transition-all disabled:pointer-events-none disabled:opacity-50',
83
- 'focus-visible:ring-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
82
+ 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm font-normal whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50',
83
+ 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
84
84
  'disabled:pointer-events-none disabled:opacity-50',
85
85
  '[&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0',
86
86
  this.userClass(),
@@ -87,8 +87,8 @@ export class HlmDateRangePicker<T> implements ControlValueAccessor {
87
87
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
88
88
  protected readonly _computedClass = computed(() =>
89
89
  hlm(
90
- 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 whitespace-nowrap rounded-md border px-3 py-2 text-left text-sm font-normal transition-all disabled:pointer-events-none disabled:opacity-50',
91
- 'focus-visible:ring-ring focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
90
+ 'ring-offset-background border-input bg-background hover:bg-accent dark:bg-input/30 dark:hover:bg-input/50 hover:text-accent-foreground inline-flex h-9 w-[280px] cursor-default items-center justify-between gap-2 rounded-md border px-3 py-2 text-left text-sm font-normal whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50',
91
+ 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none',
92
92
  'disabled:pointer-events-none disabled:opacity-50',
93
93
  '[&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0',
94
94
  this.userClass(),
@@ -4,15 +4,15 @@ import { cva, type VariantProps } from 'class-variance-authority';
4
4
  import type { ClassValue } from 'clsx';
5
5
 
6
6
  const inputGroupAddonVariants = cva(
7
- "text-muted-foreground flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>ng-icon:not([class*='size-'])]:size-4",
7
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>ng-icon:not([class*='size-'])]:size-4",
8
8
  {
9
9
  variants: {
10
10
  align: {
11
11
  'inline-start': 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',
12
12
  'inline-end': 'order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]',
13
13
  'block-start':
14
- '[.border-b]:pb-3 order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5',
15
- 'block-end': '[.border-t]:pt-3 order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5',
14
+ 'order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3',
15
+ 'block-end': 'order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3',
16
16
  },
17
17
  },
18
18
  defaultVariants: {
@@ -13,7 +13,7 @@ export class HlmInputGroupText {
13
13
 
14
14
  protected readonly _computedClass = computed(() =>
15
15
  hlm(
16
- `text-muted-foreground flex items-center gap-2 text-sm [&_ng-icon:not([class*='size-'])]:size-4 [&_ng-icon]:pointer-events-none`,
16
+ `text-muted-foreground flex items-center gap-2 text-sm [&_ng-icon]:pointer-events-none [&_ng-icon:not([class*='size-'])]:size-4`,
17
17
  this.userClass(),
18
18
  ),
19
19
  );
@@ -15,7 +15,7 @@ export class HlmInputGroup {
15
15
 
16
16
  protected readonly _computedClass = computed(() =>
17
17
  hlm(
18
- 'group/input-group border-input dark:bg-input/30 shadow-xs relative flex w-full items-center rounded-md border outline-none transition-[color,box-shadow]',
18
+ 'group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none',
19
19
  'h-9 min-w-0 has-[>textarea]:h-auto',
20
20
  // Variants based on alignment.
21
21
  'has-[>[data-align=inline-start]]:[&>input]:pl-2',
@@ -19,7 +19,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
19
19
  import type { ClassValue } from 'clsx';
20
20
 
21
21
  export const inputVariants = cva(
22
- 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input shadow-xs focus-visible:border-ring focus-visible:ring-ring/50 flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base outline-none transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-[3px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
22
+ 'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-[3px] disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
23
23
  {
24
24
  variants: {
25
25
  error: {
@@ -26,7 +26,7 @@ export class HlmInputOtpSlot {
26
26
 
27
27
  protected readonly _computedClass = computed(() =>
28
28
  hlm(
29
- 'dark:bg-input/30 border-input shadow-xs relative flex h-9 w-9 items-center justify-center border-y border-r text-sm outline-none transition-all first:rounded-l-md first:border-l last:rounded-r-md',
29
+ 'dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-r text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md',
30
30
  'has-[brn-input-otp-slot[data-active="true"]]:border-ring has-[brn-input-otp-slot[data-active="true"]]:ring-ring/50 has-[brn-input-otp-slot[data-active="true"]]:z-10 has-[brn-input-otp-slot[data-active="true"]]:ring-[3px]',
31
31
  this.userClass(),
32
32
  ),
@@ -12,6 +12,6 @@ export class HlmInputOtp {
12
12
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
13
13
 
14
14
  protected readonly _computedClass = computed(() =>
15
- hlm('has-disabled:opacity-50 flex items-center gap-2', this.userClass()),
15
+ hlm('flex items-center gap-2 has-disabled:opacity-50', this.userClass()),
16
16
  );
17
17
  }
@@ -13,7 +13,7 @@ export class HlmKbd {
13
13
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
14
14
  protected readonly _computedClass = computed(() =>
15
15
  hlm(
16
- 'bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 select-none items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium',
16
+ 'bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none',
17
17
  "[&_ng-icon:not([class*='size-'])]:size-3",
18
18
  '[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10',
19
19
  this.userClass(),
@@ -15,6 +15,6 @@ import type { ClassValue } from 'clsx';
15
15
  export class HlmMenuBar {
16
16
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
17
17
  protected readonly _computedClass = computed(() =>
18
- hlm('bg-background shadow-xs flex h-9 items-center gap-1 rounded-md border p-1', this.userClass()),
18
+ hlm('bg-background flex h-9 items-center gap-1 rounded-md border p-1 shadow-xs', this.userClass()),
19
19
  );
20
20
  }
@@ -29,7 +29,7 @@ export class HlmMenuItem {
29
29
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
30
30
  protected readonly _computedClass = computed(() =>
31
31
  hlm(
32
- `hover:bg-accent focus-visible:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[ng-icon]:!text-destructive [&_ng-icon]:text-muted-foreground relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled]:pointer-events-none data-[inset]:pl-8 data-[disabled]:opacity-50 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0`,
32
+ `hover:bg-accent focus-visible:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[ng-icon]:!text-destructive [&_ng-icon]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_ng-icon]:pointer-events-none [&_ng-icon]:shrink-0`,
33
33
  this.userClass(),
34
34
  ),
35
35
  );
@@ -25,7 +25,7 @@ import { HlmPaginationPrevious } from './hlm-pagination-previous';
25
25
  selector: 'hlm-numbered-pagination-query-params',
26
26
  template: `
27
27
  <div class="flex items-center justify-between gap-2 px-4 py-2">
28
- <div class="flex items-center gap-1 text-nowrap text-sm text-gray-600">
28
+ <div class="flex items-center gap-1 text-sm text-nowrap text-gray-600">
29
29
  <b>{{ totalItems() }}</b>
30
30
  total items |
31
31
  <b>{{ _pages().length }}</b>
@@ -24,7 +24,7 @@ import { HlmPaginationPrevious } from './hlm-pagination-previous';
24
24
  selector: 'hlm-numbered-pagination',
25
25
  template: `
26
26
  <div class="flex items-center justify-between gap-2 px-4 py-2">
27
- <div class="flex items-center gap-1 text-nowrap text-sm text-gray-600">
27
+ <div class="flex items-center gap-1 text-sm text-nowrap text-gray-600">
28
28
  <b>{{ totalItems() }}</b>
29
29
  total items |
30
30
  <b>{{ _pages().length }}</b>
@@ -14,7 +14,7 @@ export class HlmSeparator {
14
14
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
15
15
  protected readonly _computedClass = computed(() =>
16
16
  hlm(
17
- 'bg-border inline-flex shrink-0 data-[orientation=horizontal]:h-px data-[orientation=vertical]:h-full data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px',
17
+ 'bg-border inline-flex shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',
18
18
  this.userClass(),
19
19
  ),
20
20
  );
@@ -15,7 +15,7 @@ export class HlmSidebarGroupAction {
15
15
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
16
16
  protected readonly _computedClass = computed(() =>
17
17
  hlm(
18
- 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-none transition-transform hover:cursor-pointer focus-visible:ring-2 disabled:hover:cursor-default [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
18
+ 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 transition-transform outline-none hover:cursor-pointer focus-visible:ring-2 disabled:hover:cursor-default [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
19
19
  // Increases the hit area of the button on mobile.
20
20
  'after:absolute after:-inset-2 after:md:hidden',
21
21
  'group-data-[collapsible=icon]:hidden',
@@ -15,7 +15,7 @@ export class HlmSidebarGroupLabel {
15
15
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
16
16
  protected readonly _computedClass = computed(() =>
17
17
  hlm(
18
- 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium outline-none transition-[margin,opa] duration-200 ease-linear focus-visible:ring-2 [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
18
+ 'text-sidebar-foreground/70 ring-sidebar-ring flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium transition-[margin,opa] duration-200 ease-linear outline-none focus-visible:ring-2 [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
19
19
  'group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0',
20
20
  this.userClass(),
21
21
  ),
@@ -16,7 +16,7 @@ export class HlmSidebarMenuAction {
16
16
  public readonly showOnHover = input<boolean, boolean>(false, { transform: booleanAttribute });
17
17
  protected readonly _computedClass = computed(() =>
18
18
  hlm(
19
- 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-none transition-transform hover:cursor-pointer focus-visible:ring-2 disabled:hover:cursor-default [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
19
+ 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 transition-transform outline-none hover:cursor-pointer focus-visible:ring-2 disabled:hover:cursor-default [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0',
20
20
  // Increases the hit area of the button on mobile.
21
21
  'after:absolute after:-inset-2 after:md:hidden',
22
22
  'peer-data-[size=sm]/menu-button:top-1',
@@ -15,7 +15,7 @@ export class HlmSidebarMenuBadge {
15
15
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
16
16
  protected readonly _computedClass = computed(() =>
17
17
  hlm(
18
- 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums',
18
+ 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',
19
19
  'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',
20
20
  'peer-data-[size=sm]/menu-button:top-1',
21
21
  'peer-data-[size=default]/menu-button:top-1.5',
@@ -9,7 +9,7 @@ import { HlmSidebarService } from './hlm-sidebar.service';
9
9
  import type { ClassValue } from 'clsx';
10
10
 
11
11
  const sidebarMenuButtonVariants = cva(
12
- 'peer/menu-button ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground flex w-full items-center justify-start gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none transition-[width,height,padding] hover:cursor-pointer focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 disabled:hover:cursor-default group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:font-medium group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0 [&>span:last-child]:truncate group-data-[collapsible=icon]:[&>span]:hidden',
12
+ 'peer/menu-button ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground flex w-full items-center justify-start gap-2 overflow-hidden rounded-md p-2 text-left text-sm transition-[width,height,padding] outline-none group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 hover:cursor-pointer focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50 disabled:hover:cursor-default aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:font-medium [&>_ng-icon]:size-4 [&>_ng-icon]:shrink-0 group-data-[collapsible=icon]:[&>span]:hidden [&>span:last-child]:truncate',
13
13
  {
14
14
  variants: {
15
15
  variant: {
@@ -23,7 +23,7 @@ export class HlmSidebarRail {
23
23
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
24
24
  protected readonly _computedClass = computed(() =>
25
25
  hlm(
26
- 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex',
26
+ 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',
27
27
  'group-data-[side=left]:cursor-w-resize group-data-[side=right]:cursor-e-resize',
28
28
  '[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',
29
29
  'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',
@@ -55,7 +55,7 @@ export class HlmSwitch implements ControlValueAccessor {
55
55
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
56
56
  protected readonly _computedClass = computed(() =>
57
57
  hlm(
58
- 'data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 shadow-xs group inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent outline-none transition-all focus-visible:ring-[3px] data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50',
58
+ 'data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 group inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] data-[disabled=true]:cursor-not-allowed data-[disabled=true]:opacity-50',
59
59
  this.userClass(),
60
60
  ),
61
61
  );
@@ -19,7 +19,7 @@ import { cva, type VariantProps } from 'class-variance-authority';
19
19
  import type { ClassValue } from 'clsx';
20
20
 
21
21
  export const textareaVariants = cva(
22
- 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 shadow-xs flex min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base outline-none transition-[color,box-shadow] [field-sizing:content] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
22
+ 'border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 flex [field-sizing:content] min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
23
23
  {
24
24
  variants: {
25
25
  error: {
@@ -21,7 +21,7 @@ export class HlmToggleGroup {
21
21
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
22
22
  protected readonly _computedClass = computed(() =>
23
23
  hlm(
24
- 'group/toggle-group data-[variant=outline]:shadow-xs flex w-fit items-center rounded-md focus:[&>[hlm][brnToggle]]:z-10',
24
+ 'group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs focus:[&>[hlm][brnToggle]]:z-10',
25
25
  this.userClass(),
26
26
  ),
27
27
  );