@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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- 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=
|