@spartan-ng/cli 0.0.1-alpha.720 → 1.0.0

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 (69) hide show
  1. package/README.md +3 -3
  2. package/package.json +3 -2
  3. package/src/generators/base/generator.js +1 -2
  4. package/src/generators/base/generator.js.map +1 -1
  5. package/src/generators/base/lib/initialize-angular-library.d.ts +1 -1
  6. package/src/generators/base/lib/initialize-angular-library.js.map +1 -1
  7. package/src/generators/base/lib/styles/transform-style-map.d.ts +2 -0
  8. package/src/generators/base/lib/styles/transform-style-map.js +5 -4
  9. package/src/generators/base/lib/styles/transform-style-map.js.map +1 -1
  10. package/src/generators/base/schema.d.ts +2 -0
  11. package/src/generators/migrate-helm-libraries/generator.js +2 -2
  12. package/src/generators/migrate-helm-libraries/generator.js.map +1 -1
  13. package/src/generators/migrate-helm-libraries/schema.d.ts +2 -0
  14. package/src/generators/migrate-hlm/generator.js +1 -1
  15. package/src/generators/migrate-hlm/generator.js.map +1 -1
  16. package/src/generators/ui/generator.d.ts +2 -0
  17. package/src/generators/ui/generator.js +7 -4
  18. package/src/generators/ui/generator.js.map +1 -1
  19. package/src/generators/ui/libs/autocomplete/files/lib/hlm-autocomplete-input.ts.template +37 -33
  20. package/src/generators/ui/libs/breadcrumb/files/lib/hlm-breadcrumb-ellipsis.ts.template +11 -17
  21. package/src/generators/ui/libs/calendar/files/lib/hlm-calendar-multi.ts.template +1 -1
  22. package/src/generators/ui/libs/calendar/files/lib/hlm-calendar-range.ts.template +1 -1
  23. package/src/generators/ui/libs/calendar/files/lib/hlm-calendar.ts.template +1 -1
  24. package/src/generators/ui/libs/combobox/files/lib/hlm-combobox-input.ts.template +47 -42
  25. package/src/generators/ui/libs/context-menu/files/lib/hlm-context-menu-trigger.ts.template +8 -14
  26. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-anchor.ts.template +4 -2
  27. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-input.ts.template +49 -37
  28. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-multi.ts.template +6 -6
  29. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker-trigger.ts.template +1 -1
  30. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-picker.ts.template +6 -6
  31. package/src/generators/ui/libs/date-picker/files/lib/hlm-date-range-picker.ts.template +9 -6
  32. package/src/generators/ui/libs/dropdown-menu/files/index.ts.template +1 -0
  33. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-checkbox.ts.template +2 -0
  34. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-focus-on-hover.ts.template +35 -0
  35. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-item.ts.template +2 -0
  36. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-radio.ts.template +2 -0
  37. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-sub-trigger.ts.template +8 -11
  38. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-sub.ts.template +11 -25
  39. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu-trigger.ts.template +7 -14
  40. package/src/generators/ui/libs/dropdown-menu/files/lib/hlm-dropdown-menu.ts.template +11 -25
  41. package/src/generators/ui/libs/input-otp/files/lib/hlm-input-otp-fake-caret.ts.template +7 -4
  42. package/src/generators/ui/libs/menubar/files/lib/hlm-menubar-trigger.ts.template +8 -14
  43. package/src/generators/ui/libs/pagination/files/lib/hlm-numbered-pagination-query-params.ts.template +65 -62
  44. package/src/generators/ui/libs/popover/files/lib/hlm-popover-content.ts.template +1 -4
  45. package/src/generators/ui/libs/sheet/files/lib/hlm-sheet-overlay.ts.template +1 -6
  46. package/src/generators/ui/libs/sidebar/files/lib/hlm-sidebar.service.ts.template +1 -1
  47. package/src/generators/ui/libs/tooltip/files/lib/hlm-tooltip.ts.template +1 -1
  48. package/src/generators/ui/style-luma.css +9 -9
  49. package/src/generators/ui/style-lyra.css +7 -7
  50. package/src/generators/ui/style-maia.css +9 -9
  51. package/src/generators/ui/style-mira.css +9 -9
  52. package/src/generators/ui/style-nova.css +40 -10
  53. package/src/generators/ui/style-vega.css +457 -311
  54. package/src/generators/ui/supported-ui-libraries.json +44 -46
  55. package/src/index.d.ts +2 -2
  56. package/src/index.js +4 -3
  57. package/src/index.js.map +1 -1
  58. package/src/utils/config.d.ts +9 -2
  59. package/src/utils/config.js +28 -4
  60. package/src/utils/config.js.map +1 -1
  61. package/src/utils/supported-styles.d.ts +2 -0
  62. package/src/utils/supported-styles.js +7 -0
  63. package/src/utils/supported-styles.js.map +1 -0
  64. package/src/registry/index.d.ts +0 -1
  65. package/src/registry/index.js +0 -5
  66. package/src/registry/index.js.map +0 -1
  67. package/src/registry/schema.d.ts +0 -2180
  68. package/src/registry/schema.js +0 -175
  69. package/src/registry/schema.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import { type NumberInput } from '@angular/cdk/coercion';
2
2
  import { CdkMenu } from '@angular/cdk/menu';
3
- import { Directive, inject, input, numberAttribute, signal } from '@angular/core';
3
+ import { Directive, ElementRef, inject, input, numberAttribute, signal } from '@angular/core';
4
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
+ import { deriveMenuSideFromTransformOrigin, MENU_SIDE, type MenuSide } from '@spartan-ng/brain/core';
5
6
  import { classes } from '<%- importAlias %>/utils';
6
7
 
7
8
  @Directive({
@@ -16,9 +17,12 @@ import { classes } from '<%- importAlias %>/utils';
16
17
  })
17
18
  export class HlmDropdownMenu {
18
19
  private readonly _host = inject(CdkMenu);
20
+ private readonly _elementRef = inject(ElementRef<HTMLElement>);
21
+ // The trigger provides its configured side; CDK parents this content's injector under the trigger's.
22
+ private readonly _menuSide = inject(MENU_SIDE, { optional: true });
19
23
 
20
24
  protected readonly _state = signal('open');
21
- protected readonly _side = signal('top');
25
+ protected readonly _side = signal<MenuSide>(this._menuSide?.side() ?? 'bottom');
22
26
 
23
27
  public readonly sideOffset = input<number, NumberInput>(1, { transform: numberAttribute });
24
28
 
@@ -28,35 +32,17 @@ export class HlmDropdownMenu {
28
32
  'spartan-dropdown-menu-content my-[--spacing(var(--side-offset))] overflow-x-hidden overflow-y-auto outline-none',
29
33
  );
30
34
 
31
- this.setSideWithDarkMagic();
35
+ this.setSideFromTransformOrigin();
32
36
  // this is a best effort, but does not seem to work currently
33
37
  // TODO: figure out a way for us to know the host is about to be closed. might not be possible with CDK
34
38
  this._host.closed.pipe(takeUntilDestroyed()).subscribe(() => this._state.set('closed'));
35
39
  }
36
40
 
37
- private setSideWithDarkMagic() {
38
- /**
39
- * This is an ugly workaround to at least figure out the correct side of where a submenu
40
- * will appear and set the attribute to the host accordingly
41
- *
42
- * First of all we take advantage of the menu stack not being aware of the root
43
- * object immediately after it is added. This code executes before the root element is added,
44
- * which means the stack is still empty and the peek method returns undefined.
45
- */
46
- const isRoot = this._host.menuStack.peek() === undefined;
41
+ private setSideFromTransformOrigin() {
42
+ const side = this._menuSide?.side() ?? 'bottom';
43
+ // CDK sets transform-origin on this element synchronously on attach; read it next tick and derive side
47
44
  setTimeout(() => {
48
- // our menu trigger directive leaves the last position used for use immediately after opening
49
- // we can access it here and determine the correct side.
50
- // eslint-disable-next-line
51
- const ps = (this._host as any)._parentTrigger._spartanLastPosition;
52
- if (!ps) {
53
- // if we have no last position we default to the most likely option
54
- // I hate that we have to do this and hope we can revisit soon and improve
55
- this._side.set(isRoot ? 'top' : 'left');
56
- return;
57
- }
58
- const side = isRoot ? ps.originY : ps.originX === 'end' ? 'right' : 'left';
59
- this._side.set(side);
45
+ this._side.set(deriveMenuSideFromTransformOrigin(this._elementRef.nativeElement.style.transformOrigin, side));
60
46
  });
61
47
  }
62
48
  }
@@ -1,12 +1,15 @@
1
1
  import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { classes } from '<%- importAlias %>/utils';
2
3
 
3
4
  @Component({
4
5
  selector: 'hlm-input-otp-fake-caret',
5
6
  changeDetection: ChangeDetectionStrategy.OnPush,
6
7
  template: `
7
- <div class="spartan-input-otp-caret pointer-events-none absolute inset-0 flex items-center justify-center">
8
- <div class="spartan-input-otp-caret-line"></div>
9
- </div>
8
+ <div class="spartan-input-otp-caret-line"></div>
10
9
  `,
11
10
  })
12
- export class HlmInputOtpFakeCaret {}
11
+ export class HlmInputOtpFakeCaret {
12
+ constructor() {
13
+ classes(() => 'spartan-input-otp-caret pointer-events-none absolute inset-0 flex items-center justify-center');
14
+ }
15
+ }
@@ -1,13 +1,13 @@
1
1
  import { type BooleanInput } from '@angular/cdk/coercion';
2
2
  import { CdkMenuItem, CdkMenuTrigger } from '@angular/cdk/menu';
3
- import { booleanAttribute, computed, Directive, effect, inject, input } from '@angular/core';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { createMenuPosition, type MenuAlign, type MenuSide } from '@spartan-ng/brain/core';
3
+ import { booleanAttribute, computed, Directive, effect, forwardRef, inject, input } from '@angular/core';
4
+ import { createMenuPosition, MENU_SIDE, type MenuAlign, type MenuSide } from '@spartan-ng/brain/core';
6
5
  import { classes } from '<%- importAlias %>/utils';
7
6
  import { injectHlmMenubarConfig } from './hlm-menubar-token';
8
7
 
9
8
  @Directive({
10
9
  selector: 'button[hlmMenubarTrigger]',
10
+ providers: [{ provide: MENU_SIDE, useExisting: forwardRef(() => HlmMenubarTrigger) }],
11
11
  hostDirectives: [
12
12
  {
13
13
  directive: CdkMenuItem,
@@ -37,17 +37,11 @@ export class HlmMenubarTrigger {
37
37
  private readonly _menuPosition = computed(() => createMenuPosition(this.align(), this.side()));
38
38
 
39
39
  constructor() {
40
- // once the trigger opens we wait until the next tick and then grab the last position
41
- // used to position the menu. we store this in our trigger which the brnMenu directive has
42
- // access to through DI
43
- this._cdkTrigger.opened.pipe(takeUntilDestroyed()).subscribe(() =>
44
- setTimeout(
45
- () =>
46
- // eslint-disable-next-line
47
- ((this._cdkTrigger as any)._spartanLastPosition = // eslint-disable-next-line
48
- (this._cdkTrigger as any).overlayRef._positionStrategy._lastPosition),
49
- ),
50
- );
40
+ // CDK sets transform-origin on the menu content (a shared hlm-dropdown-menu) from the resolved
41
+ // position; the content reads it to animate from the anchored corner and to derive its data-side.
42
+ // Cast tolerates @angular/cdk < 21.2 (we still support >=21.0), where the property is absent and
43
+ // the assignment is a harmless no-op.
44
+ (this._cdkTrigger as { transformOriginSelector?: string }).transformOriginSelector = '[data-slot="dropdown-menu"]';
51
45
 
52
46
  effect(() => {
53
47
  this._cdkTrigger.menuPosition = this._menuPosition();
@@ -1,8 +1,8 @@
1
1
  import type { BooleanInput, NumberInput } from '@angular/cdk/coercion';
2
2
  import {
3
+ booleanAttribute,
3
4
  ChangeDetectionStrategy,
4
5
  Component,
5
- booleanAttribute,
6
6
  computed,
7
7
  input,
8
8
  model,
@@ -10,6 +10,7 @@ import {
10
10
  untracked,
11
11
  } from '@angular/core';
12
12
  import { HlmSelectImports } from '<%- importAlias %>/select';
13
+ import { classes } from '<%- importAlias %>/utils';
13
14
  import { createPageArray, outOfBoundCorrection } from './hlm-numbered-pagination';
14
15
  import { HlmPagination } from './hlm-pagination';
15
16
  import { HlmPaginationContent } from './hlm-pagination-content';
@@ -33,70 +34,68 @@ import { HlmPaginationPrevious } from './hlm-pagination-previous';
33
34
  ],
34
35
  changeDetection: ChangeDetectionStrategy.OnPush,
35
36
  template: `
36
- <div class="flex items-center justify-between gap-2 px-4 py-2">
37
- <div class="flex items-center gap-1 text-sm text-nowrap text-gray-600">
38
- <b>{{ totalItems() }}</b>
39
- total items |
40
- <b>{{ _lastPageNumber() }}</b>
41
- pages
42
- </div>
43
-
44
- <nav hlmPagination>
45
- <ul hlmPaginationContent>
46
- @if (showEdges() && !_isFirstPageActive()) {
47
- <li hlmPaginationItem>
48
- <hlm-pagination-previous
49
- [link]="link()"
50
- [queryParams]="{ page: currentPage() - 1 }"
51
- queryParamsHandling="merge"
52
- />
53
- </li>
54
- }
55
-
56
- @for (page of _pages(); track page) {
57
- <li hlmPaginationItem>
58
- @if (page === '...') {
59
- <hlm-pagination-ellipsis />
60
- } @else {
61
- <a
62
- hlmPaginationLink
63
- [link]="currentPage() !== page ? link() : undefined"
64
- [queryParams]="{ page }"
65
- queryParamsHandling="merge"
66
- [isActive]="currentPage() === page"
67
- >
68
- {{ page }}
69
- </a>
70
- }
71
- </li>
72
- }
37
+ <div class="flex items-center gap-1 text-sm text-nowrap text-gray-600">
38
+ <b>{{ totalItems() }}</b>
39
+ total items |
40
+ <b>{{ _lastPageNumber() }}</b>
41
+ pages
42
+ </div>
73
43
 
74
- @if (showEdges() && !_isLastPageActive()) {
75
- <li hlmPaginationItem>
76
- <hlm-pagination-next
77
- [link]="link()"
78
- [queryParams]="{ page: currentPage() + 1 }"
44
+ <nav hlmPagination>
45
+ <ul hlmPaginationContent>
46
+ @if (showEdges() && !_isFirstPageActive()) {
47
+ <li hlmPaginationItem>
48
+ <hlm-pagination-previous
49
+ [link]="link()"
50
+ [queryParams]="{ page: currentPage() - 1 }"
51
+ queryParamsHandling="merge"
52
+ />
53
+ </li>
54
+ }
55
+
56
+ @for (page of _pages(); track page) {
57
+ <li hlmPaginationItem>
58
+ @if (page === '...') {
59
+ <hlm-pagination-ellipsis />
60
+ } @else {
61
+ <a
62
+ hlmPaginationLink
63
+ [link]="currentPage() !== page ? link() : undefined"
64
+ [queryParams]="{ page }"
79
65
  queryParamsHandling="merge"
80
- />
81
- </li>
82
- }
83
- </ul>
84
- </nav>
85
-
86
- <!-- Show Page Size selector -->
87
- <hlm-select [(value)]="itemsPerPage" class="ml-auto">
88
- <hlm-select-trigger class="w-fit">
89
- <hlm-select-value />
90
- </hlm-select-trigger>
91
- <hlm-select-content *hlmSelectPortal>
92
- <hlm-select-group>
93
- @for (pageSize of _pageSizesWithCurrent(); track pageSize) {
94
- <hlm-select-item [value]="pageSize">{{ pageSize }}</hlm-select-item>
66
+ [isActive]="currentPage() === page"
67
+ >
68
+ {{ page }}
69
+ </a>
95
70
  }
96
- </hlm-select-group>
97
- </hlm-select-content>
98
- </hlm-select>
99
- </div>
71
+ </li>
72
+ }
73
+
74
+ @if (showEdges() && !_isLastPageActive()) {
75
+ <li hlmPaginationItem>
76
+ <hlm-pagination-next
77
+ [link]="link()"
78
+ [queryParams]="{ page: currentPage() + 1 }"
79
+ queryParamsHandling="merge"
80
+ />
81
+ </li>
82
+ }
83
+ </ul>
84
+ </nav>
85
+
86
+ <!-- Show Page Size selector -->
87
+ <hlm-select [(value)]="itemsPerPage" class="ml-auto">
88
+ <hlm-select-trigger class="w-fit">
89
+ <hlm-select-value />
90
+ </hlm-select-trigger>
91
+ <hlm-select-content *hlmSelectPortal>
92
+ <hlm-select-group>
93
+ @for (pageSize of _pageSizesWithCurrent(); track pageSize) {
94
+ <hlm-select-item [value]="pageSize">{{ pageSize }}</hlm-select-item>
95
+ }
96
+ </hlm-select-group>
97
+ </hlm-select-content>
98
+ </hlm-select>
100
99
  `,
101
100
  })
102
101
  export class HlmNumberedPaginationQueryParams {
@@ -174,4 +173,8 @@ export class HlmNumberedPaginationQueryParams {
174
173
 
175
174
  return createPageArray(correctedCurrentPage, this.itemsPerPage(), this.totalItems(), this.maxSize());
176
175
  });
176
+
177
+ constructor() {
178
+ classes(() => 'flex items-center justify-between gap-2 px-4 py-2');
179
+ }
177
180
  }
@@ -17,9 +17,6 @@ export class HlmPopoverContent {
17
17
  this._renderer.setAttribute(this._element.nativeElement, 'data-state', this.state());
18
18
  });
19
19
 
20
- classes(
21
- () =>
22
- 'spartan-popover-content data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative flex w-72 flex-col outline-none',
23
- );
20
+ classes(() => 'spartan-popover-content relative flex w-72 flex-col outline-none');
24
21
  }
25
22
  }
@@ -11,12 +11,7 @@ import type { ClassValue } from 'clsx';
11
11
  export class HlmSheetOverlay {
12
12
  private readonly _classSettable = injectCustomClassSettable({ optional: true, host: true });
13
13
  public readonly userClass = input<ClassValue>('', { alias: 'class' });
14
- protected readonly _computedClass = computed(() =>
15
- hlm(
16
- 'spartan-sheet-overlay transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0',
17
- this.userClass(),
18
- ),
19
- );
14
+ protected readonly _computedClass = computed(() => hlm('spartan-sheet-overlay', this.userClass()));
20
15
 
21
16
  constructor() {
22
17
  effect(() => {
@@ -40,7 +40,7 @@ export class HlmSidebarService {
40
40
  this.restoreStateFromCookie();
41
41
 
42
42
  afterNextRender(() => {
43
- if (!this._window) return;
43
+ if (!this._window || typeof this._window.matchMedia !== 'function') return;
44
44
 
45
45
  // Initialize MediaQueryList
46
46
  this._mediaQuery = this._window.matchMedia(`(max-width: ${this._config.mobileBreakpoint})`);
@@ -7,7 +7,7 @@ export const DEFAULT_TOOLTIP_SVG_CLASS =
7
7
  'bg-foreground fill-foreground z-50 block size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]';
8
8
 
9
9
  export const DEFAULT_TOOLTIP_CONTENT_CLASSES = hlm(
10
- 'spartan-tooltip-content bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) text-balance',
10
+ 'spartan-tooltip-content bg-foreground text-background data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) text-balance',
11
11
  );
12
12
 
13
13
  export const tooltipPositionVariants = cva('absolute', {
@@ -147,11 +147,11 @@
147
147
  }
148
148
 
149
149
  .spartan-button-group-orientation-horizontal {
150
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-4xl!;
150
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-4xl;
151
151
  }
152
152
 
153
153
  .spartan-button-group-orientation-vertical {
154
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-4xl!;
154
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-4xl;
155
155
  }
156
156
 
157
157
  .spartan-button-group-text {
@@ -288,7 +288,7 @@
288
288
  }
289
289
 
290
290
  .spartan-combobox-status {
291
- @apply text-muted-foreground gap-2 py-2 text-sm;
291
+ @apply text-muted-foreground gap-2 px-4.5 py-2 text-sm;
292
292
  }
293
293
 
294
294
  /* MARK: Input Group */
@@ -454,7 +454,7 @@
454
454
 
455
455
  /* MARK: Alert Dialog */
456
456
  .spartan-alert-dialog-overlay {
457
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm;
457
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm;
458
458
  }
459
459
 
460
460
  .spartan-alert-dialog-content {
@@ -532,7 +532,7 @@
532
532
  }
533
533
 
534
534
  .spartan-autocomplete-status {
535
- @apply text-muted-foreground gap-2 py-2 text-sm;
535
+ @apply text-muted-foreground gap-2 px-4.5 py-2 text-sm;
536
536
  }
537
537
 
538
538
  /* MARK: Avatar */
@@ -665,7 +665,7 @@
665
665
 
666
666
  /* MARK: Dialog */
667
667
  .spartan-dialog-overlay {
668
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm;
668
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm;
669
669
  }
670
670
 
671
671
  .spartan-dialog-content {
@@ -724,7 +724,7 @@
724
724
 
725
725
  /* MARK: Dropdown Menu */
726
726
  .spartan-dropdown-menu-content {
727
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground min-w-48 rounded-3xl p-1.5 shadow-lg ring-1 duration-100;
727
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground min-w-48 rounded-3xl p-1.5 shadow-lg ring-1 duration-100;
728
728
  }
729
729
 
730
730
  .spartan-dropdown-menu-item {
@@ -756,7 +756,7 @@
756
756
  }
757
757
 
758
758
  .spartan-dropdown-menu-sub-content {
759
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground min-w-36 rounded-3xl p-1.5 shadow-lg ring-1 duration-100;
759
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 dark:ring-foreground/10 bg-popover text-popover-foreground min-w-36 rounded-3xl p-1.5 shadow-lg ring-1 duration-100;
760
760
  }
761
761
 
762
762
  /* MARK: Item */
@@ -1073,7 +1073,7 @@
1073
1073
 
1074
1074
  /* MARK: Sheet */
1075
1075
  .spartan-sheet-overlay {
1076
- @apply bg-black/30 supports-backdrop-filter:backdrop-blur-sm;
1076
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/30 duration-100 supports-backdrop-filter:backdrop-blur-sm;
1077
1077
  }
1078
1078
 
1079
1079
  .spartan-sheet-content {
@@ -50,7 +50,7 @@
50
50
 
51
51
  /* MARK: Alert Dialog */
52
52
  .spartan-alert-dialog-overlay {
53
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs;
53
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs;
54
54
  }
55
55
 
56
56
  .spartan-alert-dialog-content {
@@ -103,7 +103,7 @@
103
103
  }
104
104
 
105
105
  .spartan-autocomplete-status {
106
- @apply text-muted-foreground gap-2 py-2 text-xs;
106
+ @apply text-muted-foreground gap-2 px-2 py-2 text-xs;
107
107
  }
108
108
 
109
109
  /* MARK: Avatar */
@@ -361,7 +361,7 @@
361
361
  }
362
362
 
363
363
  .spartan-combobox-status {
364
- @apply text-muted-foreground gap-2 py-2 text-xs;
364
+ @apply text-muted-foreground gap-2 px-2 py-2 text-xs;
365
365
  }
366
366
 
367
367
  /* MARK: Command */
@@ -419,7 +419,7 @@
419
419
 
420
420
  /* MARK: Dialog */
421
421
  .spartan-dialog-overlay {
422
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs;
422
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs;
423
423
  }
424
424
 
425
425
  .spartan-dialog-content {
@@ -474,7 +474,7 @@
474
474
 
475
475
  /* MARK: Dropdown Menu */
476
476
  .spartan-dropdown-menu-content {
477
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-none shadow-md ring-1 duration-100;
477
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-none shadow-md ring-1 duration-100;
478
478
  }
479
479
 
480
480
  .spartan-dropdown-menu-item {
@@ -506,7 +506,7 @@
506
506
  }
507
507
 
508
508
  .spartan-dropdown-menu-sub-content {
509
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-none shadow-lg ring-1 duration-100;
509
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-[96px] rounded-none shadow-lg ring-1 duration-100;
510
510
  }
511
511
 
512
512
  /* MARK: Empty */
@@ -898,7 +898,7 @@
898
898
 
899
899
  /* MARK: Sheet */
900
900
  .spartan-sheet-overlay {
901
- @apply bg-black/10 text-xs/relaxed supports-backdrop-filter:backdrop-blur-xs;
901
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/10 text-xs/relaxed duration-100 supports-backdrop-filter:backdrop-blur-xs;
902
902
  }
903
903
 
904
904
  .spartan-sheet-content {
@@ -26,7 +26,7 @@
26
26
 
27
27
  /* MARK: Alert Dialog */
28
28
  .spartan-alert-dialog-overlay {
29
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
29
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
30
30
  }
31
31
 
32
32
  .spartan-alert-dialog-content {
@@ -104,7 +104,7 @@
104
104
  }
105
105
 
106
106
  .spartan-autocomplete-status {
107
- @apply text-muted-foreground gap-2 py-2 text-sm;
107
+ @apply text-muted-foreground gap-2 px-4 py-2 text-sm;
108
108
  }
109
109
 
110
110
  /* MARK: Avatar */
@@ -249,11 +249,11 @@
249
249
  }
250
250
 
251
251
  .spartan-button-group-orientation-horizontal {
252
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-4xl!;
252
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-4xl;
253
253
  }
254
254
 
255
255
  .spartan-button-group-orientation-vertical {
256
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-4xl!;
256
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-4xl;
257
257
  }
258
258
 
259
259
  .spartan-button-group-text {
@@ -379,7 +379,7 @@
379
379
  }
380
380
 
381
381
  .spartan-combobox-status {
382
- @apply text-muted-foreground gap-2 py-2 text-sm;
382
+ @apply text-muted-foreground gap-2 px-4 py-2 text-sm;
383
383
  }
384
384
 
385
385
  /* MARK: Command */
@@ -437,7 +437,7 @@
437
437
 
438
438
  /* MARK: Dialog */
439
439
  .spartan-dialog-overlay {
440
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
440
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
441
441
  }
442
442
 
443
443
  .spartan-dialog-content {
@@ -496,7 +496,7 @@
496
496
 
497
497
  /* MARK: Dropdown Menu */
498
498
  .spartan-dropdown-menu-content {
499
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 bg-popover text-popover-foreground dark:ring-foreground/10 min-w-48 rounded-2xl p-1 shadow-2xl ring-1 duration-100;
499
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 bg-popover text-popover-foreground dark:ring-foreground/10 min-w-48 rounded-2xl p-1 shadow-2xl ring-1 duration-100;
500
500
  }
501
501
 
502
502
  .spartan-dropdown-menu-item {
@@ -528,7 +528,7 @@
528
528
  }
529
529
 
530
530
  .spartan-dropdown-menu-sub-content {
531
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 bg-popover text-popover-foreground min-w-36 rounded-2xl p-1 shadow-2xl ring-1 duration-100;
531
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/5 bg-popover text-popover-foreground min-w-36 rounded-2xl p-1 shadow-2xl ring-1 duration-100;
532
532
  }
533
533
 
534
534
  /* MARK: Empty */
@@ -920,7 +920,7 @@
920
920
 
921
921
  /* MARK: Sheet */
922
922
  .spartan-sheet-overlay {
923
- @apply bg-black/80 supports-backdrop-filter:backdrop-blur-xs;
923
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
924
924
  }
925
925
 
926
926
  .spartan-sheet-content {
@@ -26,7 +26,7 @@
26
26
 
27
27
  /* MARK: Alert Dialog */
28
28
  .spartan-alert-dialog-overlay {
29
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
29
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
30
30
  }
31
31
 
32
32
  .spartan-alert-dialog-content {
@@ -104,7 +104,7 @@
104
104
  }
105
105
 
106
106
  .spartan-autocomplete-status {
107
- @apply text-muted-foreground gap-2 py-2 text-xs/relaxed;
107
+ @apply text-muted-foreground gap-2 px-3 py-2 text-xs/relaxed;
108
108
  }
109
109
 
110
110
  /* MARK: Avatar */
@@ -249,11 +249,11 @@
249
249
  }
250
250
 
251
251
  .spartan-button-group-orientation-horizontal {
252
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-md!;
252
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-e-md;
253
253
  }
254
254
 
255
255
  .spartan-button-group-orientation-vertical {
256
- @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md!;
256
+ @apply [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md;
257
257
  }
258
258
 
259
259
  .spartan-button-group-text {
@@ -379,7 +379,7 @@
379
379
  }
380
380
 
381
381
  .spartan-combobox-status {
382
- @apply text-muted-foreground gap-2 py-2 text-xs/relaxed;
382
+ @apply text-muted-foreground gap-2 px-3 py-2 text-xs/relaxed;
383
383
  }
384
384
 
385
385
  /* MARK: Command */
@@ -437,7 +437,7 @@
437
437
 
438
438
  /* MARK: Dialog */
439
439
  .spartan-dialog-overlay {
440
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
440
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
441
441
  }
442
442
 
443
443
  .spartan-dialog-content {
@@ -496,7 +496,7 @@
496
496
 
497
497
  /* MARK: Dropdown Menu */
498
498
  .spartan-dropdown-menu-content {
499
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100;
499
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100;
500
500
  }
501
501
 
502
502
  .spartan-dropdown-menu-item {
@@ -528,7 +528,7 @@
528
528
  }
529
529
 
530
530
  .spartan-dropdown-menu-sub-content {
531
- @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100;
531
+ @apply motion-safe:data-open:animate-in motion-safe:data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 bg-popover text-popover-foreground min-w-32 rounded-lg p-1 shadow-md ring-1 duration-100;
532
532
  }
533
533
 
534
534
  /* MARK: Empty */
@@ -920,7 +920,7 @@
920
920
 
921
921
  /* MARK: Sheet */
922
922
  .spartan-sheet-overlay {
923
- @apply bg-black/80 supports-backdrop-filter:backdrop-blur-xs;
923
+ @apply data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 isolate bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs;
924
924
  }
925
925
 
926
926
  .spartan-sheet-content {