@sonny-ui/core 0.1.0-alpha.16 → 0.1.0-alpha.18

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 (77) hide show
  1. package/README.md +109 -55
  2. package/fesm2022/sonny-ui-core.mjs +617 -178
  3. package/fesm2022/sonny-ui-core.mjs.map +1 -1
  4. package/package.json +1 -1
  5. package/src/lib/accordion/accordion.directives.ts +0 -4
  6. package/src/lib/alert/alert.directives.ts +0 -3
  7. package/src/lib/avatar/avatar.component.ts +0 -1
  8. package/src/lib/avatar-group/avatar-group.component.spec.ts +74 -0
  9. package/src/lib/avatar-group/avatar-group.component.ts +88 -0
  10. package/src/lib/avatar-group/index.ts +1 -0
  11. package/src/lib/badge/badge.directive.ts +0 -1
  12. package/src/lib/breadcrumb/breadcrumb.directives.ts +0 -6
  13. package/src/lib/button/button.directive.ts +0 -1
  14. package/src/lib/button-group/button-group.directive.ts +0 -1
  15. package/src/lib/calendar/calendar.component.ts +0 -1
  16. package/src/lib/card/card.directives.ts +0 -6
  17. package/src/lib/carousel/carousel.directives.ts +0 -5
  18. package/src/lib/chat-bubble/chat-bubble.directives.ts +0 -6
  19. package/src/lib/checkbox/checkbox.directive.ts +0 -1
  20. package/src/lib/color-picker/color-picker.component.ts +5 -5
  21. package/src/lib/combobox/combobox.component.ts +1 -3
  22. package/src/lib/command-palette/command-palette.component.ts +0 -1
  23. package/src/lib/data-table/data-table.component.ts +0 -1
  24. package/src/lib/data-table/data-table.directives.ts +0 -4
  25. package/src/lib/date-picker/date-picker.component.ts +5 -5
  26. package/src/lib/date-range-picker/date-range-picker.component.ts +5 -5
  27. package/src/lib/diff/diff.component.ts +0 -1
  28. package/src/lib/divider/divider.component.ts +0 -1
  29. package/src/lib/dock/dock.directives.ts +0 -2
  30. package/src/lib/drawer/drawer.directives.ts +0 -3
  31. package/src/lib/dropdown/dropdown.directives.ts +3 -10
  32. package/src/lib/fab/fab.directives.ts +0 -3
  33. package/src/lib/fieldset/fieldset.directives.ts +0 -3
  34. package/src/lib/file-input/file-input.component.ts +0 -1
  35. package/src/lib/indicator/indicator.directives.ts +0 -2
  36. package/src/lib/input/input.directive.ts +0 -1
  37. package/src/lib/input/label.directive.ts +0 -1
  38. package/src/lib/kbd/kbd.directive.ts +0 -1
  39. package/src/lib/link/link.directive.ts +0 -1
  40. package/src/lib/list/list.directives.ts +0 -5
  41. package/src/lib/loader/loader.component.ts +0 -1
  42. package/src/lib/modal/dialog.directives.ts +0 -6
  43. package/src/lib/navbar/navbar.directives.ts +0 -4
  44. package/src/lib/number-input/index.ts +2 -0
  45. package/src/lib/number-input/number-input.component.spec.ts +151 -0
  46. package/src/lib/number-input/number-input.component.ts +152 -0
  47. package/src/lib/number-input/number-input.variants.ts +17 -0
  48. package/src/lib/otp-input/otp-input.component.ts +0 -1
  49. package/src/lib/pagination/pagination.component.ts +0 -1
  50. package/src/lib/popover/index.ts +6 -0
  51. package/src/lib/popover/popover.directives.spec.ts +147 -0
  52. package/src/lib/popover/popover.directives.ts +151 -0
  53. package/src/lib/progress/progress.component.ts +0 -1
  54. package/src/lib/radial-progress/radial-progress.component.ts +0 -1
  55. package/src/lib/radio/radio.directive.ts +0 -1
  56. package/src/lib/rating/rating.component.ts +0 -1
  57. package/src/lib/select/select.component.ts +1 -3
  58. package/src/lib/sheet/sheet.directives.ts +0 -5
  59. package/src/lib/skeleton/skeleton.directive.ts +0 -1
  60. package/src/lib/slider/slider.component.ts +0 -1
  61. package/src/lib/stat/stat.directives.ts +0 -5
  62. package/src/lib/status/status.directive.ts +0 -1
  63. package/src/lib/steps/steps.directives.ts +0 -2
  64. package/src/lib/switch/switch.component.ts +0 -1
  65. package/src/lib/table/table.directives.ts +0 -8
  66. package/src/lib/tabs/tabs.directives.ts +0 -4
  67. package/src/lib/tag-input/index.ts +2 -0
  68. package/src/lib/tag-input/tag-input.component.spec.ts +190 -0
  69. package/src/lib/tag-input/tag-input.component.ts +172 -0
  70. package/src/lib/tag-input/tag-input.variants.ts +31 -0
  71. package/src/lib/textarea/textarea.directive.ts +0 -1
  72. package/src/lib/timeline/timeline.directives.ts +0 -5
  73. package/src/lib/toast/toaster.component.ts +0 -1
  74. package/src/lib/toggle/toggle.directive.ts +0 -1
  75. package/src/lib/tooltip/tooltip.directive.ts +0 -1
  76. package/src/lib/validator/validator.directives.ts +0 -2
  77. package/types/sonny-ui-core.d.ts +147 -2
@@ -54,7 +54,6 @@ function computePageRange(
54
54
 
55
55
  @Component({
56
56
  selector: 'sny-pagination',
57
- standalone: true,
58
57
  changeDetection: ChangeDetectionStrategy.OnPush,
59
58
  host: {
60
59
  'role': 'navigation',
@@ -0,0 +1,6 @@
1
+ export {
2
+ SnyPopoverDirective,
3
+ SnyPopoverTriggerDirective,
4
+ SnyPopoverContentDirective,
5
+ SNY_POPOVER,
6
+ } from './popover.directives';
@@ -0,0 +1,147 @@
1
+ import { Component, signal } from '@angular/core';
2
+ import { TestBed, type ComponentFixture } from '@angular/core/testing';
3
+ import {
4
+ SnyPopoverDirective,
5
+ SnyPopoverTriggerDirective,
6
+ SnyPopoverContentDirective,
7
+ } from './popover.directives';
8
+
9
+ @Component({
10
+ standalone: true,
11
+ imports: [SnyPopoverDirective, SnyPopoverTriggerDirective, SnyPopoverContentDirective],
12
+ template: `
13
+ <div snyPopover [matchWidth]="matchWidth()" [closeOnOutside]="closeOnOutside()" [closeOnEscape]="closeOnEscape()" #pop="snyPopover">
14
+ <button snyPopoverTrigger>Open</button>
15
+ <div snyPopoverContent class="p-4">
16
+ <p>Popover content</p>
17
+ <button class="close-btn" (click)="pop.close()">Close</button>
18
+ </div>
19
+ </div>
20
+ `,
21
+ })
22
+ class TestHost {
23
+ matchWidth = signal(false);
24
+ closeOnOutside = signal(true);
25
+ closeOnEscape = signal(true);
26
+ }
27
+
28
+ describe('SnyPopoverDirective', () => {
29
+ let fixture: ComponentFixture<TestHost>;
30
+ let el: HTMLElement;
31
+
32
+ beforeEach(async () => {
33
+ await TestBed.configureTestingModule({ imports: [TestHost] }).compileComponents();
34
+ fixture = TestBed.createComponent(TestHost);
35
+ fixture.detectChanges();
36
+ el = fixture.nativeElement;
37
+ });
38
+
39
+ function getTrigger(): HTMLButtonElement {
40
+ return el.querySelector('[snypopovertrigger]') as HTMLButtonElement;
41
+ }
42
+
43
+ function getContent(): HTMLElement | null {
44
+ return el.querySelector('[snyPopoverContent], [snypopovercontent]');
45
+ }
46
+
47
+ function isVisible(): boolean {
48
+ const content = getContent();
49
+ return content ? content.style.display !== 'none' : false;
50
+ }
51
+
52
+ it('should render trigger and hidden content', () => {
53
+ expect(getTrigger()).not.toBeNull();
54
+ expect(getContent()).not.toBeNull();
55
+ expect(isVisible()).toBe(false);
56
+ });
57
+
58
+ it('should open on trigger click', () => {
59
+ getTrigger().click();
60
+ fixture.detectChanges();
61
+ expect(isVisible()).toBe(true);
62
+ });
63
+
64
+ it('should close on second trigger click', () => {
65
+ getTrigger().click();
66
+ fixture.detectChanges();
67
+ expect(isVisible()).toBe(true);
68
+
69
+ getTrigger().click();
70
+ fixture.detectChanges();
71
+ expect(isVisible()).toBe(false);
72
+ });
73
+
74
+ it('should set aria-expanded on trigger', () => {
75
+ expect(getTrigger().getAttribute('aria-expanded')).toBe('false');
76
+ getTrigger().click();
77
+ fixture.detectChanges();
78
+ expect(getTrigger().getAttribute('aria-expanded')).toBe('true');
79
+ });
80
+
81
+ it('should have aria-haspopup on trigger', () => {
82
+ expect(getTrigger().getAttribute('aria-haspopup')).toBe('dialog');
83
+ });
84
+
85
+ it('should have role=dialog on content', () => {
86
+ expect(getContent()?.getAttribute('role')).toBe('dialog');
87
+ });
88
+
89
+ it('should close on click outside', () => {
90
+ getTrigger().click();
91
+ fixture.detectChanges();
92
+ expect(isVisible()).toBe(true);
93
+
94
+ document.body.click();
95
+ fixture.detectChanges();
96
+ expect(isVisible()).toBe(false);
97
+ });
98
+
99
+ it('should not close on click outside when closeOnOutside=false', () => {
100
+ fixture.componentInstance.closeOnOutside.set(false);
101
+ fixture.detectChanges();
102
+
103
+ getTrigger().click();
104
+ fixture.detectChanges();
105
+ expect(isVisible()).toBe(true);
106
+
107
+ document.body.click();
108
+ fixture.detectChanges();
109
+ expect(isVisible()).toBe(true);
110
+ });
111
+
112
+ it('should close on escape', () => {
113
+ getTrigger().click();
114
+ fixture.detectChanges();
115
+ expect(isVisible()).toBe(true);
116
+
117
+ const host = el.querySelector('[snyPopover], [snypopover]') as HTMLElement;
118
+ host.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
119
+ fixture.detectChanges();
120
+ expect(isVisible()).toBe(false);
121
+ });
122
+
123
+ it('should not close on escape when closeOnEscape=false', () => {
124
+ fixture.componentInstance.closeOnEscape.set(false);
125
+ fixture.detectChanges();
126
+
127
+ getTrigger().click();
128
+ fixture.detectChanges();
129
+ expect(isVisible()).toBe(true);
130
+
131
+ const host = el.querySelector('[snyPopover], [snypopover]') as HTMLElement;
132
+ host.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
133
+ fixture.detectChanges();
134
+ expect(isVisible()).toBe(true);
135
+ });
136
+
137
+ it('should close programmatically via template ref', () => {
138
+ getTrigger().click();
139
+ fixture.detectChanges();
140
+ expect(isVisible()).toBe(true);
141
+
142
+ const closeBtn = el.querySelector('.close-btn') as HTMLButtonElement;
143
+ closeBtn.click();
144
+ fixture.detectChanges();
145
+ expect(isVisible()).toBe(false);
146
+ });
147
+ });
@@ -0,0 +1,151 @@
1
+ import {
2
+ Directive,
3
+ ElementRef,
4
+ InjectionToken,
5
+ OnDestroy,
6
+ computed,
7
+ inject,
8
+ input,
9
+ signal,
10
+ } from '@angular/core';
11
+ import { cn } from '../core/utils/cn';
12
+
13
+ export const SNY_POPOVER = new InjectionToken<SnyPopoverDirective>('SnyPopover');
14
+
15
+ @Directive({
16
+ selector: '[snyPopover]',
17
+ exportAs: 'snyPopover',
18
+ providers: [{ provide: SNY_POPOVER, useExisting: SnyPopoverDirective }],
19
+ host: {
20
+ '[class]': '"relative inline-block"',
21
+ '(document:click)': 'onDocumentClick($event)',
22
+ '(keydown.escape)': 'onEscape()',
23
+ },
24
+ })
25
+ export class SnyPopoverDirective implements OnDestroy {
26
+ private readonly elRef = inject(ElementRef);
27
+
28
+ readonly matchWidth = input(false);
29
+ readonly offset = input(4);
30
+ readonly closeOnOutside = input(true);
31
+ readonly closeOnEscape = input(true);
32
+
33
+ readonly isOpen = signal(false);
34
+ readonly triggerEl = signal<HTMLElement | null>(null);
35
+ readonly panelEl = signal<HTMLElement | null>(null);
36
+
37
+ private scrollHandler: (() => void) | null = null;
38
+ private resizeHandler: (() => void) | null = null;
39
+
40
+ toggle(): void {
41
+ if (this.isOpen()) {
42
+ this.close();
43
+ } else {
44
+ this.open();
45
+ }
46
+ }
47
+
48
+ open(): void {
49
+ this.isOpen.set(true);
50
+ this.addListeners();
51
+ setTimeout(() => this.updatePosition());
52
+ }
53
+
54
+ close(): void {
55
+ this.isOpen.set(false);
56
+ this.removeListeners();
57
+ }
58
+
59
+ updatePosition(): void {
60
+ const trigger = this.triggerEl();
61
+ const panel = this.panelEl();
62
+ if (!trigger || !panel) return;
63
+ const rect = trigger.getBoundingClientRect();
64
+ panel.style.top = `${rect.bottom + this.offset()}px`;
65
+ panel.style.left = `${rect.left}px`;
66
+ if (this.matchWidth()) {
67
+ panel.style.width = `${rect.width}px`;
68
+ }
69
+ }
70
+
71
+ private addListeners(): void {
72
+ this.removeListeners();
73
+ this.scrollHandler = () => {
74
+ requestAnimationFrame(() => this.updatePosition());
75
+ };
76
+ this.resizeHandler = () => {
77
+ requestAnimationFrame(() => this.updatePosition());
78
+ };
79
+ document.addEventListener('scroll', this.scrollHandler, { capture: true, passive: true });
80
+ window.addEventListener('resize', this.resizeHandler, { passive: true });
81
+ }
82
+
83
+ private removeListeners(): void {
84
+ if (this.scrollHandler) {
85
+ document.removeEventListener('scroll', this.scrollHandler, { capture: true } as EventListenerOptions);
86
+ this.scrollHandler = null;
87
+ }
88
+ if (this.resizeHandler) {
89
+ window.removeEventListener('resize', this.resizeHandler);
90
+ this.resizeHandler = null;
91
+ }
92
+ }
93
+
94
+ onDocumentClick(event: MouseEvent): void {
95
+ if (this.closeOnOutside() && this.isOpen() && !this.elRef.nativeElement.contains(event.target)) {
96
+ this.close();
97
+ }
98
+ }
99
+
100
+ onEscape(): void {
101
+ if (this.closeOnEscape() && this.isOpen()) {
102
+ this.close();
103
+ }
104
+ }
105
+
106
+ ngOnDestroy(): void {
107
+ this.removeListeners();
108
+ }
109
+ }
110
+
111
+ @Directive({
112
+ selector: '[snyPopoverTrigger]',
113
+ host: {
114
+ '(click)': 'popover.toggle()',
115
+ '[attr.aria-expanded]': 'popover.isOpen()',
116
+ 'aria-haspopup': 'dialog',
117
+ },
118
+ })
119
+ export class SnyPopoverTriggerDirective {
120
+ protected readonly popover = inject(SNY_POPOVER);
121
+ private readonly elRef = inject(ElementRef);
122
+
123
+ constructor() {
124
+ this.popover.triggerEl.set(this.elRef.nativeElement);
125
+ }
126
+ }
127
+
128
+ @Directive({
129
+ selector: '[snyPopoverContent]',
130
+ host: {
131
+ 'role': 'dialog',
132
+ '[style.display]': 'popover.isOpen() ? "" : "none"',
133
+ '[class]': 'computedClass()',
134
+ },
135
+ })
136
+ export class SnyPopoverContentDirective {
137
+ protected readonly popover = inject(SNY_POPOVER);
138
+ private readonly elRef = inject(ElementRef);
139
+ readonly class = input<string>('');
140
+
141
+ protected readonly computedClass = computed(() =>
142
+ cn(
143
+ 'fixed z-50 rounded-md border border-border bg-popover text-popover-foreground shadow-lg animate-in fade-in-0 zoom-in-95',
144
+ this.class()
145
+ )
146
+ );
147
+
148
+ constructor() {
149
+ this.popover.panelEl.set(this.elRef.nativeElement);
150
+ }
151
+ }
@@ -9,7 +9,6 @@ import {
9
9
 
10
10
  @Component({
11
11
  selector: 'sny-progress',
12
- standalone: true,
13
12
  changeDetection: ChangeDetectionStrategy.OnPush,
14
13
  host: {
15
14
  'role': 'progressbar',
@@ -16,7 +16,6 @@ const variantColorMap: Record<RadialProgressVariant, string> = {
16
16
 
17
17
  @Component({
18
18
  selector: 'sny-radial-progress',
19
- standalone: true,
20
19
  changeDetection: ChangeDetectionStrategy.OnPush,
21
20
  host: {
22
21
  'role': 'progressbar',
@@ -4,7 +4,6 @@ import { radioVariants, type RadioSize } from './radio.variants';
4
4
 
5
5
  @Directive({
6
6
  selector: 'input[type="radio"][snyRadio]',
7
- standalone: true,
8
7
  host: { '[class]': 'computedClass()' },
9
8
  })
10
9
  export class SnyRadioDirective {
@@ -10,7 +10,6 @@ interface StarState {
10
10
 
11
11
  @Component({
12
12
  selector: 'sny-rating',
13
- standalone: true,
14
13
  changeDetection: ChangeDetectionStrategy.OnPush,
15
14
  host: {
16
15
  'role': 'slider',
@@ -4,7 +4,6 @@ import {
4
4
  computed,
5
5
  ElementRef,
6
6
  forwardRef,
7
- HostListener,
8
7
  inject,
9
8
  input,
10
9
  model,
@@ -23,10 +22,10 @@ export interface SelectOption {
23
22
 
24
23
  @Component({
25
24
  selector: 'sny-select',
26
- standalone: true,
27
25
  changeDetection: ChangeDetectionStrategy.OnPush,
28
26
  host: {
29
27
  class: 'relative inline-block w-full',
28
+ '(document:click)': 'onDocumentClick($event)',
30
29
  },
31
30
  providers: [
32
31
  { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SnySelectComponent), multi: true },
@@ -228,7 +227,6 @@ export class SnySelectComponent implements ControlValueAccessor, OnDestroy {
228
227
  }
229
228
  }
230
229
 
231
- @HostListener('document:click', ['$event'])
232
230
  onDocumentClick(event: MouseEvent): void {
233
231
  if (!this.elRef.nativeElement.contains(event.target)) {
234
232
  this.close();
@@ -4,7 +4,6 @@ import { cn } from '../core/utils/cn';
4
4
 
5
5
  @Directive({
6
6
  selector: '[snySheetHeader]',
7
- standalone: true,
8
7
  host: { '[class]': 'computedClass()' },
9
8
  })
10
9
  export class SnySheetHeaderDirective {
@@ -16,7 +15,6 @@ export class SnySheetHeaderDirective {
16
15
 
17
16
  @Directive({
18
17
  selector: '[snySheetTitle]',
19
- standalone: true,
20
18
  host: { '[class]': 'computedClass()' },
21
19
  })
22
20
  export class SnySheetTitleDirective {
@@ -28,7 +26,6 @@ export class SnySheetTitleDirective {
28
26
 
29
27
  @Directive({
30
28
  selector: '[snySheetDescription]',
31
- standalone: true,
32
29
  host: { '[class]': 'computedClass()' },
33
30
  })
34
31
  export class SnySheetDescriptionDirective {
@@ -40,7 +37,6 @@ export class SnySheetDescriptionDirective {
40
37
 
41
38
  @Directive({
42
39
  selector: '[snySheetContent]',
43
- standalone: true,
44
40
  host: { '[class]': 'computedClass()' },
45
41
  })
46
42
  export class SnySheetContentDirective {
@@ -52,7 +48,6 @@ export class SnySheetContentDirective {
52
48
 
53
49
  @Directive({
54
50
  selector: '[snySheetClose]',
55
- standalone: true,
56
51
  host: {
57
52
  '[class]': 'computedClass()',
58
53
  '(click)': 'onClick()',
@@ -4,7 +4,6 @@ import { skeletonVariants, type SkeletonVariant, type SkeletonSize } from './ske
4
4
 
5
5
  @Directive({
6
6
  selector: '[snySkeleton]',
7
- standalone: true,
8
7
  host: {
9
8
  '[class]': 'computedClass()',
10
9
  'aria-busy': 'true',
@@ -5,7 +5,6 @@ import { sliderTrackVariants, sliderThumbSize, type SliderSize } from './slider.
5
5
 
6
6
  @Component({
7
7
  selector: 'sny-slider',
8
- standalone: true,
9
8
  changeDetection: ChangeDetectionStrategy.OnPush,
10
9
  host: {
11
10
  class: 'block',
@@ -7,7 +7,6 @@ let statIdCounter = 0;
7
7
 
8
8
  @Directive({
9
9
  selector: '[snyStat]',
10
- standalone: true,
11
10
  providers: [{ provide: SNY_STAT, useExisting: SnyStatDirective }],
12
11
  host: { '[class]': 'computedClass()' },
13
12
  })
@@ -21,7 +20,6 @@ export class SnyStatDirective {
21
20
 
22
21
  @Directive({
23
22
  selector: '[snyStatTitle]',
24
- standalone: true,
25
23
  host: {
26
24
  '[class]': 'computedClass()',
27
25
  '[id]': 'stat.titleId',
@@ -37,7 +35,6 @@ export class SnyStatTitleDirective {
37
35
 
38
36
  @Directive({
39
37
  selector: '[snyStatValue]',
40
- standalone: true,
41
38
  host: {
42
39
  '[class]': 'computedClass()',
43
40
  '[attr.aria-labelledby]': 'stat.titleId',
@@ -55,7 +52,6 @@ export type StatDescriptionVariant = 'default' | 'success' | 'error';
55
52
 
56
53
  @Directive({
57
54
  selector: '[snyStatDescription]',
58
- standalone: true,
59
55
  host: { '[class]': 'computedClass()' },
60
56
  })
61
57
  export class SnyStatDescriptionDirective {
@@ -73,7 +69,6 @@ export class SnyStatDescriptionDirective {
73
69
 
74
70
  @Directive({
75
71
  selector: '[snyStatFigure]',
76
- standalone: true,
77
72
  host: { '[class]': 'computedClass()' },
78
73
  })
79
74
  export class SnyStatFigureDirective {
@@ -13,7 +13,6 @@ const variantLabels: Record<StatusVariant, string> = {
13
13
 
14
14
  @Directive({
15
15
  selector: '[snyStatus]',
16
- standalone: true,
17
16
  host: {
18
17
  'role': 'status',
19
18
  '[attr.aria-label]': 'ariaLabel()',
@@ -9,7 +9,6 @@ export type StepsSize = 'sm' | 'md' | 'lg';
9
9
 
10
10
  @Directive({
11
11
  selector: '[snyStep]',
12
- standalone: true,
13
12
  host: {
14
13
  'role': 'listitem',
15
14
  '[class]': 'computedClass()',
@@ -46,7 +45,6 @@ export class SnyStepDirective {
46
45
 
47
46
  @Directive({
48
47
  selector: '[snySteps]',
49
- standalone: true,
50
48
  exportAs: 'snySteps',
51
49
  providers: [{ provide: SNY_STEPS, useExisting: SnyStepsDirective }],
52
50
  host: {
@@ -5,7 +5,6 @@ import { switchTrackVariants, switchThumbSize, switchThumbTranslate, type Switch
5
5
 
6
6
  @Component({
7
7
  selector: 'sny-switch',
8
- standalone: true,
9
8
  changeDetection: ChangeDetectionStrategy.OnPush,
10
9
  host: { class: 'inline-flex' },
11
10
  providers: [
@@ -6,7 +6,6 @@ export const SNY_TABLE = new InjectionToken<SnyTableDirective>('SnyTable');
6
6
 
7
7
  @Directive({
8
8
  selector: 'table[snyTable]',
9
- standalone: true,
10
9
  providers: [{ provide: SNY_TABLE, useExisting: SnyTableDirective }],
11
10
  host: { '[class]': 'computedClass()' },
12
11
  })
@@ -24,7 +23,6 @@ export class SnyTableDirective {
24
23
 
25
24
  @Directive({
26
25
  selector: 'thead[snyTableHeader]',
27
- standalone: true,
28
26
  host: { '[class]': 'computedClass()' },
29
27
  })
30
28
  export class SnyTableHeaderDirective {
@@ -42,7 +40,6 @@ export class SnyTableHeaderDirective {
42
40
 
43
41
  @Directive({
44
42
  selector: 'tbody[snyTableBody]',
45
- standalone: true,
46
43
  host: { '[class]': 'computedClass()' },
47
44
  })
48
45
  export class SnyTableBodyDirective {
@@ -55,7 +52,6 @@ export class SnyTableBodyDirective {
55
52
 
56
53
  @Directive({
57
54
  selector: 'tr[snyTableRow]',
58
- standalone: true,
59
55
  host: { '[class]': 'computedClass()' },
60
56
  })
61
57
  export class SnyTableRowDirective {
@@ -73,7 +69,6 @@ export class SnyTableRowDirective {
73
69
 
74
70
  @Directive({
75
71
  selector: 'th[snyTableHead]',
76
- standalone: true,
77
72
  host: { '[class]': 'computedClass()' },
78
73
  })
79
74
  export class SnyTableHeadDirective {
@@ -91,7 +86,6 @@ export class SnyTableHeadDirective {
91
86
 
92
87
  @Directive({
93
88
  selector: 'td[snyTableCell]',
94
- standalone: true,
95
89
  host: { '[class]': 'computedClass()' },
96
90
  })
97
91
  export class SnyTableCellDirective {
@@ -109,7 +103,6 @@ export class SnyTableCellDirective {
109
103
 
110
104
  @Directive({
111
105
  selector: 'tfoot[snyTableFooter]',
112
- standalone: true,
113
106
  host: { '[class]': 'computedClass()' },
114
107
  })
115
108
  export class SnyTableFooterDirective {
@@ -122,7 +115,6 @@ export class SnyTableFooterDirective {
122
115
 
123
116
  @Directive({
124
117
  selector: 'caption[snyTableCaption]',
125
- standalone: true,
126
118
  host: { '[class]': 'computedClass()' },
127
119
  })
128
120
  export class SnyTableCaptionDirective {
@@ -5,7 +5,6 @@ export const SNY_TABS = new InjectionToken<SnyTabsDirective>('SnyTabs');
5
5
 
6
6
  @Directive({
7
7
  selector: '[snyTabs]',
8
- standalone: true,
9
8
  exportAs: 'snyTabs',
10
9
  providers: [{ provide: SNY_TABS, useExisting: SnyTabsDirective }],
11
10
  host: { '[class]': 'computedClass()' },
@@ -25,7 +24,6 @@ export class SnyTabsDirective {
25
24
 
26
25
  @Directive({
27
26
  selector: '[snyTabsList]',
28
- standalone: true,
29
27
  host: {
30
28
  role: 'tablist',
31
29
  '[class]': 'computedClass()',
@@ -81,7 +79,6 @@ export class SnyTabsListDirective {
81
79
 
82
80
  @Directive({
83
81
  selector: '[snyTabsTrigger]',
84
- standalone: true,
85
82
  host: {
86
83
  role: 'tab',
87
84
  '[class]': 'computedClass()',
@@ -110,7 +107,6 @@ export class SnyTabsTriggerDirective {
110
107
 
111
108
  @Directive({
112
109
  selector: '[snyTabsContent]',
113
- standalone: true,
114
110
  host: {
115
111
  role: 'tabpanel',
116
112
  '[class]': 'computedClass()',
@@ -0,0 +1,2 @@
1
+ export { SnyTagInputComponent } from './tag-input.component';
2
+ export { tagInputContainerVariants, tagVariants, type TagInputSize } from './tag-input.variants';