valtech-components 2.0.510 → 2.0.511

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 (42) hide show
  1. package/esm2022/lib/components/molecules/refresher/refresher.component.mjs +254 -0
  2. package/esm2022/lib/components/molecules/refresher/types.mjs +15 -0
  3. package/esm2022/lib/components/organisms/infinite-list/infinite-list.component.mjs +618 -0
  4. package/esm2022/lib/components/organisms/infinite-list/types.mjs +15 -0
  5. package/esm2022/lib/components/templates/page-template/page-template.component.mjs +3 -3
  6. package/esm2022/lib/services/pagination/index.mjs +5 -0
  7. package/esm2022/lib/services/pagination/pagination.service.mjs +218 -0
  8. package/esm2022/lib/services/pagination/types.mjs +14 -0
  9. package/esm2022/lib/services/skeleton/config.mjs +79 -0
  10. package/esm2022/lib/services/skeleton/directives/loading.directive.mjs +215 -0
  11. package/esm2022/lib/services/skeleton/index.mjs +16 -0
  12. package/esm2022/lib/services/skeleton/skeleton.service.mjs +198 -0
  13. package/esm2022/lib/services/skeleton/templates/detail-skeleton.component.mjs +223 -0
  14. package/esm2022/lib/services/skeleton/templates/form-skeleton.component.mjs +127 -0
  15. package/esm2022/lib/services/skeleton/templates/grid-skeleton.component.mjs +154 -0
  16. package/esm2022/lib/services/skeleton/templates/list-skeleton.component.mjs +110 -0
  17. package/esm2022/lib/services/skeleton/templates/profile-skeleton.component.mjs +207 -0
  18. package/esm2022/lib/services/skeleton/templates/table-skeleton.component.mjs +116 -0
  19. package/esm2022/lib/services/skeleton/types.mjs +11 -0
  20. package/esm2022/public-api.mjs +12 -1
  21. package/fesm2022/valtech-components.mjs +3467 -950
  22. package/fesm2022/valtech-components.mjs.map +1 -1
  23. package/lib/components/molecules/refresher/refresher.component.d.ts +79 -0
  24. package/lib/components/molecules/refresher/types.d.ts +86 -0
  25. package/lib/components/organisms/infinite-list/infinite-list.component.d.ts +111 -0
  26. package/lib/components/organisms/infinite-list/types.d.ts +197 -0
  27. package/lib/services/pagination/index.d.ts +2 -0
  28. package/lib/services/pagination/pagination.service.d.ts +43 -0
  29. package/lib/services/pagination/types.d.ts +113 -0
  30. package/lib/services/skeleton/config.d.ts +30 -0
  31. package/lib/services/skeleton/directives/loading.directive.d.ts +71 -0
  32. package/lib/services/skeleton/index.d.ts +10 -0
  33. package/lib/services/skeleton/skeleton.service.d.ts +127 -0
  34. package/lib/services/skeleton/templates/detail-skeleton.component.d.ts +18 -0
  35. package/lib/services/skeleton/templates/form-skeleton.component.d.ts +22 -0
  36. package/lib/services/skeleton/templates/grid-skeleton.component.d.ts +18 -0
  37. package/lib/services/skeleton/templates/list-skeleton.component.d.ts +17 -0
  38. package/lib/services/skeleton/templates/profile-skeleton.component.d.ts +20 -0
  39. package/lib/services/skeleton/templates/table-skeleton.component.d.ts +17 -0
  40. package/lib/services/skeleton/types.d.ts +111 -0
  41. package/package.json +1 -1
  42. package/public-api.d.ts +6 -0
@@ -0,0 +1,223 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Template de skeleton para paginas de detalle.
7
+ *
8
+ * @example
9
+ * <val-skeleton-detail></val-skeleton-detail>
10
+ *
11
+ * @example
12
+ * <val-skeleton-detail [config]="{ sections: 3 }"></val-skeleton-detail>
13
+ */
14
+ export class DetailSkeletonComponent {
15
+ constructor() {
16
+ this.config = { sections: 2 };
17
+ }
18
+ get sections() {
19
+ return Array(this.config.sections ?? 2).fill(0);
20
+ }
21
+ get metaItems() {
22
+ return [1, 2, 3];
23
+ }
24
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DetailSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DetailSkeletonComponent, isStandalone: true, selector: "val-skeleton-detail", inputs: { config: "config" }, ngImport: i0, template: `
26
+ <div class="skeleton-detail" [class]="config.cssClass">
27
+ <!-- Hero/Header section -->
28
+ <div class="skeleton-detail-hero">
29
+ <val-skeleton
30
+ [props]="{
31
+ type: 'custom',
32
+ width: '100%',
33
+ height: '200px',
34
+ borderRadius: '8px',
35
+ animated: config.animated !== false
36
+ }"
37
+ ></val-skeleton>
38
+ </div>
39
+
40
+ <!-- Title section -->
41
+ <div class="skeleton-detail-title">
42
+ <val-skeleton
43
+ [props]="{
44
+ type: 'text',
45
+ width: '70%',
46
+ height: '28px',
47
+ animated: config.animated !== false
48
+ }"
49
+ ></val-skeleton>
50
+ <val-skeleton
51
+ [props]="{
52
+ type: 'text',
53
+ width: '40%',
54
+ height: '16px',
55
+ animated: config.animated !== false
56
+ }"
57
+ ></val-skeleton>
58
+ </div>
59
+
60
+ <!-- Metadata row -->
61
+ <div class="skeleton-detail-meta">
62
+ @for (meta of metaItems; track $index) {
63
+ <val-skeleton
64
+ [props]="{
65
+ type: 'custom',
66
+ width: '80px',
67
+ height: '24px',
68
+ borderRadius: '12px',
69
+ animated: config.animated !== false
70
+ }"
71
+ ></val-skeleton>
72
+ }
73
+ </div>
74
+
75
+ <!-- Content sections -->
76
+ @for (section of sections; track $index) {
77
+ <div class="skeleton-detail-section">
78
+ <!-- Section title -->
79
+ <val-skeleton
80
+ [props]="{
81
+ type: 'text',
82
+ width: '30%',
83
+ height: '20px',
84
+ animated: config.animated !== false
85
+ }"
86
+ ></val-skeleton>
87
+ <!-- Section content -->
88
+ <val-skeleton
89
+ [props]="{
90
+ type: 'paragraph',
91
+ lines: 4,
92
+ animated: config.animated !== false
93
+ }"
94
+ ></val-skeleton>
95
+ </div>
96
+ }
97
+
98
+ <!-- Action buttons -->
99
+ <div class="skeleton-detail-actions">
100
+ <val-skeleton
101
+ [props]="{
102
+ type: 'custom',
103
+ width: '120px',
104
+ height: '44px',
105
+ borderRadius: '8px',
106
+ animated: config.animated !== false
107
+ }"
108
+ ></val-skeleton>
109
+ <val-skeleton
110
+ [props]="{
111
+ type: 'custom',
112
+ width: '120px',
113
+ height: '44px',
114
+ borderRadius: '8px',
115
+ animated: config.animated !== false
116
+ }"
117
+ ></val-skeleton>
118
+ </div>
119
+ </div>
120
+ `, isInline: true, styles: [".skeleton-detail{display:flex;flex-direction:column;gap:20px;width:100%}.skeleton-detail-hero{width:100%}.skeleton-detail-title{display:flex;flex-direction:column;gap:8px}.skeleton-detail-meta{display:flex;gap:12px;flex-wrap:wrap}.skeleton-detail-section{display:flex;flex-direction:column;gap:12px;padding-top:16px;border-top:1px solid var(--ion-color-light-shade, #d7d8da)}.skeleton-detail-actions{display:flex;gap:12px;padding-top:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
121
+ }
122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DetailSkeletonComponent, decorators: [{
123
+ type: Component,
124
+ args: [{ selector: 'val-skeleton-detail', standalone: true, imports: [CommonModule, SkeletonComponent], template: `
125
+ <div class="skeleton-detail" [class]="config.cssClass">
126
+ <!-- Hero/Header section -->
127
+ <div class="skeleton-detail-hero">
128
+ <val-skeleton
129
+ [props]="{
130
+ type: 'custom',
131
+ width: '100%',
132
+ height: '200px',
133
+ borderRadius: '8px',
134
+ animated: config.animated !== false
135
+ }"
136
+ ></val-skeleton>
137
+ </div>
138
+
139
+ <!-- Title section -->
140
+ <div class="skeleton-detail-title">
141
+ <val-skeleton
142
+ [props]="{
143
+ type: 'text',
144
+ width: '70%',
145
+ height: '28px',
146
+ animated: config.animated !== false
147
+ }"
148
+ ></val-skeleton>
149
+ <val-skeleton
150
+ [props]="{
151
+ type: 'text',
152
+ width: '40%',
153
+ height: '16px',
154
+ animated: config.animated !== false
155
+ }"
156
+ ></val-skeleton>
157
+ </div>
158
+
159
+ <!-- Metadata row -->
160
+ <div class="skeleton-detail-meta">
161
+ @for (meta of metaItems; track $index) {
162
+ <val-skeleton
163
+ [props]="{
164
+ type: 'custom',
165
+ width: '80px',
166
+ height: '24px',
167
+ borderRadius: '12px',
168
+ animated: config.animated !== false
169
+ }"
170
+ ></val-skeleton>
171
+ }
172
+ </div>
173
+
174
+ <!-- Content sections -->
175
+ @for (section of sections; track $index) {
176
+ <div class="skeleton-detail-section">
177
+ <!-- Section title -->
178
+ <val-skeleton
179
+ [props]="{
180
+ type: 'text',
181
+ width: '30%',
182
+ height: '20px',
183
+ animated: config.animated !== false
184
+ }"
185
+ ></val-skeleton>
186
+ <!-- Section content -->
187
+ <val-skeleton
188
+ [props]="{
189
+ type: 'paragraph',
190
+ lines: 4,
191
+ animated: config.animated !== false
192
+ }"
193
+ ></val-skeleton>
194
+ </div>
195
+ }
196
+
197
+ <!-- Action buttons -->
198
+ <div class="skeleton-detail-actions">
199
+ <val-skeleton
200
+ [props]="{
201
+ type: 'custom',
202
+ width: '120px',
203
+ height: '44px',
204
+ borderRadius: '8px',
205
+ animated: config.animated !== false
206
+ }"
207
+ ></val-skeleton>
208
+ <val-skeleton
209
+ [props]="{
210
+ type: 'custom',
211
+ width: '120px',
212
+ height: '44px',
213
+ borderRadius: '8px',
214
+ animated: config.animated !== false
215
+ }"
216
+ ></val-skeleton>
217
+ </div>
218
+ </div>
219
+ `, styles: [".skeleton-detail{display:flex;flex-direction:column;gap:20px;width:100%}.skeleton-detail-hero{width:100%}.skeleton-detail-title{display:flex;flex-direction:column;gap:8px}.skeleton-detail-meta{display:flex;gap:12px;flex-wrap:wrap}.skeleton-detail-section{display:flex;flex-direction:column;gap:12px;padding-top:16px;border-top:1px solid var(--ion-color-light-shade, #d7d8da)}.skeleton-detail-actions{display:flex;gap:12px;padding-top:16px}\n"] }]
220
+ }], propDecorators: { config: [{
221
+ type: Input
222
+ }] } });
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0YWlsLXNrZWxldG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvc2tlbGV0b24vdGVtcGxhdGVzL2RldGFpbC1za2VsZXRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOztBQUcxRjs7Ozs7Ozs7R0FRRztBQThJSCxNQUFNLE9BQU8sdUJBQXVCO0lBN0lwQztRQThJVyxXQUFNLEdBQTJCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO0tBUzNEO0lBUEMsSUFBSSxRQUFRO1FBQ1YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDOytHQVRVLHVCQUF1QjttR0FBdkIsdUJBQXVCLDZHQXpJeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0ZULGtnQkFoR1MsWUFBWSwrQkFBRSxpQkFBaUI7OzRGQTBJOUIsdUJBQXVCO2tCQTdJbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStGVDs4QkEyQ1EsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9hdG9tcy9za2VsZXRvbi9za2VsZXRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0b25UZW1wbGF0ZUNvbmZpZywgU2tlbGV0b25UZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSBkZSBza2VsZXRvbiBwYXJhIHBhZ2luYXMgZGUgZGV0YWxsZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC1za2VsZXRvbi1kZXRhaWw+PC92YWwtc2tlbGV0b24tZGV0YWlsPlxuICpcbiAqIEBleGFtcGxlXG4gKiA8dmFsLXNrZWxldG9uLWRldGFpbCBbY29uZmlnXT1cInsgc2VjdGlvbnM6IDMgfVwiPjwvdmFsLXNrZWxldG9uLWRldGFpbD5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXNrZWxldG9uLWRldGFpbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNrZWxldG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tZGV0YWlsXCIgW2NsYXNzXT1cImNvbmZpZy5jc3NDbGFzc1wiPlxuICAgICAgPCEtLSBIZXJvL0hlYWRlciBzZWN0aW9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWRldGFpbC1oZXJvXCI+XG4gICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMjAwcHgnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgfVwiXG4gICAgICAgID48L3ZhbC1za2VsZXRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRpdGxlIHNlY3Rpb24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tZGV0YWlsLXRpdGxlXCI+XG4gICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgd2lkdGg6ICc3MCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMjhweCcsXG4gICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgIH1cIlxuICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgd2lkdGg6ICc0MCUnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnMTZweCcsXG4gICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgIH1cIlxuICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNZXRhZGF0YSByb3cgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tZGV0YWlsLW1ldGFcIj5cbiAgICAgICAgQGZvciAobWV0YSBvZiBtZXRhSXRlbXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgICB3aWR0aDogJzgwcHgnLFxuICAgICAgICAgICAgICBoZWlnaHQ6ICcyNHB4JyxcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXG4gICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENvbnRlbnQgc2VjdGlvbnMgLS0+XG4gICAgICBAZm9yIChzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWRldGFpbC1zZWN0aW9uXCI+XG4gICAgICAgICAgPCEtLSBTZWN0aW9uIHRpdGxlIC0tPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgd2lkdGg6ICczMCUnLFxuICAgICAgICAgICAgICBoZWlnaHQ6ICcyMHB4JyxcbiAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGNvbmZpZy5hbmltYXRlZCAhPT0gZmFsc2VcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC1za2VsZXRvbj5cbiAgICAgICAgICA8IS0tIFNlY3Rpb24gY29udGVudCAtLT5cbiAgICAgICAgICA8dmFsLXNrZWxldG9uXG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICB0eXBlOiAncGFyYWdyYXBoJyxcbiAgICAgICAgICAgICAgbGluZXM6IDQsXG4gICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8IS0tIEFjdGlvbiBidXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWRldGFpbC1hY3Rpb25zXCI+XG4gICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICB3aWR0aDogJzEyMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzQ0cHgnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgfVwiXG4gICAgICAgID48L3ZhbC1za2VsZXRvbj5cbiAgICAgICAgPHZhbC1za2VsZXRvblxuICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICB0eXBlOiAnY3VzdG9tJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTIwcHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnNDRweCcsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgICAgICAgICAgYW5pbWF0ZWQ6IGNvbmZpZy5hbmltYXRlZCAhPT0gZmFsc2VcbiAgICAgICAgICB9XCJcbiAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5za2VsZXRvbi1kZXRhaWwge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDIwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICAuc2tlbGV0b24tZGV0YWlsLWhlcm8ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnNrZWxldG9uLWRldGFpbC10aXRsZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuXG4gICAgICAuc2tlbGV0b24tZGV0YWlsLW1ldGEge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cblxuICAgICAgLnNrZWxldG9uLWRldGFpbC1zZWN0aW9uIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBwYWRkaW5nLXRvcDogMTZweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1saWdodC1zaGFkZSwgI2Q3ZDhkYSk7XG4gICAgICB9XG5cbiAgICAgIC5za2VsZXRvbi1kZXRhaWwtYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGV0YWlsU2tlbGV0b25Db21wb25lbnQgaW1wbGVtZW50cyBTa2VsZXRvblRlbXBsYXRlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgY29uZmlnOiBTa2VsZXRvblRlbXBsYXRlQ29uZmlnID0geyBzZWN0aW9uczogMiB9O1xuXG4gIGdldCBzZWN0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIEFycmF5KHRoaXMuY29uZmlnLnNlY3Rpb25zID8/IDIpLmZpbGwoMCk7XG4gIH1cblxuICBnZXQgbWV0YUl0ZW1zKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gWzEsIDIsIDNdO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,127 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Template de skeleton para formularios.
7
+ *
8
+ * @example
9
+ * <val-skeleton-form [config]="{ count: 4 }"></val-skeleton-form>
10
+ *
11
+ * @example
12
+ * <val-skeleton-form [config]="{ count: 3, variant: 'compact' }"></val-skeleton-form>
13
+ */
14
+ export class FormSkeletonComponent {
15
+ constructor() {
16
+ this.config = { count: 3 };
17
+ }
18
+ get fields() {
19
+ return Array(this.config.count ?? 3).fill(0);
20
+ }
21
+ get isCompact() {
22
+ return this.config.variant === 'compact';
23
+ }
24
+ get labelWidth() {
25
+ return this.isCompact ? '60px' : '80px';
26
+ }
27
+ get inputHeight() {
28
+ return this.isCompact ? '38px' : '44px';
29
+ }
30
+ get buttonWidth() {
31
+ return this.isCompact ? '120px' : '100%';
32
+ }
33
+ get buttonHeight() {
34
+ return this.isCompact ? '38px' : '48px';
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
37
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: FormSkeletonComponent, isStandalone: true, selector: "val-skeleton-form", inputs: { config: "config" }, ngImport: i0, template: `
38
+ <div
39
+ class="skeleton-form"
40
+ [class]="'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')"
41
+ >
42
+ @for (field of fields; track $index) {
43
+ <div class="skeleton-field">
44
+ <!-- Label -->
45
+ <val-skeleton
46
+ [props]="{
47
+ type: 'text',
48
+ width: labelWidth,
49
+ height: '14px',
50
+ animated: config.animated !== false
51
+ }"
52
+ ></val-skeleton>
53
+ <!-- Input -->
54
+ <val-skeleton
55
+ [props]="{
56
+ type: 'custom',
57
+ width: '100%',
58
+ height: inputHeight,
59
+ borderRadius: '8px',
60
+ animated: config.animated !== false
61
+ }"
62
+ ></val-skeleton>
63
+ </div>
64
+ }
65
+ <!-- Submit button -->
66
+ <div class="skeleton-button">
67
+ <val-skeleton
68
+ [props]="{
69
+ type: 'custom',
70
+ width: buttonWidth,
71
+ height: buttonHeight,
72
+ borderRadius: '8px',
73
+ animated: config.animated !== false
74
+ }"
75
+ ></val-skeleton>
76
+ </div>
77
+ </div>
78
+ `, isInline: true, styles: [".skeleton-form{display:flex;flex-direction:column;width:100%;&.variant-default{gap:20px}&.variant-compact{gap:12px}}.skeleton-field{display:flex;flex-direction:column;gap:6px}.skeleton-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
79
+ }
80
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormSkeletonComponent, decorators: [{
81
+ type: Component,
82
+ args: [{ selector: 'val-skeleton-form', standalone: true, imports: [CommonModule, SkeletonComponent], template: `
83
+ <div
84
+ class="skeleton-form"
85
+ [class]="'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')"
86
+ >
87
+ @for (field of fields; track $index) {
88
+ <div class="skeleton-field">
89
+ <!-- Label -->
90
+ <val-skeleton
91
+ [props]="{
92
+ type: 'text',
93
+ width: labelWidth,
94
+ height: '14px',
95
+ animated: config.animated !== false
96
+ }"
97
+ ></val-skeleton>
98
+ <!-- Input -->
99
+ <val-skeleton
100
+ [props]="{
101
+ type: 'custom',
102
+ width: '100%',
103
+ height: inputHeight,
104
+ borderRadius: '8px',
105
+ animated: config.animated !== false
106
+ }"
107
+ ></val-skeleton>
108
+ </div>
109
+ }
110
+ <!-- Submit button -->
111
+ <div class="skeleton-button">
112
+ <val-skeleton
113
+ [props]="{
114
+ type: 'custom',
115
+ width: buttonWidth,
116
+ height: buttonHeight,
117
+ borderRadius: '8px',
118
+ animated: config.animated !== false
119
+ }"
120
+ ></val-skeleton>
121
+ </div>
122
+ </div>
123
+ `, styles: [".skeleton-form{display:flex;flex-direction:column;width:100%;&.variant-default{gap:20px}&.variant-compact{gap:12px}}.skeleton-field{display:flex;flex-direction:column;gap:6px}.skeleton-button{margin-top:8px}\n"] }]
124
+ }], propDecorators: { config: [{
125
+ type: Input
126
+ }] } });
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1za2VsZXRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3NrZWxldG9uL3RlbXBsYXRlcy9mb3JtLXNrZWxldG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdURBQXVELENBQUM7O0FBRzFGOzs7Ozs7OztHQVFHO0FBMkVILE1BQU0sT0FBTyxxQkFBcUI7SUExRWxDO1FBMkVXLFdBQU0sR0FBMkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0F5QnhEO0lBdkJDLElBQUksTUFBTTtRQUNSLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQzsrR0F6QlUscUJBQXFCO21HQUFyQixxQkFBcUIsMkdBdEV0Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q1QsMFJBMUNTLFlBQVksK0JBQUUsaUJBQWlCOzs0RkF1RTlCLHFCQUFxQjtrQkExRWpDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQyxZQUNoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Q1Q7OEJBOEJRLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTa2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvc2tlbGV0b24vc2tlbGV0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFNrZWxldG9uVGVtcGxhdGVDb25maWcsIFNrZWxldG9uVGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGVtcGxhdGUgZGUgc2tlbGV0b24gcGFyYSBmb3JtdWxhcmlvcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC1za2VsZXRvbi1mb3JtIFtjb25maWddPVwieyBjb3VudDogNCB9XCI+PC92YWwtc2tlbGV0b24tZm9ybT5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC1za2VsZXRvbi1mb3JtIFtjb25maWddPVwieyBjb3VudDogMywgdmFyaWFudDogJ2NvbXBhY3QnIH1cIj48L3ZhbC1za2VsZXRvbi1mb3JtPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc2tlbGV0b24tZm9ybScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNrZWxldG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNrZWxldG9uLWZvcm1cIlxuICAgICAgW2NsYXNzXT1cIid2YXJpYW50LScgKyAoY29uZmlnLnZhcmlhbnQgfHwgJ2RlZmF1bHQnKSArICcgJyArIChjb25maWcuY3NzQ2xhc3MgfHwgJycpXCJcbiAgICA+XG4gICAgICBAZm9yIChmaWVsZCBvZiBmaWVsZHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tZmllbGRcIj5cbiAgICAgICAgICA8IS0tIExhYmVsIC0tPlxuICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgd2lkdGg6IGxhYmVsV2lkdGgsXG4gICAgICAgICAgICAgIGhlaWdodDogJzE0cHgnLFxuICAgICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgICAgIDwhLS0gSW5wdXQgLS0+XG4gICAgICAgICAgPHZhbC1za2VsZXRvblxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgIGhlaWdodDogaW5wdXRIZWlnaHQsXG4gICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzhweCcsXG4gICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPCEtLSBTdWJtaXQgYnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWJ1dHRvblwiPlxuICAgICAgICA8dmFsLXNrZWxldG9uXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgd2lkdGg6IGJ1dHRvbldpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBidXR0b25IZWlnaHQsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICc4cHgnLFxuICAgICAgICAgICAgYW5pbWF0ZWQ6IGNvbmZpZy5hbmltYXRlZCAhPT0gZmFsc2VcbiAgICAgICAgICB9XCJcbiAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5za2VsZXRvbi1mb3JtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgICAgJi52YXJpYW50LWRlZmF1bHQge1xuICAgICAgICAgIGdhcDogMjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgICYudmFyaWFudC1jb21wYWN0IHtcbiAgICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnNrZWxldG9uLWZpZWxkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG5cbiAgICAgIC5za2VsZXRvbi1idXR0b24ge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybVNrZWxldG9uQ29tcG9uZW50IGltcGxlbWVudHMgU2tlbGV0b25UZW1wbGF0ZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogU2tlbGV0b25UZW1wbGF0ZUNvbmZpZyA9IHsgY291bnQ6IDMgfTtcblxuICBnZXQgZmllbGRzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkodGhpcy5jb25maWcuY291bnQgPz8gMykuZmlsbCgwKTtcbiAgfVxuXG4gIGdldCBpc0NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnZhcmlhbnQgPT09ICdjb21wYWN0JztcbiAgfVxuXG4gIGdldCBsYWJlbFdpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb21wYWN0ID8gJzYwcHgnIDogJzgwcHgnO1xuICB9XG5cbiAgZ2V0IGlucHV0SGVpZ2h0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb21wYWN0ID8gJzM4cHgnIDogJzQ0cHgnO1xuICB9XG5cbiAgZ2V0IGJ1dHRvbldpZHRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb21wYWN0ID8gJzEyMHB4JyA6ICcxMDAlJztcbiAgfVxuXG4gIGdldCBidXR0b25IZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0NvbXBhY3QgPyAnMzhweCcgOiAnNDhweCc7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,154 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Template de skeleton para grids de cards.
7
+ *
8
+ * @example
9
+ * <val-skeleton-grid [config]="{ count: 6 }"></val-skeleton-grid>
10
+ *
11
+ * @example
12
+ * <val-skeleton-grid [config]="{ count: 8, variant: 'cards', columns: 4 }"></val-skeleton-grid>
13
+ */
14
+ export class GridSkeletonComponent {
15
+ constructor() {
16
+ this.config = { count: 6 };
17
+ }
18
+ get items() {
19
+ return Array(this.config.count ?? 6).fill(0);
20
+ }
21
+ get gridColumns() {
22
+ if (this.config.columns) {
23
+ return `repeat(${this.config.columns}, 1fr)`;
24
+ }
25
+ return '';
26
+ }
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GridSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: GridSkeletonComponent, isStandalone: true, selector: "val-skeleton-grid", inputs: { config: "config" }, ngImport: i0, template: `
29
+ <div
30
+ class="skeleton-grid"
31
+ [class]="'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')"
32
+ [style.gap]="config.gap || '16px'"
33
+ [style.grid-template-columns]="gridColumns"
34
+ >
35
+ @for (item of items; track $index) {
36
+ @switch (config.variant) {
37
+ @case ('cards') {
38
+ <div class="skeleton-card">
39
+ <val-skeleton
40
+ [props]="{
41
+ type: 'custom',
42
+ width: '100%',
43
+ height: '140px',
44
+ borderRadius: '8px 8px 0 0',
45
+ animated: config.animated !== false
46
+ }"
47
+ ></val-skeleton>
48
+ <div class="skeleton-card-content">
49
+ <val-skeleton
50
+ [props]="{
51
+ type: 'text',
52
+ width: '80%',
53
+ height: '18px',
54
+ animated: config.animated !== false
55
+ }"
56
+ ></val-skeleton>
57
+ <val-skeleton
58
+ [props]="{
59
+ type: 'text',
60
+ width: '60%',
61
+ height: '14px',
62
+ animated: config.animated !== false
63
+ }"
64
+ ></val-skeleton>
65
+ </div>
66
+ </div>
67
+ }
68
+ @case ('compact') {
69
+ <val-skeleton
70
+ [props]="{
71
+ type: 'thumbnail',
72
+ animated: config.animated !== false
73
+ }"
74
+ ></val-skeleton>
75
+ }
76
+ @default {
77
+ <val-skeleton
78
+ [props]="{
79
+ type: 'card',
80
+ animated: config.animated !== false
81
+ }"
82
+ ></val-skeleton>
83
+ }
84
+ }
85
+ }
86
+ </div>
87
+ `, isInline: true, styles: [".skeleton-grid{display:grid;width:100%;&.variant-default{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}&.variant-cards{grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}&.variant-compact{grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:12px}}.skeleton-card{border-radius:8px;overflow:hidden;background:var(--ion-color-light, #f4f5f8)}.skeleton-card-content{padding:12px;display:flex;flex-direction:column;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GridSkeletonComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'val-skeleton-grid', standalone: true, imports: [CommonModule, SkeletonComponent], template: `
92
+ <div
93
+ class="skeleton-grid"
94
+ [class]="'variant-' + (config.variant || 'default') + ' ' + (config.cssClass || '')"
95
+ [style.gap]="config.gap || '16px'"
96
+ [style.grid-template-columns]="gridColumns"
97
+ >
98
+ @for (item of items; track $index) {
99
+ @switch (config.variant) {
100
+ @case ('cards') {
101
+ <div class="skeleton-card">
102
+ <val-skeleton
103
+ [props]="{
104
+ type: 'custom',
105
+ width: '100%',
106
+ height: '140px',
107
+ borderRadius: '8px 8px 0 0',
108
+ animated: config.animated !== false
109
+ }"
110
+ ></val-skeleton>
111
+ <div class="skeleton-card-content">
112
+ <val-skeleton
113
+ [props]="{
114
+ type: 'text',
115
+ width: '80%',
116
+ height: '18px',
117
+ animated: config.animated !== false
118
+ }"
119
+ ></val-skeleton>
120
+ <val-skeleton
121
+ [props]="{
122
+ type: 'text',
123
+ width: '60%',
124
+ height: '14px',
125
+ animated: config.animated !== false
126
+ }"
127
+ ></val-skeleton>
128
+ </div>
129
+ </div>
130
+ }
131
+ @case ('compact') {
132
+ <val-skeleton
133
+ [props]="{
134
+ type: 'thumbnail',
135
+ animated: config.animated !== false
136
+ }"
137
+ ></val-skeleton>
138
+ }
139
+ @default {
140
+ <val-skeleton
141
+ [props]="{
142
+ type: 'card',
143
+ animated: config.animated !== false
144
+ }"
145
+ ></val-skeleton>
146
+ }
147
+ }
148
+ }
149
+ </div>
150
+ `, styles: [".skeleton-grid{display:grid;width:100%;&.variant-default{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}&.variant-cards{grid-template-columns:repeat(auto-fill,minmax(280px,1fr))}&.variant-compact{grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:12px}}.skeleton-card{border-radius:8px;overflow:hidden;background:var(--ion-color-light, #f4f5f8)}.skeleton-card-content{padding:12px;display:flex;flex-direction:column;gap:8px}\n"] }]
151
+ }], propDecorators: { config: [{
152
+ type: Input
153
+ }] } });
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1za2VsZXRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3NrZWxldG9uL3RlbXBsYXRlcy9ncmlkLXNrZWxldG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdURBQXVELENBQUM7O0FBRzFGOzs7Ozs7OztHQVFHO0FBb0dILE1BQU0sT0FBTyxxQkFBcUI7SUFuR2xDO1FBb0dXLFdBQU0sR0FBMkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FZeEQ7SUFWQyxJQUFJLEtBQUs7UUFDUCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixPQUFPLFVBQVUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLFFBQVEsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOytHQVpVLHFCQUFxQjttR0FBckIscUJBQXFCLDJHQS9GdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRULHlnQkE1RFMsWUFBWSwrQkFBRSxpQkFBaUI7OzRGQWdHOUIscUJBQXFCO2tCQW5HakMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLFlBQ2hDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJEVDs4QkFxQ1EsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9hdG9tcy9za2VsZXRvbi9za2VsZXRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0b25UZW1wbGF0ZUNvbmZpZywgU2tlbGV0b25UZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSBkZSBza2VsZXRvbiBwYXJhIGdyaWRzIGRlIGNhcmRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8dmFsLXNrZWxldG9uLWdyaWQgW2NvbmZpZ109XCJ7IGNvdW50OiA2IH1cIj48L3ZhbC1za2VsZXRvbi1ncmlkPlxuICpcbiAqIEBleGFtcGxlXG4gKiA8dmFsLXNrZWxldG9uLWdyaWQgW2NvbmZpZ109XCJ7IGNvdW50OiA4LCB2YXJpYW50OiAnY2FyZHMnLCBjb2x1bW5zOiA0IH1cIj48L3ZhbC1za2VsZXRvbi1ncmlkPlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc2tlbGV0b24tZ3JpZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNrZWxldG9uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInNrZWxldG9uLWdyaWRcIlxuICAgICAgW2NsYXNzXT1cIid2YXJpYW50LScgKyAoY29uZmlnLnZhcmlhbnQgfHwgJ2RlZmF1bHQnKSArICcgJyArIChjb25maWcuY3NzQ2xhc3MgfHwgJycpXCJcbiAgICAgIFtzdHlsZS5nYXBdPVwiY29uZmlnLmdhcCB8fCAnMTZweCdcIlxuICAgICAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCJncmlkQ29sdW1uc1wiXG4gICAgPlxuICAgICAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIEBzd2l0Y2ggKGNvbmZpZy52YXJpYW50KSB7XG4gICAgICAgICAgQGNhc2UgKCdjYXJkcycpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTQwcHgnLFxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnOHB4IDhweCAwIDAnLFxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGNvbmZpZy5hbmltYXRlZCAhPT0gZmFsc2VcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHZhbC1za2VsZXRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzgwJScsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzE4cHgnLFxuICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICc2MCUnLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxNHB4JyxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGNvbmZpZy5hbmltYXRlZCAhPT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgID48L3ZhbC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGNhc2UgKCdjb21wYWN0Jykge1xuICAgICAgICAgICAgPHZhbC1za2VsZXRvblxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0aHVtYm5haWwnLFxuICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICA8dmFsLXNrZWxldG9uXG4gICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NhcmQnLFxuICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgPjwvdmFsLXNrZWxldG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuc2tlbGV0b24tZ3JpZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgICAgICYudmFyaWFudC1kZWZhdWx0IHtcbiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMDBweCwgMWZyKSk7XG4gICAgICAgIH1cblxuICAgICAgICAmLnZhcmlhbnQtY2FyZHMge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDI4MHB4LCAxZnIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgICYudmFyaWFudC1jb21wYWN0IHtcbiAgICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgxMDBweCwgMWZyKSk7XG4gICAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5za2VsZXRvbi1jYXJkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQsICNmNGY1ZjgpO1xuICAgICAgfVxuXG4gICAgICAuc2tlbGV0b24tY2FyZC1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgR3JpZFNrZWxldG9uQ29tcG9uZW50IGltcGxlbWVudHMgU2tlbGV0b25UZW1wbGF0ZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogU2tlbGV0b25UZW1wbGF0ZUNvbmZpZyA9IHsgY291bnQ6IDYgfTtcblxuICBnZXQgaXRlbXMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiBBcnJheSh0aGlzLmNvbmZpZy5jb3VudCA/PyA2KS5maWxsKDApO1xuICB9XG5cbiAgZ2V0IGdyaWRDb2x1bW5zKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmNvbHVtbnMpIHtcbiAgICAgIHJldHVybiBgcmVwZWF0KCR7dGhpcy5jb25maWcuY29sdW1uc30sIDFmcilgO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,110 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SkeletonComponent } from '../../../components/atoms/skeleton/skeleton.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Template de skeleton para listas.
7
+ *
8
+ * @example
9
+ * <val-skeleton-list [config]="{ count: 5 }"></val-skeleton-list>
10
+ *
11
+ * @example
12
+ * <val-skeleton-list [config]="{ count: 3, variant: 'avatar', gap: '16px' }"></val-skeleton-list>
13
+ */
14
+ export class ListSkeletonComponent {
15
+ constructor() {
16
+ this.config = { count: 3 };
17
+ }
18
+ get items() {
19
+ return Array(this.config.count ?? 3).fill(0);
20
+ }
21
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListSkeletonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListSkeletonComponent, isStandalone: true, selector: "val-skeleton-list", inputs: { config: "config" }, ngImport: i0, template: `
23
+ <div class="skeleton-list" [style.gap]="config.gap || '12px'" [class]="config.cssClass">
24
+ @for (item of items; track $index) {
25
+ @if (config.variant === 'avatar') {
26
+ <div class="skeleton-list-item-avatar">
27
+ <val-skeleton
28
+ [props]="{
29
+ type: 'avatar',
30
+ animated: config.animated !== false
31
+ }"
32
+ ></val-skeleton>
33
+ <div class="skeleton-content">
34
+ <val-skeleton
35
+ [props]="{
36
+ type: 'text',
37
+ width: '70%',
38
+ height: '16px',
39
+ animated: config.animated !== false
40
+ }"
41
+ ></val-skeleton>
42
+ <val-skeleton
43
+ [props]="{
44
+ type: 'text',
45
+ width: '50%',
46
+ height: '14px',
47
+ animated: config.animated !== false
48
+ }"
49
+ ></val-skeleton>
50
+ </div>
51
+ </div>
52
+ } @else {
53
+ <val-skeleton
54
+ [props]="{
55
+ type: 'list-item',
56
+ animated: config.animated !== false
57
+ }"
58
+ ></val-skeleton>
59
+ }
60
+ }
61
+ </div>
62
+ `, isInline: true, styles: [".skeleton-list{display:flex;flex-direction:column;width:100%}.skeleton-list-item-avatar{display:flex;align-items:center;gap:12px;padding:8px 0}.skeleton-content{display:flex;flex-direction:column;gap:6px;flex:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SkeletonComponent, selector: "val-skeleton", inputs: ["props"] }] }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListSkeletonComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'val-skeleton-list', standalone: true, imports: [CommonModule, SkeletonComponent], template: `
67
+ <div class="skeleton-list" [style.gap]="config.gap || '12px'" [class]="config.cssClass">
68
+ @for (item of items; track $index) {
69
+ @if (config.variant === 'avatar') {
70
+ <div class="skeleton-list-item-avatar">
71
+ <val-skeleton
72
+ [props]="{
73
+ type: 'avatar',
74
+ animated: config.animated !== false
75
+ }"
76
+ ></val-skeleton>
77
+ <div class="skeleton-content">
78
+ <val-skeleton
79
+ [props]="{
80
+ type: 'text',
81
+ width: '70%',
82
+ height: '16px',
83
+ animated: config.animated !== false
84
+ }"
85
+ ></val-skeleton>
86
+ <val-skeleton
87
+ [props]="{
88
+ type: 'text',
89
+ width: '50%',
90
+ height: '14px',
91
+ animated: config.animated !== false
92
+ }"
93
+ ></val-skeleton>
94
+ </div>
95
+ </div>
96
+ } @else {
97
+ <val-skeleton
98
+ [props]="{
99
+ type: 'list-item',
100
+ animated: config.animated !== false
101
+ }"
102
+ ></val-skeleton>
103
+ }
104
+ }
105
+ </div>
106
+ `, styles: [".skeleton-list{display:flex;flex-direction:column;width:100%}.skeleton-list-item-avatar{display:flex;align-items:center;gap:12px;padding:8px 0}.skeleton-content{display:flex;flex-direction:column;gap:6px;flex:1}\n"] }]
107
+ }], propDecorators: { config: [{
108
+ type: Input
109
+ }] } });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1za2VsZXRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3NrZWxldG9uL3RlbXBsYXRlcy9saXN0LXNrZWxldG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdURBQXVELENBQUM7O0FBRzFGOzs7Ozs7OztHQVFHO0FBc0VILE1BQU0sT0FBTyxxQkFBcUI7SUFyRWxDO1FBc0VXLFdBQU0sR0FBMkIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FLeEQ7SUFIQyxJQUFJLEtBQUs7UUFDUCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzsrR0FMVSxxQkFBcUI7bUdBQXJCLHFCQUFxQiwyR0FqRXRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NULDhSQXpDUyxZQUFZLCtCQUFFLGlCQUFpQjs7NEZBa0U5QixxQkFBcUI7a0JBckVqQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsWUFDaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Q1Q7OEJBMEJRLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTa2VsZXRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvYXRvbXMvc2tlbGV0b24vc2tlbGV0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFNrZWxldG9uVGVtcGxhdGVDb25maWcsIFNrZWxldG9uVGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGVtcGxhdGUgZGUgc2tlbGV0b24gcGFyYSBsaXN0YXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIDx2YWwtc2tlbGV0b24tbGlzdCBbY29uZmlnXT1cInsgY291bnQ6IDUgfVwiPjwvdmFsLXNrZWxldG9uLWxpc3Q+XG4gKlxuICogQGV4YW1wbGVcbiAqIDx2YWwtc2tlbGV0b24tbGlzdCBbY29uZmlnXT1cInsgY291bnQ6IDMsIHZhcmlhbnQ6ICdhdmF0YXInLCBnYXA6ICcxNnB4JyB9XCI+PC92YWwtc2tlbGV0b24tbGlzdD5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXNrZWxldG9uLWxpc3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBTa2VsZXRvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWxpc3RcIiBbc3R5bGUuZ2FwXT1cImNvbmZpZy5nYXAgfHwgJzEycHgnXCIgW2NsYXNzXT1cImNvbmZpZy5jc3NDbGFzc1wiPlxuICAgICAgQGZvciAoaXRlbSBvZiBpdGVtczsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgIEBpZiAoY29uZmlnLnZhcmlhbnQgPT09ICdhdmF0YXInKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLWxpc3QtaXRlbS1hdmF0YXJcIj5cbiAgICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXZhdGFyJyxcbiAgICAgICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID48L3ZhbC1za2VsZXRvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICc3MCUnLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTZweCcsXG4gICAgICAgICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgICAgICAgIDx2YWwtc2tlbGV0b25cbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgd2lkdGg6ICc1MCUnLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTRweCcsXG4gICAgICAgICAgICAgICAgICBhbmltYXRlZDogY29uZmlnLmFuaW1hdGVkICE9PSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHZhbC1za2VsZXRvblxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgdHlwZTogJ2xpc3QtaXRlbScsXG4gICAgICAgICAgICAgIGFuaW1hdGVkOiBjb25maWcuYW5pbWF0ZWQgIT09IGZhbHNlXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC92YWwtc2tlbGV0b24+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnNrZWxldG9uLWxpc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnNrZWxldG9uLWxpc3QtaXRlbS1hdmF0YXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDhweCAwO1xuICAgICAgfVxuXG4gICAgICAuc2tlbGV0b24tY29udGVudCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIExpc3RTa2VsZXRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIFNrZWxldG9uVGVtcGxhdGVDb21wb25lbnQge1xuICBASW5wdXQoKSBjb25maWc6IFNrZWxldG9uVGVtcGxhdGVDb25maWcgPSB7IGNvdW50OiAzIH07XG5cbiAgZ2V0IGl0ZW1zKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkodGhpcy5jb25maWcuY291bnQgPz8gMykuZmlsbCgwKTtcbiAgfVxufVxuIl19