@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,177 @@
|
|
|
1
|
+
// framework/angular/action-log/action-log.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/action-log/ActionLog.tsx.
|
|
4
|
+
// Every tool call the agent makes, as a list that grows while it works. Each row
|
|
5
|
+
// opens to show its output. Inputs mirror the React props; callbacks become
|
|
6
|
+
// @Output EventEmitters. The header shows a spinner while running and a green dot
|
|
7
|
+
// once done, as in the vanilla JS (action-log.js).
|
|
8
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
|
|
9
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class ActionLogComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
/** The tool calls, newest at the end. */
|
|
14
|
+
this.actions = [];
|
|
15
|
+
this.title = 'Agent activity';
|
|
16
|
+
/** Shows a spinner in the header while true, and a green dot once false. */
|
|
17
|
+
this.running = true;
|
|
18
|
+
/** Sits flat in a chat thread (the default). Set false to give it a card. */
|
|
19
|
+
this.bare = true;
|
|
20
|
+
/** Emitted when a row opens or closes, with its index and the new open state. */
|
|
21
|
+
this.toggleRow = new EventEmitter();
|
|
22
|
+
this.open = new Set();
|
|
23
|
+
}
|
|
24
|
+
isOpen(i) {
|
|
25
|
+
return this.open.has(i);
|
|
26
|
+
}
|
|
27
|
+
toggle(i) {
|
|
28
|
+
const next = !this.open.has(i);
|
|
29
|
+
if (next)
|
|
30
|
+
this.open.add(i);
|
|
31
|
+
else
|
|
32
|
+
this.open.delete(i);
|
|
33
|
+
this.toggleRow.emit({ index: i, open: next });
|
|
34
|
+
}
|
|
35
|
+
get words() {
|
|
36
|
+
if (this.status)
|
|
37
|
+
return this.status;
|
|
38
|
+
if (this.running) {
|
|
39
|
+
return this.actions.length ? `Running step ${this.actions.length}` : 'Running';
|
|
40
|
+
}
|
|
41
|
+
const total = this.actions.reduce((s, a) => s + (parseFloat(a.time ?? '') || 0), 0);
|
|
42
|
+
return `${this.actions.length} steps${total ? `, ${total.toFixed(1)}s` : ''}`;
|
|
43
|
+
}
|
|
44
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActionLogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
45
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ActionLogComponent, isStandalone: true, selector: "vo-action-log", inputs: { actions: "actions", title: "title", running: "running", status: "status", bare: "bare" }, outputs: { toggleRow: "toggleRow" }, ngImport: i0, template: `
|
|
46
|
+
<div
|
|
47
|
+
data-vo=""
|
|
48
|
+
class="vo-alg"
|
|
49
|
+
[class.vo-panel]="!bare"
|
|
50
|
+
[style.padding-inline]="bare ? '0' : null"
|
|
51
|
+
>
|
|
52
|
+
<div class="vo-alg-h">
|
|
53
|
+
<span class="vo-alg-t">{{ title }}</span>
|
|
54
|
+
@if (running) {
|
|
55
|
+
<span class="vo-alg-st">
|
|
56
|
+
<span class="vo-spin"></span>
|
|
57
|
+
<span class="vo-sw vo-alg-sum">{{ words }}</span>
|
|
58
|
+
</span>
|
|
59
|
+
} @else {
|
|
60
|
+
<span class="vo-alg-st vo-enter">
|
|
61
|
+
<span class="vo-dot" style="color:var(--vo-ok)"></span>
|
|
62
|
+
<span>{{ words }}</span>
|
|
63
|
+
</span>
|
|
64
|
+
}
|
|
65
|
+
</div>
|
|
66
|
+
<ol class="vo-alg-list">
|
|
67
|
+
@for (a of actions; track $index) {
|
|
68
|
+
<li class="vo-alg-it vo-enter">
|
|
69
|
+
<button
|
|
70
|
+
type="button"
|
|
71
|
+
class="vo-alg-row"
|
|
72
|
+
[attr.aria-expanded]="a.output ? isOpen($index) : null"
|
|
73
|
+
(click)="toggle($index)"
|
|
74
|
+
>
|
|
75
|
+
<span class="vo-alg-ic"><vo-icon [name]="a.icon" size="sm"></vo-icon></span>
|
|
76
|
+
<span class="vo-alg-tx">
|
|
77
|
+
<b [innerHTML]="a.title"></b>
|
|
78
|
+
@if (a.detail) {
|
|
79
|
+
<span class="vo-d" [innerHTML]="a.detail"></span>
|
|
80
|
+
}
|
|
81
|
+
</span>
|
|
82
|
+
<span class="vo-alg-r">
|
|
83
|
+
<span class="vo-num vo-ms">{{ a.state === 'done' ? a.time : '' }}</span>
|
|
84
|
+
<span class="vo-g">
|
|
85
|
+
@if (a.state === 'done') {
|
|
86
|
+
<span class="vo-enter" style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
87
|
+
} @else {
|
|
88
|
+
<span class="vo-spin" style="width:10px;height:10px"></span>
|
|
89
|
+
}
|
|
90
|
+
</span>
|
|
91
|
+
</span>
|
|
92
|
+
</button>
|
|
93
|
+
@if (a.output) {
|
|
94
|
+
<div class="vo-fold vo-alg-det" [class.vo-shut]="!isOpen($index)" [attr.inert]="isOpen($index) ? null : ''" [attr.aria-hidden]="!isOpen($index)">
|
|
95
|
+
<div><pre [innerHTML]="a.output"></pre></div>
|
|
96
|
+
</div>
|
|
97
|
+
}
|
|
98
|
+
</li>
|
|
99
|
+
}
|
|
100
|
+
</ol>
|
|
101
|
+
</div>
|
|
102
|
+
`, isInline: true, styles: [".vo-alg{padding:var(--vo-s-2)}.vo-alg-h{display:flex;align-items:center;justify-content:space-between;padding:var(--vo-s-2) 10px 6px}.vo-alg-t{font-weight:500}.vo-alg-st{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--vo-fg2)}.vo-alg-st .vo-spin{width:10px;height:10px}.vo-alg-list{list-style:none;margin:0;padding:0}.vo-alg-it{border-radius:var(--vo-r-in);transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover{background:var(--vo-row)}}.vo-alg-row{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;text-align:left;cursor:pointer}.vo-alg-ic{width:26px;height:26px;border-radius:var(--vo-r-sm);background:var(--vo-chip);display:grid;place-items:center;color:var(--vo-fg2);flex:none;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover .vo-alg-ic{background:var(--vo-surface)}}.vo-alg-tx{flex:1;min-width:0}.vo-alg-tx b{font-weight:500}.vo-alg-tx code{font-family:var(--vo-mono);font-size:12px}.vo-alg-tx .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-alg-r{display:flex;align-items:center;gap:var(--vo-s-2);color:var(--vo-muted);font-size:12px}.vo-alg-r .vo-g{width:14px;display:grid;place-items:center}.vo-alg-det{margin:0 10px 0 46px}.vo-alg-det pre{margin:0 0 10px;font-family:var(--vo-mono);font-size:11.5px;line-height:1.6;background:var(--vo-surface);border-radius:calc(10px * var(--vo-rk));padding:var(--vo-s-2) 10px;white-space:pre-wrap;color:var(--vo-fg2);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-alg-det .vo-a{color:var(--vo-add)}.vo-alg-det .vo-x{color:var(--vo-del)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
103
|
+
}
|
|
104
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActionLogComponent, decorators: [{
|
|
105
|
+
type: Component,
|
|
106
|
+
args: [{ selector: 'vo-action-log', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
107
|
+
<div
|
|
108
|
+
data-vo=""
|
|
109
|
+
class="vo-alg"
|
|
110
|
+
[class.vo-panel]="!bare"
|
|
111
|
+
[style.padding-inline]="bare ? '0' : null"
|
|
112
|
+
>
|
|
113
|
+
<div class="vo-alg-h">
|
|
114
|
+
<span class="vo-alg-t">{{ title }}</span>
|
|
115
|
+
@if (running) {
|
|
116
|
+
<span class="vo-alg-st">
|
|
117
|
+
<span class="vo-spin"></span>
|
|
118
|
+
<span class="vo-sw vo-alg-sum">{{ words }}</span>
|
|
119
|
+
</span>
|
|
120
|
+
} @else {
|
|
121
|
+
<span class="vo-alg-st vo-enter">
|
|
122
|
+
<span class="vo-dot" style="color:var(--vo-ok)"></span>
|
|
123
|
+
<span>{{ words }}</span>
|
|
124
|
+
</span>
|
|
125
|
+
}
|
|
126
|
+
</div>
|
|
127
|
+
<ol class="vo-alg-list">
|
|
128
|
+
@for (a of actions; track $index) {
|
|
129
|
+
<li class="vo-alg-it vo-enter">
|
|
130
|
+
<button
|
|
131
|
+
type="button"
|
|
132
|
+
class="vo-alg-row"
|
|
133
|
+
[attr.aria-expanded]="a.output ? isOpen($index) : null"
|
|
134
|
+
(click)="toggle($index)"
|
|
135
|
+
>
|
|
136
|
+
<span class="vo-alg-ic"><vo-icon [name]="a.icon" size="sm"></vo-icon></span>
|
|
137
|
+
<span class="vo-alg-tx">
|
|
138
|
+
<b [innerHTML]="a.title"></b>
|
|
139
|
+
@if (a.detail) {
|
|
140
|
+
<span class="vo-d" [innerHTML]="a.detail"></span>
|
|
141
|
+
}
|
|
142
|
+
</span>
|
|
143
|
+
<span class="vo-alg-r">
|
|
144
|
+
<span class="vo-num vo-ms">{{ a.state === 'done' ? a.time : '' }}</span>
|
|
145
|
+
<span class="vo-g">
|
|
146
|
+
@if (a.state === 'done') {
|
|
147
|
+
<span class="vo-enter" style="color:var(--vo-ok)"><vo-icon name="check" size="xs"></vo-icon></span>
|
|
148
|
+
} @else {
|
|
149
|
+
<span class="vo-spin" style="width:10px;height:10px"></span>
|
|
150
|
+
}
|
|
151
|
+
</span>
|
|
152
|
+
</span>
|
|
153
|
+
</button>
|
|
154
|
+
@if (a.output) {
|
|
155
|
+
<div class="vo-fold vo-alg-det" [class.vo-shut]="!isOpen($index)" [attr.inert]="isOpen($index) ? null : ''" [attr.aria-hidden]="!isOpen($index)">
|
|
156
|
+
<div><pre [innerHTML]="a.output"></pre></div>
|
|
157
|
+
</div>
|
|
158
|
+
}
|
|
159
|
+
</li>
|
|
160
|
+
}
|
|
161
|
+
</ol>
|
|
162
|
+
</div>
|
|
163
|
+
`, styles: [".vo-alg{padding:var(--vo-s-2)}.vo-alg-h{display:flex;align-items:center;justify-content:space-between;padding:var(--vo-s-2) 10px 6px}.vo-alg-t{font-weight:500}.vo-alg-st{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;color:var(--vo-fg2)}.vo-alg-st .vo-spin{width:10px;height:10px}.vo-alg-list{list-style:none;margin:0;padding:0}.vo-alg-it{border-radius:var(--vo-r-in);transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover{background:var(--vo-row)}}.vo-alg-row{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;text-align:left;cursor:pointer}.vo-alg-ic{width:26px;height:26px;border-radius:var(--vo-r-sm);background:var(--vo-chip);display:grid;place-items:center;color:var(--vo-fg2);flex:none;transition:background .25s}@media (hover:hover) and (pointer:fine){.vo-alg-it:hover .vo-alg-ic{background:var(--vo-surface)}}.vo-alg-tx{flex:1;min-width:0}.vo-alg-tx b{font-weight:500}.vo-alg-tx code{font-family:var(--vo-mono);font-size:12px}.vo-alg-tx .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-alg-r{display:flex;align-items:center;gap:var(--vo-s-2);color:var(--vo-muted);font-size:12px}.vo-alg-r .vo-g{width:14px;display:grid;place-items:center}.vo-alg-det{margin:0 10px 0 46px}.vo-alg-det pre{margin:0 0 10px;font-family:var(--vo-mono);font-size:11.5px;line-height:1.6;background:var(--vo-surface);border-radius:calc(10px * var(--vo-rk));padding:var(--vo-s-2) 10px;white-space:pre-wrap;color:var(--vo-fg2);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-alg-det .vo-a{color:var(--vo-add)}.vo-alg-det .vo-x{color:var(--vo-del)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-muted{color:var(--vo-muted)}.vo-fg2{color:var(--vo-fg2)}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"] }]
|
|
164
|
+
}], propDecorators: { actions: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], title: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], running: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], status: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], bare: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], toggleRow: [{
|
|
175
|
+
type: Output
|
|
176
|
+
}] } });
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpb24tbG9nL2FjdGlvbi1sb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsbUVBQW1FO0FBQ25FLGlGQUFpRjtBQUNqRiw0RUFBNEU7QUFDNUUsa0ZBQWtGO0FBQ2xGLG1EQUFtRDtBQUVuRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHdCQUF3QixDQUFDOztBQW9GMUUsTUFBTSxPQUFPLGtCQUFrQjtJQWpFL0I7UUFrRUUseUNBQXlDO1FBQ2hDLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFDdkIsVUFBSyxHQUFHLGdCQUFnQixDQUFDO1FBQ2xDLDRFQUE0RTtRQUNuRSxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR3hCLDZFQUE2RTtRQUNwRSxTQUFJLEdBQUcsSUFBSSxDQUFDO1FBRXJCLGlGQUFpRjtRQUN2RSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQW9DLENBQUM7UUFFMUQsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7S0FxQjNDO0lBbkJDLE1BQU0sQ0FBQyxDQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTSxDQUFDLENBQVM7UUFDZCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDaEYsQ0FBQzsrR0FsQ1Usa0JBQWtCO21HQUFsQixrQkFBa0Isa05BNURuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURULHVoR0ExRFMsZUFBZTs7NEZBNkRkLGtCQUFrQjtrQkFqRTlCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURUOzhCQUtRLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0ksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2FjdGlvbi1sb2cvYWN0aW9uLWxvZy5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9hY3Rpb24tbG9nL0FjdGlvbkxvZy50c3guXG4vLyBFdmVyeSB0b29sIGNhbGwgdGhlIGFnZW50IG1ha2VzLCBhcyBhIGxpc3QgdGhhdCBncm93cyB3aGlsZSBpdCB3b3Jrcy4gRWFjaCByb3dcbi8vIG9wZW5zIHRvIHNob3cgaXRzIG91dHB1dC4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IGNhbGxiYWNrcyBiZWNvbWVcbi8vIEBPdXRwdXQgRXZlbnRFbWl0dGVycy4gVGhlIGhlYWRlciBzaG93cyBhIHNwaW5uZXIgd2hpbGUgcnVubmluZyBhbmQgYSBncmVlbiBkb3Rcbi8vIG9uY2UgZG9uZSwgYXMgaW4gdGhlIHZhbmlsbGEgSlMgKGFjdGlvbi1sb2cuanMpLlxuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50LCB0eXBlIFZvSWNvbk5hbWUgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcblxuLyoqIE9uZSB0b29sIGNhbGwgaW4gdGhlIGxvZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uIHtcbiAgLyoqIFRoZSB0b29sJ3MgaWNvbiwgbGlrZSAnZmlsZS10ZXh0JywgJ3NlYXJjaCcsICdlZGl0JywgJ3Rlcm0nIG9yICdwcicuICovXG4gIGljb246IFZvSWNvbk5hbWU7XG4gIC8qKiBXaGF0IHRoZSBhZ2VudCBkaWQuIEhUTUwgaXMgYWxsb3dlZCAod3JhcCBmaWxlIG5hbWVzIGluIDxjb2RlPikuICovXG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBUaGUgcXVpZXQgbGluZSB1bmRlciBpdCwgbGlrZSBcInNyYy9wYWdlcywgMjEyIGxpbmVzXCIuIEhUTUwgaXMgYWxsb3dlZC4gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xuICAvKiogcnVubmluZyBzaG93cyBhIHNwaW5uZXIsIGRvbmUgYSBjaGVjayBhbmQgdGhlIHRpbWUuICovXG4gIHN0YXRlOiAncnVubmluZycgfCAnZG9uZSc7XG4gIC8qKiBIb3cgbG9uZyBpdCB0b29rLCBsaWtlIFwiMC40c1wiLiBTaG93biBvbmNlIHRoZSBhY3Rpb24gaXMgZG9uZS4gKi9cbiAgdGltZT86IHN0cmluZztcbiAgLyoqIFdoYXQgb3BlbnMgdW5kZXIgdGhlIHJvdywgbGlrZSBhIGRpZmYgb3IgdGVzdCBvdXRwdXQuIEhUTUwgaXMgYWxsb3dlZDtcbiAgICogIGxpbmVzIGluIDxzcGFuIGNsYXNzPVwidm8tYVwiPiBvciBcInZvLXhcIiByZWFkIGFzIGFkZGVkIG9yIHJlbW92ZWQuICovXG4gIG91dHB1dD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tYWN0aW9uLWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1hbGdcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtzdHlsZS5wYWRkaW5nLWlubGluZV09XCJiYXJlID8gJzAnIDogbnVsbFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWFsZy1oXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXRcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgQGlmIChydW5uaW5nKSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbGctc3RcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3cgdm8tYWxnLXN1bVwiPnt7IHdvcmRzIH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hbGctc3Qgdm8tZW50ZXJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZG90XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS12by1vaylcIj48L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyB3b3JkcyB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPG9sIGNsYXNzPVwidm8tYWxnLWxpc3RcIj5cbiAgICAgICAgQGZvciAoYSBvZiBhY3Rpb25zOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8bGkgY2xhc3M9XCJ2by1hbGctaXQgdm8tZW50ZXJcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tYWxnLXJvd1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiYS5vdXRwdXQgPyBpc09wZW4oJGluZGV4KSA6IG51bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKCRpbmRleClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFsZy1pY1wiPjx2by1pY29uIFtuYW1lXT1cImEuaWNvblwiIHNpemU9XCJzbVwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXR4XCI+XG4gICAgICAgICAgICAgICAgPGIgW2lubmVySFRNTF09XCJhLnRpdGxlXCI+PC9iPlxuICAgICAgICAgICAgICAgIEBpZiAoYS5kZXRhaWwpIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZFwiIFtpbm5lckhUTUxdPVwiYS5kZXRhaWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWxnLXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW51bSB2by1tc1wiPnt7IGEuc3RhdGUgPT09ICdkb25lJyA/IGEudGltZSA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChhLnN0YXRlID09PSAnZG9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1lbnRlclwiIHN0eWxlPVwiY29sb3I6dmFyKC0tdm8tb2spXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBzdHlsZT1cIndpZHRoOjEwcHg7aGVpZ2h0OjEwcHhcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIEBpZiAoYS5vdXRwdXQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWZvbGQgdm8tYWxnLWRldFwiIFtjbGFzcy52by1zaHV0XT1cIiFpc09wZW4oJGluZGV4KVwiIFthdHRyLmluZXJ0XT1cImlzT3BlbigkaW5kZXgpID8gbnVsbCA6ICcnXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzT3BlbigkaW5kZXgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdj48cHJlIFtpbm5lckhUTUxdPVwiYS5vdXRwdXRcIj48L3ByZT48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgPC9vbD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2FjdGlvbi1sb2cuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uTG9nQ29tcG9uZW50IHtcbiAgLyoqIFRoZSB0b29sIGNhbGxzLCBuZXdlc3QgYXQgdGhlIGVuZC4gKi9cbiAgQElucHV0KCkgYWN0aW9uczogQWN0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgdGl0bGUgPSAnQWdlbnQgYWN0aXZpdHknO1xuICAvKiogU2hvd3MgYSBzcGlubmVyIGluIHRoZSBoZWFkZXIgd2hpbGUgdHJ1ZSwgYW5kIGEgZ3JlZW4gZG90IG9uY2UgZmFsc2UuICovXG4gIEBJbnB1dCgpIHJ1bm5pbmcgPSB0cnVlO1xuICAvKiogVGhlIHdvcmRzIGJlc2lkZSBpdC4gRGVmYXVsdHMgdG8gXCJSdW5uaW5nIHN0ZXAgTlwiLCB0aGVuIFwiTiBzdGVwcywgWHNcIi4gKi9cbiAgQElucHV0KCkgc3RhdHVzPzogc3RyaW5nO1xuICAvKiogU2l0cyBmbGF0IGluIGEgY2hhdCB0aHJlYWQgKHRoZSBkZWZhdWx0KS4gU2V0IGZhbHNlIHRvIGdpdmUgaXQgYSBjYXJkLiAqL1xuICBASW5wdXQoKSBiYXJlID0gdHJ1ZTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IG9wZW5zIG9yIGNsb3Nlcywgd2l0aCBpdHMgaW5kZXggYW5kIHRoZSBuZXcgb3BlbiBzdGF0ZS4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZVJvdyA9IG5ldyBFdmVudEVtaXR0ZXI8eyBpbmRleDogbnVtYmVyOyBvcGVuOiBib29sZWFuIH0+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgaXNPcGVuKGk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW4uaGFzKGkpO1xuICB9XG5cbiAgdG9nZ2xlKGk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5vcGVuLmhhcyhpKTtcbiAgICBpZiAobmV4dCkgdGhpcy5vcGVuLmFkZChpKTtcbiAgICBlbHNlIHRoaXMub3Blbi5kZWxldGUoaSk7XG4gICAgdGhpcy50b2dnbGVSb3cuZW1pdCh7IGluZGV4OiBpLCBvcGVuOiBuZXh0IH0pO1xuICB9XG5cbiAgZ2V0IHdvcmRzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuc3RhdHVzKSByZXR1cm4gdGhpcy5zdGF0dXM7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucy5sZW5ndGggPyBgUnVubmluZyBzdGVwICR7dGhpcy5hY3Rpb25zLmxlbmd0aH1gIDogJ1J1bm5pbmcnO1xuICAgIH1cbiAgICBjb25zdCB0b3RhbCA9IHRoaXMuYWN0aW9ucy5yZWR1Y2UoKHMsIGEpID0+IHMgKyAocGFyc2VGbG9hdChhLnRpbWUgPz8gJycpIHx8IDApLCAwKTtcbiAgICByZXR1cm4gYCR7dGhpcy5hY3Rpb25zLmxlbmd0aH0gc3RlcHMke3RvdGFsID8gYCwgJHt0b3RhbC50b0ZpeGVkKDEpfXNgIDogJyd9YDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// framework/angular/activity-heatmap/activity-heatmap.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/activity-heatmap/ActivityHeatmap.tsx.
|
|
4
|
+
// When the agent or the team is busy, by day and hour, as a 7x24 grid of cells
|
|
5
|
+
// tinted from the accent by their value. The cells fill in as a wave from the
|
|
6
|
+
// top left; a switch (shown with two or more series) sweeps a new series in the
|
|
7
|
+
// same way. In a narrow card (a phone) the grid shows half the day at a time in
|
|
8
|
+
// bigger cells, scrolls sideways and starts at the latest hours. Inputs mirror
|
|
9
|
+
// the React props; the fill-in, the switch and the scroll edges are ported from
|
|
10
|
+
// the vanilla JS (activity-heatmap.js).
|
|
11
|
+
//
|
|
12
|
+
// Icons: none of this component's chrome uses an icon (the switch is text), so
|
|
13
|
+
// no VoIconComponent is needed.
|
|
14
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../core/reduced-motion.service";
|
|
17
|
+
const DAYS = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
|
|
18
|
+
const LEGEND = [0.08, 0.3, 0.55, 0.85];
|
|
19
|
+
// every three hours; the ones between the four on a wide card only show on a phone
|
|
20
|
+
const HOURS = ['12am', '3am', '6am', '9am', '12pm', '3pm', '6pm', '9pm'];
|
|
21
|
+
const DAY_LABELS = ['Mon', '', 'Wed', '', 'Fri', '', 'Sun'];
|
|
22
|
+
const hour = (h) => (h % 12 || 12) + (h < 12 ? 'am' : 'pm');
|
|
23
|
+
export class ActivityHeatmapComponent {
|
|
24
|
+
/** The series on show, by key. Leave it out to let the switch pick it. */
|
|
25
|
+
set value(v) {
|
|
26
|
+
this.controlled = v !== undefined;
|
|
27
|
+
if (v !== undefined && v !== this.key) {
|
|
28
|
+
this.key = v;
|
|
29
|
+
if (this.ready) {
|
|
30
|
+
this.placeKnob();
|
|
31
|
+
this.draw();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
get current() {
|
|
36
|
+
return this.series.find((s) => s.key === this.key) ?? this.series[0];
|
|
37
|
+
}
|
|
38
|
+
get gridLabel() {
|
|
39
|
+
return `${this.title}, ${this.current?.note ?? this.period}`;
|
|
40
|
+
}
|
|
41
|
+
constructor(reduced, cdr) {
|
|
42
|
+
this.reduced = reduced;
|
|
43
|
+
this.cdr = cdr;
|
|
44
|
+
/** One or more series; the switch shows when there are two or more. */
|
|
45
|
+
this.series = [];
|
|
46
|
+
/** Header text. */
|
|
47
|
+
this.title = 'Activity';
|
|
48
|
+
/** The line under the title before the cells fill in, and when a series has no note. */
|
|
49
|
+
this.period = 'Last 4 weeks';
|
|
50
|
+
this.className = '';
|
|
51
|
+
this.valueChange = new EventEmitter();
|
|
52
|
+
this.dayLabels = DAY_LABELS;
|
|
53
|
+
this.hours = HOURS;
|
|
54
|
+
this.legend = LEGEND;
|
|
55
|
+
this.key = '';
|
|
56
|
+
this.cells = Array.from({ length: 168 }, () => ({ alpha: 0, transition: '', tip: '' }));
|
|
57
|
+
this.stText = '';
|
|
58
|
+
this.stOut = false;
|
|
59
|
+
this.knobLeft = 0;
|
|
60
|
+
this.knobWidth = 0;
|
|
61
|
+
this.controlled = false;
|
|
62
|
+
this.ready = false;
|
|
63
|
+
this.drawn = false;
|
|
64
|
+
this.timers = [];
|
|
65
|
+
this.moved = false;
|
|
66
|
+
}
|
|
67
|
+
ngAfterViewInit() {
|
|
68
|
+
if (!this.controlled && !this.key) {
|
|
69
|
+
this.key = this.defaultValue ?? this.series[0]?.key ?? '';
|
|
70
|
+
}
|
|
71
|
+
this.stText = this.period;
|
|
72
|
+
this.ready = true;
|
|
73
|
+
this.cdr.detectChanges();
|
|
74
|
+
this.placeKnob();
|
|
75
|
+
this.setupScroll();
|
|
76
|
+
// the cells start empty and fill in a moment after the card appears
|
|
77
|
+
this.later(() => {
|
|
78
|
+
this.drawn = true;
|
|
79
|
+
this.draw();
|
|
80
|
+
}, 150);
|
|
81
|
+
}
|
|
82
|
+
select(key) {
|
|
83
|
+
if (!this.controlled) {
|
|
84
|
+
this.key = key;
|
|
85
|
+
this.placeKnob();
|
|
86
|
+
this.draw();
|
|
87
|
+
}
|
|
88
|
+
this.valueChange.emit(key);
|
|
89
|
+
}
|
|
90
|
+
draw() {
|
|
91
|
+
const s = this.current;
|
|
92
|
+
const reduce = this.reduced.reduce();
|
|
93
|
+
// the line under the title blurs out and back in when the series changes
|
|
94
|
+
const note = this.drawn ? s?.note ?? this.period : this.period;
|
|
95
|
+
if (note !== this.stText) {
|
|
96
|
+
this.stOut = true;
|
|
97
|
+
this.later(() => {
|
|
98
|
+
this.stText = note;
|
|
99
|
+
this.stOut = false;
|
|
100
|
+
this.cdr.markForCheck();
|
|
101
|
+
}, reduce ? 0 : 170);
|
|
102
|
+
}
|
|
103
|
+
for (let i = 0; i < 168; i++) {
|
|
104
|
+
const d = Math.floor(i / 24);
|
|
105
|
+
const h = i % 24;
|
|
106
|
+
const v = s?.values[i] ?? 0;
|
|
107
|
+
// each cell changes a beat after the one before it, so a new series sweeps in from the top left
|
|
108
|
+
const delay = reduce ? 0 : (h + d) * 14;
|
|
109
|
+
this.cells[i].alpha = this.drawn ? +(v * 0.9).toFixed(2) : 0;
|
|
110
|
+
this.cells[i].transition = `background .5s var(--vo-ease) ${delay}ms, transform .2s`;
|
|
111
|
+
this.cells[i].tip = this.drawn && s ? `${DAYS[d]} ${hour(h)}: ${Math.round(v * s.max)} ${s.unit}` : '';
|
|
112
|
+
}
|
|
113
|
+
this.cdr.markForCheck();
|
|
114
|
+
}
|
|
115
|
+
placeKnob() {
|
|
116
|
+
if (this.series.length < 2)
|
|
117
|
+
return;
|
|
118
|
+
const btns = this.sc?.nativeElement
|
|
119
|
+
? (this.sc.nativeElement.closest('.vo-hmx')?.querySelectorAll('.vo-hmx-sg button') ?? [])
|
|
120
|
+
: [];
|
|
121
|
+
const at = this.series.findIndex((s) => s.key === this.key);
|
|
122
|
+
const b = btns[at < 0 ? 0 : at];
|
|
123
|
+
if (b) {
|
|
124
|
+
this.knobLeft = b.offsetLeft;
|
|
125
|
+
this.knobWidth = b.offsetWidth;
|
|
126
|
+
this.cdr.markForCheck();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// on a phone the grid scrolls sideways: it starts at the latest hours, and fades out on whichever side has more to see
|
|
130
|
+
setupScroll() {
|
|
131
|
+
const el = this.sc?.nativeElement;
|
|
132
|
+
if (!el)
|
|
133
|
+
return;
|
|
134
|
+
const edges = () => {
|
|
135
|
+
const m = el.scrollWidth - el.clientWidth;
|
|
136
|
+
el.classList.toggle('vo-ml', m > 1 && el.scrollLeft > 1);
|
|
137
|
+
el.classList.toggle('vo-mr', m > 1 && el.scrollLeft < m - 1);
|
|
138
|
+
};
|
|
139
|
+
// it stays on the latest hours as the card settles its size, until the person scrolls it themselves
|
|
140
|
+
const fit = () => {
|
|
141
|
+
if (!this.moved)
|
|
142
|
+
el.scrollLeft = el.scrollWidth;
|
|
143
|
+
edges();
|
|
144
|
+
};
|
|
145
|
+
const move = () => {
|
|
146
|
+
this.moved = true;
|
|
147
|
+
};
|
|
148
|
+
el.addEventListener('scroll', edges, { passive: true });
|
|
149
|
+
['pointerdown', 'wheel', 'touchstart', 'keydown'].forEach((e) => el.addEventListener(e, move, { passive: true }));
|
|
150
|
+
if (typeof ResizeObserver === 'function') {
|
|
151
|
+
this.ro = new ResizeObserver(fit);
|
|
152
|
+
this.ro.observe(el);
|
|
153
|
+
const grid = el.querySelector('.vo-hmx-grid');
|
|
154
|
+
if (grid)
|
|
155
|
+
this.ro.observe(grid);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
later(fn, ms) {
|
|
159
|
+
this.timers.push(setTimeout(fn, ms));
|
|
160
|
+
}
|
|
161
|
+
ngOnDestroy() {
|
|
162
|
+
this.timers.forEach(clearTimeout);
|
|
163
|
+
this.timers = [];
|
|
164
|
+
this.ro?.disconnect();
|
|
165
|
+
}
|
|
166
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActivityHeatmapComponent, deps: [{ token: i1.ReducedMotionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
167
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ActivityHeatmapComponent, isStandalone: true, selector: "vo-activity-heatmap", inputs: { series: "series", value: "value", defaultValue: "defaultValue", title: "title", period: "period", className: "className" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "sc", first: true, predicate: ["sc"], descendants: true }], ngImport: i0, template: `
|
|
168
|
+
<div data-vo="" class="vo-hmx vo-panel" [class]="className">
|
|
169
|
+
<div class="vo-hmx-h">
|
|
170
|
+
<div>
|
|
171
|
+
<b>{{ title }}</b>
|
|
172
|
+
<span class="vo-sw vo-muted vo-hmx-st" [class.vo-out]="stOut">{{ stText }}</span>
|
|
173
|
+
</div>
|
|
174
|
+
@if (series.length > 1) {
|
|
175
|
+
<div class="vo-seg2 vo-hmx-sg" role="group" aria-label="Who">
|
|
176
|
+
<span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
|
|
177
|
+
@for (s of series; track s.key) {
|
|
178
|
+
<button
|
|
179
|
+
type="button"
|
|
180
|
+
[attr.aria-pressed]="s.key === key"
|
|
181
|
+
(click)="select(s.key)"
|
|
182
|
+
>{{ s.label }}</button>
|
|
183
|
+
}
|
|
184
|
+
</div>
|
|
185
|
+
}
|
|
186
|
+
</div>
|
|
187
|
+
<div class="vo-hmx-wrap">
|
|
188
|
+
<div #sc class="vo-hmx-sc">
|
|
189
|
+
<div class="vo-hmx-days vo-muted" aria-hidden="true">
|
|
190
|
+
@for (d of dayLabels; track $index) {
|
|
191
|
+
<span>{{ d }}</span>
|
|
192
|
+
}
|
|
193
|
+
</div>
|
|
194
|
+
<div class="vo-hmx-grid" role="img" [attr.aria-label]="gridLabel">
|
|
195
|
+
@for (cell of cells; track $index) {
|
|
196
|
+
<i
|
|
197
|
+
[style.--vo-a]="cell.alpha"
|
|
198
|
+
[style.transition]="cell.transition"
|
|
199
|
+
[attr.data-tip]="cell.tip || null"
|
|
200
|
+
></i>
|
|
201
|
+
}
|
|
202
|
+
</div>
|
|
203
|
+
<div class="vo-hmx-f vo-muted" aria-hidden="true">
|
|
204
|
+
@for (t of hours; track t; let i = $index) {
|
|
205
|
+
<span class="vo-hmx-ax" [class.vo-x]="i % 2 === 1">{{ t }}</span>
|
|
206
|
+
}
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
<div class="vo-hmx-lg vo-muted" aria-hidden="true">
|
|
211
|
+
Less@for (a of legend; track a) {<i [style.--vo-a]="a"></i>}More
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
`, isInline: true, styles: [".vo-hmx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-hmx-h{display:flex;align-items:center;justify-content:space-between;gap:10px}.vo-hmx-h>div:first-child{display:flex;flex-direction:column;font-size:13.5px}.vo-hmx-h b{font-weight:500}.vo-hmx-st{font-size:12px}.vo-hmx-sg button{font-size:12px;height:26px;padding:0 9px}.vo-hmx-sc{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px}.vo-hmx-days{display:grid;grid-template-rows:repeat(7,1fr);gap:3px;font-size:10px}.vo-hmx-days span{display:flex;align-items:center;height:100%}.vo-hmx-grid{display:grid;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;min-width:0}.vo-hmx-grid i{aspect-ratio:1;border-radius:3px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip));transition:background .5s var(--vo-ease),transform .2s;max-width:100%}@media (hover:hover) and (pointer:fine){.vo-hmx-grid i:hover{transform:scale(1.35);box-shadow:0 0 0 1.5px var(--vo-surface);position:relative;z-index:1}}.vo-hmx-f{grid-column:2;display:grid;grid-template-columns:repeat(4,1fr);font-size:10.5px}.vo-hmx-f .vo-x{display:none}.vo-hmx{container-type:inline-size}@container (max-width:400px){.vo-hmx-sc{grid-template-columns:34px calc((100cqw - 34px)*2);column-gap:0;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;scroll-snap-type:x proximity;scroll-padding-left:34px;--vo-fl:0px;--vo-fr:0px;-webkit-mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent);mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent)}.vo-hmx-sc::-webkit-scrollbar{display:none}.vo-hmx-sc.vo-ml{--vo-fl:16px}.vo-hmx-sc.vo-mr{--vo-fr:16px}.vo-hmx-days{position:sticky;left:0;z-index:2;background:var(--vo-surface);gap:4px;padding-right:6px;font-size:10.5px}.vo-hmx-sc:after{content:\"\";grid-row:2;grid-column:1;position:sticky;left:0;z-index:2;background:var(--vo-surface)}.vo-hmx-grid{gap:4px}.vo-hmx-grid i{border-radius:calc(4px * var(--vo-rk));scroll-snap-align:start}.vo-hmx-f{grid-template-columns:repeat(8,1fr)}.vo-hmx-f .vo-x{display:block}}.vo-hmx-lg{align-self:flex-end;display:flex;align-items:center;gap:3px;font-size:10.5px}.vo-hmx-lg i{width:9px;height:9px;border-radius:2px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip))}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-seg2{display:inline-flex;padding:2px;background:var(--vo-chip);border-radius:var(--vo-r-pill);position:relative}.vo-seg2 button{position:relative;z-index:1;height:26px;padding:0 11px;border-radius:var(--vo-r-pill);font-size:12.5px;color:var(--vo-fg2);transition:color var(--vo-t-fast)}.vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-seg2 button:focus-visible{outline-offset:-2px;border-radius:var(--vo-r-pill)}.vo-seg2 .vo-knob{position:absolute;top:2px;bottom:2px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:0 1px 2px #00000014;transition:left var(--vo-t) var(--vo-ease),width var(--vo-t) var(--vo-ease)}.vo-seg2 .vo-knob:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}.vo-sw{display:inline-block;transition:opacity .22s var(--vo-ease),filter .22s var(--vo-ease),transform .22s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(4px);transform:translateY(3px)}@media (prefers-reduced-motion:reduce){.vo-sw{transition:none}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
215
|
+
}
|
|
216
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ActivityHeatmapComponent, decorators: [{
|
|
217
|
+
type: Component,
|
|
218
|
+
args: [{ selector: 'vo-activity-heatmap', standalone: true, encapsulation: ViewEncapsulation.None, template: `
|
|
219
|
+
<div data-vo="" class="vo-hmx vo-panel" [class]="className">
|
|
220
|
+
<div class="vo-hmx-h">
|
|
221
|
+
<div>
|
|
222
|
+
<b>{{ title }}</b>
|
|
223
|
+
<span class="vo-sw vo-muted vo-hmx-st" [class.vo-out]="stOut">{{ stText }}</span>
|
|
224
|
+
</div>
|
|
225
|
+
@if (series.length > 1) {
|
|
226
|
+
<div class="vo-seg2 vo-hmx-sg" role="group" aria-label="Who">
|
|
227
|
+
<span class="vo-knob" [style.left.px]="knobLeft" [style.width.px]="knobWidth"></span>
|
|
228
|
+
@for (s of series; track s.key) {
|
|
229
|
+
<button
|
|
230
|
+
type="button"
|
|
231
|
+
[attr.aria-pressed]="s.key === key"
|
|
232
|
+
(click)="select(s.key)"
|
|
233
|
+
>{{ s.label }}</button>
|
|
234
|
+
}
|
|
235
|
+
</div>
|
|
236
|
+
}
|
|
237
|
+
</div>
|
|
238
|
+
<div class="vo-hmx-wrap">
|
|
239
|
+
<div #sc class="vo-hmx-sc">
|
|
240
|
+
<div class="vo-hmx-days vo-muted" aria-hidden="true">
|
|
241
|
+
@for (d of dayLabels; track $index) {
|
|
242
|
+
<span>{{ d }}</span>
|
|
243
|
+
}
|
|
244
|
+
</div>
|
|
245
|
+
<div class="vo-hmx-grid" role="img" [attr.aria-label]="gridLabel">
|
|
246
|
+
@for (cell of cells; track $index) {
|
|
247
|
+
<i
|
|
248
|
+
[style.--vo-a]="cell.alpha"
|
|
249
|
+
[style.transition]="cell.transition"
|
|
250
|
+
[attr.data-tip]="cell.tip || null"
|
|
251
|
+
></i>
|
|
252
|
+
}
|
|
253
|
+
</div>
|
|
254
|
+
<div class="vo-hmx-f vo-muted" aria-hidden="true">
|
|
255
|
+
@for (t of hours; track t; let i = $index) {
|
|
256
|
+
<span class="vo-hmx-ax" [class.vo-x]="i % 2 === 1">{{ t }}</span>
|
|
257
|
+
}
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
</div>
|
|
261
|
+
<div class="vo-hmx-lg vo-muted" aria-hidden="true">
|
|
262
|
+
Less@for (a of legend; track a) {<i [style.--vo-a]="a"></i>}More
|
|
263
|
+
</div>
|
|
264
|
+
</div>
|
|
265
|
+
`, styles: [".vo-hmx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-hmx-h{display:flex;align-items:center;justify-content:space-between;gap:10px}.vo-hmx-h>div:first-child{display:flex;flex-direction:column;font-size:13.5px}.vo-hmx-h b{font-weight:500}.vo-hmx-st{font-size:12px}.vo-hmx-sg button{font-size:12px;height:26px;padding:0 9px}.vo-hmx-sc{display:grid;grid-template-columns:auto minmax(0,1fr);gap:6px}.vo-hmx-days{display:grid;grid-template-rows:repeat(7,1fr);gap:3px;font-size:10px}.vo-hmx-days span{display:flex;align-items:center;height:100%}.vo-hmx-grid{display:grid;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;min-width:0}.vo-hmx-grid i{aspect-ratio:1;border-radius:3px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip));transition:background .5s var(--vo-ease),transform .2s;max-width:100%}@media (hover:hover) and (pointer:fine){.vo-hmx-grid i:hover{transform:scale(1.35);box-shadow:0 0 0 1.5px var(--vo-surface);position:relative;z-index:1}}.vo-hmx-f{grid-column:2;display:grid;grid-template-columns:repeat(4,1fr);font-size:10.5px}.vo-hmx-f .vo-x{display:none}.vo-hmx{container-type:inline-size}@container (max-width:400px){.vo-hmx-sc{grid-template-columns:34px calc((100cqw - 34px)*2);column-gap:0;overflow-x:auto;overscroll-behavior-x:contain;scrollbar-width:none;scroll-snap-type:x proximity;scroll-padding-left:34px;--vo-fl:0px;--vo-fr:0px;-webkit-mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent);mask-image:linear-gradient(to right,#000 34px,transparent 34px,#000 calc(34px + var(--vo-fl)),#000 calc(100% - var(--vo-fr)),transparent)}.vo-hmx-sc::-webkit-scrollbar{display:none}.vo-hmx-sc.vo-ml{--vo-fl:16px}.vo-hmx-sc.vo-mr{--vo-fr:16px}.vo-hmx-days{position:sticky;left:0;z-index:2;background:var(--vo-surface);gap:4px;padding-right:6px;font-size:10.5px}.vo-hmx-sc:after{content:\"\";grid-row:2;grid-column:1;position:sticky;left:0;z-index:2;background:var(--vo-surface)}.vo-hmx-grid{gap:4px}.vo-hmx-grid i{border-radius:calc(4px * var(--vo-rk));scroll-snap-align:start}.vo-hmx-f{grid-template-columns:repeat(8,1fr)}.vo-hmx-f .vo-x{display:block}}.vo-hmx-lg{align-self:flex-end;display:flex;align-items:center;gap:3px;font-size:10.5px}.vo-hmx-lg i{width:9px;height:9px;border-radius:2px;background:color-mix(in srgb,var(--vo-accent) calc(var(--vo-a) * 100%),var(--vo-chip))}.vo-muted{color:var(--vo-muted)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-seg2{display:inline-flex;padding:2px;background:var(--vo-chip);border-radius:var(--vo-r-pill);position:relative}.vo-seg2 button{position:relative;z-index:1;height:26px;padding:0 11px;border-radius:var(--vo-r-pill);font-size:12.5px;color:var(--vo-fg2);transition:color var(--vo-t-fast)}.vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-seg2 button:focus-visible{outline-offset:-2px;border-radius:var(--vo-r-pill)}.vo-seg2 .vo-knob{position:absolute;top:2px;bottom:2px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:0 1px 2px #00000014;transition:left var(--vo-t) var(--vo-ease),width var(--vo-t) var(--vo-ease)}.vo-seg2 .vo-knob:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}.vo-sw{display:inline-block;transition:opacity .22s var(--vo-ease),filter .22s var(--vo-ease),transform .22s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(4px);transform:translateY(3px)}@media (prefers-reduced-motion:reduce){.vo-sw{transition:none}}\n"] }]
|
|
266
|
+
}], ctorParameters: () => [{ type: i1.ReducedMotionService }, { type: i0.ChangeDetectorRef }], propDecorators: { series: [{
|
|
267
|
+
type: Input,
|
|
268
|
+
args: [{ required: true }]
|
|
269
|
+
}], value: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], defaultValue: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}], title: [{
|
|
274
|
+
type: Input
|
|
275
|
+
}], period: [{
|
|
276
|
+
type: Input
|
|
277
|
+
}], className: [{
|
|
278
|
+
type: Input
|
|
279
|
+
}], valueChange: [{
|
|
280
|
+
type: Output
|
|
281
|
+
}], sc: [{
|
|
282
|
+
type: ViewChild,
|
|
283
|
+
args: ['sc']
|
|
284
|
+
}] } });
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktaGVhdG1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hY3Rpdml0eS1oZWF0bWFwL2FjdGl2aXR5LWhlYXRtYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLHdDQUF3QztBQUN4QyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLGdDQUFnQztBQUVoQyxPQUFPLEVBR0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7OztBQWtCdkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLG1GQUFtRjtBQUNuRixNQUFNLEtBQUssR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN6RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRTVELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLEdB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dml0eS1oZWF0bWFwL2FjdGl2aXR5LWhlYXRtYXAuY29tcG9uZW50LnRzXG4vL1xuLy8gTmF0aXZlIEFuZ3VsYXIgcG9ydCBvZiBmcmFtZXdvcmsvcmVhY3QvYWN0aXZpdHktaGVhdG1hcC9BY3Rpdml0eUhlYXRtYXAudHN4LlxuLy8gV2hlbiB0aGUgYWdlbnQgb3IgdGhlIHRlYW0gaXMgYnVzeSwgYnkgZGF5IGFuZCBob3VyLCBhcyBhIDd4MjQgZ3JpZCBvZiBjZWxsc1xuLy8gdGludGVkIGZyb20gdGhlIGFjY2VudCBieSB0aGVpciB2YWx1ZS4gVGhlIGNlbGxzIGZpbGwgaW4gYXMgYSB3YXZlIGZyb20gdGhlXG4vLyB0b3AgbGVmdDsgYSBzd2l0Y2ggKHNob3duIHdpdGggdHdvIG9yIG1vcmUgc2VyaWVzKSBzd2VlcHMgYSBuZXcgc2VyaWVzIGluIHRoZVxuLy8gc2FtZSB3YXkuIEluIGEgbmFycm93IGNhcmQgKGEgcGhvbmUpIHRoZSBncmlkIHNob3dzIGhhbGYgdGhlIGRheSBhdCBhIHRpbWUgaW5cbi8vIGJpZ2dlciBjZWxscywgc2Nyb2xscyBzaWRld2F5cyBhbmQgc3RhcnRzIGF0IHRoZSBsYXRlc3QgaG91cnMuIElucHV0cyBtaXJyb3Jcbi8vIHRoZSBSZWFjdCBwcm9wczsgdGhlIGZpbGwtaW4sIHRoZSBzd2l0Y2ggYW5kIHRoZSBzY3JvbGwgZWRnZXMgYXJlIHBvcnRlZCBmcm9tXG4vLyB0aGUgdmFuaWxsYSBKUyAoYWN0aXZpdHktaGVhdG1hcC5qcykuXG4vL1xuLy8gSWNvbnM6IG5vbmUgb2YgdGhpcyBjb21wb25lbnQncyBjaHJvbWUgdXNlcyBhbiBpY29uICh0aGUgc3dpdGNoIGlzIHRleHQpLCBzb1xuLy8gbm8gVm9JY29uQ29tcG9uZW50IGlzIG5lZWRlZC5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogT25lIHNlcmllczogYSBzd2l0Y2ggb3B0aW9uIHdpdGggaXRzIDE2OCBob3VybHkgdmFsdWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3Rpdml0eUhlYXRtYXBTZXJpZXMge1xuICBrZXk6IHN0cmluZztcbiAgLyoqIFRoZSBzd2l0Y2ggbGFiZWwsIGxpa2UgXCJBZ2VudFwiLiAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogMTY4IHZhbHVlcyBmcm9tIDAgdG8gMSwgb25lIGFuIGhvdXIsIE1vbmRheSAxMmFtIGZpcnN0LiAqL1xuICB2YWx1ZXM6IG51bWJlcltdO1xuICAvKiogV2hhdCBhIGZ1bGwgY2VsbCBjb3VudHMsIGZvciB0aGUgdGlwcywgbGlrZSA0MC4gKi9cbiAgbWF4OiBudW1iZXI7XG4gIC8qKiBXaGF0IGl0IGNvdW50cywgZm9yIHRoZSB0aXBzLCBsaWtlIFwicnVuc1wiLiAqL1xuICB1bml0OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGluZSB1bmRlciB0aGUgdGl0bGUgd2hpbGUgdGhpcyBzZXJpZXMgc2hvd3MsIGxpa2UgXCJCdXNpZXN0IG92ZXJuaWdodCwgd2hlbiB0aGUgcXVldWUgcnVuc1wiLiAqL1xuICBub3RlPzogc3RyaW5nO1xufVxuXG5jb25zdCBEQVlTID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xuY29uc3QgTEVHRU5EID0gWzAuMDgsIDAuMywgMC41NSwgMC44NV07XG4vLyBldmVyeSB0aHJlZSBob3VyczsgdGhlIG9uZXMgYmV0d2VlbiB0aGUgZm91ciBvbiBhIHdpZGUgY2FyZCBvbmx5IHNob3cgb24gYSBwaG9uZVxuY29uc3QgSE9VUlMgPSBbJzEyYW0nLCAnM2FtJywgJzZhbScsICc5YW0nLCAnMTJwbScsICczcG0nLCAnNnBtJywgJzlwbSddO1xuY29uc3QgREFZX0xBQkVMUyA9IFsnTW9uJywgJycsICdXZWQnLCAnJywgJ0ZyaScsICcnLCAnU3VuJ107XG5cbmNvbnN0IGhvdXIgPSAoaDogbnVtYmVyKTogc3RyaW5nID0+IChoICUgMTIgfHwgMTIpICsgKGggPCAxMiA/ICdhbScgOiAncG0nKTtcblxuLyoqIE9uZSBjZWxsJ3MgcmVuZGVyIHN0YXRlOiBpdHMgdGludCwgaXRzIHBlci1jZWxsIHRyYW5zaXRpb24gYW5kIGl0cyB0aXAuICovXG5pbnRlcmZhY2UgQ2VsbCB7XG4gIGFscGhhOiBudW1iZXI7XG4gIHRyYW5zaXRpb246IHN0cmluZztcbiAgdGlwOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZvLWFjdGl2aXR5LWhlYXRtYXAnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8taG14IHZvLXBhbmVsXCIgW2NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWhteC1oXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGI+e3sgdGl0bGUgfX08L2I+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zdyB2by1tdXRlZCB2by1obXgtc3RcIiBbY2xhc3Mudm8tb3V0XT1cInN0T3V0XCI+e3sgc3RUZXh0IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChzZXJpZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zZWcyIHZvLWhteC1zZ1wiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJXaG9cIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8ta25vYlwiIFtzdHlsZS5sZWZ0LnB4XT1cImtub2JMZWZ0XCIgW3N0eWxlLndpZHRoLnB4XT1cImtub2JXaWR0aFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIEBmb3IgKHMgb2Ygc2VyaWVzOyB0cmFjayBzLmtleSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInMua2V5ID09PSBrZXlcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Qocy5rZXkpXCJcbiAgICAgICAgICAgICAgPnt7IHMubGFiZWwgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8taG14LXdyYXBcIj5cbiAgICAgICAgPGRpdiAjc2MgY2xhc3M9XCJ2by1obXgtc2NcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWRheXMgdm8tbXV0ZWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIEBmb3IgKGQgb2YgZGF5TGFiZWxzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHNwYW4+e3sgZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWdyaWRcIiByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJncmlkTGFiZWxcIj5cbiAgICAgICAgICAgIEBmb3IgKGNlbGwgb2YgY2VsbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIFtzdHlsZS4tLXZvLWFdPVwiY2VsbC5hbHBoYVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwiY2VsbC50cmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLXRpcF09XCJjZWxsLnRpcCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taG14LWYgdm8tbXV0ZWRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIEBmb3IgKHQgb2YgaG91cnM7IHRyYWNrIHQ7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG14LWF4XCIgW2NsYXNzLnZvLXhdPVwiaSAlIDIgPT09IDFcIj57eyB0IH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWhteC1sZyB2by1tdXRlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICBMZXNzQGZvciAoYSBvZiBsZWdlbmQ7IHRyYWNrIGEpIHs8aSBbc3R5bGUuLS12by1hXT1cImFcIj48L2k+fU1vcmVcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vYWN0aXZpdHktaGVhdG1hcC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpdml0eUhlYXRtYXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogT25lIG9yIG1vcmUgc2VyaWVzOyB0aGUgc3dpdGNoIHNob3dzIHdoZW4gdGhlcmUgYXJlIHR3byBvciBtb3JlLiAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXJpZXM6IEFjdGl2aXR5SGVhdG1hcFNlcmllc1tdID0gW107XG4gIC8qKiBUaGUgc2VyaWVzIG9uIHNob3csIGJ5IGtleS4gTGVhdmUgaXQgb3V0IHRvIGxldCB0aGUgc3dpdGNoIHBpY2sgaXQuICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbnRyb2xsZWQgPSB2ICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSB0aGlzLmtleSkge1xuICAgICAgdGhpcy5rZXkgPSB2O1xuICAgICAgaWYgKHRoaXMucmVhZHkpIHtcbiAgICAgICAgdGhpcy5wbGFjZUtub2IoKTtcbiAgICAgICAgdGhpcy5kcmF3KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRWYWx1ZT86IHN0cmluZztcbiAgLyoqIEhlYWRlciB0ZXh0LiAqL1xuICBASW5wdXQoKSB0aXRsZSA9ICdBY3Rpdml0eSc7XG4gIC8qKiBUaGUgbGluZSB1bmRlciB0aGUgdGl0bGUgYmVmb3JlIHRoZSBjZWxscyBmaWxsIGluLCBhbmQgd2hlbiBhIHNlcmllcyBoYXMgbm8gbm90ZS4gKi9cbiAgQElucHV0KCkgcGVyaW9kID0gJ0xhc3QgNCB3ZWVrcyc7XG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NjJykgc2MhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICByZWFkb25seSBkYXlMYWJlbHMgPSBEQVlfTEFCRUxTO1xuICByZWFkb25seSBob3VycyA9IEhPVVJTO1xuICByZWFkb25seSBsZWdlbmQgPSBMRUdFTkQ7XG5cbiAga2V5ID0gJyc7XG4gIGNlbGxzOiBDZWxsW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxNjggfSwgKCkgPT4gKHsgYWxwaGE6IDAsIHRyYW5zaXRpb246ICcnLCB0aXA6ICcnIH0pKTtcbiAgc3RUZXh0ID0gJyc7XG4gIHN0T3V0ID0gZmFsc2U7XG4gIGtub2JMZWZ0ID0gMDtcbiAga25vYldpZHRoID0gMDtcblxuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIGRyYXduID0gZmFsc2U7XG4gIHByaXZhdGUgdGltZXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PltdID0gW107XG4gIHByaXZhdGUgcm8/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBtb3ZlZCA9IGZhbHNlO1xuXG4gIGdldCBjdXJyZW50KCk6IEFjdGl2aXR5SGVhdG1hcFNlcmllcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzLmZpbmQoKHMpID0+IHMua2V5ID09PSB0aGlzLmtleSkgPz8gdGhpcy5zZXJpZXNbMF07XG4gIH1cblxuICBnZXQgZ3JpZExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudGl0bGV9LCAke3RoaXMuY3VycmVudD8ubm90ZSA/PyB0aGlzLnBlcmlvZH1gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWR1Y2VkOiBSZWR1Y2VkTW90aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRyb2xsZWQgJiYgIXRoaXMua2V5KSB7XG4gICAgICB0aGlzLmtleSA9IHRoaXMuZGVmYXVsdFZhbHVlID8/IHRoaXMuc2VyaWVzWzBdPy5rZXkgPz8gJyc7XG4gICAgfVxuICAgIHRoaXMuc3RUZXh0ID0gdGhpcy5wZXJpb2Q7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucGxhY2VLbm9iKCk7XG4gICAgdGhpcy5zZXR1cFNjcm9sbCgpO1xuICAgIC8vIHRoZSBjZWxscyBzdGFydCBlbXB0eSBhbmQgZmlsbCBpbiBhIG1vbWVudCBhZnRlciB0aGUgY2FyZCBhcHBlYXJzXG4gICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICB0aGlzLmRyYXduID0gdHJ1ZTtcbiAgICAgIHRoaXMuZHJhdygpO1xuICAgIH0sIDE1MCk7XG4gIH1cblxuICBzZWxlY3Qoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICB0aGlzLnBsYWNlS25vYigpO1xuICAgICAgdGhpcy5kcmF3KCk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3KCk6IHZvaWQge1xuICAgIGNvbnN0IHMgPSB0aGlzLmN1cnJlbnQ7XG4gICAgY29uc3QgcmVkdWNlID0gdGhpcy5yZWR1Y2VkLnJlZHVjZSgpO1xuICAgIC8vIHRoZSBsaW5lIHVuZGVyIHRoZSB0aXRsZSBibHVycyBvdXQgYW5kIGJhY2sgaW4gd2hlbiB0aGUgc2VyaWVzIGNoYW5nZXNcbiAgICBjb25zdCBub3RlID0gdGhpcy5kcmF3biA/IHM/Lm5vdGUgPz8gdGhpcy5wZXJpb2QgOiB0aGlzLnBlcmlvZDtcbiAgICBpZiAobm90ZSAhPT0gdGhpcy5zdFRleHQpIHtcbiAgICAgIHRoaXMuc3RPdXQgPSB0cnVlO1xuICAgICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuc3RUZXh0ID0gbm90ZTtcbiAgICAgICAgdGhpcy5zdE91dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0sIHJlZHVjZSA/IDAgOiAxNzApO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2ODsgaSsrKSB7XG4gICAgICBjb25zdCBkID0gTWF0aC5mbG9vcihpIC8gMjQpO1xuICAgICAgY29uc3QgaCA9IGkgJSAyNDtcbiAgICAgIGNvbnN0IHYgPSBzPy52YWx1ZXNbaV0gPz8gMDtcbiAgICAgIC8vIGVhY2ggY2VsbCBjaGFuZ2VzIGEgYmVhdCBhZnRlciB0aGUgb25lIGJlZm9yZSBpdCwgc28gYSBuZXcgc2VyaWVzIHN3ZWVwcyBpbiBmcm9tIHRoZSB0b3AgbGVmdFxuICAgICAgY29uc3QgZGVsYXkgPSByZWR1Y2UgPyAwIDogKGggKyBkKSAqIDE0O1xuICAgICAgdGhpcy5jZWxsc1tpXS5hbHBoYSA9IHRoaXMuZHJhd24gPyArKHYgKiAwLjkpLnRvRml4ZWQoMikgOiAwO1xuICAgICAgdGhpcy5jZWxsc1tpXS50cmFuc2l0aW9uID0gYGJhY2tncm91bmQgLjVzIHZhcigtLXZvLWVhc2UpICR7ZGVsYXl9bXMsIHRyYW5zZm9ybSAuMnNgO1xuICAgICAgdGhpcy5jZWxsc1tpXS50aXAgPSB0aGlzLmRyYXduICYmIHMgPyBgJHtEQVlTW2RdfSAke2hvdXIoaCl9OiAke01hdGgucm91bmQodiAqIHMubWF4KX0gJHtzLnVuaXR9YCA6ICcnO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcGxhY2VLbm9iKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlcmllcy5sZW5ndGggPCAyKSByZXR1cm47XG4gICAgY29uc3QgYnRucyA9IHRoaXMuc2M/Lm5hdGl2ZUVsZW1lbnRcbiAgICAgID8gKHRoaXMuc2MubmF0aXZlRWxlbWVudC5jbG9zZXN0KCcudm8taG14Jyk/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8taG14LXNnIGJ1dHRvbicpID8/IFtdKVxuICAgICAgOiBbXTtcbiAgICBjb25zdCBhdCA9IHRoaXMuc2VyaWVzLmZpbmRJbmRleCgocykgPT4gcy5rZXkgPT09IHRoaXMua2V5KTtcbiAgICBjb25zdCBiID0gYnRuc1thdCA8IDAgPyAwIDogYXRdO1xuICAgIGlmIChiKSB7XG4gICAgICB0aGlzLmtub2JMZWZ0ID0gYi5vZmZzZXRMZWZ0O1xuICAgICAgdGhpcy5rbm9iV2lkdGggPSBiLm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gb24gYSBwaG9uZSB0aGUgZ3JpZCBzY3JvbGxzIHNpZGV3YXlzOiBpdCBzdGFydHMgYXQgdGhlIGxhdGVzdCBob3VycywgYW5kIGZhZGVzIG91dCBvbiB3aGljaGV2ZXIgc2lkZSBoYXMgbW9yZSB0byBzZWVcbiAgcHJpdmF0ZSBzZXR1cFNjcm9sbCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2M/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGVkZ2VzID0gKCkgPT4ge1xuICAgICAgY29uc3QgbSA9IGVsLnNjcm9sbFdpZHRoIC0gZWwuY2xpZW50V2lkdGg7XG4gICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCd2by1tbCcsIG0gPiAxICYmIGVsLnNjcm9sbExlZnQgPiAxKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ3ZvLW1yJywgbSA+IDEgJiYgZWwuc2Nyb2xsTGVmdCA8IG0gLSAxKTtcbiAgICB9O1xuICAgIC8vIGl0IHN0YXlzIG9uIHRoZSBsYXRlc3QgaG91cnMgYXMgdGhlIGNhcmQgc2V0dGxlcyBpdHMgc2l6ZSwgdW50aWwgdGhlIHBlcnNvbiBzY3JvbGxzIGl0IHRoZW1zZWx2ZXNcbiAgICBjb25zdCBmaXQgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMubW92ZWQpIGVsLnNjcm9sbExlZnQgPSBlbC5zY3JvbGxXaWR0aDtcbiAgICAgIGVkZ2VzKCk7XG4gICAgfTtcbiAgICBjb25zdCBtb3ZlID0gKCkgPT4ge1xuICAgICAgdGhpcy5tb3ZlZCA9IHRydWU7XG4gICAgfTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBlZGdlcywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIChbJ3BvaW50ZXJkb3duJywgJ3doZWVsJywgJ3RvdWNoc3RhcnQnLCAna2V5ZG93biddIGFzIGNvbnN0KS5mb3JFYWNoKChlKSA9PlxuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlLCBtb3ZlLCB7IHBhc3NpdmU6IHRydWUgfSksXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZpdCk7XG4gICAgICB0aGlzLnJvLm9ic2VydmUoZWwpO1xuICAgICAgY29uc3QgZ3JpZCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy52by1obXgtZ3JpZCcpO1xuICAgICAgaWYgKGdyaWQpIHRoaXMucm8ub2JzZXJ2ZShncmlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxhdGVyKGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMucHVzaChzZXRUaW1lb3V0KGZuLCBtcykpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaChjbGVhclRpbWVvdXQpO1xuICAgIHRoaXMudGltZXJzID0gW107XG4gICAgdGhpcy5ybz8uZGlzY29ubmVjdCgpO1xuICB9XG59XG4iXX0=
|