@tolle_/tolle-ui 18.2.29 → 18.2.30

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 (279) hide show
  1. package/esm2022/lib/accordion-item.component.mjs +5 -11
  2. package/esm2022/lib/accordion.component.mjs +4 -9
  3. package/esm2022/lib/alert-dialog-dynamic.component.mjs +5 -10
  4. package/esm2022/lib/alert-dialog.component.mjs +44 -59
  5. package/esm2022/lib/alert.component.mjs +5 -11
  6. package/esm2022/lib/aspect-ratio.component.mjs +119 -0
  7. package/esm2022/lib/attachment.component.mjs +334 -0
  8. package/esm2022/lib/avatar-fallback.component.mjs +3 -3
  9. package/esm2022/lib/avatar.component.mjs +4 -9
  10. package/esm2022/lib/badge.component.mjs +4 -9
  11. package/esm2022/lib/breadcrumb-item.component.mjs +3 -3
  12. package/esm2022/lib/breadcrumb-link.component.mjs +3 -3
  13. package/esm2022/lib/breadcrumb-separator.component.mjs +3 -3
  14. package/esm2022/lib/breadcrumb.component.mjs +3 -3
  15. package/esm2022/lib/bubble.component.mjs +301 -0
  16. package/esm2022/lib/button.component.mjs +5 -11
  17. package/esm2022/lib/calendar.component.mjs +5 -11
  18. package/esm2022/lib/card.component.mjs +14 -43
  19. package/esm2022/lib/carousel/carousel.component.mjs +5 -12
  20. package/esm2022/lib/chain-of-thought.component.mjs +380 -0
  21. package/esm2022/lib/chart-pie.component.mjs +386 -0
  22. package/esm2022/lib/chart.component.mjs +1146 -0
  23. package/esm2022/lib/chart.service.mjs +555 -0
  24. package/esm2022/lib/checkbox.component.mjs +5 -11
  25. package/esm2022/lib/checkpoint.component.mjs +134 -0
  26. package/esm2022/lib/collapsible.component.mjs +4 -11
  27. package/esm2022/lib/combobox.component.mjs +372 -0
  28. package/esm2022/lib/command-dialog.component.mjs +164 -0
  29. package/esm2022/lib/command.component.mjs +514 -0
  30. package/esm2022/lib/command.service.mjs +130 -0
  31. package/esm2022/lib/confirmation.component.mjs +219 -0
  32. package/esm2022/lib/context-menu-trigger.directive.mjs +36 -0
  33. package/esm2022/lib/context-menu.component.mjs +460 -0
  34. package/esm2022/lib/context-menu.service.mjs +121 -0
  35. package/esm2022/lib/context.component.mjs +377 -0
  36. package/esm2022/lib/conversation.component.mjs +442 -0
  37. package/esm2022/lib/country-selector.component.mjs +5 -11
  38. package/esm2022/lib/data-table.component.mjs +59 -12
  39. package/esm2022/lib/date-picker.component.mjs +251 -198
  40. package/esm2022/lib/date-range-picker.component.mjs +224 -116
  41. package/esm2022/lib/date-time-picker.component.mjs +506 -0
  42. package/esm2022/lib/direction.component.mjs +79 -0
  43. package/esm2022/lib/dropdown-item.component.mjs +3 -3
  44. package/esm2022/lib/dropdown-label.component.mjs +3 -3
  45. package/esm2022/lib/dropdown-menu.component.mjs +3 -3
  46. package/esm2022/lib/dropdown-separator.component.mjs +3 -3
  47. package/esm2022/lib/dropdown-trigger.directive.mjs +6 -4
  48. package/esm2022/lib/empty-state.component.mjs +4 -9
  49. package/esm2022/lib/field.component.mjs +394 -0
  50. package/esm2022/lib/hover-card.component.mjs +6 -16
  51. package/esm2022/lib/inline-citation.component.mjs +263 -0
  52. package/esm2022/lib/input-group.component.mjs +418 -0
  53. package/esm2022/lib/input.component.mjs +5 -11
  54. package/esm2022/lib/item.component.mjs +243 -0
  55. package/esm2022/lib/kbd.component.mjs +82 -0
  56. package/esm2022/lib/label.component.mjs +4 -9
  57. package/esm2022/lib/marker.component.mjs +135 -0
  58. package/esm2022/lib/masked-input.component.mjs +5 -11
  59. package/esm2022/lib/menubar.component.mjs +683 -0
  60. package/esm2022/lib/message-scroller.component.mjs +353 -0
  61. package/esm2022/lib/message-scroller.service.mjs +157 -0
  62. package/esm2022/lib/message.component.mjs +228 -0
  63. package/esm2022/lib/model-selector.component.mjs +310 -0
  64. package/esm2022/lib/multi-select.component.mjs +155 -72
  65. package/esm2022/lib/native-select.component.mjs +201 -0
  66. package/esm2022/lib/navigation-menu.component.mjs +642 -0
  67. package/esm2022/lib/otp-group.component.mjs +3 -3
  68. package/esm2022/lib/otp-slot.component.mjs +4 -9
  69. package/esm2022/lib/otp.component.mjs +5 -11
  70. package/esm2022/lib/pagination.component.mjs +7 -10
  71. package/esm2022/lib/plan.component.mjs +335 -0
  72. package/esm2022/lib/popover-content.component.mjs +4 -9
  73. package/esm2022/lib/popover.component.mjs +15 -13
  74. package/esm2022/lib/progress.component.mjs +4 -9
  75. package/esm2022/lib/prompt-input.component.mjs +526 -0
  76. package/esm2022/lib/queue.component.mjs +280 -0
  77. package/esm2022/lib/radio-group.component.mjs +6 -13
  78. package/esm2022/lib/radio-item.component.mjs +4 -9
  79. package/esm2022/lib/range-calendar.component.mjs +5 -11
  80. package/esm2022/lib/reasoning.component.mjs +335 -0
  81. package/esm2022/lib/resizable.component.mjs +219 -0
  82. package/esm2022/lib/segment.component.mjs +17 -7
  83. package/esm2022/lib/select-group.component.mjs +4 -8
  84. package/esm2022/lib/select-item.component.mjs +4 -9
  85. package/esm2022/lib/select-separator.component.mjs +4 -8
  86. package/esm2022/lib/select.component.mjs +133 -49
  87. package/esm2022/lib/separator.component.mjs +4 -9
  88. package/esm2022/lib/sheet.component.mjs +38 -56
  89. package/esm2022/lib/shimmer.component.mjs +84 -0
  90. package/esm2022/lib/sidebar.component.mjs +11 -1
  91. package/esm2022/lib/skeleton.component.mjs +4 -9
  92. package/esm2022/lib/sources.component.mjs +452 -0
  93. package/esm2022/lib/spinner.component.mjs +68 -0
  94. package/esm2022/lib/suggestion.component.mjs +207 -0
  95. package/esm2022/lib/switch.component.mjs +5 -11
  96. package/esm2022/lib/table.component.mjs +213 -0
  97. package/esm2022/lib/tabs.component.mjs +4 -11
  98. package/esm2022/lib/tag-input.component.mjs +5 -11
  99. package/esm2022/lib/task.component.mjs +359 -0
  100. package/esm2022/lib/textarea.component.mjs +5 -11
  101. package/esm2022/lib/theme.service.mjs +17 -6
  102. package/esm2022/lib/time-picker.component.mjs +923 -0
  103. package/esm2022/lib/toast.service.mjs +3 -2
  104. package/esm2022/lib/toaster.component.mjs +76 -39
  105. package/esm2022/lib/toggle-group.component.mjs +4 -9
  106. package/esm2022/lib/toggle.component.mjs +5 -11
  107. package/esm2022/lib/tool.component.mjs +462 -0
  108. package/esm2022/lib/typography.component.mjs +83 -0
  109. package/esm2022/lib/utils/color.mjs +140 -19
  110. package/esm2022/public-api.mjs +61 -1
  111. package/fesm2022/tolle-ui.mjs +16453 -1024
  112. package/fesm2022/tolle-ui.mjs.map +1 -1
  113. package/lib/alert-dialog.component.d.ts +10 -2
  114. package/lib/aspect-ratio.component.d.ts +20 -0
  115. package/lib/attachment.component.d.ts +101 -0
  116. package/lib/bubble.component.d.ts +112 -0
  117. package/lib/chain-of-thought.component.d.ts +166 -0
  118. package/lib/chart-pie.component.d.ts +108 -0
  119. package/lib/chart.component.d.ts +369 -0
  120. package/lib/chart.service.d.ts +222 -0
  121. package/lib/checkpoint.component.d.ts +51 -0
  122. package/lib/combobox.component.d.ts +90 -0
  123. package/lib/command-dialog.component.d.ts +53 -0
  124. package/lib/command.component.d.ts +189 -0
  125. package/lib/command.service.d.ts +67 -0
  126. package/lib/confirmation.component.d.ts +70 -0
  127. package/lib/context-menu-trigger.directive.d.ts +12 -0
  128. package/lib/context-menu.component.d.ts +41 -0
  129. package/lib/context-menu.service.d.ts +38 -0
  130. package/lib/context.component.d.ts +134 -0
  131. package/lib/conversation.component.d.ts +165 -0
  132. package/lib/data-table.component.d.ts +26 -1
  133. package/lib/date-picker.component.d.ts +72 -11
  134. package/lib/date-range-picker.component.d.ts +63 -6
  135. package/lib/date-time-picker.component.d.ts +119 -0
  136. package/lib/direction.component.d.ts +45 -0
  137. package/lib/field.component.d.ts +201 -0
  138. package/lib/inline-citation.component.d.ts +103 -0
  139. package/lib/input-group.component.d.ts +150 -0
  140. package/lib/item.component.d.ts +154 -0
  141. package/lib/kbd.component.d.ts +50 -0
  142. package/lib/marker.component.d.ts +58 -0
  143. package/lib/menubar.component.d.ts +247 -0
  144. package/lib/message-scroller.component.d.ts +159 -0
  145. package/lib/message-scroller.service.d.ts +73 -0
  146. package/lib/message.component.d.ts +128 -0
  147. package/lib/model-selector.component.d.ts +103 -0
  148. package/lib/multi-select.component.d.ts +66 -14
  149. package/lib/native-select.component.d.ts +57 -0
  150. package/lib/navigation-menu.component.d.ts +230 -0
  151. package/lib/plan.component.d.ts +120 -0
  152. package/lib/popover.component.d.ts +1 -0
  153. package/lib/prompt-input.component.d.ts +194 -0
  154. package/lib/queue.component.d.ts +106 -0
  155. package/lib/reasoning.component.d.ts +127 -0
  156. package/lib/resizable.component.d.ts +43 -0
  157. package/lib/segment.component.d.ts +13 -3
  158. package/lib/select.component.d.ts +37 -5
  159. package/lib/sheet.component.d.ts +3 -0
  160. package/lib/shimmer.component.d.ts +38 -0
  161. package/lib/sidebar.component.d.ts +2 -0
  162. package/lib/sources.component.d.ts +156 -0
  163. package/lib/spinner.component.d.ts +29 -0
  164. package/lib/suggestion.component.d.ts +96 -0
  165. package/lib/table.component.d.ts +106 -0
  166. package/lib/task.component.d.ts +151 -0
  167. package/lib/theme.service.d.ts +9 -0
  168. package/lib/time-picker.component.d.ts +243 -0
  169. package/lib/toast.service.d.ts +3 -1
  170. package/lib/toaster.component.d.ts +26 -9
  171. package/lib/tool.component.d.ts +158 -0
  172. package/lib/typography.component.d.ts +32 -0
  173. package/lib/utils/color.d.ts +19 -5
  174. package/package.json +1 -1
  175. package/public-api.d.ts +50 -0
  176. package/registry/docs-content.json +8480 -1542
  177. package/registry/llms-full.txt +2679 -319
  178. package/registry/llms.txt +43 -4
  179. package/registry/manifest.json +9090 -1742
  180. package/registry/r/accordion-item.json +1 -1
  181. package/registry/r/accordion.json +1 -1
  182. package/registry/r/alert-dialog-dynamic.json +1 -1
  183. package/registry/r/alert-dialog.json +1 -1
  184. package/registry/r/alert.json +1 -1
  185. package/registry/r/attachment.json +23 -0
  186. package/registry/r/avatar-fallback.json +1 -1
  187. package/registry/r/avatar.json +1 -1
  188. package/registry/r/badge.json +1 -1
  189. package/registry/r/breadcrumb-item.json +1 -1
  190. package/registry/r/breadcrumb-link.json +1 -1
  191. package/registry/r/breadcrumb-separator.json +1 -1
  192. package/registry/r/breadcrumb.json +1 -1
  193. package/registry/r/bubble.json +23 -0
  194. package/registry/r/button.json +1 -1
  195. package/registry/r/calendar.json +1 -1
  196. package/registry/r/card.json +1 -1
  197. package/registry/r/carousel.json +1 -1
  198. package/registry/r/chain-of-thought.json +23 -0
  199. package/registry/r/chart-pie.json +30 -0
  200. package/registry/r/chart.json +28 -0
  201. package/registry/r/checkbox.json +1 -1
  202. package/registry/r/checkpoint.json +23 -0
  203. package/registry/r/collapsible.json +1 -1
  204. package/registry/r/combobox.json +31 -0
  205. package/registry/r/command-dialog.json +21 -0
  206. package/registry/r/command.json +26 -0
  207. package/registry/r/confirmation.json +23 -0
  208. package/registry/r/context.json +26 -0
  209. package/registry/r/conversation.json +23 -0
  210. package/registry/r/country-selector.json +1 -1
  211. package/registry/r/data-table.json +1 -1
  212. package/registry/r/date-picker.json +4 -4
  213. package/registry/r/date-range-picker.json +3 -3
  214. package/registry/r/date-time-picker.json +28 -0
  215. package/registry/r/direction.json +16 -0
  216. package/registry/r/dropdown-item.json +1 -1
  217. package/registry/r/dropdown-label.json +1 -1
  218. package/registry/r/dropdown-menu.json +1 -1
  219. package/registry/r/dropdown-separator.json +1 -1
  220. package/registry/r/dropdown-trigger.json +1 -1
  221. package/registry/r/empty-state.json +1 -1
  222. package/registry/r/field.json +23 -0
  223. package/registry/r/hover-card.json +1 -1
  224. package/registry/r/inline-citation.json +26 -0
  225. package/registry/r/input-group.json +23 -0
  226. package/registry/r/input.json +1 -1
  227. package/registry/r/item.json +23 -0
  228. package/registry/r/kbd.json +23 -0
  229. package/registry/r/label.json +1 -1
  230. package/registry/r/marker.json +23 -0
  231. package/registry/r/masked-input.json +1 -1
  232. package/registry/r/menubar.json +24 -0
  233. package/registry/r/message-scroller.json +26 -0
  234. package/registry/r/message.json +23 -0
  235. package/registry/r/model-selector.json +32 -0
  236. package/registry/r/multi-select.json +2 -2
  237. package/registry/r/native-select.json +23 -0
  238. package/registry/r/navigation-menu.json +24 -0
  239. package/registry/r/otp-group.json +1 -1
  240. package/registry/r/otp-slot.json +1 -1
  241. package/registry/r/otp.json +1 -1
  242. package/registry/r/pagination.json +3 -2
  243. package/registry/r/plan.json +23 -0
  244. package/registry/r/popover-content.json +1 -1
  245. package/registry/r/popover.json +1 -1
  246. package/registry/r/progress.json +1 -1
  247. package/registry/r/prompt-input.json +23 -0
  248. package/registry/r/queue.json +23 -0
  249. package/registry/r/radio-group.json +1 -1
  250. package/registry/r/radio-item.json +1 -1
  251. package/registry/r/range-calendar.json +1 -1
  252. package/registry/r/reasoning.json +23 -0
  253. package/registry/r/segment.json +1 -1
  254. package/registry/r/select-group.json +1 -1
  255. package/registry/r/select-item.json +1 -1
  256. package/registry/r/select-separator.json +1 -1
  257. package/registry/r/select.json +4 -3
  258. package/registry/r/separator.json +1 -1
  259. package/registry/r/sheet.json +1 -1
  260. package/registry/r/shimmer.json +23 -0
  261. package/registry/r/sidebar.json +1 -1
  262. package/registry/r/skeleton.json +1 -1
  263. package/registry/r/sources.json +23 -0
  264. package/registry/r/spinner.json +23 -0
  265. package/registry/r/suggestion.json +23 -0
  266. package/registry/r/switch.json +1 -1
  267. package/registry/r/table.json +21 -0
  268. package/registry/r/tabs.json +1 -1
  269. package/registry/r/tag-input.json +1 -1
  270. package/registry/r/task.json +23 -0
  271. package/registry/r/textarea.json +1 -1
  272. package/registry/r/time-picker.json +24 -0
  273. package/registry/r/toaster.json +2 -2
  274. package/registry/r/toggle-group.json +1 -1
  275. package/registry/r/toggle.json +1 -1
  276. package/registry/r/tool.json +23 -0
  277. package/registry/r/typography.json +23 -0
  278. package/registry/registry.json +915 -22
  279. package/theme.css +109 -8
@@ -0,0 +1,119 @@
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cn } from './utils/cn';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class AspectRatioComponent {
7
+ cdr;
8
+ ratio = '16 / 9';
9
+ class = '';
10
+ container;
11
+ isLoading = true;
12
+ hasError = false;
13
+ cleanupListeners = [];
14
+ constructor(cdr) {
15
+ this.cdr = cdr;
16
+ }
17
+ ngAfterViewInit() {
18
+ const el = this.container.nativeElement;
19
+ // Use capture phase because load/error do not bubble
20
+ const onLoad = (event) => {
21
+ // Check if the event target is inside our container
22
+ if (el.contains(event.target)) {
23
+ this.onLoad();
24
+ }
25
+ };
26
+ const onError = (event) => {
27
+ if (el.contains(event.target)) {
28
+ this.onError();
29
+ }
30
+ };
31
+ el.addEventListener('load', onLoad, true);
32
+ el.addEventListener('error', onError, true);
33
+ this.cleanupListeners.push(() => {
34
+ el.removeEventListener('load', onLoad, true);
35
+ el.removeEventListener('error', onError, true);
36
+ });
37
+ // Check if there are even any media elements. If not, don't show loader.
38
+ // Or if images were already cached/loaded before AfterViewInit
39
+ setTimeout(() => {
40
+ const media = el.querySelectorAll('img, video, iframe');
41
+ if (media.length === 0) {
42
+ this.onLoad();
43
+ }
44
+ else {
45
+ // Double check if all images are already complete (cached)
46
+ const allComplete = Array.from(media).every(m => {
47
+ if (m instanceof HTMLImageElement)
48
+ return m.complete;
49
+ return false; // For video/iframe we wait for event
50
+ });
51
+ if (allComplete) {
52
+ this.onLoad();
53
+ }
54
+ }
55
+ }, 50);
56
+ }
57
+ onLoad() {
58
+ this.isLoading = false;
59
+ this.hasError = false;
60
+ this.cdr.detectChanges();
61
+ }
62
+ onError() {
63
+ this.isLoading = false;
64
+ this.hasError = true;
65
+ this.cdr.detectChanges();
66
+ }
67
+ ngOnDestroy() {
68
+ this.cleanupListeners.forEach(cleanup => cleanup());
69
+ }
70
+ cn = cn;
71
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AspectRatioComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
72
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AspectRatioComponent, isStandalone: true, selector: "tolle-aspect-ratio", inputs: { ratio: "ratio", class: "class" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
73
+ <div
74
+ #container
75
+ [class]="cn('relative w-full overflow-hidden bg-muted/20', class)"
76
+ [style.aspect-ratio]="ratio"
77
+ >
78
+ <div *ngIf="isLoading && !hasError" class="absolute inset-0 z-10 animate-pulse bg-muted flex items-center justify-center">
79
+ <i class="ri-image-line text-muted-foreground/40 text-3xl"></i>
80
+ </div>
81
+
82
+ <div *ngIf="hasError" class="absolute inset-0 z-20 bg-secondary flex flex-col items-center justify-center gap-2">
83
+ <i class="ri-image-warning-line text-destructive text-2xl"></i>
84
+ <span class="text-[10px] font-medium uppercase tracking-wider text-muted-foreground">Failed to load</span>
85
+ </div>
86
+
87
+ <ng-content></ng-content>
88
+ </div>
89
+ `, isInline: true, styles: [":host{display:block;width:100%}:host ::ng-deep img,:host ::ng-deep video,:host ::ng-deep iframe{position:absolute;height:100%;width:100%;inset:0;object-fit:cover;transition:opacity .3s ease-in-out}:host ::ng-deep .aspect-ratio-content{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
90
+ }
91
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AspectRatioComponent, decorators: [{
92
+ type: Component,
93
+ args: [{ selector: 'tolle-aspect-ratio', standalone: true, imports: [CommonModule], template: `
94
+ <div
95
+ #container
96
+ [class]="cn('relative w-full overflow-hidden bg-muted/20', class)"
97
+ [style.aspect-ratio]="ratio"
98
+ >
99
+ <div *ngIf="isLoading && !hasError" class="absolute inset-0 z-10 animate-pulse bg-muted flex items-center justify-center">
100
+ <i class="ri-image-line text-muted-foreground/40 text-3xl"></i>
101
+ </div>
102
+
103
+ <div *ngIf="hasError" class="absolute inset-0 z-20 bg-secondary flex flex-col items-center justify-center gap-2">
104
+ <i class="ri-image-warning-line text-destructive text-2xl"></i>
105
+ <span class="text-[10px] font-medium uppercase tracking-wider text-muted-foreground">Failed to load</span>
106
+ </div>
107
+
108
+ <ng-content></ng-content>
109
+ </div>
110
+ `, styles: [":host{display:block;width:100%}:host ::ng-deep img,:host ::ng-deep video,:host ::ng-deep iframe{position:absolute;height:100%;width:100%;inset:0;object-fit:cover;transition:opacity .3s ease-in-out}:host ::ng-deep .aspect-ratio-content{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n"] }]
111
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { ratio: [{
112
+ type: Input
113
+ }], class: [{
114
+ type: Input
115
+ }], container: [{
116
+ type: ViewChild,
117
+ args: ['container']
118
+ }] } });
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNwZWN0LXJhdGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYXNwZWN0LXJhdGlvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQTJELE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUFvRGhDLE1BQU0sT0FBTyxvQkFBb0I7SUFXWDtJQVZYLEtBQUssR0FBb0IsUUFBUSxDQUFDO0lBQ2xDLEtBQUssR0FBVyxFQUFFLENBQUM7SUFFSixTQUFTLENBQTJCO0lBRTVELFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUVULGdCQUFnQixHQUFtQixFQUFFLENBQUM7SUFFOUMsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBSSxDQUFDO0lBRS9DLGVBQWU7UUFDYixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztRQUV4QyxxREFBcUQ7UUFDckQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUM5QixvREFBb0Q7WUFDcEQsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7WUFDL0IsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlCLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzdDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLCtEQUErRDtRQUMvRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDeEQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLDJEQUEyRDtnQkFDM0QsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxZQUFZLGdCQUFnQjt3QkFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ3JELE9BQU8sS0FBSyxDQUFDLENBQUMscUNBQXFDO2dCQUNyRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxFQUFFLEdBQUcsRUFBRSxDQUFDO3dHQXpFUCxvQkFBb0I7NEZBQXBCLG9CQUFvQixrT0E5Q3JCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCVCx1WUFsQlMsWUFBWTs7NEZBK0NYLG9CQUFvQjtrQkFsRGhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCVDtzRkE4QlEsS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFa0IsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXNwZWN0LXJhdGlvJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI2NvbnRhaW5lclxuICAgICAgW2NsYXNzXT1cImNuKCdyZWxhdGl2ZSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIGJnLW11dGVkLzIwJywgY2xhc3MpXCJcbiAgICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwicmF0aW9cIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmcgJiYgIWhhc0Vycm9yXCIgY2xhc3M9XCJhYnNvbHV0ZSBpbnNldC0wIHotMTAgYW5pbWF0ZS1wdWxzZSBiZy1tdXRlZCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8aSBjbGFzcz1cInJpLWltYWdlLWxpbmUgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kLzQwIHRleHQtM3hsXCI+PC9pPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJoYXNFcnJvclwiIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTIwIGJnLXNlY29uZGFyeSBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMlwiPlxuICAgICAgICA8aSBjbGFzcz1cInJpLWltYWdlLXdhcm5pbmctbGluZSB0ZXh0LWRlc3RydWN0aXZlIHRleHQtMnhsXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtWzEwcHhdIGZvbnQtbWVkaXVtIHVwcGVyY2FzZSB0cmFja2luZy13aWRlciB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5GYWlsZWQgdG8gbG9hZDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC8qIFRhcmdldCBlbGVtZW50cyBwcm9qZWN0ZWQgaW50byB0aGUgbmctY29udGVudCAqL1xuICAgIDpob3N0IDo6bmctZGVlcCBpbWcsXG4gICAgOmhvc3QgOjpuZy1kZWVwIHZpZGVvLFxuICAgIDpob3N0IDo6bmctZGVlcCBpZnJhbWUge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBpbnNldDogMDtcbiAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzIGVhc2UtaW4tb3V0O1xuICAgIH1cblxuICAgIC8qIFRhcmdldCBkaXJlY3QgZGl2IHdyYXBwZXJzIGlmIG5lZWRlZCAqL1xuICAgIDpob3N0IDo6bmctZGVlcCAuYXNwZWN0LXJhdGlvLWNvbnRlbnQge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgQXNwZWN0UmF0aW9Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSByYXRpbzogc3RyaW5nIHwgbnVtYmVyID0gJzE2IC8gOSc7XG4gIEBJbnB1dCgpIGNsYXNzOiBzdHJpbmcgPSAnJztcblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBpc0xvYWRpbmcgPSB0cnVlO1xuICBoYXNFcnJvciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY2xlYW51cExpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAvLyBVc2UgY2FwdHVyZSBwaGFzZSBiZWNhdXNlIGxvYWQvZXJyb3IgZG8gbm90IGJ1YmJsZVxuICAgIGNvbnN0IG9uTG9hZCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCB0YXJnZXQgaXMgaW5zaWRlIG91ciBjb250YWluZXJcbiAgICAgIGlmIChlbC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5vbkxvYWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25FcnJvciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmIChlbC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgdGhpcy5vbkVycm9yKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQsIHRydWUpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgdHJ1ZSk7XG5cbiAgICB0aGlzLmNsZWFudXBMaXN0ZW5lcnMucHVzaCgoKSA9PiB7XG4gICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkLCB0cnVlKTtcbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgZXZlbiBhbnkgbWVkaWEgZWxlbWVudHMuIElmIG5vdCwgZG9uJ3Qgc2hvdyBsb2FkZXIuXG4gICAgLy8gT3IgaWYgaW1hZ2VzIHdlcmUgYWxyZWFkeSBjYWNoZWQvbG9hZGVkIGJlZm9yZSBBZnRlclZpZXdJbml0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBtZWRpYSA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZywgdmlkZW8sIGlmcmFtZScpO1xuICAgICAgaWYgKG1lZGlhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLm9uTG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG91YmxlIGNoZWNrIGlmIGFsbCBpbWFnZXMgYXJlIGFscmVhZHkgY29tcGxldGUgKGNhY2hlZClcbiAgICAgICAgY29uc3QgYWxsQ29tcGxldGUgPSBBcnJheS5mcm9tKG1lZGlhKS5ldmVyeShtID0+IHtcbiAgICAgICAgICBpZiAobSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHJldHVybiBtLmNvbXBsZXRlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yIHZpZGVvL2lmcmFtZSB3ZSB3YWl0IGZvciBldmVudFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGFsbENvbXBsZXRlKSB7XG4gICAgICAgICAgdGhpcy5vbkxvYWQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDUwKTtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRXJyb3IgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkVycm9yKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5oYXNFcnJvciA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhbnVwTGlzdGVuZXJzLmZvckVhY2goY2xlYW51cCA9PiBjbGVhbnVwKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNuID0gY247XG59XG4iXX0=
@@ -0,0 +1,334 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from './utils/cn';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ const attachmentVariants = cva('group/attachment relative flex w-full max-w-xs items-center gap-3 overflow-hidden rounded-lg border text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', {
8
+ variants: {
9
+ state: {
10
+ idle: 'border-border bg-card text-card-foreground hover:bg-accent',
11
+ uploading: 'border-border bg-card text-card-foreground',
12
+ error: 'border-destructive bg-destructive/10 text-foreground',
13
+ },
14
+ size: {
15
+ sm: 'gap-2 p-1.5 text-xs',
16
+ default: 'gap-3 p-2 text-sm',
17
+ },
18
+ },
19
+ defaultVariants: { state: 'idle', size: 'default' },
20
+ });
21
+ /**
22
+ * A file or image attached to a chat message, with an upload state and an
23
+ * optional progress bar. Wrap several in `tolle-attachment-group`.
24
+ * @new
25
+ */
26
+ export class AttachmentComponent {
27
+ cdr = inject(ChangeDetectorRef);
28
+ /**
29
+ * Angular writes a bound `class` input through its styling path, which does
30
+ * not mark an OnPush component dirty — without this hook the component keeps
31
+ * rendering the class it was born with.
32
+ */
33
+ ngOnChanges() {
34
+ this.cdr.markForCheck();
35
+ }
36
+ /** File name shown as the card's title. */
37
+ name = '';
38
+ /** File size in bytes; rendered as B / KB / MB. @default 0 */
39
+ size = 0;
40
+ /** MIME type, e.g. 'image/png'. Chooses the thumbnail or the file icon. */
41
+ type = '';
42
+ /** Source for the thumbnail and the target of `open`. */
43
+ url = '';
44
+ /** Upload lifecycle state of the attachment. @default 'idle' */
45
+ state = 'idle';
46
+ /** Upload progress from 0 to 100; only shown while uploading. @default 0 */
47
+ progress = 0;
48
+ /** Density of the card. @default 'default' */
49
+ density = 'default';
50
+ /** Shows a trailing remove button that emits `remove`. @default false */
51
+ removable = false;
52
+ /** Accessible label for the remove button. @default 'Remove attachment' */
53
+ removeLabel = 'Remove attachment';
54
+ /** Text shown in place of the size when the state is 'error'. @default 'Upload failed' */
55
+ errorLabel = 'Upload failed';
56
+ /** Extra Tailwind classes merged onto the card via `cn()` (last-wins). */
57
+ class = '';
58
+ /** Emitted when the remove button is pressed. */
59
+ remove = new EventEmitter();
60
+ /** Emitted when the card is activated by click, Enter, or Space. */
61
+ open = new EventEmitter();
62
+ get computedClass() {
63
+ return cn(attachmentVariants({ state: this.state, size: this.density }), this.class);
64
+ }
65
+ /** Whether the attachment renders as an image thumbnail rather than a file icon. */
66
+ get isImage() {
67
+ return this.type.startsWith('image/') && !!this.url;
68
+ }
69
+ /** Remixicon class picked from the MIME type. */
70
+ get iconClass() {
71
+ return this.iconForType(this.type);
72
+ }
73
+ /** The `size` input rendered for display, e.g. 1536 becomes "1.5 KB". */
74
+ get formattedSize() {
75
+ return this.formatBytes(this.size);
76
+ }
77
+ /** `progress` constrained to the 0-100 the progress bar can render. */
78
+ get clampedProgress() {
79
+ if (!Number.isFinite(this.progress))
80
+ return 0;
81
+ return Math.min(100, Math.max(0, this.progress));
82
+ }
83
+ formatBytes(bytes) {
84
+ if (!Number.isFinite(bytes) || bytes < 0)
85
+ return '';
86
+ if (bytes < 1024)
87
+ return bytes + ' B';
88
+ const units = ['KB', 'MB', 'GB', 'TB'];
89
+ let value = bytes / 1024;
90
+ let unit = 0;
91
+ while (value >= 1024 && unit < units.length - 1) {
92
+ value /= 1024;
93
+ unit++;
94
+ }
95
+ // One decimal, with a trailing ".0" dropped: 1536 -> "1.5 KB", 2048 -> "2 KB".
96
+ return Math.round(value * 10) / 10 + ' ' + units[unit];
97
+ }
98
+ iconForType(type) {
99
+ if (type.startsWith('image/'))
100
+ return 'ri-image-line';
101
+ if (type.startsWith('video/'))
102
+ return 'ri-film-line';
103
+ if (type.startsWith('audio/'))
104
+ return 'ri-music-2-line';
105
+ if (type === 'application/pdf')
106
+ return 'ri-file-pdf-line';
107
+ if (type.startsWith('text/'))
108
+ return 'ri-file-text-line';
109
+ if (type.includes('zip') || type.includes('compressed') || type.includes('tar')) {
110
+ return 'ri-file-zip-line';
111
+ }
112
+ if (type.includes('spreadsheet') || type.includes('excel') || type.includes('csv')) {
113
+ return 'ri-file-excel-line';
114
+ }
115
+ return 'ri-file-line';
116
+ }
117
+ onRemove(event) {
118
+ // The card itself is a trigger; a remove click must not also open it.
119
+ event.stopPropagation();
120
+ this.remove.emit(event);
121
+ }
122
+ onOpen(event) {
123
+ if (event.type === 'keydown')
124
+ event.preventDefault();
125
+ this.open.emit(event);
126
+ }
127
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
128
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AttachmentComponent, isStandalone: true, selector: "tolle-attachment", inputs: { name: "name", size: "size", type: "type", url: "url", state: "state", progress: "progress", density: "density", removable: "removable", removeLabel: "removeLabel", errorLabel: "errorLabel", class: "class" }, outputs: { remove: "remove", open: "open" }, usesOnChanges: true, ngImport: i0, template: `
129
+ <div
130
+ [class]="computedClass"
131
+ role="button"
132
+ tabindex="0"
133
+ [attr.aria-label]="name"
134
+ (click)="onOpen($event)"
135
+ (keydown.enter)="onOpen($event)"
136
+ (keydown.space)="onOpen($event)">
137
+ <img
138
+ *ngIf="isImage; else fileIcon"
139
+ [src]="url"
140
+ [alt]="name"
141
+ class="size-10 shrink-0 rounded-md object-cover" />
142
+
143
+ <ng-template #fileIcon>
144
+ <span class="flex size-10 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground">
145
+ <i [class]="iconClass" aria-hidden="true"></i>
146
+ </span>
147
+ </ng-template>
148
+
149
+ <span class="flex min-w-0 flex-1 flex-col gap-0.5">
150
+ <span class="truncate font-medium leading-none">{{ name }}</span>
151
+
152
+ <span class="truncate text-xs text-muted-foreground">
153
+ <ng-container *ngIf="state === 'error'; else metaText">{{ errorLabel }}</ng-container>
154
+ <ng-template #metaText>{{ formattedSize }}</ng-template>
155
+ </span>
156
+
157
+ <span
158
+ *ngIf="state === 'uploading'"
159
+ class="mt-1 block h-1 w-full overflow-hidden rounded-full bg-muted"
160
+ role="progressbar"
161
+ aria-valuemin="0"
162
+ aria-valuemax="100"
163
+ [attr.aria-valuenow]="clampedProgress">
164
+ <span
165
+ class="block h-full rounded-full bg-primary transition-all"
166
+ [style.width.%]="clampedProgress"></span>
167
+ </span>
168
+ </span>
169
+
170
+ <button
171
+ *ngIf="removable"
172
+ type="button"
173
+ [attr.aria-label]="removeLabel"
174
+ (click)="onRemove($event)"
175
+ class="shrink-0 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring">
176
+ <i class="ri-close-line" aria-hidden="true"></i>
177
+ </button>
178
+
179
+ <ng-content></ng-content>
180
+ </div>
181
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
182
+ }
183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentComponent, decorators: [{
184
+ type: Component,
185
+ args: [{ selector: 'tolle-attachment', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
186
+ <div
187
+ [class]="computedClass"
188
+ role="button"
189
+ tabindex="0"
190
+ [attr.aria-label]="name"
191
+ (click)="onOpen($event)"
192
+ (keydown.enter)="onOpen($event)"
193
+ (keydown.space)="onOpen($event)">
194
+ <img
195
+ *ngIf="isImage; else fileIcon"
196
+ [src]="url"
197
+ [alt]="name"
198
+ class="size-10 shrink-0 rounded-md object-cover" />
199
+
200
+ <ng-template #fileIcon>
201
+ <span class="flex size-10 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground">
202
+ <i [class]="iconClass" aria-hidden="true"></i>
203
+ </span>
204
+ </ng-template>
205
+
206
+ <span class="flex min-w-0 flex-1 flex-col gap-0.5">
207
+ <span class="truncate font-medium leading-none">{{ name }}</span>
208
+
209
+ <span class="truncate text-xs text-muted-foreground">
210
+ <ng-container *ngIf="state === 'error'; else metaText">{{ errorLabel }}</ng-container>
211
+ <ng-template #metaText>{{ formattedSize }}</ng-template>
212
+ </span>
213
+
214
+ <span
215
+ *ngIf="state === 'uploading'"
216
+ class="mt-1 block h-1 w-full overflow-hidden rounded-full bg-muted"
217
+ role="progressbar"
218
+ aria-valuemin="0"
219
+ aria-valuemax="100"
220
+ [attr.aria-valuenow]="clampedProgress">
221
+ <span
222
+ class="block h-full rounded-full bg-primary transition-all"
223
+ [style.width.%]="clampedProgress"></span>
224
+ </span>
225
+ </span>
226
+
227
+ <button
228
+ *ngIf="removable"
229
+ type="button"
230
+ [attr.aria-label]="removeLabel"
231
+ (click)="onRemove($event)"
232
+ class="shrink-0 rounded-md p-1 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring">
233
+ <i class="ri-close-line" aria-hidden="true"></i>
234
+ </button>
235
+
236
+ <ng-content></ng-content>
237
+ </div>
238
+ `, styles: [":host{display:block}\n"] }]
239
+ }], propDecorators: { name: [{
240
+ type: Input
241
+ }], size: [{
242
+ type: Input
243
+ }], type: [{
244
+ type: Input
245
+ }], url: [{
246
+ type: Input
247
+ }], state: [{
248
+ type: Input
249
+ }], progress: [{
250
+ type: Input
251
+ }], density: [{
252
+ type: Input
253
+ }], removable: [{
254
+ type: Input
255
+ }], removeLabel: [{
256
+ type: Input
257
+ }], errorLabel: [{
258
+ type: Input
259
+ }], class: [{
260
+ type: Input
261
+ }], remove: [{
262
+ type: Output
263
+ }], open: [{
264
+ type: Output
265
+ }] } });
266
+ /** Wrapping row of attachment cards below or above a message. */
267
+ export class AttachmentGroupComponent {
268
+ cdr = inject(ChangeDetectorRef);
269
+ /**
270
+ * Angular writes a bound `class` input through its styling path, which does
271
+ * not mark an OnPush component dirty — without this hook the component keeps
272
+ * rendering the class it was born with.
273
+ */
274
+ ngOnChanges() {
275
+ this.cdr.markForCheck();
276
+ }
277
+ /** Extra Tailwind classes merged onto the row via `cn()` (last-wins). */
278
+ class = '';
279
+ cn = cn;
280
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
281
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AttachmentGroupComponent, isStandalone: true, selector: "tolle-attachment-group", inputs: { class: "class" }, usesOnChanges: true, ngImport: i0, template: `<div [class]="cn('flex flex-wrap items-start gap-2', class)"><ng-content></ng-content></div>`, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
282
+ }
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentGroupComponent, decorators: [{
284
+ type: Component,
285
+ args: [{ selector: 'tolle-attachment-group', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `<div [class]="cn('flex flex-wrap items-start gap-2', class)"><ng-content></ng-content></div>`, styles: [":host{display:block}\n"] }]
286
+ }], propDecorators: { class: [{
287
+ type: Input
288
+ }] } });
289
+ /**
290
+ * Trailing slot for attachment controls — download, retry, remove. Clicks are
291
+ * kept inside the slot so the card's own trigger does not also fire.
292
+ */
293
+ export class AttachmentActionsComponent {
294
+ cdr = inject(ChangeDetectorRef);
295
+ /**
296
+ * Angular writes a bound `class` input through its styling path, which does
297
+ * not mark an OnPush component dirty — without this hook the component keeps
298
+ * rendering the class it was born with.
299
+ */
300
+ ngOnChanges() {
301
+ this.cdr.markForCheck();
302
+ }
303
+ /** Keeps the actions visible instead of revealing them on hover or focus. @default false */
304
+ alwaysVisible = false;
305
+ /** Extra Tailwind classes merged onto the slot via `cn()` (last-wins). */
306
+ class = '';
307
+ get computedClass() {
308
+ return cn('flex shrink-0 items-center gap-1 transition-opacity', this.alwaysVisible
309
+ ? 'opacity-100'
310
+ : 'opacity-0 focus-within:opacity-100 group-hover/attachment:opacity-100', this.class);
311
+ }
312
+ onClick(event) {
313
+ event.stopPropagation();
314
+ }
315
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
316
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AttachmentActionsComponent, isStandalone: true, selector: "tolle-attachment-actions", inputs: { alwaysVisible: "alwaysVisible", class: "class" }, usesOnChanges: true, ngImport: i0, template: `
317
+ <div [class]="computedClass" (click)="onClick($event)">
318
+ <ng-content></ng-content>
319
+ </div>
320
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
321
+ }
322
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AttachmentActionsComponent, decorators: [{
323
+ type: Component,
324
+ args: [{ selector: 'tolle-attachment-actions', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
325
+ <div [class]="computedClass" (click)="onClick($event)">
326
+ <ng-content></ng-content>
327
+ </div>
328
+ `, styles: [":host{display:block}\n"] }]
329
+ }], propDecorators: { alwaysVisible: [{
330
+ type: Input
331
+ }], class: [{
332
+ type: Input
333
+ }] } });
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy90b2xsZS9zcmMvbGliL2F0dGFjaG1lbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFxQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7OztBQUVoQyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FDNUIsdU5BQXVOLEVBQ3ZOO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLDREQUE0RDtZQUNsRSxTQUFTLEVBQUUsNENBQTRDO1lBQ3ZELEtBQUssRUFBRSxzREFBc0Q7U0FDOUQ7UUFDRCxJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUscUJBQXFCO1lBQ3pCLE9BQU8sRUFBRSxtQkFBbUI7U0FDN0I7S0FDRjtJQUNELGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtDQUNwRCxDQUNGLENBQUM7QUFJRjs7OztHQUlHO0FBOERILE1BQU0sT0FBTyxtQkFBbUI7SUFDYixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFakQ7Ozs7T0FJRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCwyQ0FBMkM7SUFDbEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNuQiw4REFBOEQ7SUFDckQs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YixLQUFLOztBQUlSOzs7R0FHRztBQWFILE1BQU0sT0FBTywwQkFBMEI7SUFDcEIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsNEZBQTRGO0lBQ25GLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDL0IsMEVBQTBFO0lBQ2pFLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFcEIsSUFBSSxhQUFhO1FBQ2YsT0FBTyxFQUFFLENBQ1AscURBQXFELEVBQ3JELElBQUksQ0FBQyxhQUFhO1lBQ2hCLENBQUMsQ0FBQyxhQUFhO1lBQ2YsQ0FBQyxDQUFDLHVFQUF1RSxFQUMzRSxJQUFJLENBQUMsS0FBSyxDQUNYLENBQUM7SUFDSixDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQVk7UUFDNUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7d0dBN0JVLDBCQUEwQjs0RkFBMUIsMEJBQTBCLHFLQU4zQjs7OztHQUlULCtGQU5TLFlBQVk7OzRGQVFYLDBCQUEwQjtrQkFadEMsU0FBUzsrQkFDRSwwQkFBMEIsY0FFeEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7R0FJVDs4QkFlUSxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIE9uQ2hhbmdlcywgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuXG5jb25zdCBhdHRhY2htZW50VmFyaWFudHMgPSBjdmEoXG4gICdncm91cC9hdHRhY2htZW50IHJlbGF0aXZlIGZsZXggdy1mdWxsIG1heC13LXhzIGl0ZW1zLWNlbnRlciBnYXAtMyBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1sZyBib3JkZXIgdGV4dC1sZWZ0IHRyYW5zaXRpb24tY29sb3JzIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTInLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIGlkbGU6ICdib3JkZXItYm9yZGVyIGJnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQgaG92ZXI6YmctYWNjZW50JyxcbiAgICAgICAgdXBsb2FkaW5nOiAnYm9yZGVyLWJvcmRlciBiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZXJyb3I6ICdib3JkZXItZGVzdHJ1Y3RpdmUgYmctZGVzdHJ1Y3RpdmUvMTAgdGV4dC1mb3JlZ3JvdW5kJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHNtOiAnZ2FwLTIgcC0xLjUgdGV4dC14cycsXG4gICAgICAgIGRlZmF1bHQ6ICdnYXAtMyBwLTIgdGV4dC1zbScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7IHN0YXRlOiAnaWRsZScsIHNpemU6ICdkZWZhdWx0JyB9LFxuICB9XG4pO1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50UHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIGF0dGFjaG1lbnRWYXJpYW50cz47XG5cbi8qKlxuICogQSBmaWxlIG9yIGltYWdlIGF0dGFjaGVkIHRvIGEgY2hhdCBtZXNzYWdlLCB3aXRoIGFuIHVwbG9hZCBzdGF0ZSBhbmQgYW5cbiAqIG9wdGlvbmFsIHByb2dyZXNzIGJhci4gV3JhcCBzZXZlcmFsIGluIGB0b2xsZS1hdHRhY2htZW50LWdyb3VwYC5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXR0YWNobWVudCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiXG4gICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5hbWVcIlxuICAgICAgKGNsaWNrKT1cIm9uT3BlbigkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uT3BlbigkZXZlbnQpXCJcbiAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uT3BlbigkZXZlbnQpXCI+XG4gICAgICA8aW1nXG4gICAgICAgICpuZ0lmPVwiaXNJbWFnZTsgZWxzZSBmaWxlSWNvblwiXG4gICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgW2FsdF09XCJuYW1lXCJcbiAgICAgICAgY2xhc3M9XCJzaXplLTEwIHNocmluay0wIHJvdW5kZWQtbWQgb2JqZWN0LWNvdmVyXCIgLz5cblxuICAgICAgPG5nLXRlbXBsYXRlICNmaWxlSWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IHNpemUtMTAgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYmctbXV0ZWQgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cImljb25DbGFzc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IG1pbi13LTAgZmxleC0xIGZsZXgtY29sIGdhcC0wLjVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0cnVuY2F0ZSBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmVcIj57eyBuYW1lIH19PC9zcGFuPlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC14cyB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhdGUgPT09ICdlcnJvcic7IGVsc2UgbWV0YVRleHRcIj57eyBlcnJvckxhYmVsIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNtZXRhVGV4dD57eyBmb3JtYXR0ZWRTaXplIH19PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJzdGF0ZSA9PT0gJ3VwbG9hZGluZydcIlxuICAgICAgICAgIGNsYXNzPVwibXQtMSBibG9jayBoLTEgdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLWZ1bGwgYmctbXV0ZWRcIlxuICAgICAgICAgIHJvbGU9XCJwcm9ncmVzc2JhclwiXG4gICAgICAgICAgYXJpYS12YWx1ZW1pbj1cIjBcIlxuICAgICAgICAgIGFyaWEtdmFsdWVtYXg9XCIxMDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwiY2xhbXBlZFByb2dyZXNzXCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgaC1mdWxsIHJvdW5kZWQtZnVsbCBiZy1wcmltYXJ5IHRyYW5zaXRpb24tYWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNsYW1wZWRQcm9ncmVzc1wiPjwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwicmVtb3ZhYmxlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVtb3ZlTGFiZWxcIlxuICAgICAgICAoY2xpY2spPVwib25SZW1vdmUoJGV2ZW50KVwiXG4gICAgICAgIGNsYXNzPVwic2hyaW5rLTAgcm91bmRlZC1tZCBwLTEgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLW11dGVkIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZ1wiPlxuICAgICAgICA8aSBjbGFzcz1cInJpLWNsb3NlLWxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50Q29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRmlsZSBuYW1lIHNob3duIGFzIHRoZSBjYXJkJ3MgdGl0bGUuICovXG4gIEBJbnB1dCgpIG5hbWUgPSAnJztcbiAgLyoqIEZpbGUgc2l6ZSBpbiBieXRlczsgcmVuZGVyZWQgYXMgQiAvIEtCIC8gTUIuIEBkZWZhdWx0IDAgKi9cbiAgQElucHV0KCkgc2l6ZSA9IDA7XG4gIC8qKiBNSU1FIHR5cGUsIGUuZy4gJ2ltYWdlL3BuZycuIENob29zZXMgdGhlIHRodW1ibmFpbCBvciB0aGUgZmlsZSBpY29uLiAqL1xuICBASW5wdXQoKSB0eXBlID0gJyc7XG4gIC8qKiBTb3VyY2UgZm9yIHRoZSB0aHVtYm5haWwgYW5kIHRoZSB0YXJnZXQgb2YgYG9wZW5gLiAqL1xuICBASW5wdXQoKSB1cmwgPSAnJztcbiAgLyoqIFVwbG9hZCBsaWZlY3ljbGUgc3RhdGUgb2YgdGhlIGF0dGFjaG1lbnQuIEBkZWZhdWx0ICdpZGxlJyAqL1xuICBASW5wdXQoKSBzdGF0ZTogQXR0YWNobWVudFByb3BzWydzdGF0ZSddID0gJ2lkbGUnO1xuICAvKiogVXBsb2FkIHByb2dyZXNzIGZyb20gMCB0byAxMDA7IG9ubHkgc2hvd24gd2hpbGUgdXBsb2FkaW5nLiBAZGVmYXVsdCAwICovXG4gIEBJbnB1dCgpIHByb2dyZXNzID0gMDtcbiAgLyoqIERlbnNpdHkgb2YgdGhlIGNhcmQuIEBkZWZhdWx0ICdkZWZhdWx0JyAqL1xuICBASW5wdXQoKSBkZW5zaXR5OiBBdHRhY2htZW50UHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFNob3dzIGEgdHJhaWxpbmcgcmVtb3ZlIGJ1dHRvbiB0aGF0IGVtaXRzIGByZW1vdmVgLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSByZW1vdmFibGUgPSBmYWxzZTtcbiAgLyoqIEFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSByZW1vdmUgYnV0dG9uLiBAZGVmYXVsdCAnUmVtb3ZlIGF0dGFjaG1lbnQnICovXG4gIEBJbnB1dCgpIHJlbW92ZUxhYmVsID0gJ1JlbW92ZSBhdHRhY2htZW50JztcbiAgLyoqIFRleHQgc2hvd24gaW4gcGxhY2Ugb2YgdGhlIHNpemUgd2hlbiB0aGUgc3RhdGUgaXMgJ2Vycm9yJy4gQGRlZmF1bHQgJ1VwbG9hZCBmYWlsZWQnICovXG4gIEBJbnB1dCgpIGVycm9yTGFiZWwgPSAnVXBsb2FkIGZhaWxlZCc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBjYXJkIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgcmVtb3ZlIGJ1dHRvbiBpcyBwcmVzc2VkLiAqL1xuICBAT3V0cHV0KCkgcmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgY2FyZCBpcyBhY3RpdmF0ZWQgYnkgY2xpY2ssIEVudGVyLCBvciBTcGFjZS4gKi9cbiAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIGdldCBjb21wdXRlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNuKGF0dGFjaG1lbnRWYXJpYW50cyh7IHN0YXRlOiB0aGlzLnN0YXRlLCBzaXplOiB0aGlzLmRlbnNpdHkgfSksIHRoaXMuY2xhc3MpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGF0dGFjaG1lbnQgcmVuZGVycyBhcyBhbiBpbWFnZSB0aHVtYm5haWwgcmF0aGVyIHRoYW4gYSBmaWxlIGljb24uICovXG4gIGdldCBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykgJiYgISF0aGlzLnVybDtcbiAgfVxuXG4gIC8qKiBSZW1peGljb24gY2xhc3MgcGlja2VkIGZyb20gdGhlIE1JTUUgdHlwZS4gKi9cbiAgZ2V0IGljb25DbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25Gb3JUeXBlKHRoaXMudHlwZSk7XG4gIH1cblxuICAvKiogVGhlIGBzaXplYCBpbnB1dCByZW5kZXJlZCBmb3IgZGlzcGxheSwgZS5nLiAxNTM2IGJlY29tZXMgXCIxLjUgS0JcIi4gKi9cbiAgZ2V0IGZvcm1hdHRlZFNpemUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRCeXRlcyh0aGlzLnNpemUpO1xuICB9XG5cbiAgLyoqIGBwcm9ncmVzc2AgY29uc3RyYWluZWQgdG8gdGhlIDAtMTAwIHRoZSBwcm9ncmVzcyBiYXIgY2FuIHJlbmRlci4gKi9cbiAgZ2V0IGNsYW1wZWRQcm9ncmVzcygpOiBudW1iZXIge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMucHJvZ3Jlc3MpKSByZXR1cm4gMDtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLnByb2dyZXNzKSk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGJ5dGVzKSB8fCBieXRlcyA8IDApIHJldHVybiAnJztcbiAgICBpZiAoYnl0ZXMgPCAxMDI0KSByZXR1cm4gYnl0ZXMgKyAnIEInO1xuXG4gICAgY29uc3QgdW5pdHMgPSBbJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XG4gICAgbGV0IHZhbHVlID0gYnl0ZXMgLyAxMDI0O1xuICAgIGxldCB1bml0ID0gMDtcbiAgICB3aGlsZSAodmFsdWUgPj0gMTAyNCAmJiB1bml0IDwgdW5pdHMubGVuZ3RoIC0gMSkge1xuICAgICAgdmFsdWUgLz0gMTAyNDtcbiAgICAgIHVuaXQrKztcbiAgICB9XG5cbiAgICAvLyBPbmUgZGVjaW1hbCwgd2l0aCBhIHRyYWlsaW5nIFwiLjBcIiBkcm9wcGVkOiAxNTM2IC0+IFwiMS41IEtCXCIsIDIwNDggLT4gXCIyIEtCXCIuXG4gICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiAxMCkgLyAxMCArICcgJyArIHVuaXRzW3VuaXRdO1xuICB9XG5cbiAgcHJpdmF0ZSBpY29uRm9yVHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSByZXR1cm4gJ3JpLWltYWdlLWxpbmUnO1xuICAgIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpKSByZXR1cm4gJ3JpLWZpbG0tbGluZSc7XG4gICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgnYXVkaW8vJykpIHJldHVybiAncmktbXVzaWMtMi1saW5lJztcbiAgICBpZiAodHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIHJldHVybiAncmktZmlsZS1wZGYtbGluZSc7XG4gICAgaWYgKHR5cGUuc3RhcnRzV2l0aCgndGV4dC8nKSkgcmV0dXJuICdyaS1maWxlLXRleHQtbGluZSc7XG4gICAgaWYgKHR5cGUuaW5jbHVkZXMoJ3ppcCcpIHx8IHR5cGUuaW5jbHVkZXMoJ2NvbXByZXNzZWQnKSB8fCB0eXBlLmluY2x1ZGVzKCd0YXInKSkge1xuICAgICAgcmV0dXJuICdyaS1maWxlLXppcC1saW5lJztcbiAgICB9XG4gICAgaWYgKHR5cGUuaW5jbHVkZXMoJ3NwcmVhZHNoZWV0JykgfHwgdHlwZS5pbmNsdWRlcygnZXhjZWwnKSB8fCB0eXBlLmluY2x1ZGVzKCdjc3YnKSkge1xuICAgICAgcmV0dXJuICdyaS1maWxlLWV4Y2VsLWxpbmUnO1xuICAgIH1cbiAgICByZXR1cm4gJ3JpLWZpbGUtbGluZSc7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25SZW1vdmUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gVGhlIGNhcmQgaXRzZWxmIGlzIGEgdHJpZ2dlcjsgYSByZW1vdmUgY2xpY2sgbXVzdCBub3QgYWxzbyBvcGVuIGl0LlxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMucmVtb3ZlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uT3BlbihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMub3Blbi5lbWl0KGV2ZW50KTtcbiAgfVxufVxuXG4vKiogV3JhcHBpbmcgcm93IG9mIGF0dGFjaG1lbnQgY2FyZHMgYmVsb3cgb3IgYWJvdmUgYSBtZXNzYWdlLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXR0YWNobWVudC1ncm91cCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGA8ZGl2IFtjbGFzc109XCJjbignZmxleCBmbGV4LXdyYXAgaXRlbXMtc3RhcnQgZ2FwLTInLCBjbGFzcylcIj48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YCxcbn0pXG5leHBvcnQgY2xhc3MgQXR0YWNobWVudEdyb3VwQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcm93IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG4gIHByb3RlY3RlZCBjbiA9IGNuO1xufVxuXG4vKipcbiAqIFRyYWlsaW5nIHNsb3QgZm9yIGF0dGFjaG1lbnQgY29udHJvbHMg4oCUIGRvd25sb2FkLCByZXRyeSwgcmVtb3ZlLiBDbGlja3MgYXJlXG4gKiBrZXB0IGluc2lkZSB0aGUgc2xvdCBzbyB0aGUgY2FyZCdzIG93biB0cmlnZ2VyIGRvZXMgbm90IGFsc28gZmlyZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXR0YWNobWVudC1hY3Rpb25zJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEF0dGFjaG1lbnRBY3Rpb25zQ29tcG9uZW50ICBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogS2VlcHMgdGhlIGFjdGlvbnMgdmlzaWJsZSBpbnN0ZWFkIG9mIHJldmVhbGluZyB0aGVtIG9uIGhvdmVyIG9yIGZvY3VzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBhbHdheXNWaXNpYmxlID0gZmFsc2U7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBzbG90IHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAnZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIgZ2FwLTEgdHJhbnNpdGlvbi1vcGFjaXR5JyxcbiAgICAgIHRoaXMuYWx3YXlzVmlzaWJsZVxuICAgICAgICA/ICdvcGFjaXR5LTEwMCdcbiAgICAgICAgOiAnb3BhY2l0eS0wIGZvY3VzLXdpdGhpbjpvcGFjaXR5LTEwMCBncm91cC1ob3Zlci9hdHRhY2htZW50Om9wYWNpdHktMTAwJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbiJdfQ==
@@ -6,7 +6,7 @@ export class AvatarFallbackComponent {
6
6
  <div class="flex h-full w-full items-center justify-center bg-muted text-muted-foreground font-medium uppercase">
7
7
  <ng-content></ng-content>
8
8
  </div>
9
- `, isInline: true, styles: [""] });
9
+ `, isInline: true, styles: [":host{display:inline-flex}\n"] });
10
10
  }
11
11
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AvatarFallbackComponent, decorators: [{
12
12
  type: Component,
@@ -14,6 +14,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
14
14
  <div class="flex h-full w-full items-center justify-center bg-muted text-muted-foreground font-medium uppercase">
15
15
  <ng-content></ng-content>
16
16
  </div>
17
- ` }]
17
+ `, styles: [":host{display:inline-flex}\n"] }]
18
18
  }] });
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLWZhbGxiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYXZhdGFyLWZhbGxiYWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWExQyxNQUFNLE9BQU8sdUJBQXVCO3dHQUF2Qix1QkFBdUI7NEZBQXZCLHVCQUF1QixpRkFQeEI7Ozs7R0FJVDs7NEZBR1UsdUJBQXVCO2tCQVhuQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsRUFBRSxZQUNEOzs7O0dBSVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXZhdGFyLWZhbGxiYWNrJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctbXV0ZWQgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtIHVwcGVyY2FzZVwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IGBgXG59KVxuZXhwb3J0IGNsYXNzIEF2YXRhckZhbGxiYWNrQ29tcG9uZW50IHtcblxufVxuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLWZhbGxiYWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYXZhdGFyLWZhbGxiYWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWExQyxNQUFNLE9BQU8sdUJBQXVCO3dHQUF2Qix1QkFBdUI7NEZBQXZCLHVCQUF1QixpRkFQeEI7Ozs7R0FJVDs7NEZBR1UsdUJBQXVCO2tCQVhuQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsRUFBRSxZQUNEOzs7O0dBSVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYXZhdGFyLWZhbGxiYWNrJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW10sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImZsZXggaC1mdWxsIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctbXV0ZWQgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtIHVwcGVyY2FzZVwiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IGA6aG9zdCB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyB9YFxufSlcbmV4cG9ydCBjbGFzcyBBdmF0YXJGYWxsYmFja0NvbXBvbmVudCB7XG5cbn1cbiJdfQ==
@@ -66,15 +66,11 @@ export class AvatarComponent {
66
66
  <div *ngIf="hasError || !src || isLoading" class="flex h-full w-full items-center justify-center bg-muted">
67
67
  <ng-content></ng-content>
68
68
  </div>
69
- `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
69
+ `, isInline: true, styles: [":host{display:inline-flex}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
70
70
  }
71
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AvatarComponent, decorators: [{
72
72
  type: Component,
73
- args: [{
74
- selector: 'tolle-avatar',
75
- standalone: true,
76
- imports: [NgIf],
77
- template: `
73
+ args: [{ selector: 'tolle-avatar', standalone: true, imports: [NgIf], template: `
78
74
  <!-- Image Layer -->
79
75
  <img *ngIf="src && !hasError"
80
76
  [src]="src"
@@ -88,8 +84,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
88
84
  <div *ngIf="hasError || !src || isLoading" class="flex h-full w-full items-center justify-center bg-muted">
89
85
  <ng-content></ng-content>
90
86
  </div>
91
- `
92
- }]
87
+ `, styles: [":host{display:inline-flex}\n"] }]
93
88
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { src: [{
94
89
  type: Input
95
90
  }], alt: [{
@@ -104,4 +99,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
104
99
  type: HostBinding,
105
100
  args: ['class']
106
101
  }] } });
107
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXZDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FDeEIsaURBQWlELEVBQ2pEO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGNBQWM7WUFDdEIsTUFBTSxFQUFFLFlBQVk7U0FDckI7UUFDRCxJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLEVBQUUsRUFBRSxtQkFBbUI7WUFDdkIsRUFBRSxFQUFFLG1CQUFtQjtTQUN4QjtLQUNGO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLFFBQVE7UUFDZixJQUFJLEVBQUUsU0FBUztLQUNoQjtDQUNGLENBQ0YsQ0FBQztBQXdCRixNQUFNLE9BQU8sZUFBZTtJQWVOO0lBZHBCLHFGQUFxRjtJQUM1RSxHQUFHLENBQVU7SUFDdEIseURBQXlEO0lBQ2hELEdBQUcsR0FBVyxFQUFFLENBQUM7SUFDMUIsNkNBQTZDO0lBQ3BDLElBQUksR0FBd0IsU0FBUyxDQUFDO0lBQy9DLDZDQUE2QztJQUNwQyxLQUFLLEdBQXlCLFFBQVEsQ0FBQztJQUNoRCw0RUFBNEU7SUFDbkUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVwQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO0lBRTlDLE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELElBQ0ksV0FBVztRQUNiLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEYsQ0FBQzt3R0FoQ1UsZUFBZTs0RkFBZixlQUFlLGlOQWhCaEI7Ozs7Ozs7Ozs7Ozs7O0dBY1QsNERBZlMsSUFBSTs7NEZBaUJILGVBQWU7a0JBcEIzQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO29CQUN4QixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDO29CQUNmLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7R0FjVDtpQkFDRjtzRkFHVSxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQW9CRixXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmNvbnN0IGF2YXRhclZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgZmxleCBzaHJpbmstMCBvdmVyZmxvdy1oaWRkZW4gYmctbXV0ZWQnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNoYXBlOiB7XG4gICAgICAgIGNpcmNsZTogJ3JvdW5kZWQtZnVsbCcsXG4gICAgICAgIHNxdWFyZTogJ3JvdW5kZWQtbWQnLFxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTggdy04IHRleHQteHMnLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCB3LTEwJyxcbiAgICAgICAgbGc6ICdoLTE2IHctMTYgdGV4dC1sZycsXG4gICAgICAgIHhsOiAnaC0yNCB3LTI0IHRleHQteGwnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2hhcGU6ICdjaXJjbGUnLFxuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIEF2YXRhclByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBhdmF0YXJWYXJpYW50cz47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWF2YXRhcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIEltYWdlIExheWVyIC0tPlxuICAgIDxpbWcgKm5nSWY9XCJzcmMgJiYgIWhhc0Vycm9yXCJcbiAgICAgICAgIFtzcmNdPVwic3JjXCJcbiAgICAgICAgIFthbHRdPVwiYWx0XCJcbiAgICAgICAgIChsb2FkKT1cIm9uTG9hZCgpXCJcbiAgICAgICAgIChlcnJvcik9XCJvbkVycm9yKClcIlxuICAgICAgICAgW2NsYXNzLm9wYWNpdHktMF09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIG9iamVjdC1jb3ZlciB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMzAwXCIgLz5cblxuICAgIDwhLS0gRmFsbGJhY2sgTGF5ZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImhhc0Vycm9yIHx8ICFzcmMgfHwgaXNMb2FkaW5nXCIgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLW11dGVkXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQXZhdGFyQ29tcG9uZW50IHtcbiAgLyoqIEltYWdlIFVSTC4gV2hlbiBhYnNlbnQgb3IgZmFpbGVkIHRvIGxvYWQsIHByb2plY3RlZCBmYWxsYmFjayBjb250ZW50IGlzIHNob3duLiAqL1xuICBASW5wdXQoKSBzcmM/OiBzdHJpbmc7XG4gIC8qKiBBbHRlcm5hdGl2ZSB0ZXh0IGZvciB0aGUgYXZhdGFyIGltYWdlLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBhbHQ6IHN0cmluZyA9ICcnO1xuICAvKiogU2l6ZSBvZiB0aGUgYXZhdGFyLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogQXZhdGFyUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFNoYXBlIG9mIHRoZSBhdmF0YXIuIEBkZWZhdWx0ICdjaXJjbGUnICovXG4gIEBJbnB1dCgpIHNoYXBlOiBBdmF0YXJQcm9wc1snc2hhcGUnXSA9ICdjaXJjbGUnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYXZhdGFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25Mb2FkKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25FcnJvcigpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHN0eWxlcyBkaXJlY3RseSB0byB0aGUgPHRvbGxlLWF2YXRhcj4gdGFnXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIGNuKGF2YXRhclZhcmlhbnRzKHsgc2hhcGU6IHRoaXMuc2hhcGUsIHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZhdGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvYXZhdGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXZDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FDeEIsaURBQWlELEVBQ2pEO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLGNBQWM7WUFDdEIsTUFBTSxFQUFFLFlBQVk7U0FDckI7UUFDRCxJQUFJLEVBQUU7WUFDSixFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLEVBQUUsRUFBRSxtQkFBbUI7WUFDdkIsRUFBRSxFQUFFLG1CQUFtQjtTQUN4QjtLQUNGO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsS0FBSyxFQUFFLFFBQVE7UUFDZixJQUFJLEVBQUUsU0FBUztLQUNoQjtDQUNGLENBQ0YsQ0FBQztBQXlCRixNQUFNLE9BQU8sZUFBZTtJQWVOO0lBZHBCLHFGQUFxRjtJQUM1RSxHQUFHLENBQVU7SUFDdEIseURBQXlEO0lBQ2hELEdBQUcsR0FBVyxFQUFFLENBQUM7SUFDMUIsNkNBQTZDO0lBQ3BDLElBQUksR0FBd0IsU0FBUyxDQUFDO0lBQy9DLDZDQUE2QztJQUNwQyxLQUFLLEdBQXlCLFFBQVEsQ0FBQztJQUNoRCw0RUFBNEU7SUFDbkUsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVwQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsWUFBb0IsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7SUFBRyxDQUFDO0lBRTlDLE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELElBQ0ksV0FBVztRQUNiLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEYsQ0FBQzt3R0FoQ1UsZUFBZTs0RkFBZixlQUFlLGlOQWhCaEI7Ozs7Ozs7Ozs7Ozs7O0dBY1Qsc0dBZlMsSUFBSTs7NEZBaUJILGVBQWU7a0JBckIzQixTQUFTOytCQUNFLGNBQWMsY0FFWixJQUFJLFdBQ1AsQ0FBQyxJQUFJLENBQUMsWUFDTDs7Ozs7Ozs7Ozs7Ozs7R0FjVDtzRkFJUSxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQW9CRixXQUFXO3NCQURkLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBIb3N0QmluZGluZyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4vdXRpbHMvY24nO1xuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmNvbnN0IGF2YXRhclZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgZmxleCBzaHJpbmstMCBvdmVyZmxvdy1oaWRkZW4gYmctbXV0ZWQnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHNoYXBlOiB7XG4gICAgICAgIGNpcmNsZTogJ3JvdW5kZWQtZnVsbCcsXG4gICAgICAgIHNxdWFyZTogJ3JvdW5kZWQtbWQnLFxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgc206ICdoLTggdy04IHRleHQteHMnLFxuICAgICAgICBkZWZhdWx0OiAnaC0xMCB3LTEwJyxcbiAgICAgICAgbGc6ICdoLTE2IHctMTYgdGV4dC1sZycsXG4gICAgICAgIHhsOiAnaC0yNCB3LTI0IHRleHQteGwnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgc2hhcGU6ICdjaXJjbGUnLFxuICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIEF2YXRhclByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBhdmF0YXJWYXJpYW50cz47XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWF2YXRhcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGlubGluZS1mbGV4OyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIEltYWdlIExheWVyIC0tPlxuICAgIDxpbWcgKm5nSWY9XCJzcmMgJiYgIWhhc0Vycm9yXCJcbiAgICAgICAgIFtzcmNdPVwic3JjXCJcbiAgICAgICAgIFthbHRdPVwiYWx0XCJcbiAgICAgICAgIChsb2FkKT1cIm9uTG9hZCgpXCJcbiAgICAgICAgIChlcnJvcik9XCJvbkVycm9yKClcIlxuICAgICAgICAgW2NsYXNzLm9wYWNpdHktMF09XCJpc0xvYWRpbmdcIlxuICAgICAgICAgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIG9iamVjdC1jb3ZlciB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMzAwXCIgLz5cblxuICAgIDwhLS0gRmFsbGJhY2sgTGF5ZXIgLS0+XG4gICAgPGRpdiAqbmdJZj1cImhhc0Vycm9yIHx8ICFzcmMgfHwgaXNMb2FkaW5nXCIgY2xhc3M9XCJmbGV4IGgtZnVsbCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLW11dGVkXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQXZhdGFyQ29tcG9uZW50IHtcbiAgLyoqIEltYWdlIFVSTC4gV2hlbiBhYnNlbnQgb3IgZmFpbGVkIHRvIGxvYWQsIHByb2plY3RlZCBmYWxsYmFjayBjb250ZW50IGlzIHNob3duLiAqL1xuICBASW5wdXQoKSBzcmM/OiBzdHJpbmc7XG4gIC8qKiBBbHRlcm5hdGl2ZSB0ZXh0IGZvciB0aGUgYXZhdGFyIGltYWdlLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBhbHQ6IHN0cmluZyA9ICcnO1xuICAvKiogU2l6ZSBvZiB0aGUgYXZhdGFyLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogQXZhdGFyUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFNoYXBlIG9mIHRoZSBhdmF0YXIuIEBkZWZhdWx0ICdjaXJjbGUnICovXG4gIEBJbnB1dCgpIHNoYXBlOiBBdmF0YXJQcm9wc1snc2hhcGUnXSA9ICdjaXJjbGUnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgYXZhdGFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgaXNMb2FkaW5nID0gdHJ1ZTtcbiAgaGFzRXJyb3IgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgb25Mb2FkKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25FcnJvcigpIHtcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHN0eWxlcyBkaXJlY3RseSB0byB0aGUgPHRvbGxlLWF2YXRhcj4gdGFnXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKSB7XG4gICAgcmV0dXJuIGNuKGF2YXRhclZhcmlhbnRzKHsgc2hhcGU6IHRoaXMuc2hhcGUsIHNpemU6IHRoaXMuc2l6ZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cbn1cbiJdfQ==