@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.
- package/README.md +109 -55
- package/fesm2022/sonny-ui-core.mjs +617 -178
- package/fesm2022/sonny-ui-core.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/accordion/accordion.directives.ts +0 -4
- package/src/lib/alert/alert.directives.ts +0 -3
- package/src/lib/avatar/avatar.component.ts +0 -1
- package/src/lib/avatar-group/avatar-group.component.spec.ts +74 -0
- package/src/lib/avatar-group/avatar-group.component.ts +88 -0
- package/src/lib/avatar-group/index.ts +1 -0
- package/src/lib/badge/badge.directive.ts +0 -1
- package/src/lib/breadcrumb/breadcrumb.directives.ts +0 -6
- package/src/lib/button/button.directive.ts +0 -1
- package/src/lib/button-group/button-group.directive.ts +0 -1
- package/src/lib/calendar/calendar.component.ts +0 -1
- package/src/lib/card/card.directives.ts +0 -6
- package/src/lib/carousel/carousel.directives.ts +0 -5
- package/src/lib/chat-bubble/chat-bubble.directives.ts +0 -6
- package/src/lib/checkbox/checkbox.directive.ts +0 -1
- package/src/lib/color-picker/color-picker.component.ts +5 -5
- package/src/lib/combobox/combobox.component.ts +1 -3
- package/src/lib/command-palette/command-palette.component.ts +0 -1
- package/src/lib/data-table/data-table.component.ts +0 -1
- package/src/lib/data-table/data-table.directives.ts +0 -4
- package/src/lib/date-picker/date-picker.component.ts +5 -5
- package/src/lib/date-range-picker/date-range-picker.component.ts +5 -5
- package/src/lib/diff/diff.component.ts +0 -1
- package/src/lib/divider/divider.component.ts +0 -1
- package/src/lib/dock/dock.directives.ts +0 -2
- package/src/lib/drawer/drawer.directives.ts +0 -3
- package/src/lib/dropdown/dropdown.directives.ts +3 -10
- package/src/lib/fab/fab.directives.ts +0 -3
- package/src/lib/fieldset/fieldset.directives.ts +0 -3
- package/src/lib/file-input/file-input.component.ts +0 -1
- package/src/lib/indicator/indicator.directives.ts +0 -2
- package/src/lib/input/input.directive.ts +0 -1
- package/src/lib/input/label.directive.ts +0 -1
- package/src/lib/kbd/kbd.directive.ts +0 -1
- package/src/lib/link/link.directive.ts +0 -1
- package/src/lib/list/list.directives.ts +0 -5
- package/src/lib/loader/loader.component.ts +0 -1
- package/src/lib/modal/dialog.directives.ts +0 -6
- package/src/lib/navbar/navbar.directives.ts +0 -4
- package/src/lib/number-input/index.ts +2 -0
- package/src/lib/number-input/number-input.component.spec.ts +151 -0
- package/src/lib/number-input/number-input.component.ts +152 -0
- package/src/lib/number-input/number-input.variants.ts +17 -0
- package/src/lib/otp-input/otp-input.component.ts +0 -1
- package/src/lib/pagination/pagination.component.ts +0 -1
- package/src/lib/popover/index.ts +6 -0
- package/src/lib/popover/popover.directives.spec.ts +147 -0
- package/src/lib/popover/popover.directives.ts +151 -0
- package/src/lib/progress/progress.component.ts +0 -1
- package/src/lib/radial-progress/radial-progress.component.ts +0 -1
- package/src/lib/radio/radio.directive.ts +0 -1
- package/src/lib/rating/rating.component.ts +0 -1
- package/src/lib/select/select.component.ts +1 -3
- package/src/lib/sheet/sheet.directives.ts +0 -5
- package/src/lib/skeleton/skeleton.directive.ts +0 -1
- package/src/lib/slider/slider.component.ts +0 -1
- package/src/lib/stat/stat.directives.ts +0 -5
- package/src/lib/status/status.directive.ts +0 -1
- package/src/lib/steps/steps.directives.ts +0 -2
- package/src/lib/switch/switch.component.ts +0 -1
- package/src/lib/table/table.directives.ts +0 -8
- package/src/lib/tabs/tabs.directives.ts +0 -4
- package/src/lib/tag-input/index.ts +2 -0
- package/src/lib/tag-input/tag-input.component.spec.ts +190 -0
- package/src/lib/tag-input/tag-input.component.ts +172 -0
- package/src/lib/tag-input/tag-input.variants.ts +31 -0
- package/src/lib/textarea/textarea.directive.ts +0 -1
- package/src/lib/timeline/timeline.directives.ts +0 -5
- package/src/lib/toast/toaster.component.ts +0 -1
- package/src/lib/toggle/toggle.directive.ts +0 -1
- package/src/lib/tooltip/tooltip.directive.ts +0 -1
- package/src/lib/validator/validator.directives.ts +0 -2
- package/types/sonny-ui-core.d.ts +147 -2
|
@@ -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
|
+
}
|
|
@@ -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()',
|
|
@@ -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 {
|
|
@@ -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: {
|
|
@@ -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()',
|