@visuno/angular 0.0.0-stage → 0.1.0

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 (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,301 @@
1
+ // framework/angular/toast-stack/toast-stack.component.ts
2
+ //
3
+ // Native Angular port of framework/react/toast-stack/ToastStack.tsx.
4
+ // Notifications stack into a deck and fan out when the pointer is over them or
5
+ // the focus is inside. A new toast rises in from below, blurred; a dismissed one
6
+ // keeps its place for a moment and slides off to the right as it fades. Inputs
7
+ // mirror the React props; the close button emits `dismiss`.
8
+ import { Component, EventEmitter, Input, Output, ViewChildren, ViewEncapsulation, inject, } from '@angular/core';
9
+ import { VoIconComponent } from '../core/icon.component';
10
+ import { ReducedMotionService } from '../core/reduced-motion.service';
11
+ import * as i0 from "@angular/core";
12
+ const TONE = {
13
+ neutral: ['--vo-fg2', '--vo-chip'], ok: ['--vo-ok', '--vo-ok-bg'], warn: ['--vo-warn', '--vo-warn-bg'],
14
+ bad: ['--vo-bad', '--vo-bad-bg'], merge: ['--vo-merge', '--vo-merge-bg'], blue: ['--vo-pb', '--vo-pb-bg'],
15
+ purple: ['--vo-pl', '--vo-pl-bg'], green: ['--vo-pm', '--vo-pm-bg'], orange: ['--vo-pp', '--vo-pp-bg'],
16
+ red: ['--vo-pr', '--vo-pr-bg'], yellow: ['--vo-py', '--vo-py-bg'], pink: ['--vo-pk', '--vo-pk-bg'],
17
+ teal: ['--vo-pt', '--vo-pt-bg'],
18
+ };
19
+ // a new toast rises in from below, blurred, before it takes its place
20
+ const ARRIVING = { transform: 'translateY(24px) scale(.96)', opacity: 0, filter: 'blur(6px)', zIndex: 100 };
21
+ export class ToastStackComponent {
22
+ constructor() {
23
+ /** Oldest first. The last one sits in front. */
24
+ this.toasts = [];
25
+ /** Fans the stack out. Leave it out (null) to fan it while the pointer is over it. */
26
+ this.expanded = null;
27
+ /** How many toasts stay mounted. Older ones drop off the back. */
28
+ this.max = 6;
29
+ /** Emitted when a toast's close button is pressed. */
30
+ this.dismiss = new EventEmitter();
31
+ this.motion = inject(ReducedMotionService);
32
+ /** The toasts shown now (live, front first in the DOM order below), plus any leaving. */
33
+ this.rows = [];
34
+ this.hover = false;
35
+ this.focused = false;
36
+ this.live = [];
37
+ this.placed = new Set();
38
+ this.leaving = [];
39
+ this.heights = new Map();
40
+ this.prevIds = '';
41
+ this.rafs = new Set();
42
+ this.timers = new Set();
43
+ this.fanh = null;
44
+ }
45
+ get fan() {
46
+ return this.expanded ?? (this.hover || this.focused);
47
+ }
48
+ tone(t) {
49
+ return TONE[t.tone ?? 'neutral'];
50
+ }
51
+ ngOnChanges(changes) {
52
+ if (changes['toasts'] || changes['max'])
53
+ this.sync();
54
+ this.rebuild();
55
+ }
56
+ // measure the mounted cards, then place any just-arrived toast
57
+ ngAfterViewChecked() {
58
+ let changed = false;
59
+ this.cards.forEach((ref) => {
60
+ const el = ref.nativeElement;
61
+ const id = this.idOf(el);
62
+ if (id === null)
63
+ return;
64
+ const h = el.offsetHeight;
65
+ if (this.heights.get(id) !== h) {
66
+ this.heights.set(id, h);
67
+ changed = true;
68
+ }
69
+ });
70
+ const fresh = this.live.filter((t) => !this.placed.has(t.id)).map((t) => t.id);
71
+ if (fresh.length) {
72
+ // wait two frames in the arriving pose, so the move to place animates
73
+ const raf = requestAnimationFrame(() => {
74
+ this.rafs.delete(raf);
75
+ const raf2 = requestAnimationFrame(() => {
76
+ this.rafs.delete(raf2);
77
+ fresh.forEach((id) => this.placed.add(id));
78
+ this.rebuild();
79
+ });
80
+ this.rafs.add(raf2);
81
+ });
82
+ this.rafs.add(raf);
83
+ }
84
+ else if (changed) {
85
+ this.rebuild();
86
+ }
87
+ }
88
+ idOf(el) {
89
+ const raw = el.getAttribute('data-id');
90
+ if (raw === null)
91
+ return null;
92
+ const match = this.live.find((t) => String(t.id) === raw) ??
93
+ this.leaving.find((l) => String(l.toast.id) === raw)?.toast;
94
+ return match ? match.id : null;
95
+ }
96
+ // reconcile the incoming list: trim to `max`, track leavers, drop stale heights
97
+ sync() {
98
+ const next = this.toasts.slice(-this.max);
99
+ const ids = next.map((t) => t.id).join('\u0000');
100
+ if (ids === this.prevIds) {
101
+ this.live = next;
102
+ return;
103
+ }
104
+ const now = new Set(next.map((t) => t.id));
105
+ const n = this.live.length;
106
+ const fanWas = this.fan;
107
+ const gone = [];
108
+ this.live.forEach((t, at) => {
109
+ if (now.has(t.id) || this.leaving.some((l) => l.toast.id === t.id))
110
+ return;
111
+ const was = this.place(n - 1 - at, fanWas);
112
+ gone.push({ toast: t, at, style: { ...was, transform: was.transform + ' translateX(30px)', opacity: 0 } });
113
+ });
114
+ if (gone.length) {
115
+ this.leaving = [...this.leaving, ...gone];
116
+ const delay = this.motion.reduce() ? 0 : 400;
117
+ const timer = setTimeout(() => {
118
+ this.leaving = this.leaving.filter((l) => !gone.includes(l));
119
+ this.timers.delete(timer);
120
+ this.rebuild();
121
+ }, delay);
122
+ this.timers.add(timer);
123
+ }
124
+ // forget toasts that are neither live nor leaving
125
+ const keep = new Set([...next.map((t) => t.id), ...this.leaving.map((l) => l.toast.id)]);
126
+ this.heights.forEach((_, id) => { if (!keep.has(id))
127
+ this.heights.delete(id); });
128
+ this.placed.forEach((id) => { if (!keep.has(id))
129
+ this.placed.delete(id); });
130
+ this.live = next;
131
+ this.prevIds = ids;
132
+ }
133
+ // the front-first height list, used to leave the right gaps when fanned
134
+ frontHeights() {
135
+ return this.live.slice().reverse().map((t) => this.heights.get(t.id) ?? 0);
136
+ }
137
+ /** Where a toast sits: `i` counts from the front (0 = front). */
138
+ place(i, fan) {
139
+ const hs = this.frontHeights();
140
+ if (fan) {
141
+ let y = 0;
142
+ for (let k = 0; k < Math.min(i, 3); k++)
143
+ y += hs[k] + 8;
144
+ return { transform: `translateY(${-y}px)`, opacity: i > 3 ? 0 : 1, filter: 'none', zIndex: 100 - i };
145
+ }
146
+ const k = Math.min(i, 3);
147
+ return {
148
+ transform: `translateY(${-k * 10}px) scale(${1 - k * 0.05})`,
149
+ opacity: i > 2 ? 0 : 1 - k * 0.15,
150
+ filter: i ? 'blur(.3px)' : 'none',
151
+ zIndex: 100 - i,
152
+ };
153
+ }
154
+ // compose the rendered rows (live, with the leavers slotted back into their old spots)
155
+ rebuild() {
156
+ const fan = this.fan;
157
+ const front = this.live.slice().reverse();
158
+ const hs = this.frontHeights();
159
+ this.fanh = this.live.length ? (hs.slice(0, 4).reduce((a, b) => a + b + 8, 0) - 8 || 96) : null;
160
+ const rows = this.live.map((t) => {
161
+ const i = front.indexOf(t);
162
+ const style = this.placed.has(t.id) ? this.place(i, fan) : ARRIVING;
163
+ const inert = fan ? i > 3 : i > 0;
164
+ return { toast: t, style, inert };
165
+ });
166
+ this.leaving.slice().sort((a, b) => a.at - b.at).forEach((l) => {
167
+ rows.splice(Math.min(l.at, rows.length), 0, { toast: l.toast, style: l.style, inert: true });
168
+ });
169
+ this.rows = rows;
170
+ }
171
+ onEnter() { this.hover = true; this.rebuild(); }
172
+ onLeave() { this.hover = false; this.rebuild(); }
173
+ onFocusIn() { if (!this.focused) {
174
+ this.focused = true;
175
+ this.rebuild();
176
+ } }
177
+ onFocusOut(e) {
178
+ const stack = e.currentTarget;
179
+ if (!stack.contains(e.relatedTarget)) {
180
+ this.focused = false;
181
+ this.rebuild();
182
+ }
183
+ }
184
+ onDismiss(t) {
185
+ this.dismiss.emit(t.id);
186
+ }
187
+ ngOnDestroy() {
188
+ this.rafs.forEach((r) => cancelAnimationFrame(r));
189
+ this.rafs.clear();
190
+ this.timers.forEach((t) => clearTimeout(t));
191
+ this.timers.clear();
192
+ }
193
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToastStackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
194
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ToastStackComponent, isStandalone: true, selector: "vo-toast-stack", inputs: { toasts: "toasts", expanded: "expanded", max: "max" }, outputs: { dismiss: "dismiss" }, viewQueries: [{ propertyName: "cards", predicate: ["tskCard"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
195
+ <div
196
+ data-vo=""
197
+ class="vo-tsk-stack"
198
+ [class.vo-fan]="fan"
199
+ aria-live="polite"
200
+ [style.--vo-fanh]="fanh !== null ? fanh + 'px' : null"
201
+ (pointerenter)="onEnter()"
202
+ (pointerleave)="onLeave()"
203
+ (focusin)="onFocusIn()"
204
+ (focusout)="onFocusOut($event)"
205
+ >
206
+ @for (row of rows; track row.toast.id) {
207
+ <div
208
+ #tskCard
209
+ class="vo-tsk-c"
210
+ [attr.data-id]="row.toast.id"
211
+ [style.transform]="row.style.transform"
212
+ [style.opacity]="row.style.opacity"
213
+ [style.filter]="row.style.filter"
214
+ [style.zIndex]="row.style.zIndex"
215
+ [attr.inert]="row.inert ? '' : null"
216
+ >
217
+ <span
218
+ class="vo-g"
219
+ [style.color]="'var(' + tone(row.toast)[0] + ')'"
220
+ [style.background]="'var(' + tone(row.toast)[1] + ')'"
221
+ >
222
+ <vo-icon [name]="row.toast.icon" size="sm"></vo-icon>
223
+ </span>
224
+ <div class="vo-tx">
225
+ <b>{{ row.toast.title }}</b>
226
+ @if (row.toast.detail) {
227
+ <span>{{ row.toast.detail }}</span>
228
+ }
229
+ </div>
230
+ @if (row.toast.time) {
231
+ <span class="vo-t">{{ row.toast.time }}</span>
232
+ }
233
+ <button type="button" class="vo-ib" aria-label="Dismiss" (click)="onDismiss(row.toast)">
234
+ <vo-icon name="x" size="sm"></vo-icon>
235
+ </button>
236
+ </div>
237
+ }
238
+ </div>
239
+ `, isInline: true, styles: [".vo-tsk-stack{position:relative;width:100%;max-width:380px;height:96px;isolation:isolate}.vo-tsk-stack.vo-fan{height:var(--vo-fanh,96px)}@media (hover:hover) and (pointer:fine){.vo-tsk-stack:hover{height:var(--vo-fanh,96px)}}.vo-tsk-stack{transition:height .55s var(--vo-ease)}.vo-tsk-c{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3);background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-toast);transition:transform .55s var(--vo-ease),opacity .45s var(--vo-ease),filter .45s;transform-origin:bottom center}.vo-tsk-c .vo-g{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;flex:none}.vo-tsk-c .vo-tx{flex:1;min-width:0;font-size:13px;line-height:1.35}.vo-tsk-c .vo-tx b{font-weight:500;display:block}.vo-tsk-c .vo-tx span{font-size:12px;color:var(--vo-muted)}.vo-tsk-c .vo-t{font-size:11.5px;color:var(--vo-muted);align-self:flex-start;margin-top:2px}.vo-tsk-c .vo-t{transition:opacity .2s}.vo-tsk-c .vo-ib{position:absolute;top:50%;right:var(--vo-s-3);margin-top:-15px;opacity:0;transition:opacity .2s}.vo-tsk-c .vo-ib:focus-visible{opacity:1}@media (hover:hover) and (pointer:fine){.vo-tsk-c:hover .vo-ib{opacity:1}}.vo-tsk-c:has(.vo-ib:focus-visible) .vo-t{opacity:0}@media (hover:hover) and (pointer:fine){.vo-tsk-c:hover .vo-t{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}</invoke>{}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
240
+ }
241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ToastStackComponent, decorators: [{
242
+ type: Component,
243
+ args: [{ selector: 'vo-toast-stack', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
244
+ <div
245
+ data-vo=""
246
+ class="vo-tsk-stack"
247
+ [class.vo-fan]="fan"
248
+ aria-live="polite"
249
+ [style.--vo-fanh]="fanh !== null ? fanh + 'px' : null"
250
+ (pointerenter)="onEnter()"
251
+ (pointerleave)="onLeave()"
252
+ (focusin)="onFocusIn()"
253
+ (focusout)="onFocusOut($event)"
254
+ >
255
+ @for (row of rows; track row.toast.id) {
256
+ <div
257
+ #tskCard
258
+ class="vo-tsk-c"
259
+ [attr.data-id]="row.toast.id"
260
+ [style.transform]="row.style.transform"
261
+ [style.opacity]="row.style.opacity"
262
+ [style.filter]="row.style.filter"
263
+ [style.zIndex]="row.style.zIndex"
264
+ [attr.inert]="row.inert ? '' : null"
265
+ >
266
+ <span
267
+ class="vo-g"
268
+ [style.color]="'var(' + tone(row.toast)[0] + ')'"
269
+ [style.background]="'var(' + tone(row.toast)[1] + ')'"
270
+ >
271
+ <vo-icon [name]="row.toast.icon" size="sm"></vo-icon>
272
+ </span>
273
+ <div class="vo-tx">
274
+ <b>{{ row.toast.title }}</b>
275
+ @if (row.toast.detail) {
276
+ <span>{{ row.toast.detail }}</span>
277
+ }
278
+ </div>
279
+ @if (row.toast.time) {
280
+ <span class="vo-t">{{ row.toast.time }}</span>
281
+ }
282
+ <button type="button" class="vo-ib" aria-label="Dismiss" (click)="onDismiss(row.toast)">
283
+ <vo-icon name="x" size="sm"></vo-icon>
284
+ </button>
285
+ </div>
286
+ }
287
+ </div>
288
+ `, styles: [".vo-tsk-stack{position:relative;width:100%;max-width:380px;height:96px;isolation:isolate}.vo-tsk-stack.vo-fan{height:var(--vo-fanh,96px)}@media (hover:hover) and (pointer:fine){.vo-tsk-stack:hover{height:var(--vo-fanh,96px)}}.vo-tsk-stack{transition:height .55s var(--vo-ease)}.vo-tsk-c{position:absolute;left:0;right:0;bottom:0;display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3);background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-toast);transition:transform .55s var(--vo-ease),opacity .45s var(--vo-ease),filter .45s;transform-origin:bottom center}.vo-tsk-c .vo-g{width:28px;height:28px;border-radius:50%;display:grid;place-items:center;flex:none}.vo-tsk-c .vo-tx{flex:1;min-width:0;font-size:13px;line-height:1.35}.vo-tsk-c .vo-tx b{font-weight:500;display:block}.vo-tsk-c .vo-tx span{font-size:12px;color:var(--vo-muted)}.vo-tsk-c .vo-t{font-size:11.5px;color:var(--vo-muted);align-self:flex-start;margin-top:2px}.vo-tsk-c .vo-t{transition:opacity .2s}.vo-tsk-c .vo-ib{position:absolute;top:50%;right:var(--vo-s-3);margin-top:-15px;opacity:0;transition:opacity .2s}.vo-tsk-c .vo-ib:focus-visible{opacity:1}@media (hover:hover) and (pointer:fine){.vo-tsk-c:hover .vo-ib{opacity:1}}.vo-tsk-c:has(.vo-ib:focus-visible) .vo-t{opacity:0}@media (hover:hover) and (pointer:fine){.vo-tsk-c:hover .vo-t{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}</invoke>{}\n"] }]
289
+ }], propDecorators: { toasts: [{
290
+ type: Input
291
+ }], expanded: [{
292
+ type: Input
293
+ }], max: [{
294
+ type: Input
295
+ }], dismiss: [{
296
+ type: Output
297
+ }], cards: [{
298
+ type: ViewChildren,
299
+ args: ['tskCard']
300
+ }] } });
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Qtc3RhY2suY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdG9hc3Qtc3RhY2svdG9hc3Qtc3RhY2suY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLCtFQUErRTtBQUMvRSxpRkFBaUY7QUFDakYsK0VBQStFO0FBQy9FLDREQUE0RDtBQUU1RCxPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUdOLFlBQVksRUFDWixpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBb0N0RSxNQUFNLElBQUksR0FBNkM7SUFDckQsT0FBTyxFQUFFLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDO0lBQ3RHLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQztJQUN6RyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUM7SUFDdEcsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsRUFBRSxJ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QUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7K0dBeExVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHFSQWhEcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDVCx5dkRBOUNTLGVBQWU7OzRGQWlEZCxtQkFBbUI7a0JBckQvQixTQUFTOytCQUNFLGdCQUFnQixjQUNkLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNUOzhCQUtRLE1BQU07c0JBQWQsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLEdBQUc7c0JBQVgsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNO2dCQUVrQixLQUFLO3NCQUE3QixZQUFZO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmcmFtZXdvcmsvYW5ndWxhci90b2FzdC1zdGFjay90b2FzdC1zdGFjay5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC90b2FzdC1zdGFjay9Ub2FzdFN0YWNrLnRzeC5cbi8vIE5vdGlmaWNhdGlvbnMgc3RhY2sgaW50byBhIGRlY2sgYW5kIGZhbiBvdXQgd2hlbiB0aGUgcG9pbnRlciBpcyBvdmVyIHRoZW0gb3Jcbi8vIHRoZSBmb2N1cyBpcyBpbnNpZGUuIEEgbmV3IHRvYXN0IHJpc2VzIGluIGZyb20gYmVsb3csIGJsdXJyZWQ7IGEgZGlzbWlzc2VkIG9uZVxuLy8ga2VlcHMgaXRzIHBsYWNlIGZvciBhIG1vbWVudCBhbmQgc2xpZGVzIG9mZiB0byB0aGUgcmlnaHQgYXMgaXQgZmFkZXMuIElucHV0c1xuLy8gbWlycm9yIHRoZSBSZWFjdCBwcm9wczsgdGhlIGNsb3NlIGJ1dHRvbiBlbWl0cyBgZGlzbWlzc2AuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50LCB0eXBlIFZvSWNvbk5hbWUgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIFRvbmUgb2YgYSBzdGFja2VkIHRvYXN0OiBjb2xvdXJzIHRoZSByb3VuZCBpY29uIGJhZGdlLiAqL1xuZXhwb3J0IHR5cGUgVG9hc3RTdGFja1RvbmUgPVxuICB8ICduZXV0cmFsJyB8ICdvaycgfCAnd2FybicgfCAnYmFkJyB8ICdtZXJnZScgfCAnYmx1ZScgfCAncHVycGxlJ1xuICB8ICdncmVlbicgfCAnb3JhbmdlJyB8ICdyZWQnIHwgJ3llbGxvdycgfCAncGluaycgfCAndGVhbCc7XG5cbi8qKiBUaGUgZGF0YSBmb3Igb25lIHRvYXN0IGluIHRoZSBzdGFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tUb2FzdCB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gIC8qKiBUaGUgaWNvbiBpbiB0aGUgcm91bmQgYmFkZ2UuICovXG4gIGljb246IFZvSWNvbk5hbWU7XG4gIC8qKiBDb2xvdXJzIHRoZSBiYWRnZS4gRGVmYXVsdHMgdG8gbmV1dHJhbC4gKi9cbiAgdG9uZT86IFRvYXN0U3RhY2tUb25lO1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogVGhlIHF1aWV0IGxpbmUgdW5kZXIgdGhlIHRpdGxlLiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwibm93XCIgb3IgXCIybVwiLiAqL1xuICB0aW1lPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIGlubGluZSBzdHlsZSBhIHRvYXN0IGlzIHBsYWNlZCB3aXRoLiAqL1xuaW50ZXJmYWNlIFBsYWNlbWVudCB7XG4gIHRyYW5zZm9ybTogc3RyaW5nO1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIGZpbHRlcjogc3RyaW5nO1xuICB6SW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIEEgdG9hc3Qga2VwdCBvbiBzY3JlZW4sIHdpdGggaXRzIGV4aXQgc3R5bGUgd2hpbGUgaXQgbGVhdmVzLiAqL1xuaW50ZXJmYWNlIExlYXZpbmcge1xuICB0b2FzdDogU3RhY2tUb2FzdDtcbiAgc3R5bGU6IFBsYWNlbWVudDtcbiAgYXQ6IG51bWJlcjtcbn1cblxuY29uc3QgVE9ORTogUmVjb3JkPFRvYXN0U3RhY2tUb25lLCBbc3RyaW5nLCBzdHJpbmddPiA9IHtcbiAgbmV1dHJhbDogWyctLXZvLWZnMicsICctLXZvLWNoaXAnXSwgb2s6IFsnLS12by1vaycsICctLXZvLW9rLWJnJ10sIHdhcm46IFsnLS12by13YXJuJywgJy0tdm8td2Fybi1iZyddLFxuICBiYWQ6IFsnLS12by1iYWQnLCAnLS12by1iYWQtYmcnXSwgbWVyZ2U6IFsnLS12by1tZXJnZScsICctLXZvLW1lcmdlLWJnJ10sIGJsdWU6IFsnLS12by1wYicsICctLXZvLXBiLWJnJ10sXG4gIHB1cnBsZTogWyctLXZvLXBsJywgJy0tdm8tcGwtYmcnXSwgZ3JlZW46IFsnLS12by1wbScsICctLXZvLXBtLWJnJ10sIG9yYW5nZTogWyctLXZvLXBwJywgJy0tdm8tcHAtYmcnXSxcbiAgcmVkOiBbJy0tdm8tcHInLCAnLS12by1wci1iZyddLCB5ZWxsb3c6IFsnLS12by1weScsICctLXZvLXB5LWJnJ10sIHBpbms6IFsnLS12by1waycsICctLXZvLXBrLWJnJ10sXG4gIHRlYWw6IFsnLS12by1wdCcsICctLXZvLXB0LWJnJ10sXG59O1xuXG4vLyBhIG5ldyB0b2FzdCByaXNlcyBpbiBmcm9tIGJlbG93LCBibHVycmVkLCBiZWZvcmUgaXQgdGFrZXMgaXRzIHBsYWNlXG5jb25zdCBBUlJJVklORzogUGxhY2VtZW50ID0geyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDI0cHgpIHNjYWxlKC45NiknLCBvcGFjaXR5OiAwLCBmaWx0ZXI6ICdibHVyKDZweCknLCB6SW5kZXg6IDEwMCB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by10b2FzdC1zdGFjaycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by10c2stc3RhY2tcIlxuICAgICAgW2NsYXNzLnZvLWZhbl09XCJmYW5cIlxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgIFtzdHlsZS4tLXZvLWZhbmhdPVwiZmFuaCAhPT0gbnVsbCA/IGZhbmggKyAncHgnIDogbnVsbFwiXG4gICAgICAocG9pbnRlcmVudGVyKT1cIm9uRW50ZXIoKVwiXG4gICAgICAocG9pbnRlcmxlYXZlKT1cIm9uTGVhdmUoKVwiXG4gICAgICAoZm9jdXNpbik9XCJvbkZvY3VzSW4oKVwiXG4gICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbiAgICA+XG4gICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93LnRvYXN0LmlkKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjdHNrQ2FyZFxuICAgICAgICAgIGNsYXNzPVwidm8tdHNrLWNcIlxuICAgICAgICAgIFthdHRyLmRhdGEtaWRdPVwicm93LnRvYXN0LmlkXCJcbiAgICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cInJvdy5zdHlsZS50cmFuc2Zvcm1cIlxuICAgICAgICAgIFtzdHlsZS5vcGFjaXR5XT1cInJvdy5zdHlsZS5vcGFjaXR5XCJcbiAgICAgICAgICBbc3R5bGUuZmlsdGVyXT1cInJvdy5zdHlsZS5maWx0ZXJcIlxuICAgICAgICAgIFtzdHlsZS56SW5kZXhdPVwicm93LnN0eWxlLnpJbmRleFwiXG4gICAgICAgICAgW2F0dHIuaW5lcnRdPVwicm93LmluZXJ0ID8gJycgOiBudWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInZvLWdcIlxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIid2YXIoJyArIHRvbmUocm93LnRvYXN0KVswXSArICcpJ1wiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCIndmFyKCcgKyB0b25lKHJvdy50b2FzdClbMV0gKyAnKSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2by1pY29uIFtuYW1lXT1cInJvdy50b2FzdC5pY29uXCIgc2l6ZT1cInNtXCI+PC92by1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tdHhcIj5cbiAgICAgICAgICAgIDxiPnt7IHJvdy50b2FzdC50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgIEBpZiAocm93LnRvYXN0LmRldGFpbCkge1xuICAgICAgICAgICAgICA8c3Bhbj57eyByb3cudG9hc3QuZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIEBpZiAocm93LnRvYXN0LnRpbWUpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdFwiPnt7IHJvdy50b2FzdC50aW1lIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliXCIgYXJpYS1sYWJlbD1cIkRpc21pc3NcIiAoY2xpY2spPVwib25EaXNtaXNzKHJvdy50b2FzdClcIj5cbiAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJ4XCIgc2l6ZT1cInNtXCI+PC92by1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL3RvYXN0LXN0YWNrLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0U3RhY2tDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveSB7XG4gIC8qKiBPbGRlc3QgZmlyc3QuIFRoZSBsYXN0IG9uZSBzaXRzIGluIGZyb250LiAqL1xuICBASW5wdXQoKSB0b2FzdHM6IFN0YWNrVG9hc3RbXSA9IFtdO1xuXG4gIC8qKiBGYW5zIHRoZSBzdGFjayBvdXQuIExlYXZlIGl0IG91dCAobnVsbCkgdG8gZmFuIGl0IHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgaXQuICovXG4gIEBJbnB1dCgpIGV4cGFuZGVkOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhvdyBtYW55IHRvYXN0cyBzdGF5IG1vdW50ZWQuIE9sZGVyIG9uZXMgZHJvcCBvZmYgdGhlIGJhY2suICovXG4gIEBJbnB1dCgpIG1heCA9IDY7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiBhIHRvYXN0J3MgY2xvc2UgYnV0dG9uIGlzIHByZXNzZWQuICovXG4gIEBPdXRwdXQoKSBkaXNtaXNzID0gbmV3IEV2ZW50RW1pdHRlcjxTdGFja1RvYXN0WydpZCddPigpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oJ3Rza0NhcmQnKSBjYXJkcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIC8qKiBUaGUgdG9hc3RzIHNob3duIG5vdyAobGl2ZSwgZnJvbnQgZmlyc3QgaW4gdGhlIERPTSBvcmRlciBiZWxvdyksIHBsdXMgYW55IGxlYXZpbmcuICovXG4gIHJvd3M6IHsgdG9hc3Q6IFN0YWNrVG9hc3Q7IHN0eWxlOiBQbGFjZW1lbnQ7IGluZXJ0OiBib29sZWFuIH1bXSA9IFtdO1xuXG4gIHByaXZhdGUgaG92ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmb2N1c2VkID0gZmFsc2U7XG4gIHByaXZhdGUgbGl2ZTogU3RhY2tUb2FzdFtdID0gW107XG4gIHByaXZhdGUgcGxhY2VkID0gbmV3IFNldDxTdGFja1RvYXN0WydpZCddPigpO1xuICBwcml2YXRlIGxlYXZpbmc6IExlYXZpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhlaWdodHMgPSBuZXcgTWFwPFN0YWNrVG9hc3RbJ2lkJ10sIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBwcmV2SWRzID0gJyc7XG4gIHByaXZhdGUgcmFmcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHRpbWVycyA9IG5ldyBTZXQ8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+KCk7XG4gIGZhbmg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBmYW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWQgPz8gKHRoaXMuaG92ZXIgfHwgdGhpcy5mb2N1c2VkKTtcbiAgfVxuXG4gIHRvbmUodDogU3RhY2tUb2FzdCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIHJldHVybiBUT05FW3QudG9uZSA/PyAnbmV1dHJhbCddO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0b2FzdHMnXSB8fCBjaGFuZ2VzWydtYXgnXSkgdGhpcy5zeW5jKCk7XG4gICAgdGhpcy5yZWJ1aWxkKCk7XG4gIH1cblxuICAvLyBtZWFzdXJlIHRoZSBtb3VudGVkIGNhcmRzLCB0aGVuIHBsYWNlIGFueSBqdXN0LWFycml2ZWQgdG9hc3RcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5jYXJkcy5mb3JFYWNoKChyZWYpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBpZCA9IHRoaXMuaWRPZihlbCk7XG4gICAgICBpZiAoaWQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIGNvbnN0IGggPSBlbC5vZmZzZXRIZWlnaHQ7XG4gICAgICBpZiAodGhpcy5oZWlnaHRzLmdldChpZCkgIT09IGgpIHtcbiAgICAgICAgdGhpcy5oZWlnaHRzLnNldChpZCwgaCk7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZnJlc2ggPSB0aGlzLmxpdmUuZmlsdGVyKCh0KSA9PiAhdGhpcy5wbGFjZWQuaGFzKHQuaWQpKS5tYXAoKHQpID0+IHQuaWQpO1xuICAgIGlmIChmcmVzaC5sZW5ndGgpIHtcbiAgICAgIC8vIHdhaXQgdHdvIGZyYW1lcyBpbiB0aGUgYXJyaXZpbmcgcG9zZSwgc28gdGhlIG1vdmUgdG8gcGxhY2UgYW5pbWF0ZXNcbiAgICAgIGNvbnN0IHJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmFmcy5kZWxldGUocmFmKTtcbiAgICAgICAgY29uc3QgcmFmMiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yYWZzLmRlbGV0ZShyYWYyKTtcbiAgICAgICAgICBmcmVzaC5mb3JFYWNoKChpZCkgPT4gdGhpcy5wbGFjZWQuYWRkKGlkKSk7XG4gICAgICAgICAgdGhpcy5yZWJ1aWxkKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJhZnMuYWRkKHJhZjIpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnJhZnMuYWRkKHJhZik7XG4gICAgfSBlbHNlIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLnJlYnVpbGQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlkT2YoZWw6IEhUTUxEaXZFbGVtZW50KTogU3RhY2tUb2FzdFsnaWQnXSB8IG51bGwge1xuICAgIGNvbnN0IHJhdyA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1pZCcpO1xuICAgIGlmIChyYXcgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoID1cbiAgICAgIHRoaXMubGl2ZS5maW5kKCh0KSA9PiBTdHJpbmcodC5pZCkgPT09IHJhdykgPz9cbiAgICAgIHRoaXMubGVhdmluZy5maW5kKChsKSA9PiBTdHJpbmcobC50b2FzdC5pZCkgPT09IHJhdyk/LnRvYXN0O1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoLmlkIDogbnVsbDtcbiAgfVxuXG4gIC8vIHJlY29uY2lsZSB0aGUgaW5jb21pbmcgbGlzdDogdHJpbSB0byBgbWF4YCwgdHJhY2sgbGVhdmVycywgZHJvcCBzdGFsZSBoZWlnaHRzXG4gIHByaXZhdGUgc3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy50b2FzdHMuc2xpY2UoLXRoaXMubWF4KTtcbiAgICBjb25zdCBpZHMgPSBuZXh0Lm1hcCgodCkgPT4gdC5pZCkuam9pbignXFx1MDAwMCcpO1xuICAgIGlmIChpZHMgPT09IHRoaXMucHJldklkcykge1xuICAgICAgdGhpcy5saXZlID0gbmV4dDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBub3cgPSBuZXcgU2V0KG5leHQubWFwKCh0KSA9PiB0LmlkKSk7XG4gICAgY29uc3QgbiA9IHRoaXMubGl2ZS5sZW5ndGg7XG4gICAgY29uc3QgZmFuV2FzID0gdGhpcy5mYW47XG4gICAgY29uc3QgZ29uZTogTGVhdmluZ1tdID0gW107XG4gICAgdGhpcy5saXZlLmZvckVhY2goKHQsIGF0KSA9PiB7XG4gICAgICBpZiAobm93Lmhhcyh0LmlkKSB8fCB0aGlzLmxlYXZpbmcuc29tZSgobCkgPT4gbC50b2FzdC5pZCA9PT0gdC5pZCkpIHJldHVybjtcbiAgICAgIGNvbnN0IHdhcyA9IHRoaXMucGxhY2UobiAtIDEgLSBhdCwgZmFuV2FzKTtcbiAgICAgIGdvbmUucHVzaCh7IHRvYXN0OiB0LCBhdCwgc3R5bGU6IHsgLi4ud2FzLCB0cmFuc2Zvcm06IHdhcy50cmFuc2Zvcm0gKyAnIHRyYW5zbGF0ZVgoMzBweCknLCBvcGFjaXR5OiAwIH0gfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoZ29uZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGVhdmluZyA9IFsuLi50aGlzLmxlYXZpbmcsIC4uLmdvbmVdO1xuICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiA0MDA7XG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmxlYXZpbmcgPSB0aGlzLmxlYXZpbmcuZmlsdGVyKChsKSA9PiAhZ29uZS5pbmNsdWRlcyhsKSk7XG4gICAgICAgIHRoaXMudGltZXJzLmRlbGV0ZSh0aW1lcik7XG4gICAgICAgIHRoaXMucmVidWlsZCgpO1xuICAgICAgfSwgZGVsYXkpO1xuICAgICAgdGhpcy50aW1lcnMuYWRkKHRpbWVyKTtcbiAgICB9XG5cbiAgICAvLyBmb3JnZXQgdG9hc3RzIHRoYXQgYXJlIG5laXRoZXIgbGl2ZSBub3IgbGVhdmluZ1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgU2V0PFN0YWNrVG9hc3RbJ2lkJ10+KFsuLi5uZXh0Lm1hcCgodCkgPT4gdC5pZCksIC4uLnRoaXMubGVhdmluZy5tYXAoKGwpID0+IGwudG9hc3QuaWQpXSk7XG4gICAgdGhpcy5oZWlnaHRzLmZvckVhY2goKF8sIGlkKSA9PiB7IGlmICgha2VlcC5oYXMoaWQpKSB0aGlzLmhlaWdodHMuZGVsZXRlKGlkKTsgfSk7XG4gICAgdGhpcy5wbGFjZWQuZm9yRWFjaCgoaWQpID0+IHsgaWYgKCFrZWVwLmhhcyhpZCkpIHRoaXMucGxhY2VkLmRlbGV0ZShpZCk7IH0pO1xuXG4gICAgdGhpcy5saXZlID0gbmV4dDtcbiAgICB0aGlzLnByZXZJZHMgPSBpZHM7XG4gIH1cblxuICAvLyB0aGUgZnJvbnQtZmlyc3QgaGVpZ2h0IGxpc3QsIHVzZWQgdG8gbGVhdmUgdGhlIHJpZ2h0IGdhcHMgd2hlbiBmYW5uZWRcbiAgcHJpdmF0ZSBmcm9udEhlaWdodHMoKTogbnVtYmVyW10ge1xuICAgIHJldHVybiB0aGlzLmxpdmUuc2xpY2UoKS5yZXZlcnNlKCkubWFwKCh0KSA9PiB0aGlzLmhlaWdodHMuZ2V0KHQuaWQpID8/IDApO1xuICB9XG5cbiAgLyoqIFdoZXJlIGEgdG9hc3Qgc2l0czogYGlgIGNvdW50cyBmcm9tIHRoZSBmcm9udCAoMCA9IGZyb250KS4gKi9cbiAgcHJpdmF0ZSBwbGFjZShpOiBudW1iZXIsIGZhbjogYm9vbGVhbik6IFBsYWNlbWVudCB7XG4gICAgY29uc3QgaHMgPSB0aGlzLmZyb250SGVpZ2h0cygpO1xuICAgIGlmIChmYW4pIHtcbiAgICAgIGxldCB5ID0gMDtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgTWF0aC5taW4oaSwgMyk7IGsrKykgeSArPSBoc1trXSArIDg7XG4gICAgICByZXR1cm4geyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7LXl9cHgpYCwgb3BhY2l0eTogaSA+IDMgPyAwIDogMSwgZmlsdGVyOiAnbm9uZScsIHpJbmRleDogMTAwIC0gaSB9O1xuICAgIH1cbiAgICBjb25zdCBrID0gTWF0aC5taW4oaSwgMyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoJHstayAqIDEwfXB4KSBzY2FsZSgkezEgLSBrICogMC4wNX0pYCxcbiAgICAgIG9wYWNpdHk6IGkgPiAyID8gMCA6IDEgLSBrICogMC4xNSxcbiAgICAgIGZpbHRlcjogaSA/ICdibHVyKC4zcHgpJyA6ICdub25lJyxcbiAgICAgIHpJbmRleDogMTAwIC0gaSxcbiAgICB9O1xuICB9XG5cbiAgLy8gY29tcG9zZSB0aGUgcmVuZGVyZWQgcm93cyAobGl2ZSwgd2l0aCB0aGUgbGVhdmVycyBzbG90dGVkIGJhY2sgaW50byB0aGVpciBvbGQgc3BvdHMpXG4gIHByaXZhdGUgcmVidWlsZCgpOiB2b2lkIHtcbiAgICBjb25zdCBmYW4gPSB0aGlzLmZhbjtcbiAgICBjb25zdCBmcm9udCA9IHRoaXMubGl2ZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICBjb25zdCBocyA9IHRoaXMuZnJvbnRIZWlnaHRzKCk7XG4gICAgdGhpcy5mYW5oID0gdGhpcy5saXZlLmxlbmd0aCA/IChocy5zbGljZSgwLCA0KS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiICsgOCwgMCkgLSA4IHx8IDk2KSA6IG51bGw7XG5cbiAgICBjb25zdCByb3dzOiB7IHRvYXN0OiBTdGFja1RvYXN0OyBzdHlsZTogUGxhY2VtZW50OyBpbmVydDogYm9vbGVhbiB9W10gPSB0aGlzLmxpdmUubWFwKCh0KSA9PiB7XG4gICAgICBjb25zdCBpID0gZnJvbnQuaW5kZXhPZih0KTtcbiAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wbGFjZWQuaGFzKHQuaWQpID8gdGhpcy5wbGFjZShpLCBmYW4pIDogQVJSSVZJTkc7XG4gICAgICBjb25zdCBpbmVydCA9IGZhbiA/IGkgPiAzIDogaSA+IDA7XG4gICAgICByZXR1cm4geyB0b2FzdDogdCwgc3R5bGUsIGluZXJ0IH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmxlYXZpbmcuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLmF0IC0gYi5hdCkuZm9yRWFjaCgobCkgPT4ge1xuICAgICAgcm93cy5zcGxpY2UoTWF0aC5taW4obC5hdCwgcm93cy5sZW5ndGgpLCAwLCB7IHRvYXN0OiBsLnRvYXN0LCBzdHlsZTogbC5zdHlsZSwgaW5lcnQ6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJvd3MgPSByb3dzO1xuICB9XG5cbiAgb25FbnRlcigpOiB2b2lkIHsgdGhpcy5ob3ZlciA9IHRydWU7IHRoaXMucmVidWlsZCgpOyB9XG4gIG9uTGVhdmUoKTogdm9pZCB7IHRoaXMuaG92ZXIgPSBmYWxzZTsgdGhpcy5yZWJ1aWxkKCk7IH1cbiAgb25Gb2N1c0luKCk6IHZvaWQgeyBpZiAoIXRoaXMuZm9jdXNlZCkgeyB0aGlzLmZvY3VzZWQgPSB0cnVlOyB0aGlzLnJlYnVpbGQoKTsgfSB9XG4gIG9uRm9jdXNPdXQoZTogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YWNrID0gZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghc3RhY2suY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKSB7IHRoaXMuZm9jdXNlZCA9IGZhbHNlOyB0aGlzLnJlYnVpbGQoKTsgfVxuICB9XG5cbiAgb25EaXNtaXNzKHQ6IFN0YWNrVG9hc3QpOiB2b2lkIHtcbiAgICB0aGlzLmRpc21pc3MuZW1pdCh0LmlkKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmFmcy5mb3JFYWNoKChyKSA9PiBjYW5jZWxBbmltYXRpb25GcmFtZShyKSk7XG4gICAgdGhpcy5yYWZzLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaCgodCkgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLnRpbWVycy5jbGVhcigpO1xuICB9XG59XG4iXX0=