@lumston/ds-angular 0.0.7 → 0.0.8

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 (38) hide show
  1. package/fesm2022/lumston-ds-angular-src-data-display.mjs +215 -0
  2. package/fesm2022/lumston-ds-angular-src-data-display.mjs.map +1 -0
  3. package/fesm2022/lumston-ds-angular-src-dropdown.mjs +94 -0
  4. package/fesm2022/lumston-ds-angular-src-dropdown.mjs.map +1 -0
  5. package/fesm2022/lumston-ds-angular-src-feedback.mjs +400 -0
  6. package/fesm2022/lumston-ds-angular-src-feedback.mjs.map +1 -0
  7. package/fesm2022/lumston-ds-angular-src-icon.mjs +148 -0
  8. package/fesm2022/lumston-ds-angular-src-icon.mjs.map +1 -0
  9. package/fesm2022/lumston-ds-angular-src-inputs.mjs +1132 -0
  10. package/fesm2022/lumston-ds-angular-src-inputs.mjs.map +1 -0
  11. package/fesm2022/lumston-ds-angular-src-navigation.mjs +473 -0
  12. package/fesm2022/lumston-ds-angular-src-navigation.mjs.map +1 -0
  13. package/fesm2022/lumston-ds-angular-src-overlay.mjs +1038 -0
  14. package/fesm2022/lumston-ds-angular-src-overlay.mjs.map +1 -0
  15. package/fesm2022/lumston-ds-angular-src-typography.mjs +303 -0
  16. package/fesm2022/lumston-ds-angular-src-typography.mjs.map +1 -0
  17. package/fesm2022/lumston-ds-angular.mjs +90 -65
  18. package/fesm2022/lumston-ds-angular.mjs.map +1 -1
  19. package/package.json +58 -32
  20. package/styles/index.css +0 -24
  21. package/styles/ls-icons.css +482 -0
  22. package/types/lumston-ds-angular-src-data-display.d.ts +50 -0
  23. package/types/lumston-ds-angular-src-data-display.d.ts.map +1 -0
  24. package/types/lumston-ds-angular-src-dropdown.d.ts +28 -0
  25. package/types/lumston-ds-angular-src-dropdown.d.ts.map +1 -0
  26. package/types/lumston-ds-angular-src-feedback.d.ts +75 -0
  27. package/types/lumston-ds-angular-src-feedback.d.ts.map +1 -0
  28. package/types/lumston-ds-angular-src-icon.d.ts +27 -0
  29. package/types/lumston-ds-angular-src-icon.d.ts.map +1 -0
  30. package/types/lumston-ds-angular-src-inputs.d.ts +201 -0
  31. package/types/lumston-ds-angular-src-inputs.d.ts.map +1 -0
  32. package/types/lumston-ds-angular-src-navigation.d.ts +186 -0
  33. package/types/lumston-ds-angular-src-navigation.d.ts.map +1 -0
  34. package/types/lumston-ds-angular-src-overlay.d.ts +357 -0
  35. package/types/lumston-ds-angular-src-overlay.d.ts.map +1 -0
  36. package/types/lumston-ds-angular-src-typography.d.ts +51 -0
  37. package/types/lumston-ds-angular-src-typography.d.ts.map +1 -0
  38. package/types/lumston-ds-angular.d.ts.map +1 -1
@@ -0,0 +1,1132 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, output, ChangeDetectionStrategy, Component, signal, effect, computed, forwardRef, Renderer2, DestroyRef, model, viewChild } from '@angular/core';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
+ import { DomSanitizer } from '@angular/platform-browser';
5
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
+
7
+ class ButtonComponent {
8
+ constructor() {
9
+ this._elementRef = inject((ElementRef));
10
+ this.sanitizer = inject(DomSanitizer);
11
+ /** Host element of this component. Pass directly as `anchorEl` to overlay components like `ls-menu`. */
12
+ this.nativeElement = this._elementRef.nativeElement;
13
+ this.variant = input('contained', ...(ngDevMode ? [{ debugName: "variant" }] : []));
14
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
15
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
16
+ this.type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : []));
17
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
18
+ this.fullWidth = input(false, ...(ngDevMode ? [{ debugName: "fullWidth" }] : []));
19
+ this.startIcon = input(...(ngDevMode ? [undefined, { debugName: "startIcon" }] : []));
20
+ this.endIcon = input(...(ngDevMode ? [undefined, { debugName: "endIcon" }] : []));
21
+ this.loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
22
+ this.loadingIndicator = input('spinner', ...(ngDevMode ? [{ debugName: "loadingIndicator" }] : []));
23
+ this.loadingPosition = input('center', ...(ngDevMode ? [{ debugName: "loadingPosition" }] : []));
24
+ this.rounded = input(false, ...(ngDevMode ? [{ debugName: "rounded" }] : []));
25
+ this.clicked = output();
26
+ }
27
+ get isCustomText() {
28
+ return this.loadingIndicator() !== 'spinner';
29
+ }
30
+ get iconSizeClass() {
31
+ switch (this.size()) {
32
+ case 'small':
33
+ return 'btn-icon--sm';
34
+ case 'large':
35
+ return 'btn-icon--lg';
36
+ default:
37
+ return 'btn-icon--md';
38
+ }
39
+ }
40
+ get showStartIcon() {
41
+ if (!this.startIcon())
42
+ return false;
43
+ if (!this.loading())
44
+ return true;
45
+ return this.loadingPosition() === 'end' && !this.isCustomText;
46
+ }
47
+ get showEndIcon() {
48
+ if (!this.endIcon())
49
+ return false;
50
+ if (!this.loading())
51
+ return true;
52
+ return this.loadingPosition() === 'start' && !this.isCustomText;
53
+ }
54
+ get sanitizedStartIcon() {
55
+ return this.sanitizer.bypassSecurityTrustHtml(this.startIcon() ?? '');
56
+ }
57
+ get sanitizedEndIcon() {
58
+ return this.sanitizer.bypassSecurityTrustHtml(this.endIcon() ?? '');
59
+ }
60
+ get buttonClasses() {
61
+ const classes = ['btn'];
62
+ const variant = this.variant();
63
+ const color = this.color();
64
+ // Variant + color mapping
65
+ if (variant === 'contained') {
66
+ classes.push(`btn-${color}`);
67
+ }
68
+ if (variant === 'outline') {
69
+ classes.push(`btn-outline-${color}`);
70
+ }
71
+ if (variant === 'text') {
72
+ classes.push(`btn-text-${color}`);
73
+ }
74
+ // Size
75
+ switch (this.size()) {
76
+ case 'small':
77
+ classes.push('btn-sm');
78
+ break;
79
+ case 'large':
80
+ classes.push('btn-lg');
81
+ break;
82
+ default:
83
+ classes.push('btn-md');
84
+ }
85
+ if (this.fullWidth()) {
86
+ classes.push('btn-full-width');
87
+ }
88
+ if (this.rounded()) {
89
+ classes.push('btn-rounded');
90
+ }
91
+ return classes.join(' ');
92
+ }
93
+ onClick(event) {
94
+ if (!this.disabled() && !this.loading()) {
95
+ this.clicked.emit(event);
96
+ }
97
+ }
98
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: ButtonComponent, isStandalone: true, selector: "ls-button", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, fullWidth: { classPropertyName: "fullWidth", publicName: "fullWidth", isSignal: true, isRequired: false, transformFunction: null }, startIcon: { classPropertyName: "startIcon", publicName: "startIcon", isSignal: true, isRequired: false, transformFunction: null }, endIcon: { classPropertyName: "endIcon", publicName: "endIcon", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, loadingIndicator: { classPropertyName: "loadingIndicator", publicName: "loadingIndicator", isSignal: true, isRequired: false, transformFunction: null }, loadingPosition: { classPropertyName: "loadingPosition", publicName: "loadingPosition", isSignal: true, isRequired: false, transformFunction: null }, rounded: { classPropertyName: "rounded", publicName: "rounded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
100
+ <button
101
+ [type]="type()"
102
+ [disabled]="disabled() || loading()"
103
+ [class]="buttonClasses"
104
+ (click)="onClick($event)">
105
+ <ng-template #spinner>
106
+ <svg class="btn-spinner" viewBox="0 0 24 24" fill="none">
107
+ <circle
108
+ class="btn-spinner-circle"
109
+ cx="12"
110
+ cy="12"
111
+ r="10"
112
+ stroke="currentColor"
113
+ stroke-width="4" />
114
+ <path
115
+ class="btn-spinner-path"
116
+ fill="currentColor"
117
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
118
+ </svg>
119
+ </ng-template>
120
+
121
+ @if (showStartIcon) {
122
+ <span
123
+ class="btn-icon btn-icon--start"
124
+ [class]="iconSizeClass"
125
+ [innerHTML]="sanitizedStartIcon"></span>
126
+ }
127
+
128
+ @if (loading() && isCustomText) {
129
+ <span class="btn-loading-overlay">
130
+ {{ loadingIndicator() }}
131
+ </span>
132
+ }
133
+
134
+ @if (loading() && !isCustomText && loadingPosition() === 'start') {
135
+ <span class="btn-loading-inline btn-loading-inline--start">
136
+ <ng-container *ngTemplateOutlet="spinner" />
137
+ </span>
138
+ }
139
+
140
+ @if (loading() && !isCustomText && loadingPosition() === 'center') {
141
+ <span class="btn-loading-overlay">
142
+ <ng-container *ngTemplateOutlet="spinner" />
143
+ </span>
144
+ }
145
+
146
+ <span
147
+ [class]="
148
+ loading() && (isCustomText || loadingPosition() === 'center')
149
+ ? 'btn-content--hidden'
150
+ : ''
151
+ ">
152
+ <ng-content />
153
+ </span>
154
+
155
+ @if (loading() && !isCustomText && loadingPosition() === 'end') {
156
+ <span class="btn-loading-inline btn-loading-inline--end">
157
+ <ng-container *ngTemplateOutlet="spinner" />
158
+ </span>
159
+ }
160
+ @if (showEndIcon) {
161
+ <span
162
+ class="btn-icon btn-icon--end"
163
+ [class]="iconSizeClass"
164
+ [innerHTML]="sanitizedEndIcon"></span>
165
+ }
166
+ </button>
167
+ `, isInline: true, styles: [":host{display:contents}.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--ls-border-radius-md);border:1px solid;padding:.5rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:600;box-shadow:0 10px 20px -10px;outline:none;transition:all var(--ls-transition-duration) ease;cursor:pointer}.btn-lg{padding:.625rem 1.75rem;font-size:1rem;line-height:1.5rem}.btn-sm{padding:.375rem .625rem;font-size:.75rem;line-height:1rem}.btn[disabled]{cursor:not-allowed;opacity:.6}.btn-primary{border-color:var(--ls-color-primary);background-color:var(--ls-color-primary);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #4361ee99}.btn-primary:hover{filter:brightness(.9)}.btn-secondary{border-color:var(--ls-color-secondary);background-color:var(--ls-color-secondary);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #805dca99}.btn-secondary:hover{filter:brightness(.9)}.btn-success{border-color:var(--ls-color-success);background-color:var(--ls-color-success);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #00ab5599}.btn-success:hover{filter:brightness(.9)}.btn-error{border-color:var(--ls-color-danger);background-color:var(--ls-color-danger);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #e7515a99}.btn-error:hover{filter:brightness(.9)}.btn-warning{border-color:var(--ls-color-warning);background-color:var(--ls-color-warning);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #e2a03f99}.btn-warning:hover{filter:brightness(.9)}.btn-info{border-color:var(--ls-color-info);background-color:var(--ls-color-info);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #2196f399}.btn-info:hover{filter:brightness(.9)}.btn-dark{border-color:var(--ls-color-dark);background-color:var(--ls-color-dark);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #3b3f5c99}.btn-dark:hover{filter:brightness(.9)}.btn-outline-primary{border-color:var(--ls-color-primary);color:var(--ls-color-primary);background-color:transparent;box-shadow:none}.btn-outline-primary:hover{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.btn-outline-secondary{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary);background-color:transparent;box-shadow:none}.btn-outline-secondary:hover{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.btn-outline-success{border-color:var(--ls-color-success);color:var(--ls-color-success);background-color:transparent;box-shadow:none}.btn-outline-success:hover{background-color:var(--ls-color-success);color:var(--ls-color-white)}.btn-outline-error{border-color:var(--ls-color-danger);color:var(--ls-color-danger);background-color:transparent;box-shadow:none}.btn-outline-error:hover{background-color:var(--ls-color-danger);color:var(--ls-color-white)}.btn-outline-warning{border-color:var(--ls-color-warning);color:var(--ls-color-warning);background-color:transparent;box-shadow:none}.btn-outline-warning:hover{background-color:var(--ls-color-warning);color:var(--ls-color-white)}.btn-outline-info{border-color:var(--ls-color-info);color:var(--ls-color-info);background-color:transparent;box-shadow:none}.btn-outline-info:hover{background-color:var(--ls-color-info);color:var(--ls-color-white)}.btn-outline-dark{border-color:var(--ls-color-dark);color:var(--ls-color-dark);background-color:transparent;box-shadow:none}.btn-outline-dark:hover{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.btn-text-primary{border-color:transparent;background-color:transparent;color:var(--ls-color-primary);box-shadow:none}.btn-text-primary:hover{background-color:#4361ee1a}.btn-text-secondary{border-color:transparent;background-color:transparent;color:var(--ls-color-secondary);box-shadow:none}.btn-text-secondary:hover{background-color:#805dca1a}.btn-text-success{border-color:transparent;background-color:transparent;color:var(--ls-color-success);box-shadow:none}.btn-text-success:hover{background-color:#00ab551a}.btn-text-error{border-color:transparent;background-color:transparent;color:var(--ls-color-danger);box-shadow:none}.btn-text-error:hover{background-color:#e7515a1a}.btn-text-warning{border-color:transparent;background-color:transparent;color:var(--ls-color-warning);box-shadow:none}.btn-text-warning:hover{background-color:#e2a03f1a}.btn-text-info{border-color:transparent;background-color:transparent;color:var(--ls-color-info);box-shadow:none}.btn-text-info:hover{background-color:#2196f31a}.btn-text-dark{border-color:transparent;background-color:transparent;color:var(--ls-color-dark);box-shadow:none}.btn-text-dark:hover{background-color:#3b3f5c1a}.btn-gradient{background:linear-gradient(to right,var(--ls-gradient-start),var(--ls-gradient-end));color:var(--ls-color-white);border-color:transparent}.btn-gradient:hover{background:linear-gradient(to right,var(--ls-gradient-end),var(--ls-gradient-start))}.btn-full-width{width:100%}.btn-rounded{border-radius:var(--ls-border-radius-full)}.btn-spinner{animation:ls-spin 1s linear infinite;height:1rem;width:1rem}.btn-spinner-circle{opacity:.25}.btn-spinner-path{opacity:.75}.btn-icon{flex-shrink:0;display:inline-flex}.btn-icon>svg{height:100%;width:100%}.btn-icon--start{margin-inline-end:.375rem}.btn-icon--end{margin-inline-start:.375rem}.btn-icon--sm{height:.875rem;width:.875rem}.btn-icon--md{height:1rem;width:1rem}.btn-icon--lg{height:1.25rem;width:1.25rem}.btn-loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.btn-loading-inline{display:inline-flex;align-items:center}.btn-loading-inline--start{margin-inline-end:.5rem}.btn-loading-inline--end{margin-inline-start:.5rem}.btn-content--hidden{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
168
+ }
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ButtonComponent, decorators: [{
170
+ type: Component,
171
+ args: [{ selector: 'ls-button', standalone: true, imports: [NgTemplateOutlet], template: `
172
+ <button
173
+ [type]="type()"
174
+ [disabled]="disabled() || loading()"
175
+ [class]="buttonClasses"
176
+ (click)="onClick($event)">
177
+ <ng-template #spinner>
178
+ <svg class="btn-spinner" viewBox="0 0 24 24" fill="none">
179
+ <circle
180
+ class="btn-spinner-circle"
181
+ cx="12"
182
+ cy="12"
183
+ r="10"
184
+ stroke="currentColor"
185
+ stroke-width="4" />
186
+ <path
187
+ class="btn-spinner-path"
188
+ fill="currentColor"
189
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
190
+ </svg>
191
+ </ng-template>
192
+
193
+ @if (showStartIcon) {
194
+ <span
195
+ class="btn-icon btn-icon--start"
196
+ [class]="iconSizeClass"
197
+ [innerHTML]="sanitizedStartIcon"></span>
198
+ }
199
+
200
+ @if (loading() && isCustomText) {
201
+ <span class="btn-loading-overlay">
202
+ {{ loadingIndicator() }}
203
+ </span>
204
+ }
205
+
206
+ @if (loading() && !isCustomText && loadingPosition() === 'start') {
207
+ <span class="btn-loading-inline btn-loading-inline--start">
208
+ <ng-container *ngTemplateOutlet="spinner" />
209
+ </span>
210
+ }
211
+
212
+ @if (loading() && !isCustomText && loadingPosition() === 'center') {
213
+ <span class="btn-loading-overlay">
214
+ <ng-container *ngTemplateOutlet="spinner" />
215
+ </span>
216
+ }
217
+
218
+ <span
219
+ [class]="
220
+ loading() && (isCustomText || loadingPosition() === 'center')
221
+ ? 'btn-content--hidden'
222
+ : ''
223
+ ">
224
+ <ng-content />
225
+ </span>
226
+
227
+ @if (loading() && !isCustomText && loadingPosition() === 'end') {
228
+ <span class="btn-loading-inline btn-loading-inline--end">
229
+ <ng-container *ngTemplateOutlet="spinner" />
230
+ </span>
231
+ }
232
+ @if (showEndIcon) {
233
+ <span
234
+ class="btn-icon btn-icon--end"
235
+ [class]="iconSizeClass"
236
+ [innerHTML]="sanitizedEndIcon"></span>
237
+ }
238
+ </button>
239
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:contents}.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--ls-border-radius-md);border:1px solid;padding:.5rem 1.25rem;font-size:.875rem;line-height:1.25rem;font-weight:600;box-shadow:0 10px 20px -10px;outline:none;transition:all var(--ls-transition-duration) ease;cursor:pointer}.btn-lg{padding:.625rem 1.75rem;font-size:1rem;line-height:1.5rem}.btn-sm{padding:.375rem .625rem;font-size:.75rem;line-height:1rem}.btn[disabled]{cursor:not-allowed;opacity:.6}.btn-primary{border-color:var(--ls-color-primary);background-color:var(--ls-color-primary);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #4361ee99}.btn-primary:hover{filter:brightness(.9)}.btn-secondary{border-color:var(--ls-color-secondary);background-color:var(--ls-color-secondary);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #805dca99}.btn-secondary:hover{filter:brightness(.9)}.btn-success{border-color:var(--ls-color-success);background-color:var(--ls-color-success);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #00ab5599}.btn-success:hover{filter:brightness(.9)}.btn-error{border-color:var(--ls-color-danger);background-color:var(--ls-color-danger);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #e7515a99}.btn-error:hover{filter:brightness(.9)}.btn-warning{border-color:var(--ls-color-warning);background-color:var(--ls-color-warning);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #e2a03f99}.btn-warning:hover{filter:brightness(.9)}.btn-info{border-color:var(--ls-color-info);background-color:var(--ls-color-info);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #2196f399}.btn-info:hover{filter:brightness(.9)}.btn-dark{border-color:var(--ls-color-dark);background-color:var(--ls-color-dark);color:var(--ls-color-white);box-shadow:0 10px 20px -10px #3b3f5c99}.btn-dark:hover{filter:brightness(.9)}.btn-outline-primary{border-color:var(--ls-color-primary);color:var(--ls-color-primary);background-color:transparent;box-shadow:none}.btn-outline-primary:hover{background-color:var(--ls-color-primary);color:var(--ls-color-white)}.btn-outline-secondary{border-color:var(--ls-color-secondary);color:var(--ls-color-secondary);background-color:transparent;box-shadow:none}.btn-outline-secondary:hover{background-color:var(--ls-color-secondary);color:var(--ls-color-white)}.btn-outline-success{border-color:var(--ls-color-success);color:var(--ls-color-success);background-color:transparent;box-shadow:none}.btn-outline-success:hover{background-color:var(--ls-color-success);color:var(--ls-color-white)}.btn-outline-error{border-color:var(--ls-color-danger);color:var(--ls-color-danger);background-color:transparent;box-shadow:none}.btn-outline-error:hover{background-color:var(--ls-color-danger);color:var(--ls-color-white)}.btn-outline-warning{border-color:var(--ls-color-warning);color:var(--ls-color-warning);background-color:transparent;box-shadow:none}.btn-outline-warning:hover{background-color:var(--ls-color-warning);color:var(--ls-color-white)}.btn-outline-info{border-color:var(--ls-color-info);color:var(--ls-color-info);background-color:transparent;box-shadow:none}.btn-outline-info:hover{background-color:var(--ls-color-info);color:var(--ls-color-white)}.btn-outline-dark{border-color:var(--ls-color-dark);color:var(--ls-color-dark);background-color:transparent;box-shadow:none}.btn-outline-dark:hover{background-color:var(--ls-color-dark);color:var(--ls-color-white)}.btn-text-primary{border-color:transparent;background-color:transparent;color:var(--ls-color-primary);box-shadow:none}.btn-text-primary:hover{background-color:#4361ee1a}.btn-text-secondary{border-color:transparent;background-color:transparent;color:var(--ls-color-secondary);box-shadow:none}.btn-text-secondary:hover{background-color:#805dca1a}.btn-text-success{border-color:transparent;background-color:transparent;color:var(--ls-color-success);box-shadow:none}.btn-text-success:hover{background-color:#00ab551a}.btn-text-error{border-color:transparent;background-color:transparent;color:var(--ls-color-danger);box-shadow:none}.btn-text-error:hover{background-color:#e7515a1a}.btn-text-warning{border-color:transparent;background-color:transparent;color:var(--ls-color-warning);box-shadow:none}.btn-text-warning:hover{background-color:#e2a03f1a}.btn-text-info{border-color:transparent;background-color:transparent;color:var(--ls-color-info);box-shadow:none}.btn-text-info:hover{background-color:#2196f31a}.btn-text-dark{border-color:transparent;background-color:transparent;color:var(--ls-color-dark);box-shadow:none}.btn-text-dark:hover{background-color:#3b3f5c1a}.btn-gradient{background:linear-gradient(to right,var(--ls-gradient-start),var(--ls-gradient-end));color:var(--ls-color-white);border-color:transparent}.btn-gradient:hover{background:linear-gradient(to right,var(--ls-gradient-end),var(--ls-gradient-start))}.btn-full-width{width:100%}.btn-rounded{border-radius:var(--ls-border-radius-full)}.btn-spinner{animation:ls-spin 1s linear infinite;height:1rem;width:1rem}.btn-spinner-circle{opacity:.25}.btn-spinner-path{opacity:.75}.btn-icon{flex-shrink:0;display:inline-flex}.btn-icon>svg{height:100%;width:100%}.btn-icon--start{margin-inline-end:.375rem}.btn-icon--end{margin-inline-start:.375rem}.btn-icon--sm{height:.875rem;width:.875rem}.btn-icon--md{height:1rem;width:1rem}.btn-icon--lg{height:1.25rem;width:1.25rem}.btn-loading-overlay{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}.btn-loading-inline{display:inline-flex;align-items:center}.btn-loading-inline--start{margin-inline-end:.5rem}.btn-loading-inline--end{margin-inline-start:.5rem}.btn-content--hidden{visibility:hidden}\n"] }]
240
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], fullWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "fullWidth", required: false }] }], startIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "startIcon", required: false }] }], endIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "endIcon", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], loadingIndicator: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingIndicator", required: false }] }], loadingPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingPosition", required: false }] }], rounded: [{ type: i0.Input, args: [{ isSignal: true, alias: "rounded", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
241
+
242
+ const INDETERMINATE_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">' +
243
+ '<path d="M19 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2zm-2 10H7v-2h10v2z"/>' +
244
+ '</svg>';
245
+ class CheckboxComponent {
246
+ constructor() {
247
+ this._sanitizer = inject(DomSanitizer);
248
+ this.icon = input.required(...(ngDevMode ? [{ debugName: "icon" }] : []));
249
+ this.checkedIcon = input.required(...(ngDevMode ? [{ debugName: "checkedIcon" }] : []));
250
+ this.checked = input(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
251
+ this.defaultChecked = input(false, ...(ngDevMode ? [{ debugName: "defaultChecked" }] : []));
252
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
253
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
254
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
255
+ this.indeterminate = input(false, ...(ngDevMode ? [{ debugName: "indeterminate" }] : []));
256
+ this.labelPlacement = input('end', ...(ngDevMode ? [{ debugName: "labelPlacement" }] : []));
257
+ this.changed = output();
258
+ this._isChecked = signal(false, ...(ngDevMode ? [{ debugName: "_isChecked" }] : []));
259
+ this._isFirstSync = true;
260
+ this._syncChecked = effect(() => {
261
+ const checked = this.checked();
262
+ if (this._isFirstSync) {
263
+ this._isFirstSync = false;
264
+ this._isChecked.set(checked || this.defaultChecked());
265
+ }
266
+ else {
267
+ this._isChecked.set(checked);
268
+ }
269
+ }, ...(ngDevMode ? [{ debugName: "_syncChecked" }] : []));
270
+ this.checkboxClasses = computed(() => {
271
+ const s = this.size() === 'small' ? 'sm' : 'md';
272
+ const parts = [
273
+ 'checkbox',
274
+ `checkbox-${s}`,
275
+ `checkbox-color-${this.color()}`,
276
+ `checkbox-label-${this.labelPlacement()}`,
277
+ ];
278
+ if (this._isChecked()) {
279
+ parts.push('checkbox-checked');
280
+ }
281
+ if (this.disabled()) {
282
+ parts.push('checkbox-disabled');
283
+ }
284
+ if (this.indeterminate()) {
285
+ parts.push('checkbox-indeterminate');
286
+ }
287
+ return parts.join(' ');
288
+ }, ...(ngDevMode ? [{ debugName: "checkboxClasses" }] : []));
289
+ this.currentIcon = computed(() => {
290
+ let svg;
291
+ if (this.indeterminate()) {
292
+ svg = INDETERMINATE_SVG;
293
+ }
294
+ else if (this._isChecked()) {
295
+ svg = this.checkedIcon();
296
+ }
297
+ else {
298
+ svg = this.icon();
299
+ }
300
+ return this._sanitizer.bypassSecurityTrustHtml(svg);
301
+ }, ...(ngDevMode ? [{ debugName: "currentIcon" }] : []));
302
+ }
303
+ onToggle() {
304
+ if (this.disabled()) {
305
+ return;
306
+ }
307
+ const next = !this._isChecked();
308
+ this._isChecked.set(next);
309
+ this.changed.emit(next);
310
+ }
311
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
312
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: CheckboxComponent, isStandalone: true, selector: "ls-checkbox", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, checkedIcon: { classPropertyName: "checkedIcon", publicName: "checkedIcon", isSignal: true, isRequired: true, transformFunction: null }, checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, defaultChecked: { classPropertyName: "defaultChecked", publicName: "defaultChecked", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, labelPlacement: { classPropertyName: "labelPlacement", publicName: "labelPlacement", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed" }, ngImport: i0, template: `
313
+ <label [class]="checkboxClasses()">
314
+ <input
315
+ type="checkbox"
316
+ class="checkbox-input"
317
+ [checked]="_isChecked()"
318
+ [disabled]="disabled()"
319
+ [indeterminate]="indeterminate()"
320
+ (change)="onToggle()"
321
+ />
322
+ <span
323
+ class="checkbox-icon"
324
+ [innerHTML]="currentIcon()"
325
+ ></span>
326
+ <span class="checkbox-label">
327
+ <ng-content />
328
+ </span>
329
+ </label>
330
+ `, isInline: true, styles: [":host{display:inline-flex}.checkbox{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative;transition:opacity var(--ls-transition-duration)}.checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.checkbox-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.checkbox-icon svg{width:100%;height:100%}.checkbox-label{-webkit-user-select:none;user-select:none;cursor:pointer}.checkbox-sm .checkbox-icon{width:18px;height:18px}.checkbox-sm .checkbox-label{font-size:.875rem}.checkbox-md .checkbox-icon{width:1.25rem;height:1.25rem}.checkbox-md .checkbox-label{font-size:.875rem}.checkbox-label-end{flex-direction:row}.checkbox-label-start{flex-direction:row-reverse}.checkbox-label-top{flex-direction:column-reverse;align-items:center}.checkbox-label-bottom{flex-direction:column;align-items:center}.checkbox-color-inherit.checkbox-checked .checkbox-icon,.checkbox-color-inherit.checkbox-indeterminate .checkbox-icon{color:inherit}.checkbox-color-primary.checkbox-checked .checkbox-icon,.checkbox-color-primary.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-primary)}.checkbox-color-secondary.checkbox-checked .checkbox-icon,.checkbox-color-secondary.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-secondary)}.checkbox-color-success.checkbox-checked .checkbox-icon,.checkbox-color-success.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-success)}.checkbox-color-error.checkbox-checked .checkbox-icon,.checkbox-color-error.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-danger)}.checkbox-color-info.checkbox-checked .checkbox-icon,.checkbox-color-info.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-info)}.checkbox-color-warning.checkbox-checked .checkbox-icon,.checkbox-color-warning.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-warning)}.checkbox:not(.checkbox-checked):not(.checkbox-indeterminate) .checkbox-icon{color:var(--ls-color-dark)}.checkbox-disabled{cursor:not-allowed;opacity:.5}.checkbox-disabled .checkbox-label{cursor:not-allowed}.checkbox-input:focus-visible+.checkbox-icon{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}body.dark .checkbox:not(.checkbox-checked):not(.checkbox-indeterminate) .checkbox-icon{color:#e0e6ed}body.dark .checkbox-label{color:#e0e6ed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
331
+ }
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CheckboxComponent, decorators: [{
333
+ type: Component,
334
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ls-checkbox', standalone: true, template: `
335
+ <label [class]="checkboxClasses()">
336
+ <input
337
+ type="checkbox"
338
+ class="checkbox-input"
339
+ [checked]="_isChecked()"
340
+ [disabled]="disabled()"
341
+ [indeterminate]="indeterminate()"
342
+ (change)="onToggle()"
343
+ />
344
+ <span
345
+ class="checkbox-icon"
346
+ [innerHTML]="currentIcon()"
347
+ ></span>
348
+ <span class="checkbox-label">
349
+ <ng-content />
350
+ </span>
351
+ </label>
352
+ `, styles: [":host{display:inline-flex}.checkbox{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative;transition:opacity var(--ls-transition-duration)}.checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.checkbox-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.checkbox-icon svg{width:100%;height:100%}.checkbox-label{-webkit-user-select:none;user-select:none;cursor:pointer}.checkbox-sm .checkbox-icon{width:18px;height:18px}.checkbox-sm .checkbox-label{font-size:.875rem}.checkbox-md .checkbox-icon{width:1.25rem;height:1.25rem}.checkbox-md .checkbox-label{font-size:.875rem}.checkbox-label-end{flex-direction:row}.checkbox-label-start{flex-direction:row-reverse}.checkbox-label-top{flex-direction:column-reverse;align-items:center}.checkbox-label-bottom{flex-direction:column;align-items:center}.checkbox-color-inherit.checkbox-checked .checkbox-icon,.checkbox-color-inherit.checkbox-indeterminate .checkbox-icon{color:inherit}.checkbox-color-primary.checkbox-checked .checkbox-icon,.checkbox-color-primary.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-primary)}.checkbox-color-secondary.checkbox-checked .checkbox-icon,.checkbox-color-secondary.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-secondary)}.checkbox-color-success.checkbox-checked .checkbox-icon,.checkbox-color-success.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-success)}.checkbox-color-error.checkbox-checked .checkbox-icon,.checkbox-color-error.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-danger)}.checkbox-color-info.checkbox-checked .checkbox-icon,.checkbox-color-info.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-info)}.checkbox-color-warning.checkbox-checked .checkbox-icon,.checkbox-color-warning.checkbox-indeterminate .checkbox-icon{color:var(--ls-color-warning)}.checkbox:not(.checkbox-checked):not(.checkbox-indeterminate) .checkbox-icon{color:var(--ls-color-dark)}.checkbox-disabled{cursor:not-allowed;opacity:.5}.checkbox-disabled .checkbox-label{cursor:not-allowed}.checkbox-input:focus-visible+.checkbox-icon{outline:2px solid currentColor;outline-offset:2px;border-radius:2px}body.dark .checkbox:not(.checkbox-checked):not(.checkbox-indeterminate) .checkbox-icon{color:#e0e6ed}body.dark .checkbox-label{color:#e0e6ed}\n"] }]
353
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: true }] }], checkedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "checkedIcon", required: true }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], defaultChecked: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultChecked", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], labelPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPlacement", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
354
+
355
+ class IconButtonComponent {
356
+ constructor() {
357
+ this.sanitizer = inject(DomSanitizer);
358
+ this.icon = input.required(...(ngDevMode ? [{ debugName: "icon" }] : []));
359
+ this.ariaLabel = input.required(...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
360
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
361
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
362
+ this.type = input('button', ...(ngDevMode ? [{ debugName: "type" }] : []));
363
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
364
+ this.loading = input(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
365
+ this.clicked = output();
366
+ }
367
+ get sanitizedIcon() {
368
+ return this.sanitizer.bypassSecurityTrustHtml(this.icon());
369
+ }
370
+ get buttonClasses() {
371
+ const classes = ['icon-btn'];
372
+ classes.push(`icon-btn-${this.color()}`);
373
+ switch (this.size()) {
374
+ case 'small':
375
+ classes.push('icon-btn-sm');
376
+ break;
377
+ case 'large':
378
+ classes.push('icon-btn-lg');
379
+ break;
380
+ default:
381
+ classes.push('icon-btn-md');
382
+ }
383
+ return classes.join(' ');
384
+ }
385
+ onClick(event) {
386
+ if (!this.disabled() && !this.loading()) {
387
+ this.clicked.emit(event);
388
+ }
389
+ }
390
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IconButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
391
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: IconButtonComponent, isStandalone: true, selector: "ls-icon-button", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: true, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
392
+ <button
393
+ [type]="type()"
394
+ [disabled]="disabled() || loading()"
395
+ [class]="buttonClasses"
396
+ [attr.aria-label]="ariaLabel()"
397
+ [attr.aria-busy]="loading() || null"
398
+ (click)="onClick($event)">
399
+ @if (loading()) {
400
+ <svg class="icon-btn-spinner" viewBox="0 0 24 24" fill="none">
401
+ <circle
402
+ class="icon-btn-spinner-circle"
403
+ cx="12"
404
+ cy="12"
405
+ r="10"
406
+ stroke="currentColor"
407
+ stroke-width="4" />
408
+ <path
409
+ class="icon-btn-spinner-path"
410
+ fill="currentColor"
411
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
412
+ </svg>
413
+ } @else {
414
+ <span class="icon-btn-icon" [innerHTML]="sanitizedIcon"></span>
415
+ }
416
+ </button>
417
+ `, isInline: true, styles: [":host{display:inline-flex}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--ls-border-radius-full);background-color:transparent;padding:0;outline:none;cursor:pointer;transition:all var(--ls-transition-duration) ease;box-shadow:none}.icon-btn-sm{width:32px;height:32px}.icon-btn-md{width:40px;height:40px}.icon-btn-lg{width:48px;height:48px}.icon-btn-sm .icon-btn-icon,.icon-btn-sm .icon-btn-spinner{width:18px;height:18px}.icon-btn-md .icon-btn-icon,.icon-btn-md .icon-btn-spinner{width:24px;height:24px}.icon-btn-lg .icon-btn-icon,.icon-btn-lg .icon-btn-spinner{width:28px;height:28px}.icon-btn-primary{color:var(--ls-color-primary)}.icon-btn-primary:hover{background-color:#4361ee1a}.icon-btn-secondary{color:var(--ls-color-secondary)}.icon-btn-secondary:hover{background-color:#805dca1a}.icon-btn-success{color:var(--ls-color-success)}.icon-btn-success:hover{background-color:#00ab551a}.icon-btn-error{color:var(--ls-color-danger)}.icon-btn-error:hover{background-color:#e7515a1a}.icon-btn-warning{color:var(--ls-color-warning)}.icon-btn-warning:hover{background-color:#e2a03f1a}.icon-btn-info{color:var(--ls-color-info)}.icon-btn-info:hover{background-color:#2196f31a}.icon-btn-dark{color:var(--ls-color-dark)}.icon-btn-dark:hover{background-color:#3b3f5c1a}.icon-btn:focus-visible{outline:2px solid currentColor;outline-offset:2px}.icon-btn[disabled]{cursor:not-allowed;opacity:.6}.icon-btn[disabled]:hover{background-color:transparent}.icon-btn-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.icon-btn-icon>svg,.icon-btn-icon svg{width:100%;height:100%}.icon-btn-spinner{animation:ls-spin 1s linear infinite}.icon-btn-spinner-circle{opacity:.25}.icon-btn-spinner-path{opacity:.75}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
418
+ }
419
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IconButtonComponent, decorators: [{
420
+ type: Component,
421
+ args: [{ selector: 'ls-icon-button', standalone: true, template: `
422
+ <button
423
+ [type]="type()"
424
+ [disabled]="disabled() || loading()"
425
+ [class]="buttonClasses"
426
+ [attr.aria-label]="ariaLabel()"
427
+ [attr.aria-busy]="loading() || null"
428
+ (click)="onClick($event)">
429
+ @if (loading()) {
430
+ <svg class="icon-btn-spinner" viewBox="0 0 24 24" fill="none">
431
+ <circle
432
+ class="icon-btn-spinner-circle"
433
+ cx="12"
434
+ cy="12"
435
+ r="10"
436
+ stroke="currentColor"
437
+ stroke-width="4" />
438
+ <path
439
+ class="icon-btn-spinner-path"
440
+ fill="currentColor"
441
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
442
+ </svg>
443
+ } @else {
444
+ <span class="icon-btn-icon" [innerHTML]="sanitizedIcon"></span>
445
+ }
446
+ </button>
447
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:inline-flex}.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;border-radius:var(--ls-border-radius-full);background-color:transparent;padding:0;outline:none;cursor:pointer;transition:all var(--ls-transition-duration) ease;box-shadow:none}.icon-btn-sm{width:32px;height:32px}.icon-btn-md{width:40px;height:40px}.icon-btn-lg{width:48px;height:48px}.icon-btn-sm .icon-btn-icon,.icon-btn-sm .icon-btn-spinner{width:18px;height:18px}.icon-btn-md .icon-btn-icon,.icon-btn-md .icon-btn-spinner{width:24px;height:24px}.icon-btn-lg .icon-btn-icon,.icon-btn-lg .icon-btn-spinner{width:28px;height:28px}.icon-btn-primary{color:var(--ls-color-primary)}.icon-btn-primary:hover{background-color:#4361ee1a}.icon-btn-secondary{color:var(--ls-color-secondary)}.icon-btn-secondary:hover{background-color:#805dca1a}.icon-btn-success{color:var(--ls-color-success)}.icon-btn-success:hover{background-color:#00ab551a}.icon-btn-error{color:var(--ls-color-danger)}.icon-btn-error:hover{background-color:#e7515a1a}.icon-btn-warning{color:var(--ls-color-warning)}.icon-btn-warning:hover{background-color:#e2a03f1a}.icon-btn-info{color:var(--ls-color-info)}.icon-btn-info:hover{background-color:#2196f31a}.icon-btn-dark{color:var(--ls-color-dark)}.icon-btn-dark:hover{background-color:#3b3f5c1a}.icon-btn:focus-visible{outline:2px solid currentColor;outline-offset:2px}.icon-btn[disabled]{cursor:not-allowed;opacity:.6}.icon-btn[disabled]:hover{background-color:transparent}.icon-btn-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}.icon-btn-icon>svg,.icon-btn-icon svg{width:100%;height:100%}.icon-btn-spinner{animation:ls-spin 1s linear infinite}.icon-btn-spinner-circle{opacity:.25}.icon-btn-spinner-path{opacity:.75}\n"] }]
448
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: true }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: true }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], clicked: [{ type: i0.Output, args: ["clicked"] }] } });
449
+
450
+ class RadioButtonComponent {
451
+ constructor() {
452
+ this.checked = input(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
453
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
454
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
455
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
456
+ this.labelPlacement = input('end', ...(ngDevMode ? [{ debugName: "labelPlacement" }] : []));
457
+ this.changed = output();
458
+ this._isChecked = signal(false, ...(ngDevMode ? [{ debugName: "_isChecked" }] : []));
459
+ this._isDisabledByCva = signal(false, ...(ngDevMode ? [{ debugName: "_isDisabledByCva" }] : []));
460
+ this._onChange = () => { };
461
+ this._onTouched = () => { };
462
+ this._syncChecked = effect(() => {
463
+ this._isChecked.set(this.checked());
464
+ }, ...(ngDevMode ? [{ debugName: "_syncChecked" }] : []));
465
+ this.radioClasses = computed(() => {
466
+ const s = this.size() === 'small' ? 'sm' : 'md';
467
+ const parts = [
468
+ 'radio',
469
+ `radio-${s}`,
470
+ `radio-color-${this.color()}`,
471
+ `radio-label-${this.labelPlacement()}`,
472
+ ];
473
+ if (this._isChecked()) {
474
+ parts.push('radio-checked');
475
+ }
476
+ if (this.isEffectivelyDisabled()) {
477
+ parts.push('radio-disabled');
478
+ }
479
+ return parts.join(' ');
480
+ }, ...(ngDevMode ? [{ debugName: "radioClasses" }] : []));
481
+ this.isEffectivelyDisabled = computed(() => this.disabled() || this._isDisabledByCva(), ...(ngDevMode ? [{ debugName: "isEffectivelyDisabled" }] : []));
482
+ }
483
+ onToggle() {
484
+ if (this.isEffectivelyDisabled()) {
485
+ return;
486
+ }
487
+ const isNext = !this._isChecked();
488
+ this._isChecked.set(isNext);
489
+ this.changed.emit(isNext);
490
+ this._onChange(isNext);
491
+ this._onTouched();
492
+ }
493
+ writeValue(value) {
494
+ this._isChecked.set(!!value);
495
+ }
496
+ registerOnChange(fn) {
497
+ this._onChange = fn;
498
+ }
499
+ registerOnTouched(fn) {
500
+ this._onTouched = fn;
501
+ }
502
+ setDisabledState(isDisabled) {
503
+ this._isDisabledByCva.set(isDisabled);
504
+ }
505
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: RadioButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.2", type: RadioButtonComponent, isStandalone: true, selector: "ls-radio-button", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, labelPlacement: { classPropertyName: "labelPlacement", publicName: "labelPlacement", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed" }, providers: [
507
+ {
508
+ provide: NG_VALUE_ACCESSOR,
509
+ useExisting: forwardRef(() => RadioButtonComponent),
510
+ multi: true,
511
+ },
512
+ ], ngImport: i0, template: `
513
+ <label [class]="radioClasses()">
514
+ <button
515
+ type="button"
516
+ role="radio"
517
+ class="radio-indicator"
518
+ [attr.aria-checked]="_isChecked()"
519
+ [disabled]="isEffectivelyDisabled()"
520
+ (click)="onToggle()"
521
+ (keydown.space)="onToggle(); $event.preventDefault()"
522
+ (keydown.enter)="onToggle(); $event.preventDefault()">
523
+ </button>
524
+ <span class="radio-label">
525
+ <ng-content />
526
+ </span>
527
+ </label>
528
+ `, isInline: true, styles: [":host{display:inline-flex}.radio{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative}.radio-indicator{position:relative;display:inline-flex;align-items:center;justify-content:center;border:2px solid #c4c4c4;border-radius:50%;background-color:transparent;padding:0;cursor:pointer;transition:border-color var(--ls-transition-duration),background-color var(--ls-transition-duration);outline:none;flex-shrink:0}.radio-indicator:after{content:\"\";position:absolute;border-radius:50%;transform:scale(0);transition:transform var(--ls-transition-duration)}.radio-checked .radio-indicator:after{transform:scale(1)}.radio-label{-webkit-user-select:none;user-select:none;cursor:pointer;font-size:.875rem}.radio-sm .radio-indicator{width:16px;height:16px}.radio-sm .radio-indicator:after{width:8px;height:8px}.radio-md .radio-indicator{width:20px;height:20px}.radio-md .radio-indicator:after{width:10px;height:10px}.radio-checked.radio-color-inherit .radio-indicator{border-color:inherit}.radio-checked.radio-color-inherit .radio-indicator:after{background-color:inherit}.radio-checked.radio-color-primary .radio-indicator{border-color:var(--ls-color-primary)}.radio-checked.radio-color-primary .radio-indicator:after{background-color:var(--ls-color-primary)}.radio-checked.radio-color-secondary .radio-indicator{border-color:var(--ls-color-secondary)}.radio-checked.radio-color-secondary .radio-indicator:after{background-color:var(--ls-color-secondary)}.radio-checked.radio-color-success .radio-indicator{border-color:var(--ls-color-success)}.radio-checked.radio-color-success .radio-indicator:after{background-color:var(--ls-color-success)}.radio-checked.radio-color-error .radio-indicator{border-color:var(--ls-color-error)}.radio-checked.radio-color-error .radio-indicator:after{background-color:var(--ls-color-error)}.radio-checked.radio-color-info .radio-indicator{border-color:var(--ls-color-info)}.radio-checked.radio-color-info .radio-indicator:after{background-color:var(--ls-color-info)}.radio-checked.radio-color-warning .radio-indicator{border-color:var(--ls-color-warning)}.radio-checked.radio-color-warning .radio-indicator:after{background-color:var(--ls-color-warning)}.radio-label-end{flex-direction:row}.radio-label-start{flex-direction:row-reverse}.radio-label-top{flex-direction:column-reverse;align-items:center}.radio-label-bottom{flex-direction:column;align-items:center}.radio-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.radio-disabled .radio-label,.radio-disabled .radio-indicator{cursor:not-allowed}.radio-indicator:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:50%}body.dark .radio-indicator{border-color:#555}body.dark .radio-label{color:#e0e6ed}body.dark .radio-checked.radio-color-primary .radio-indicator{border-color:var(--ls-color-primary)}body.dark .radio-checked.radio-color-primary .radio-indicator:after{background-color:var(--ls-color-primary)}body.dark .radio-checked.radio-color-secondary .radio-indicator{border-color:var(--ls-color-secondary)}body.dark .radio-checked.radio-color-secondary .radio-indicator:after{background-color:var(--ls-color-secondary)}body.dark .radio-checked.radio-color-success .radio-indicator{border-color:var(--ls-color-success)}body.dark .radio-checked.radio-color-success .radio-indicator:after{background-color:var(--ls-color-success)}body.dark .radio-checked.radio-color-error .radio-indicator{border-color:var(--ls-color-error)}body.dark .radio-checked.radio-color-error .radio-indicator:after{background-color:var(--ls-color-error)}body.dark .radio-checked.radio-color-info .radio-indicator{border-color:var(--ls-color-info)}body.dark .radio-checked.radio-color-info .radio-indicator:after{background-color:var(--ls-color-info)}body.dark .radio-checked.radio-color-warning .radio-indicator{border-color:var(--ls-color-warning)}body.dark .radio-checked.radio-color-warning .radio-indicator:after{background-color:var(--ls-color-warning)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
529
+ }
530
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: RadioButtonComponent, decorators: [{
531
+ type: Component,
532
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, providers: [
533
+ {
534
+ provide: NG_VALUE_ACCESSOR,
535
+ useExisting: forwardRef(() => RadioButtonComponent),
536
+ multi: true,
537
+ },
538
+ ], selector: 'ls-radio-button', standalone: true, template: `
539
+ <label [class]="radioClasses()">
540
+ <button
541
+ type="button"
542
+ role="radio"
543
+ class="radio-indicator"
544
+ [attr.aria-checked]="_isChecked()"
545
+ [disabled]="isEffectivelyDisabled()"
546
+ (click)="onToggle()"
547
+ (keydown.space)="onToggle(); $event.preventDefault()"
548
+ (keydown.enter)="onToggle(); $event.preventDefault()">
549
+ </button>
550
+ <span class="radio-label">
551
+ <ng-content />
552
+ </span>
553
+ </label>
554
+ `, styles: [":host{display:inline-flex}.radio{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative}.radio-indicator{position:relative;display:inline-flex;align-items:center;justify-content:center;border:2px solid #c4c4c4;border-radius:50%;background-color:transparent;padding:0;cursor:pointer;transition:border-color var(--ls-transition-duration),background-color var(--ls-transition-duration);outline:none;flex-shrink:0}.radio-indicator:after{content:\"\";position:absolute;border-radius:50%;transform:scale(0);transition:transform var(--ls-transition-duration)}.radio-checked .radio-indicator:after{transform:scale(1)}.radio-label{-webkit-user-select:none;user-select:none;cursor:pointer;font-size:.875rem}.radio-sm .radio-indicator{width:16px;height:16px}.radio-sm .radio-indicator:after{width:8px;height:8px}.radio-md .radio-indicator{width:20px;height:20px}.radio-md .radio-indicator:after{width:10px;height:10px}.radio-checked.radio-color-inherit .radio-indicator{border-color:inherit}.radio-checked.radio-color-inherit .radio-indicator:after{background-color:inherit}.radio-checked.radio-color-primary .radio-indicator{border-color:var(--ls-color-primary)}.radio-checked.radio-color-primary .radio-indicator:after{background-color:var(--ls-color-primary)}.radio-checked.radio-color-secondary .radio-indicator{border-color:var(--ls-color-secondary)}.radio-checked.radio-color-secondary .radio-indicator:after{background-color:var(--ls-color-secondary)}.radio-checked.radio-color-success .radio-indicator{border-color:var(--ls-color-success)}.radio-checked.radio-color-success .radio-indicator:after{background-color:var(--ls-color-success)}.radio-checked.radio-color-error .radio-indicator{border-color:var(--ls-color-error)}.radio-checked.radio-color-error .radio-indicator:after{background-color:var(--ls-color-error)}.radio-checked.radio-color-info .radio-indicator{border-color:var(--ls-color-info)}.radio-checked.radio-color-info .radio-indicator:after{background-color:var(--ls-color-info)}.radio-checked.radio-color-warning .radio-indicator{border-color:var(--ls-color-warning)}.radio-checked.radio-color-warning .radio-indicator:after{background-color:var(--ls-color-warning)}.radio-label-end{flex-direction:row}.radio-label-start{flex-direction:row-reverse}.radio-label-top{flex-direction:column-reverse;align-items:center}.radio-label-bottom{flex-direction:column;align-items:center}.radio-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.radio-disabled .radio-label,.radio-disabled .radio-indicator{cursor:not-allowed}.radio-indicator:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:50%}body.dark .radio-indicator{border-color:#555}body.dark .radio-label{color:#e0e6ed}body.dark .radio-checked.radio-color-primary .radio-indicator{border-color:var(--ls-color-primary)}body.dark .radio-checked.radio-color-primary .radio-indicator:after{background-color:var(--ls-color-primary)}body.dark .radio-checked.radio-color-secondary .radio-indicator{border-color:var(--ls-color-secondary)}body.dark .radio-checked.radio-color-secondary .radio-indicator:after{background-color:var(--ls-color-secondary)}body.dark .radio-checked.radio-color-success .radio-indicator{border-color:var(--ls-color-success)}body.dark .radio-checked.radio-color-success .radio-indicator:after{background-color:var(--ls-color-success)}body.dark .radio-checked.radio-color-error .radio-indicator{border-color:var(--ls-color-error)}body.dark .radio-checked.radio-color-error .radio-indicator:after{background-color:var(--ls-color-error)}body.dark .radio-checked.radio-color-info .radio-indicator{border-color:var(--ls-color-info)}body.dark .radio-checked.radio-color-info .radio-indicator:after{background-color:var(--ls-color-info)}body.dark .radio-checked.radio-color-warning .radio-indicator{border-color:var(--ls-color-warning)}body.dark .radio-checked.radio-color-warning .radio-indicator:after{background-color:var(--ls-color-warning)}\n"] }]
555
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], labelPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPlacement", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
556
+
557
+ class SliderComponent {
558
+ constructor() {
559
+ this._renderer = inject(Renderer2);
560
+ this._destroyRef = inject(DestroyRef);
561
+ this._elementRef = inject(ElementRef);
562
+ this.value = model(0, ...(ngDevMode ? [{ debugName: "value" }] : []));
563
+ this.defaultValue = input(...(ngDevMode ? [undefined, { debugName: "defaultValue" }] : []));
564
+ this.min = input(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
565
+ this.max = input(100, ...(ngDevMode ? [{ debugName: "max" }] : []));
566
+ this.step = input(1, ...(ngDevMode ? [{ debugName: "step" }] : []));
567
+ this.marks = input(false, ...(ngDevMode ? [{ debugName: "marks" }] : []));
568
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
569
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
570
+ this.orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
571
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
572
+ this.valueLabelDisplay = input('auto', ...(ngDevMode ? [{ debugName: "valueLabelDisplay" }] : []));
573
+ this.onChange = output();
574
+ this._railRef = viewChild('railRef', ...(ngDevMode ? [{ debugName: "_railRef" }] : []));
575
+ this._activeThumbIndex = signal(0, ...(ngDevMode ? [{ debugName: "_activeThumbIndex" }] : []));
576
+ this._isDragging = signal(false, ...(ngDevMode ? [{ debugName: "_isDragging" }] : []));
577
+ this._cleanupMouseMove = null;
578
+ this._cleanupMouseUp = null;
579
+ this._cleanupTouchMove = null;
580
+ this._cleanupTouchEnd = null;
581
+ this._cachedRect = null;
582
+ this._isRange = computed(() => Array.isArray(this.value()), ...(ngDevMode ? [{ debugName: "_isRange" }] : []));
583
+ this._values = computed(() => {
584
+ const v = this.value();
585
+ if (Array.isArray(v))
586
+ return [v[0], v[1]];
587
+ return [this.min(), v];
588
+ }, ...(ngDevMode ? [{ debugName: "_values" }] : []));
589
+ this._normalizedMarks = computed(() => {
590
+ const m = this.marks();
591
+ if (m === false)
592
+ return [];
593
+ if (Array.isArray(m))
594
+ return m;
595
+ const marks = [];
596
+ const s = this.step() ?? 1;
597
+ for (let v = this.min(); v <= this.max(); v += s) {
598
+ marks.push({ value: v });
599
+ }
600
+ return marks;
601
+ }, ...(ngDevMode ? [{ debugName: "_normalizedMarks" }] : []));
602
+ this._trackFillStyle = computed(() => {
603
+ const [v0, v1] = this._values();
604
+ const range = this.max() - this.min();
605
+ if (range <= 0)
606
+ return { left: '0%', width: '0%' };
607
+ const left = ((v0 - this.min()) / range) * 100;
608
+ const width = ((v1 - v0) / range) * 100;
609
+ if (this._isRange()) {
610
+ return {
611
+ left: `${left}%`,
612
+ width: `${width}%`,
613
+ };
614
+ }
615
+ return {
616
+ left: '0%',
617
+ width: `${left + width}%`,
618
+ };
619
+ }, ...(ngDevMode ? [{ debugName: "_trackFillStyle" }] : []));
620
+ this._thumbPositions = computed(() => {
621
+ const [v0, v1] = this._values();
622
+ const range = this.max() - this.min();
623
+ if (range <= 0)
624
+ return this._isRange() ? [0, 0] : [0];
625
+ if (this._isRange()) {
626
+ return [
627
+ ((v0 - this.min()) / range) * 100,
628
+ ((v1 - this.min()) / range) * 100,
629
+ ];
630
+ }
631
+ return [((v1 - this.min()) / range) * 100];
632
+ }, ...(ngDevMode ? [{ debugName: "_thumbPositions" }] : []));
633
+ this._containerClasses = computed(() => {
634
+ const classes = ['ls-slider'];
635
+ classes.push(`ls-slider--${this.color()}`);
636
+ classes.push(`ls-slider--${this.size()}`);
637
+ if (this.disabled())
638
+ classes.push('ls-slider--disabled');
639
+ if (this._isDragging())
640
+ classes.push('ls-slider--active');
641
+ return classes.join(' ');
642
+ }, ...(ngDevMode ? [{ debugName: "_containerClasses" }] : []));
643
+ effect(() => {
644
+ const dv = this.defaultValue();
645
+ if (dv !== undefined && this.value() === 0) {
646
+ this.value.set(dv);
647
+ }
648
+ }, { allowSignalWrites: true });
649
+ this._destroyRef.onDestroy(() => {
650
+ this._removeGlobalListeners();
651
+ });
652
+ }
653
+ _isMarkActive(markValue) {
654
+ const [v0, v1] = this._values();
655
+ if (this._isRange()) {
656
+ return markValue >= v0 && markValue <= v1;
657
+ }
658
+ return markValue <= v1;
659
+ }
660
+ _getMarkPosition(markValue) {
661
+ const range = this.max() - this.min();
662
+ if (range <= 0)
663
+ return 0;
664
+ return (((markValue - this.min()) / range) * 100);
665
+ }
666
+ _getThumbValue(thumbIndex) {
667
+ const v = this.value();
668
+ if (Array.isArray(v)) {
669
+ return v[thumbIndex];
670
+ }
671
+ return v;
672
+ }
673
+ _onRailMouseDown(event) {
674
+ if (this.disabled())
675
+ return;
676
+ event.preventDefault();
677
+ this._startDrag(event.clientX);
678
+ }
679
+ _onThumbMouseDown(event, thumbIndex) {
680
+ if (this.disabled())
681
+ return;
682
+ event.preventDefault();
683
+ event.stopPropagation();
684
+ this._activeThumbIndex.set(thumbIndex);
685
+ this._startMouseDrag(event.clientX);
686
+ }
687
+ _onRailTouchStart(event) {
688
+ if (this.disabled())
689
+ return;
690
+ if (event.touches.length === 0)
691
+ return;
692
+ event.preventDefault();
693
+ this._startTouchDrag(event.touches[0].clientX);
694
+ }
695
+ _onThumbTouchStart(event, thumbIndex) {
696
+ if (this.disabled())
697
+ return;
698
+ if (event.touches.length === 0)
699
+ return;
700
+ event.preventDefault();
701
+ event.stopPropagation();
702
+ this._activeThumbIndex.set(thumbIndex);
703
+ this._startTouchDrag(event.touches[0].clientX);
704
+ }
705
+ _onKeyDown(event, thumbIndex) {
706
+ if (this.disabled())
707
+ return;
708
+ const s = this.step() ?? 1;
709
+ let handled = false;
710
+ switch (event.key) {
711
+ case 'ArrowRight':
712
+ case 'ArrowUp':
713
+ this._adjustThumbValue(thumbIndex, s);
714
+ handled = true;
715
+ break;
716
+ case 'ArrowLeft':
717
+ case 'ArrowDown':
718
+ this._adjustThumbValue(thumbIndex, -s);
719
+ handled = true;
720
+ break;
721
+ case 'Home':
722
+ this._setThumbValue(thumbIndex, this.min());
723
+ handled = true;
724
+ break;
725
+ case 'End':
726
+ this._setThumbValue(thumbIndex, this.max());
727
+ handled = true;
728
+ break;
729
+ }
730
+ if (handled) {
731
+ event.preventDefault();
732
+ this.onChange.emit(this.value());
733
+ }
734
+ }
735
+ _startDrag(clientX) {
736
+ this._cacheRect();
737
+ if (this._isRange() && this._cachedRect) {
738
+ const clickValue = this._positionToValue(clientX, this._cachedRect);
739
+ const [v0, v1] = this._values();
740
+ const dist0 = Math.abs(clickValue - v0);
741
+ const dist1 = Math.abs(clickValue - v1);
742
+ this._activeThumbIndex.set(dist0 <= dist1 ? 0 : 1);
743
+ }
744
+ this._startMouseDrag(clientX);
745
+ }
746
+ _startMouseDrag(clientX) {
747
+ this._cacheRect();
748
+ this._isDragging.set(true);
749
+ this._updateValueFromPosition(clientX);
750
+ this._cleanupMouseMove =
751
+ this._renderer.listen('window', 'mousemove', (e) => {
752
+ this._updateValueFromPosition(e.clientX);
753
+ });
754
+ this._cleanupMouseUp = this._renderer.listen('window', 'mouseup', () => {
755
+ this._endDrag();
756
+ });
757
+ }
758
+ _startTouchDrag(clientX) {
759
+ this._cacheRect();
760
+ if (this._isRange() && this._cachedRect) {
761
+ const clickValue = this._positionToValue(clientX, this._cachedRect);
762
+ const [v0, v1] = this._values();
763
+ const dist0 = Math.abs(clickValue - v0);
764
+ const dist1 = Math.abs(clickValue - v1);
765
+ this._activeThumbIndex.set(dist0 <= dist1 ? 0 : 1);
766
+ }
767
+ this._isDragging.set(true);
768
+ this._updateValueFromPosition(clientX);
769
+ this._cleanupTouchMove =
770
+ this._renderer.listen('window', 'touchmove', (e) => {
771
+ if (e.touches.length > 0) {
772
+ this._updateValueFromPosition(e.touches[0].clientX);
773
+ }
774
+ });
775
+ this._cleanupTouchEnd =
776
+ this._renderer.listen('window', 'touchend', () => {
777
+ this._endDrag();
778
+ });
779
+ }
780
+ _endDrag() {
781
+ this._isDragging.set(false);
782
+ this._removeGlobalListeners();
783
+ this._cachedRect = null;
784
+ this.onChange.emit(this.value());
785
+ }
786
+ _updateValueFromPosition(clientX) {
787
+ if (!this._cachedRect)
788
+ return;
789
+ const newValue = this._positionToValue(clientX, this._cachedRect);
790
+ const idx = this._activeThumbIndex();
791
+ if (this._isRange()) {
792
+ const current = this.value();
793
+ const updated = [...current];
794
+ updated[idx] = newValue;
795
+ if (idx === 0 && updated[0] > updated[1]) {
796
+ updated[0] = updated[1];
797
+ }
798
+ if (idx === 1 && updated[1] < updated[0]) {
799
+ updated[1] = updated[0];
800
+ }
801
+ this.value.set(updated);
802
+ }
803
+ else {
804
+ this.value.set(newValue);
805
+ }
806
+ }
807
+ _adjustThumbValue(thumbIndex, delta) {
808
+ if (this._isRange()) {
809
+ const current = this.value();
810
+ const updated = [...current];
811
+ updated[thumbIndex] = this._quantize(updated[thumbIndex] + delta);
812
+ if (thumbIndex === 0 &&
813
+ updated[0] > updated[1]) {
814
+ updated[0] = updated[1];
815
+ }
816
+ if (thumbIndex === 1 &&
817
+ updated[1] < updated[0]) {
818
+ updated[1] = updated[0];
819
+ }
820
+ this.value.set(updated);
821
+ }
822
+ else {
823
+ this.value.set(this._quantize(this.value() + delta));
824
+ }
825
+ }
826
+ _setThumbValue(thumbIndex, newValue) {
827
+ if (this._isRange()) {
828
+ const current = this.value();
829
+ const updated = [...current];
830
+ updated[thumbIndex] =
831
+ this._quantize(newValue);
832
+ if (thumbIndex === 0 &&
833
+ updated[0] > updated[1]) {
834
+ updated[0] = updated[1];
835
+ }
836
+ if (thumbIndex === 1 &&
837
+ updated[1] < updated[0]) {
838
+ updated[1] = updated[0];
839
+ }
840
+ this.value.set(updated);
841
+ }
842
+ else {
843
+ this.value.set(this._quantize(newValue));
844
+ }
845
+ }
846
+ _positionToValue(clientX, rect) {
847
+ const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
848
+ return this._quantize(this.min() +
849
+ percent * (this.max() - this.min()));
850
+ }
851
+ _quantize(raw) {
852
+ const s = this.step();
853
+ if (s === null)
854
+ return Math.min(this.max(), Math.max(this.min(), raw));
855
+ return Math.min(this.max(), Math.max(this.min(), this.min() +
856
+ Math.round((raw - this.min()) / s) * s));
857
+ }
858
+ _cacheRect() {
859
+ const railEl = this._railRef();
860
+ if (railEl) {
861
+ this._cachedRect =
862
+ railEl.nativeElement.getBoundingClientRect();
863
+ }
864
+ }
865
+ _removeGlobalListeners() {
866
+ this._cleanupMouseMove?.();
867
+ this._cleanupMouseMove = null;
868
+ this._cleanupMouseUp?.();
869
+ this._cleanupMouseUp = null;
870
+ this._cleanupTouchMove?.();
871
+ this._cleanupTouchMove = null;
872
+ this._cleanupTouchEnd?.();
873
+ this._cleanupTouchEnd = null;
874
+ }
875
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
876
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: SliderComponent, isStandalone: true, selector: "ls-slider", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, step: { classPropertyName: "step", publicName: "step", isSignal: true, isRequired: false, transformFunction: null }, marks: { classPropertyName: "marks", publicName: "marks", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, valueLabelDisplay: { classPropertyName: "valueLabelDisplay", publicName: "valueLabelDisplay", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", onChange: "onChange" }, viewQueries: [{ propertyName: "_railRef", first: true, predicate: ["railRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
877
+ <div
878
+ [class]="_containerClasses()"
879
+ (mousedown)="_onRailMouseDown($event)"
880
+ (touchstart)="_onRailTouchStart($event)"
881
+ #railRef>
882
+ <div class="ls-slider__rail"></div>
883
+
884
+ <div
885
+ class="ls-slider__track"
886
+ [style.left]="_trackFillStyle().left"
887
+ [style.width]="_trackFillStyle().width">
888
+ </div>
889
+
890
+ @for (mark of _normalizedMarks(); track mark.value) {
891
+ <span
892
+ class="ls-slider__mark"
893
+ [class.ls-slider__mark--active]="
894
+ _isMarkActive(mark.value)
895
+ "
896
+ [style.left]="_getMarkPosition(mark.value) + '%'">
897
+ </span>
898
+ @if (mark.label) {
899
+ <span
900
+ class="ls-slider__mark-label"
901
+ [style.left]="
902
+ _getMarkPosition(mark.value) + '%'
903
+ ">
904
+ {{ mark.label }}
905
+ </span>
906
+ }
907
+ }
908
+
909
+ @for (pos of _thumbPositions(); track $index) {
910
+ <span
911
+ class="ls-slider__thumb"
912
+ [class.ls-slider__thumb--active]="
913
+ _isDragging() && _activeThumbIndex() === $index
914
+ "
915
+ [style.left]="pos + '%'"
916
+ [attr.role]="'slider'"
917
+ [attr.aria-valuenow]="_getThumbValue($index)"
918
+ [attr.aria-valuemin]="min()"
919
+ [attr.aria-valuemax]="max()"
920
+ [attr.aria-disabled]="disabled()"
921
+ [attr.tabindex]="disabled() ? -1 : 0"
922
+ (mousedown)="_onThumbMouseDown($event, $index)"
923
+ (touchstart)="_onThumbTouchStart($event, $index)"
924
+ (keydown)="_onKeyDown($event, $index)">
925
+ @if (
926
+ valueLabelDisplay() === 'on' ||
927
+ (valueLabelDisplay() === 'auto' &&
928
+ _isDragging() &&
929
+ _activeThumbIndex() === $index)
930
+ ) {
931
+ <span class="ls-slider__value-label">
932
+ {{ _getThumbValue($index) }}
933
+ </span>
934
+ }
935
+ </span>
936
+ }
937
+ </div>
938
+ `, isInline: true, styles: [":host{display:block}.ls-slider{position:relative;height:38px;cursor:pointer;padding:15px 0;touch-action:none;-webkit-user-select:none;user-select:none}.ls-slider__rail{position:absolute;top:50%;left:0;width:100%;border-radius:9999px;background:#e0e6ed;transform:translateY(-50%)}.ls-slider__track{position:absolute;top:50%;border-radius:9999px;background:var(--ls-slider-main-color);transform:translateY(-50%)}.ls-slider__thumb{position:absolute;top:50%;z-index:1;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--ls-slider-main-color);box-shadow:0 1px 3px #0003,0 0 0 0 transparent;cursor:grab;transform:translate(-50%,-50%);transition:box-shadow .15s ease,width .15s ease,height .15s ease}.ls-slider__thumb:hover{box-shadow:0 1px 3px #0003,0 0 0 8px color-mix(in srgb,var(--ls-slider-main-color) 16%,transparent)}.ls-slider__thumb:focus-visible{outline:2px solid var(--ls-slider-main-color);outline-offset:2px}.ls-slider__thumb--active{cursor:grabbing;box-shadow:0 1px 3px #0003,0 0 0 12px color-mix(in srgb,var(--ls-slider-main-color) 24%,transparent)}.ls-slider__value-label{position:absolute;bottom:calc(100% + 6px);left:50%;padding:2px 8px;border-radius:4px;background:var(--ls-color-dark, #3b3f5c);color:#fff;font-size:12px;font-weight:600;line-height:1.4;white-space:nowrap;transform:translate(-50%);pointer-events:none}.ls-slider__mark{position:absolute;top:50%;border-radius:50%;background:#bfc9d4;transform:translate(-50%,-50%)}.ls-slider__mark--active{background:var(--ls-slider-main-color)}.ls-slider__mark-label{position:absolute;top:calc(50% + 14px);color:#888ea8;font-size:11px;white-space:nowrap;transform:translate(-50%)}.ls-slider--medium .ls-slider__rail,.ls-slider--medium .ls-slider__track{height:4px}.ls-slider--medium .ls-slider__thumb{width:20px;height:20px}.ls-slider--medium .ls-slider__mark{width:4px;height:4px}.ls-slider--medium .ls-slider__value-label{font-size:12px}.ls-slider--small .ls-slider__rail,.ls-slider--small .ls-slider__track{height:2px}.ls-slider--small .ls-slider__thumb{width:12px;height:12px}.ls-slider--small .ls-slider__mark{width:3px;height:3px}.ls-slider--small .ls-slider__value-label{font-size:10px}.ls-slider--primary{--ls-slider-main-color: var(--ls-color-primary)}.ls-slider--secondary{--ls-slider-main-color: var(--ls-color-secondary)}.ls-slider--success{--ls-slider-main-color: var(--ls-color-success)}.ls-slider--error{--ls-slider-main-color: var(--ls-color-error)}.ls-slider--info{--ls-slider-main-color: var(--ls-color-info)}.ls-slider--warning{--ls-slider-main-color: var(--ls-color-warning)}.ls-slider--disabled{opacity:.5;cursor:default;pointer-events:none}.ls-slider--active{cursor:grabbing}body.dark .ls-slider__rail{background:#ffffff26}body.dark .ls-slider__mark{background:#ffffff4d}body.dark .ls-slider__mark--active{background:var(--ls-slider-main-color)}body.dark .ls-slider__mark-label{color:#888ea8}body.dark .ls-slider__value-label{background:#1b2e4b;color:#e0e6ed}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
939
+ }
940
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SliderComponent, decorators: [{
941
+ type: Component,
942
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ls-slider', standalone: true, template: `
943
+ <div
944
+ [class]="_containerClasses()"
945
+ (mousedown)="_onRailMouseDown($event)"
946
+ (touchstart)="_onRailTouchStart($event)"
947
+ #railRef>
948
+ <div class="ls-slider__rail"></div>
949
+
950
+ <div
951
+ class="ls-slider__track"
952
+ [style.left]="_trackFillStyle().left"
953
+ [style.width]="_trackFillStyle().width">
954
+ </div>
955
+
956
+ @for (mark of _normalizedMarks(); track mark.value) {
957
+ <span
958
+ class="ls-slider__mark"
959
+ [class.ls-slider__mark--active]="
960
+ _isMarkActive(mark.value)
961
+ "
962
+ [style.left]="_getMarkPosition(mark.value) + '%'">
963
+ </span>
964
+ @if (mark.label) {
965
+ <span
966
+ class="ls-slider__mark-label"
967
+ [style.left]="
968
+ _getMarkPosition(mark.value) + '%'
969
+ ">
970
+ {{ mark.label }}
971
+ </span>
972
+ }
973
+ }
974
+
975
+ @for (pos of _thumbPositions(); track $index) {
976
+ <span
977
+ class="ls-slider__thumb"
978
+ [class.ls-slider__thumb--active]="
979
+ _isDragging() && _activeThumbIndex() === $index
980
+ "
981
+ [style.left]="pos + '%'"
982
+ [attr.role]="'slider'"
983
+ [attr.aria-valuenow]="_getThumbValue($index)"
984
+ [attr.aria-valuemin]="min()"
985
+ [attr.aria-valuemax]="max()"
986
+ [attr.aria-disabled]="disabled()"
987
+ [attr.tabindex]="disabled() ? -1 : 0"
988
+ (mousedown)="_onThumbMouseDown($event, $index)"
989
+ (touchstart)="_onThumbTouchStart($event, $index)"
990
+ (keydown)="_onKeyDown($event, $index)">
991
+ @if (
992
+ valueLabelDisplay() === 'on' ||
993
+ (valueLabelDisplay() === 'auto' &&
994
+ _isDragging() &&
995
+ _activeThumbIndex() === $index)
996
+ ) {
997
+ <span class="ls-slider__value-label">
998
+ {{ _getThumbValue($index) }}
999
+ </span>
1000
+ }
1001
+ </span>
1002
+ }
1003
+ </div>
1004
+ `, styles: [":host{display:block}.ls-slider{position:relative;height:38px;cursor:pointer;padding:15px 0;touch-action:none;-webkit-user-select:none;user-select:none}.ls-slider__rail{position:absolute;top:50%;left:0;width:100%;border-radius:9999px;background:#e0e6ed;transform:translateY(-50%)}.ls-slider__track{position:absolute;top:50%;border-radius:9999px;background:var(--ls-slider-main-color);transform:translateY(-50%)}.ls-slider__thumb{position:absolute;top:50%;z-index:1;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--ls-slider-main-color);box-shadow:0 1px 3px #0003,0 0 0 0 transparent;cursor:grab;transform:translate(-50%,-50%);transition:box-shadow .15s ease,width .15s ease,height .15s ease}.ls-slider__thumb:hover{box-shadow:0 1px 3px #0003,0 0 0 8px color-mix(in srgb,var(--ls-slider-main-color) 16%,transparent)}.ls-slider__thumb:focus-visible{outline:2px solid var(--ls-slider-main-color);outline-offset:2px}.ls-slider__thumb--active{cursor:grabbing;box-shadow:0 1px 3px #0003,0 0 0 12px color-mix(in srgb,var(--ls-slider-main-color) 24%,transparent)}.ls-slider__value-label{position:absolute;bottom:calc(100% + 6px);left:50%;padding:2px 8px;border-radius:4px;background:var(--ls-color-dark, #3b3f5c);color:#fff;font-size:12px;font-weight:600;line-height:1.4;white-space:nowrap;transform:translate(-50%);pointer-events:none}.ls-slider__mark{position:absolute;top:50%;border-radius:50%;background:#bfc9d4;transform:translate(-50%,-50%)}.ls-slider__mark--active{background:var(--ls-slider-main-color)}.ls-slider__mark-label{position:absolute;top:calc(50% + 14px);color:#888ea8;font-size:11px;white-space:nowrap;transform:translate(-50%)}.ls-slider--medium .ls-slider__rail,.ls-slider--medium .ls-slider__track{height:4px}.ls-slider--medium .ls-slider__thumb{width:20px;height:20px}.ls-slider--medium .ls-slider__mark{width:4px;height:4px}.ls-slider--medium .ls-slider__value-label{font-size:12px}.ls-slider--small .ls-slider__rail,.ls-slider--small .ls-slider__track{height:2px}.ls-slider--small .ls-slider__thumb{width:12px;height:12px}.ls-slider--small .ls-slider__mark{width:3px;height:3px}.ls-slider--small .ls-slider__value-label{font-size:10px}.ls-slider--primary{--ls-slider-main-color: var(--ls-color-primary)}.ls-slider--secondary{--ls-slider-main-color: var(--ls-color-secondary)}.ls-slider--success{--ls-slider-main-color: var(--ls-color-success)}.ls-slider--error{--ls-slider-main-color: var(--ls-color-error)}.ls-slider--info{--ls-slider-main-color: var(--ls-color-info)}.ls-slider--warning{--ls-slider-main-color: var(--ls-color-warning)}.ls-slider--disabled{opacity:.5;cursor:default;pointer-events:none}.ls-slider--active{cursor:grabbing}body.dark .ls-slider__rail{background:#ffffff26}body.dark .ls-slider__mark{background:#ffffff4d}body.dark .ls-slider__mark--active{background:var(--ls-slider-main-color)}body.dark .ls-slider__mark-label{color:#888ea8}body.dark .ls-slider__value-label{background:#1b2e4b;color:#e0e6ed}\n"] }]
1005
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], step: [{ type: i0.Input, args: [{ isSignal: true, alias: "step", required: false }] }], marks: [{ type: i0.Input, args: [{ isSignal: true, alias: "marks", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], valueLabelDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueLabelDisplay", required: false }] }], onChange: [{ type: i0.Output, args: ["onChange"] }], _railRef: [{ type: i0.ViewChild, args: ['railRef', { isSignal: true }] }] } });
1006
+
1007
+ const CHECK_SVG = '<svg viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">' +
1008
+ '<path d="M3.5 6L5.5 8L8.5 4" stroke="currentColor" ' +
1009
+ 'stroke-width="2" stroke-linecap="round" ' +
1010
+ 'stroke-linejoin="round"/></svg>';
1011
+ const CLOSE_SVG = '<svg viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">' +
1012
+ '<path d="M3.5 3.5L8.5 8.5M8.5 3.5L3.5 8.5" ' +
1013
+ 'stroke="currentColor" stroke-width="2" ' +
1014
+ 'stroke-linecap="round" stroke-linejoin="round"/></svg>';
1015
+ class SwitchComponent {
1016
+ constructor() {
1017
+ this._sanitizer = inject(DomSanitizer);
1018
+ this.checked = input(false, ...(ngDevMode ? [{ debugName: "checked" }] : []));
1019
+ this.defaultChecked = input(false, ...(ngDevMode ? [{ debugName: "defaultChecked" }] : []));
1020
+ this.color = input('primary', ...(ngDevMode ? [{ debugName: "color" }] : []));
1021
+ this.size = input('medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
1022
+ this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
1023
+ this.icon = input(false, ...(ngDevMode ? [{ debugName: "icon" }] : []));
1024
+ this.variant = input('solid', ...(ngDevMode ? [{ debugName: "variant" }] : []));
1025
+ this.labelPlacement = input('end', ...(ngDevMode ? [{ debugName: "labelPlacement" }] : []));
1026
+ this.changed = output();
1027
+ this._isChecked = signal(false, ...(ngDevMode ? [{ debugName: "_isChecked" }] : []));
1028
+ this._isFirstSync = true;
1029
+ this._syncChecked = effect(() => {
1030
+ const isChecked = this.checked();
1031
+ if (this._isFirstSync) {
1032
+ this._isFirstSync = false;
1033
+ this._isChecked.set(isChecked || this.defaultChecked());
1034
+ }
1035
+ else {
1036
+ this._isChecked.set(isChecked);
1037
+ }
1038
+ }, ...(ngDevMode ? [{ debugName: "_syncChecked" }] : []));
1039
+ this.switchClasses = computed(() => {
1040
+ const s = this.size() === 'small' ? 'sm' : 'md';
1041
+ const parts = [
1042
+ 'switch',
1043
+ `switch-${s}`,
1044
+ `switch-color-${this.color()}`,
1045
+ `switch-${this.variant()}`,
1046
+ `switch-label-${this.labelPlacement()}`,
1047
+ ];
1048
+ if (this._isChecked()) {
1049
+ parts.push('switch-checked');
1050
+ }
1051
+ if (this.disabled()) {
1052
+ parts.push('switch-disabled');
1053
+ }
1054
+ return parts.join(' ');
1055
+ }, ...(ngDevMode ? [{ debugName: "switchClasses" }] : []));
1056
+ this.currentIcon = computed(() => {
1057
+ const svg = this._isChecked()
1058
+ ? CHECK_SVG
1059
+ : CLOSE_SVG;
1060
+ return this._sanitizer.bypassSecurityTrustHtml(svg);
1061
+ }, ...(ngDevMode ? [{ debugName: "currentIcon" }] : []));
1062
+ }
1063
+ onToggle() {
1064
+ if (this.disabled()) {
1065
+ return;
1066
+ }
1067
+ const isNext = !this._isChecked();
1068
+ this._isChecked.set(isNext);
1069
+ this.changed.emit(isNext);
1070
+ }
1071
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SwitchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1072
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: SwitchComponent, isStandalone: true, selector: "ls-switch", inputs: { checked: { classPropertyName: "checked", publicName: "checked", isSignal: true, isRequired: false, transformFunction: null }, defaultChecked: { classPropertyName: "defaultChecked", publicName: "defaultChecked", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, labelPlacement: { classPropertyName: "labelPlacement", publicName: "labelPlacement", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changed: "changed" }, ngImport: i0, template: `
1073
+ <label [class]="switchClasses()">
1074
+ <button
1075
+ type="button"
1076
+ role="switch"
1077
+ class="switch-track"
1078
+ [attr.aria-checked]="_isChecked()"
1079
+ [disabled]="disabled()"
1080
+ (click)="onToggle()"
1081
+ (keydown.space)="onToggle(); $event.preventDefault()"
1082
+ (keydown.enter)="onToggle(); $event.preventDefault()">
1083
+ <span class="switch-thumb">
1084
+ @if (icon()) {
1085
+ <span
1086
+ class="switch-icon"
1087
+ [innerHTML]="currentIcon()"
1088
+ ></span>
1089
+ }
1090
+ </span>
1091
+ </button>
1092
+ <span class="switch-label">
1093
+ <ng-content />
1094
+ </span>
1095
+ </label>
1096
+ `, isInline: true, styles: [":host{display:inline-flex}.switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative}.switch-track{position:relative;display:inline-flex;align-items:center;border:none;border-radius:999px;padding:2px;cursor:pointer;transition:background-color var(--ls-transition-duration),border-color var(--ls-transition-duration);outline:none;flex-shrink:0}.switch-thumb{display:flex;align-items:center;justify-content:center;border-radius:50%;background-color:#fff;transition:transform var(--ls-transition-duration);box-shadow:0 1px 3px #0003}.switch-icon{display:flex;align-items:center;justify-content:center;line-height:0;color:#999}.switch-icon svg{width:100%;height:100%}.switch-label{-webkit-user-select:none;user-select:none;cursor:pointer;font-size:.875rem}.switch-sm .switch-track{width:34px;height:20px}.switch-sm .switch-thumb{width:16px;height:16px}.switch-sm .switch-icon{width:10px;height:10px}.switch-sm.switch-checked .switch-thumb{transform:translate(14px)}.switch-md .switch-track{width:42px;height:24px}.switch-md .switch-thumb{width:20px;height:20px}.switch-md .switch-icon{width:12px;height:12px}.switch-md.switch-checked .switch-thumb{transform:translate(18px)}.switch-solid .switch-track{background-color:#c4c4c4}.switch-outlined .switch-track{background-color:transparent;border:2px solid #999}.switch-outlined .switch-track{padding:0}.switch-outlined .switch-thumb{background-color:#999}.switch-outlined .switch-icon{color:#fff}.switch-checked.switch-solid.switch-color-inherit .switch-track{background-color:inherit}.switch-checked.switch-solid.switch-color-primary .switch-track{background-color:var(--ls-color-primary)}.switch-checked.switch-solid.switch-color-secondary .switch-track{background-color:var(--ls-color-secondary)}.switch-checked.switch-solid.switch-color-success .switch-track{background-color:var(--ls-color-success)}.switch-checked.switch-solid.switch-color-error .switch-track{background-color:var(--ls-color-danger)}.switch-checked.switch-solid.switch-color-info .switch-track{background-color:var(--ls-color-info)}.switch-checked.switch-solid.switch-color-warning .switch-track{background-color:var(--ls-color-warning)}.switch-checked.switch-outlined.switch-color-inherit .switch-track{border-color:inherit}.switch-checked.switch-outlined.switch-color-primary .switch-track{border-color:var(--ls-color-primary)}.switch-checked.switch-outlined.switch-color-secondary .switch-track{border-color:var(--ls-color-secondary)}.switch-checked.switch-outlined.switch-color-success .switch-track{border-color:var(--ls-color-success)}.switch-checked.switch-outlined.switch-color-error .switch-track{border-color:var(--ls-color-danger)}.switch-checked.switch-outlined.switch-color-info .switch-track{border-color:var(--ls-color-info)}.switch-checked.switch-outlined.switch-color-warning .switch-track{border-color:var(--ls-color-warning)}.switch-checked.switch-outlined.switch-color-inherit .switch-thumb{background-color:inherit}.switch-checked.switch-outlined.switch-color-primary .switch-thumb{background-color:var(--ls-color-primary)}.switch-checked.switch-outlined.switch-color-secondary .switch-thumb{background-color:var(--ls-color-secondary)}.switch-checked.switch-outlined.switch-color-success .switch-thumb{background-color:var(--ls-color-success)}.switch-checked.switch-outlined.switch-color-error .switch-thumb{background-color:var(--ls-color-danger)}.switch-checked.switch-outlined.switch-color-info .switch-thumb{background-color:var(--ls-color-info)}.switch-checked.switch-outlined.switch-color-warning .switch-thumb{background-color:var(--ls-color-warning)}.switch-checked.switch-outlined .switch-icon{color:#fff}.switch-checked.switch-solid .switch-icon{color:var(--ls-color-primary)}.switch-checked.switch-solid.switch-color-secondary .switch-icon{color:var(--ls-color-secondary)}.switch-checked.switch-solid.switch-color-success .switch-icon{color:var(--ls-color-success)}.switch-checked.switch-solid.switch-color-error .switch-icon{color:var(--ls-color-danger)}.switch-checked.switch-solid.switch-color-info .switch-icon{color:var(--ls-color-info)}.switch-checked.switch-solid.switch-color-warning .switch-icon{color:var(--ls-color-warning)}.switch-checked.switch-solid.switch-color-inherit .switch-icon{color:inherit}.switch-label-end{flex-direction:row}.switch-label-start{flex-direction:row-reverse}.switch-label-top{flex-direction:column-reverse;align-items:center}.switch-label-bottom{flex-direction:column;align-items:center}.switch-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.switch-disabled .switch-label,.switch-disabled .switch-track{cursor:not-allowed}.switch-track:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:999px}body.dark .switch-solid .switch-track{background-color:#3b3f5c}body.dark .switch-outlined .switch-track{border-color:#555}body.dark .switch-outlined .switch-thumb{background-color:#888}body.dark .switch-label{color:#e0e6ed}body.dark .switch-icon{color:#bbb}body.dark .switch-checked.switch-solid.switch-color-primary .switch-track{background-color:var(--ls-color-primary)}body.dark .switch-checked.switch-solid.switch-color-secondary .switch-track{background-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-solid.switch-color-success .switch-track{background-color:var(--ls-color-success)}body.dark .switch-checked.switch-solid.switch-color-error .switch-track{background-color:var(--ls-color-danger)}body.dark .switch-checked.switch-solid.switch-color-info .switch-track{background-color:var(--ls-color-info)}body.dark .switch-checked.switch-solid.switch-color-warning .switch-track{background-color:var(--ls-color-warning)}body.dark .switch-checked.switch-outlined.switch-color-primary .switch-track{border-color:var(--ls-color-primary)}body.dark .switch-checked.switch-outlined.switch-color-secondary .switch-track{border-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-outlined.switch-color-success .switch-track{border-color:var(--ls-color-success)}body.dark .switch-checked.switch-outlined.switch-color-error .switch-track{border-color:var(--ls-color-danger)}body.dark .switch-checked.switch-outlined.switch-color-info .switch-track{border-color:var(--ls-color-info)}body.dark .switch-checked.switch-outlined.switch-color-warning .switch-track{border-color:var(--ls-color-warning)}body.dark .switch-checked.switch-outlined.switch-color-primary .switch-thumb{background-color:var(--ls-color-primary)}body.dark .switch-checked.switch-outlined.switch-color-secondary .switch-thumb{background-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-outlined.switch-color-success .switch-thumb{background-color:var(--ls-color-success)}body.dark .switch-checked.switch-outlined.switch-color-error .switch-thumb{background-color:var(--ls-color-danger)}body.dark .switch-checked.switch-outlined.switch-color-info .switch-thumb{background-color:var(--ls-color-info)}body.dark .switch-checked.switch-outlined.switch-color-warning .switch-thumb{background-color:var(--ls-color-warning)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1097
+ }
1098
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SwitchComponent, decorators: [{
1099
+ type: Component,
1100
+ args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ls-switch', standalone: true, template: `
1101
+ <label [class]="switchClasses()">
1102
+ <button
1103
+ type="button"
1104
+ role="switch"
1105
+ class="switch-track"
1106
+ [attr.aria-checked]="_isChecked()"
1107
+ [disabled]="disabled()"
1108
+ (click)="onToggle()"
1109
+ (keydown.space)="onToggle(); $event.preventDefault()"
1110
+ (keydown.enter)="onToggle(); $event.preventDefault()">
1111
+ <span class="switch-thumb">
1112
+ @if (icon()) {
1113
+ <span
1114
+ class="switch-icon"
1115
+ [innerHTML]="currentIcon()"
1116
+ ></span>
1117
+ }
1118
+ </span>
1119
+ </button>
1120
+ <span class="switch-label">
1121
+ <ng-content />
1122
+ </span>
1123
+ </label>
1124
+ `, styles: [":host{display:inline-flex}.switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;position:relative}.switch-track{position:relative;display:inline-flex;align-items:center;border:none;border-radius:999px;padding:2px;cursor:pointer;transition:background-color var(--ls-transition-duration),border-color var(--ls-transition-duration);outline:none;flex-shrink:0}.switch-thumb{display:flex;align-items:center;justify-content:center;border-radius:50%;background-color:#fff;transition:transform var(--ls-transition-duration);box-shadow:0 1px 3px #0003}.switch-icon{display:flex;align-items:center;justify-content:center;line-height:0;color:#999}.switch-icon svg{width:100%;height:100%}.switch-label{-webkit-user-select:none;user-select:none;cursor:pointer;font-size:.875rem}.switch-sm .switch-track{width:34px;height:20px}.switch-sm .switch-thumb{width:16px;height:16px}.switch-sm .switch-icon{width:10px;height:10px}.switch-sm.switch-checked .switch-thumb{transform:translate(14px)}.switch-md .switch-track{width:42px;height:24px}.switch-md .switch-thumb{width:20px;height:20px}.switch-md .switch-icon{width:12px;height:12px}.switch-md.switch-checked .switch-thumb{transform:translate(18px)}.switch-solid .switch-track{background-color:#c4c4c4}.switch-outlined .switch-track{background-color:transparent;border:2px solid #999}.switch-outlined .switch-track{padding:0}.switch-outlined .switch-thumb{background-color:#999}.switch-outlined .switch-icon{color:#fff}.switch-checked.switch-solid.switch-color-inherit .switch-track{background-color:inherit}.switch-checked.switch-solid.switch-color-primary .switch-track{background-color:var(--ls-color-primary)}.switch-checked.switch-solid.switch-color-secondary .switch-track{background-color:var(--ls-color-secondary)}.switch-checked.switch-solid.switch-color-success .switch-track{background-color:var(--ls-color-success)}.switch-checked.switch-solid.switch-color-error .switch-track{background-color:var(--ls-color-danger)}.switch-checked.switch-solid.switch-color-info .switch-track{background-color:var(--ls-color-info)}.switch-checked.switch-solid.switch-color-warning .switch-track{background-color:var(--ls-color-warning)}.switch-checked.switch-outlined.switch-color-inherit .switch-track{border-color:inherit}.switch-checked.switch-outlined.switch-color-primary .switch-track{border-color:var(--ls-color-primary)}.switch-checked.switch-outlined.switch-color-secondary .switch-track{border-color:var(--ls-color-secondary)}.switch-checked.switch-outlined.switch-color-success .switch-track{border-color:var(--ls-color-success)}.switch-checked.switch-outlined.switch-color-error .switch-track{border-color:var(--ls-color-danger)}.switch-checked.switch-outlined.switch-color-info .switch-track{border-color:var(--ls-color-info)}.switch-checked.switch-outlined.switch-color-warning .switch-track{border-color:var(--ls-color-warning)}.switch-checked.switch-outlined.switch-color-inherit .switch-thumb{background-color:inherit}.switch-checked.switch-outlined.switch-color-primary .switch-thumb{background-color:var(--ls-color-primary)}.switch-checked.switch-outlined.switch-color-secondary .switch-thumb{background-color:var(--ls-color-secondary)}.switch-checked.switch-outlined.switch-color-success .switch-thumb{background-color:var(--ls-color-success)}.switch-checked.switch-outlined.switch-color-error .switch-thumb{background-color:var(--ls-color-danger)}.switch-checked.switch-outlined.switch-color-info .switch-thumb{background-color:var(--ls-color-info)}.switch-checked.switch-outlined.switch-color-warning .switch-thumb{background-color:var(--ls-color-warning)}.switch-checked.switch-outlined .switch-icon{color:#fff}.switch-checked.switch-solid .switch-icon{color:var(--ls-color-primary)}.switch-checked.switch-solid.switch-color-secondary .switch-icon{color:var(--ls-color-secondary)}.switch-checked.switch-solid.switch-color-success .switch-icon{color:var(--ls-color-success)}.switch-checked.switch-solid.switch-color-error .switch-icon{color:var(--ls-color-danger)}.switch-checked.switch-solid.switch-color-info .switch-icon{color:var(--ls-color-info)}.switch-checked.switch-solid.switch-color-warning .switch-icon{color:var(--ls-color-warning)}.switch-checked.switch-solid.switch-color-inherit .switch-icon{color:inherit}.switch-label-end{flex-direction:row}.switch-label-start{flex-direction:row-reverse}.switch-label-top{flex-direction:column-reverse;align-items:center}.switch-label-bottom{flex-direction:column;align-items:center}.switch-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.switch-disabled .switch-label,.switch-disabled .switch-track{cursor:not-allowed}.switch-track:focus-visible{outline:2px solid currentColor;outline-offset:2px;border-radius:999px}body.dark .switch-solid .switch-track{background-color:#3b3f5c}body.dark .switch-outlined .switch-track{border-color:#555}body.dark .switch-outlined .switch-thumb{background-color:#888}body.dark .switch-label{color:#e0e6ed}body.dark .switch-icon{color:#bbb}body.dark .switch-checked.switch-solid.switch-color-primary .switch-track{background-color:var(--ls-color-primary)}body.dark .switch-checked.switch-solid.switch-color-secondary .switch-track{background-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-solid.switch-color-success .switch-track{background-color:var(--ls-color-success)}body.dark .switch-checked.switch-solid.switch-color-error .switch-track{background-color:var(--ls-color-danger)}body.dark .switch-checked.switch-solid.switch-color-info .switch-track{background-color:var(--ls-color-info)}body.dark .switch-checked.switch-solid.switch-color-warning .switch-track{background-color:var(--ls-color-warning)}body.dark .switch-checked.switch-outlined.switch-color-primary .switch-track{border-color:var(--ls-color-primary)}body.dark .switch-checked.switch-outlined.switch-color-secondary .switch-track{border-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-outlined.switch-color-success .switch-track{border-color:var(--ls-color-success)}body.dark .switch-checked.switch-outlined.switch-color-error .switch-track{border-color:var(--ls-color-danger)}body.dark .switch-checked.switch-outlined.switch-color-info .switch-track{border-color:var(--ls-color-info)}body.dark .switch-checked.switch-outlined.switch-color-warning .switch-track{border-color:var(--ls-color-warning)}body.dark .switch-checked.switch-outlined.switch-color-primary .switch-thumb{background-color:var(--ls-color-primary)}body.dark .switch-checked.switch-outlined.switch-color-secondary .switch-thumb{background-color:var(--ls-color-secondary)}body.dark .switch-checked.switch-outlined.switch-color-success .switch-thumb{background-color:var(--ls-color-success)}body.dark .switch-checked.switch-outlined.switch-color-error .switch-thumb{background-color:var(--ls-color-danger)}body.dark .switch-checked.switch-outlined.switch-color-info .switch-thumb{background-color:var(--ls-color-info)}body.dark .switch-checked.switch-outlined.switch-color-warning .switch-thumb{background-color:var(--ls-color-warning)}\n"] }]
1125
+ }], propDecorators: { checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }], defaultChecked: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultChecked", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], labelPlacement: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelPlacement", required: false }] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
1126
+
1127
+ /**
1128
+ * Generated bundle index. Do not edit.
1129
+ */
1130
+
1131
+ export { ButtonComponent, CheckboxComponent, IconButtonComponent, RadioButtonComponent, SliderComponent, SwitchComponent };
1132
+ //# sourceMappingURL=lumston-ds-angular-src-inputs.mjs.map