@corenel/web-ui 0.7.0 → 0.8.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/dist/Composer.d.ts.map +1 -1
- package/dist/Composer.js +184 -172
- package/dist/Composer.js.map +1 -1
- package/dist/ContextBar.d.ts +1 -4
- package/dist/ContextBar.d.ts.map +1 -1
- package/dist/ContextBar.js +2 -2
- package/dist/ContextBar.js.map +1 -1
- package/dist/ContextManager.d.ts +3 -6
- package/dist/ContextManager.d.ts.map +1 -1
- package/dist/ContextManager.js +58 -10
- package/dist/ContextManager.js.map +1 -1
- package/dist/SummaryTranscript.d.ts +11 -1
- package/dist/SummaryTranscript.d.ts.map +1 -1
- package/dist/SummaryTranscript.js +47 -10
- package/dist/SummaryTranscript.js.map +1 -1
- package/dist/ToolFold.d.ts +9 -0
- package/dist/ToolFold.d.ts.map +1 -0
- package/dist/ToolFold.js +32 -0
- package/dist/ToolFold.js.map +1 -0
- package/dist/Transcript.d.ts +30 -1
- package/dist/Transcript.d.ts.map +1 -1
- package/dist/Transcript.js +132 -23
- package/dist/Transcript.js.map +1 -1
- package/dist/agentChat/AgentChat.d.ts +11 -3
- package/dist/agentChat/AgentChat.d.ts.map +1 -1
- package/dist/agentChat/AgentChat.js +171 -88
- package/dist/agentChat/AgentChat.js.map +1 -1
- package/dist/agentChat/OptionsDrawer.d.ts +0 -23
- package/dist/agentChat/OptionsDrawer.d.ts.map +1 -1
- package/dist/agentChat/OptionsDrawer.js +10 -45
- package/dist/agentChat/OptionsDrawer.js.map +1 -1
- package/dist/agentChat/PlanReview.d.ts +24 -0
- package/dist/agentChat/PlanReview.d.ts.map +1 -0
- package/dist/agentChat/PlanReview.js +103 -0
- package/dist/agentChat/PlanReview.js.map +1 -0
- package/dist/agentChat/SkillsSection.js +4 -2
- package/dist/agentChat/SkillsSection.js.map +1 -1
- package/dist/agentChat/controller.d.ts +10 -2
- package/dist/agentChat/controller.d.ts.map +1 -1
- package/dist/agentChat/controller.js.map +1 -1
- package/dist/arrivalEffect.d.ts +28 -0
- package/dist/arrivalEffect.d.ts.map +1 -0
- package/dist/arrivalEffect.js +114 -0
- package/dist/arrivalEffect.js.map +1 -0
- package/dist/commandTurn.d.ts.map +1 -1
- package/dist/commandTurn.js +3 -2
- package/dist/commandTurn.js.map +1 -1
- package/dist/fx/AsteroidsOverlay.d.ts +6 -0
- package/dist/fx/AsteroidsOverlay.d.ts.map +1 -0
- package/dist/fx/AsteroidsOverlay.js +166 -0
- package/dist/fx/AsteroidsOverlay.js.map +1 -0
- package/dist/fx/FlapRow.d.ts +8 -0
- package/dist/fx/FlapRow.d.ts.map +1 -0
- package/dist/fx/FlapRow.js +12 -0
- package/dist/fx/FlapRow.js.map +1 -0
- package/dist/fx/FxText.d.ts +11 -0
- package/dist/fx/FxText.d.ts.map +1 -0
- package/dist/fx/FxText.js +50 -0
- package/dist/fx/FxText.js.map +1 -0
- package/dist/fx/LiveAnswer.d.ts +17 -0
- package/dist/fx/LiveAnswer.d.ts.map +1 -0
- package/dist/fx/LiveAnswer.js +298 -0
- package/dist/fx/LiveAnswer.js.map +1 -0
- package/dist/fx/MatrixRain.d.ts +5 -0
- package/dist/fx/MatrixRain.d.ts.map +1 -0
- package/dist/fx/MatrixRain.js +73 -0
- package/dist/fx/MatrixRain.js.map +1 -0
- package/dist/fx/NetsplitJoin.d.ts +3 -0
- package/dist/fx/NetsplitJoin.d.ts.map +1 -0
- package/dist/fx/NetsplitJoin.js +13 -0
- package/dist/fx/NetsplitJoin.js.map +1 -0
- package/dist/fx/arrivalModes.d.ts +27 -0
- package/dist/fx/arrivalModes.d.ts.map +1 -0
- package/dist/fx/arrivalModes.js +107 -0
- package/dist/fx/arrivalModes.js.map +1 -0
- package/dist/fx/tail.d.ts +16 -0
- package/dist/fx/tail.d.ts.map +1 -0
- package/dist/fx/tail.js +54 -0
- package/dist/fx/tail.js.map +1 -0
- package/dist/fx/useReveal.d.ts +2 -0
- package/dist/fx/useReveal.d.ts.map +1 -0
- package/dist/fx/useReveal.js +59 -0
- package/dist/fx/useReveal.js.map +1 -0
- package/dist/observed.d.ts +16 -0
- package/dist/observed.d.ts.map +1 -0
- package/dist/observed.js +33 -0
- package/dist/observed.js.map +1 -0
- package/dist/toolRender.d.ts +6 -2
- package/dist/toolRender.d.ts.map +1 -1
- package/dist/toolRender.js +27 -17
- package/dist/toolRender.js.map +1 -1
- package/dist/transcriptSkin.d.ts +23 -0
- package/dist/transcriptSkin.d.ts.map +1 -0
- package/dist/transcriptSkin.js +255 -0
- package/dist/transcriptSkin.js.map +1 -0
- package/dist/transcriptSkinCss.d.ts +4 -0
- package/dist/transcriptSkinCss.d.ts.map +1 -0
- package/dist/transcriptSkinCss.js +136 -0
- package/dist/transcriptSkinCss.js.map +1 -0
- package/dist/usageSummary.d.ts +31 -0
- package/dist/usageSummary.d.ts.map +1 -0
- package/dist/usageSummary.js +39 -0
- package/dist/usageSummary.js.map +1 -0
- package/dist/verificationView.d.ts +3 -0
- package/dist/verificationView.d.ts.map +1 -0
- package/dist/verificationView.js +37 -0
- package/dist/verificationView.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/* The Asteroids arrival effect: a vector ship at the bottom of the live turn
|
|
3
|
+
* fires at the text as it arrives (the empty `.fx-tail` marker LiveAnswer
|
|
4
|
+
* leaves at the reveal's edge), and each new tool line drifts in as a rock
|
|
5
|
+
* that is shot into place.
|
|
6
|
+
*
|
|
7
|
+
* Decorative only: aria-hidden, click-through, and it never leaves anything
|
|
8
|
+
* hidden -- a tool line held back while its rock flies is shown the moment it
|
|
9
|
+
* is hit, or when the overlay stops for any reason. Needs a positioned root. */
|
|
10
|
+
import { useEffect, useRef } from 'react';
|
|
11
|
+
const ROCK_MS = 650;
|
|
12
|
+
// Each live tool line carries its tool call id, kept across running -> done,
|
|
13
|
+
// so a tool gets ONE rock however often its element is replaced.
|
|
14
|
+
const TOOL_SELECTOR = '[data-fx-id]';
|
|
15
|
+
export function AsteroidsOverlay({ active, rootRef }) {
|
|
16
|
+
const ref = useRef(null);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const cv = ref.current;
|
|
19
|
+
const root = rootRef.current;
|
|
20
|
+
if (!active || !cv || !root)
|
|
21
|
+
return;
|
|
22
|
+
const ctx = cv.getContext('2d');
|
|
23
|
+
if (!ctx)
|
|
24
|
+
return;
|
|
25
|
+
const seen = new Set();
|
|
26
|
+
const held = new Set();
|
|
27
|
+
const rocks = [];
|
|
28
|
+
const shots = [];
|
|
29
|
+
const sparks = [];
|
|
30
|
+
const shape = Array.from({ length: 9 }, (_, k) => {
|
|
31
|
+
const a = (k / 9) * Math.PI * 2, r = 12 + Math.random() * 6;
|
|
32
|
+
return [Math.cos(a) * r, Math.sin(a) * r];
|
|
33
|
+
});
|
|
34
|
+
let aim = null;
|
|
35
|
+
let lastShot = 0;
|
|
36
|
+
let raf = 0;
|
|
37
|
+
const center = (el) => {
|
|
38
|
+
const r = el.getBoundingClientRect(), b = root.getBoundingClientRect();
|
|
39
|
+
return { x: r.left - b.left + r.width / 2, y: r.top - b.top + r.height / 2 };
|
|
40
|
+
};
|
|
41
|
+
const burst = (p, n, red, now) => {
|
|
42
|
+
for (let i = 0; i < n; i++) {
|
|
43
|
+
const a = Math.random() * Math.PI * 2, v = 40 + Math.random() * 70;
|
|
44
|
+
sparks.push({ p, vx: Math.cos(a) * v, vy: Math.sin(a) * v, t0: now, life: n > 6 ? 600 : 300, red });
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const show = (el) => { el.style.visibility = ''; held.delete(el); };
|
|
48
|
+
const frame = (now) => {
|
|
49
|
+
const W = root.clientWidth, H = root.clientHeight, dpr = window.devicePixelRatio || 1;
|
|
50
|
+
if (cv.width !== Math.round(W * dpr) || cv.height !== Math.round(H * dpr)) {
|
|
51
|
+
cv.width = Math.round(W * dpr);
|
|
52
|
+
cv.height = Math.round(H * dpr);
|
|
53
|
+
}
|
|
54
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
55
|
+
ctx.clearRect(0, 0, W, H);
|
|
56
|
+
ctx.lineWidth = 1.4;
|
|
57
|
+
const ship = { x: W / 2, y: H - 16 };
|
|
58
|
+
// A new tool line: hold it back and send a rock at its slot.
|
|
59
|
+
root.querySelectorAll(TOOL_SELECTOR).forEach((el) => {
|
|
60
|
+
const id = el.dataset.fxId ?? '';
|
|
61
|
+
if (seen.has(id))
|
|
62
|
+
return;
|
|
63
|
+
seen.add(id);
|
|
64
|
+
el.style.visibility = 'hidden';
|
|
65
|
+
held.add(el);
|
|
66
|
+
const c = center(el);
|
|
67
|
+
rocks.push({ id, el, from: { x: rocks.length % 2 ? W + 30 : -30, y: c.y - 40 }, t0: now, fired: false, at: c });
|
|
68
|
+
});
|
|
69
|
+
for (const r of rocks) {
|
|
70
|
+
if (r.fired)
|
|
71
|
+
continue;
|
|
72
|
+
// The tool's CURRENT element: a finished tool replaces its running row.
|
|
73
|
+
// A replacement is not held back -- the tool already has its rock.
|
|
74
|
+
const live = [...root.querySelectorAll(TOOL_SELECTOR)].find((e) => e.dataset.fxId === r.id);
|
|
75
|
+
if (live && live !== r.el) {
|
|
76
|
+
show(r.el);
|
|
77
|
+
r.el = live;
|
|
78
|
+
}
|
|
79
|
+
const failed = r.el.dataset.status === 'failed' || r.el.querySelector('[data-tx-status="error"]') !== null;
|
|
80
|
+
const k = Math.min(1, (now - r.t0) / ROCK_MS);
|
|
81
|
+
const to = center(r.el);
|
|
82
|
+
r.at = { x: r.from.x + (to.x - r.from.x) * k, y: r.from.y + (to.y - r.from.y) * k };
|
|
83
|
+
ctx.strokeStyle = failed ? '#ff6b5a' : '#e9e9e9';
|
|
84
|
+
ctx.save();
|
|
85
|
+
ctx.translate(r.at.x, r.at.y);
|
|
86
|
+
ctx.rotate(now / 600);
|
|
87
|
+
ctx.beginPath();
|
|
88
|
+
shape.forEach(([x, y], i) => (i ? ctx.lineTo(x, y) : ctx.moveTo(x, y)));
|
|
89
|
+
ctx.closePath();
|
|
90
|
+
ctx.stroke();
|
|
91
|
+
ctx.restore();
|
|
92
|
+
if (k >= 1) {
|
|
93
|
+
r.fired = true;
|
|
94
|
+
const at = r.at;
|
|
95
|
+
aim = at;
|
|
96
|
+
shots.push({ to: at, t0: now, dur: 160, hit: () => { show(r.el); burst(at, 14, failed, now); } });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// The reveal's edge: fire at it as text arrives.
|
|
100
|
+
const tail = root.querySelector('.fx-tail[data-fx-tail="asteroids"]');
|
|
101
|
+
if (tail && now - lastShot > 170) {
|
|
102
|
+
const p = center(tail);
|
|
103
|
+
aim = p;
|
|
104
|
+
lastShot = now;
|
|
105
|
+
shots.push({ to: p, t0: now, dur: 120, hit: () => burst(p, 5, false, now) });
|
|
106
|
+
}
|
|
107
|
+
ctx.strokeStyle = '#ffffff';
|
|
108
|
+
for (let i = shots.length - 1; i >= 0; i--) {
|
|
109
|
+
const s = shots[i];
|
|
110
|
+
const k = (now - s.t0) / s.dur;
|
|
111
|
+
if (k >= 1) {
|
|
112
|
+
s.hit();
|
|
113
|
+
shots.splice(i, 1);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const x = ship.x + (s.to.x - ship.x) * k, y = ship.y + (s.to.y - ship.y) * k;
|
|
117
|
+
ctx.beginPath();
|
|
118
|
+
ctx.moveTo(x, y);
|
|
119
|
+
ctx.lineTo(x - (s.to.x - ship.x) * 0.04, y - (s.to.y - ship.y) * 0.04);
|
|
120
|
+
ctx.stroke();
|
|
121
|
+
}
|
|
122
|
+
for (let i = sparks.length - 1; i >= 0; i--) {
|
|
123
|
+
const s = sparks[i];
|
|
124
|
+
const age = now - s.t0;
|
|
125
|
+
if (age > s.life) {
|
|
126
|
+
sparks.splice(i, 1);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const f = 1 - age / s.life, t = age / 1000;
|
|
130
|
+
const x = s.p.x + s.vx * t, y = s.p.y + s.vy * t;
|
|
131
|
+
ctx.strokeStyle = s.red ? `rgba(255,107,90,${f})` : `rgba(255,255,255,${f})`;
|
|
132
|
+
ctx.beginPath();
|
|
133
|
+
ctx.moveTo(x, y);
|
|
134
|
+
ctx.lineTo(x - s.vx * 0.03, y - s.vy * 0.03);
|
|
135
|
+
ctx.stroke();
|
|
136
|
+
}
|
|
137
|
+
const a = aim ? Math.atan2(aim.y - ship.y, aim.x - ship.x) : -Math.PI / 2;
|
|
138
|
+
ctx.strokeStyle = '#e9e9e9';
|
|
139
|
+
ctx.save();
|
|
140
|
+
ctx.translate(ship.x, ship.y);
|
|
141
|
+
ctx.rotate(a + Math.PI / 2);
|
|
142
|
+
ctx.beginPath();
|
|
143
|
+
ctx.moveTo(0, -10);
|
|
144
|
+
ctx.lineTo(6, 7);
|
|
145
|
+
ctx.lineTo(0, 3);
|
|
146
|
+
ctx.lineTo(-6, 7);
|
|
147
|
+
ctx.closePath();
|
|
148
|
+
ctx.stroke();
|
|
149
|
+
ctx.restore();
|
|
150
|
+
raf = window.requestAnimationFrame(frame);
|
|
151
|
+
};
|
|
152
|
+
raf = window.requestAnimationFrame(frame);
|
|
153
|
+
return () => {
|
|
154
|
+
window.cancelAnimationFrame(raf);
|
|
155
|
+
held.forEach((el) => { el.style.visibility = ''; });
|
|
156
|
+
held.clear();
|
|
157
|
+
};
|
|
158
|
+
}, [active, rootRef]);
|
|
159
|
+
if (!active)
|
|
160
|
+
return null;
|
|
161
|
+
return _jsx("canvas", { ref: ref, "aria-hidden": "true", style: S.canvas });
|
|
162
|
+
}
|
|
163
|
+
const S = {
|
|
164
|
+
canvas: { position: 'absolute', inset: 0, width: '100%', height: '100%', pointerEvents: 'none', zIndex: 1 },
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=AsteroidsOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsteroidsOverlay.js","sourceRoot":"","sources":["../../fx/AsteroidsOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type FlapStatus = 'running' | 'done' | 'failed';
|
|
3
|
+
export declare function FlapRow({ status, name, detail }: {
|
|
4
|
+
status: FlapStatus;
|
|
5
|
+
name: string;
|
|
6
|
+
detail: string;
|
|
7
|
+
}): React.JSX.Element;
|
|
8
|
+
//# sourceMappingURL=FlapRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlapRow.d.ts","sourceRoot":"","sources":["../../fx/FlapRow.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAOvD,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,qBAQrG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { FxText } from './FxText';
|
|
3
|
+
const LABEL = { running: 'RUNNING', done: 'DONE', failed: 'FAILED' };
|
|
4
|
+
const COLOR = { running: '#ffc53d', done: '#f3f1e8', failed: '#ff6150' };
|
|
5
|
+
const pad = (s, n) => (s.length > n ? s.slice(0, n - 1) + '.' : s.padEnd(n, ' '));
|
|
6
|
+
export function FlapRow({ status, name, detail }) {
|
|
7
|
+
return (_jsxs("div", { "data-fx": "flap-row", "data-status": status, style: S.row, children: [_jsx(FxText, { text: pad(LABEL[status], 7), effect: "splitflap", tiles: true, color: COLOR[status] }), _jsx(FxText, { text: pad(name.toUpperCase(), 13), effect: "splitflap", tiles: true }), _jsx(FxText, { text: pad(detail.toUpperCase(), 18), effect: "splitflap", tiles: true })] }));
|
|
8
|
+
}
|
|
9
|
+
const S = {
|
|
10
|
+
row: { display: 'flex', gap: 8, padding: '4px 6px', borderRadius: 4, background: '#101010', overflowX: 'auto', whiteSpace: 'nowrap' },
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=FlapRow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlapRow.js","sourceRoot":"","sources":["../../fx/FlapRow.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC,MAAM,KAAK,GAA+B,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjG,MAAM,KAAK,GAA+B,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAErG,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAE1G,MAAM,UAAU,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAwD;IACpG,OAAO,CACL,0BAAa,UAAU,iBAAc,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,aACvD,KAAC,MAAM,IAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAC,WAAW,EAAC,KAAK,QAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,GAAI,EACtF,KAAC,MAAM,IAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAC,WAAW,EAAC,KAAK,SAAG,EACtE,KAAC,MAAM,IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAC,WAAW,EAAC,KAAK,SAAG,IACpE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,GAAwC;IAC7C,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE;CACtI,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ArrivalEffect } from '../arrivalEffect';
|
|
3
|
+
export declare function FxText({ text, effect, tiles, color }: {
|
|
4
|
+
text: string;
|
|
5
|
+
effect: ArrivalEffect;
|
|
6
|
+
/** Split-flap: keep the tiles after landing (the board), not just while flipping. */
|
|
7
|
+
tiles?: boolean;
|
|
8
|
+
/** Tile text colour (split-flap board status). */
|
|
9
|
+
color?: string;
|
|
10
|
+
}): React.JSX.Element;
|
|
11
|
+
//# sourceMappingURL=FxText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FxText.d.ts","sourceRoot":"","sources":["../../fx/FxText.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAetD,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAa,EAAE,KAAK,EAAE,EAAE;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,qFAAqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,qBAmCA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* A short label that animates into place once: each character cycles the
|
|
3
|
+
* effect's glyphs and locks, roughly left to right. Used for live tool names
|
|
4
|
+
* and the split-flap board. A screen reader gets the real text, never the
|
|
5
|
+
* glyphs. Effects without glyphs render the text as is. */
|
|
6
|
+
import { useLayoutEffect, useState } from 'react';
|
|
7
|
+
import { glyphFor } from './tail';
|
|
8
|
+
const ANIMATED = ['matrix', 'splitflap', 'decode'];
|
|
9
|
+
const STEP_MS = 80;
|
|
10
|
+
const PER_CHAR_MS = 45;
|
|
11
|
+
const JITTER_MS = 250;
|
|
12
|
+
const SR_ONLY = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' };
|
|
13
|
+
const TILE = {
|
|
14
|
+
display: 'inline-flex', alignItems: 'center', justifyContent: 'center', width: '0.95em', height: '1.35em', margin: '0 1px',
|
|
15
|
+
borderRadius: 2, verticalAlign: 'middle', background: 'linear-gradient(#262626 0 49%, #0a0a0a 49% 51%, #1d1d1d 51%)',
|
|
16
|
+
font: '700 0.9em var(--font-mono, ui-monospace, monospace)',
|
|
17
|
+
};
|
|
18
|
+
export function FxText({ text, effect, tiles = false, color }) {
|
|
19
|
+
const animated = ANIMATED.includes(effect);
|
|
20
|
+
const [done, setDone] = useState(() => [...text].map(() => !animated));
|
|
21
|
+
// Layout, not a plain effect: a new text must scramble before it is ever painted.
|
|
22
|
+
useLayoutEffect(() => {
|
|
23
|
+
if (!animated) {
|
|
24
|
+
setDone([...text].map(() => true));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const lockAt = [...text].map((_, i) => i * PER_CHAR_MS + Math.random() * JITTER_MS);
|
|
28
|
+
const t0 = Date.now();
|
|
29
|
+
setDone(lockAt.map(() => false));
|
|
30
|
+
const id = setInterval(() => {
|
|
31
|
+
const ms = Date.now() - t0;
|
|
32
|
+
const next = lockAt.map((t) => ms >= t);
|
|
33
|
+
setDone(next);
|
|
34
|
+
if (next.every(Boolean))
|
|
35
|
+
clearInterval(id);
|
|
36
|
+
}, STEP_MS);
|
|
37
|
+
return () => clearInterval(id);
|
|
38
|
+
}, [text, animated]);
|
|
39
|
+
if (!animated)
|
|
40
|
+
return _jsx(_Fragment, { children: text });
|
|
41
|
+
const landed = done.length === text.length && done.every(Boolean);
|
|
42
|
+
const asTiles = effect === 'splitflap' && (tiles || !landed);
|
|
43
|
+
const glow = effect === 'matrix' ? { color: '#b6ffb6', textShadow: '0 0 6px #33ff33' } : undefined;
|
|
44
|
+
return (_jsxs("span", { children: [_jsx("span", { "data-fx-sr": "", style: SR_ONLY, children: text }), _jsx("span", { "aria-hidden": "true", style: { userSelect: 'none' }, children: [...text].map((ch, i) => {
|
|
45
|
+
const isDone = done[i] === true;
|
|
46
|
+
const style = asTiles ? { ...TILE, color: color ?? '#f3f1e8' } : !isDone ? glow : undefined;
|
|
47
|
+
return _jsx("span", { "data-fx-char": "", style: style, children: isDone ? ch : glyphFor(effect, ch) }, i);
|
|
48
|
+
}) })] }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=FxText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FxText.js","sourceRoot":"","sources":["../../fx/FxText.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type ArrivalEffect } from '../arrivalEffect';
|
|
3
|
+
export declare function LiveAnswer({ text, effect, complete, startAt, onProgress, onDone }: {
|
|
4
|
+
text: string;
|
|
5
|
+
effect: ArrivalEffect;
|
|
6
|
+
/** The text is final (the stream ended). Only complete text commits in full
|
|
7
|
+
* when the reveal catches up; while streaming, catching up is a pause and
|
|
8
|
+
* the effect's own rule still applies. The live turn passes !running. */
|
|
9
|
+
complete?: boolean;
|
|
10
|
+
/** Resume a reveal part-way (a hand-off from the in-progress turn). */
|
|
11
|
+
startAt?: number;
|
|
12
|
+
/** Characters shown so far, after each step (the chat hands this off). */
|
|
13
|
+
onProgress?: (shown: number) => void;
|
|
14
|
+
/** Called once when the reveal reaches the end of `text`. */
|
|
15
|
+
onDone?: () => void;
|
|
16
|
+
}): React.JSX.Element;
|
|
17
|
+
//# sourceMappingURL=LiveAnswer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveAnswer.d.ts","sourceRoot":"","sources":["../../fx/LiveAnswer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAuD,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAiI5E,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAe,EAAE,OAAW,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB;;6EAEyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB,qBA2HA"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/* The in-progress answer under an arrival effect.
|
|
3
|
+
*
|
|
4
|
+
* The streamed text itself is never rewritten: a paced reveal decides how much
|
|
5
|
+
* of it Markdown renders (see arrivalModes.ts for how each effect commits),
|
|
6
|
+
* and the effect's decoration is drawn after it (the tail). The tail is DOM
|
|
7
|
+
* decoration appended to the newest block after each render -- aria-hidden,
|
|
8
|
+
* never selectable, never part of the text, and gone once the reveal catches
|
|
9
|
+
* up. With no effect, or under reduced motion, this is plain Markdown. */
|
|
10
|
+
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
11
|
+
import { Markdown } from '../RichContent';
|
|
12
|
+
import { prefersReducedMotion } from '../arrivalEffect';
|
|
13
|
+
import { useReveal } from './useReveal';
|
|
14
|
+
import { TAIL_MAX, tailGlyphs, tailHost } from './tail';
|
|
15
|
+
import { bandEnd, bandText, committedAt, isBandEffect, lineCount, paceFor, signalGlyphs, SIGNAL_TAIL } from './arrivalModes';
|
|
16
|
+
const TILE = 'display:inline-flex;align-items:center;justify-content:center;width:.95em;height:1.3em;margin:0 1px;border-radius:2px;' +
|
|
17
|
+
'vertical-align:middle;background:linear-gradient(#262626 0 49%,#0a0a0a 49% 51%,#1d1d1d 51%);color:#f3f1e8;' +
|
|
18
|
+
'font:700 .85em var(--font-mono, ui-monospace, monospace)';
|
|
19
|
+
/* Colours come from the text (currentColor) so every effect reads on every
|
|
20
|
+
* skin and theme; the skin's --accent only tints glows, which degrade to
|
|
21
|
+
* nothing where it is missing. */
|
|
22
|
+
const GLOW = 'var(--accent, #4fd1ff)';
|
|
23
|
+
// Signal lock's small vertical roll as a new line starts: six steps, ~350 ms.
|
|
24
|
+
const ROLL_PX = [-5, -3, 2, 4, 1, 0];
|
|
25
|
+
const ROLL_MS = 350;
|
|
26
|
+
// Teleprinter paper feed: one small step up, then back.
|
|
27
|
+
const FEED_MS = 140;
|
|
28
|
+
// Effects whose tail re-rolls between reveal ticks.
|
|
29
|
+
const REROLL = new Set(['matrix', 'splitflap', 'decode', 'typewriter', 'signal']);
|
|
30
|
+
function tailSpan(effect) {
|
|
31
|
+
const span = document.createElement('span');
|
|
32
|
+
span.className = 'fx-tail';
|
|
33
|
+
span.setAttribute('aria-hidden', 'true');
|
|
34
|
+
span.dataset.fxTail = effect;
|
|
35
|
+
// Decoration: never selectable, so it is never part of copied text, and
|
|
36
|
+
// never takes the pointer (a band tail must not act as a link).
|
|
37
|
+
span.style.userSelect = 'none';
|
|
38
|
+
span.style.pointerEvents = 'none';
|
|
39
|
+
return span;
|
|
40
|
+
}
|
|
41
|
+
/** A band of words (radar contacts, pencil sketch). `age` 0 is the newest word. */
|
|
42
|
+
function buildBand(effect, band) {
|
|
43
|
+
const span = tailSpan(effect);
|
|
44
|
+
const words = bandText(band).split(' ');
|
|
45
|
+
words.forEach((w, i) => {
|
|
46
|
+
if (i > 0)
|
|
47
|
+
span.appendChild(document.createTextNode(' '));
|
|
48
|
+
if (!w)
|
|
49
|
+
return;
|
|
50
|
+
const el = document.createElement('span');
|
|
51
|
+
el.textContent = w;
|
|
52
|
+
const age = (words.length - 1 - i) / Math.max(1, words.length - 1);
|
|
53
|
+
if (effect === 'radar') {
|
|
54
|
+
el.dataset.fxContact = '';
|
|
55
|
+
// Newest contacts glow brightest and fade as the sweep moves on.
|
|
56
|
+
el.style.textShadow = `0 0 ${Math.round(8 - age * 6)}px ${GLOW}`;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
el.dataset.fxSketch = '';
|
|
60
|
+
// Outline only: the fill is transparent, the stroke is the text colour.
|
|
61
|
+
el.style.setProperty('-webkit-text-fill-color', 'transparent');
|
|
62
|
+
el.style.setProperty('-webkit-text-stroke', '0.6px currentColor');
|
|
63
|
+
el.style.opacity = String(0.9 - age * 0.25);
|
|
64
|
+
}
|
|
65
|
+
span.appendChild(el);
|
|
66
|
+
});
|
|
67
|
+
return span;
|
|
68
|
+
}
|
|
69
|
+
function buildSignal(pending, lineStartAt) {
|
|
70
|
+
const span = tailSpan('signal');
|
|
71
|
+
const glyphs = signalGlyphs(pending);
|
|
72
|
+
// Blur falls away toward the reveal point, where the signal has locked.
|
|
73
|
+
const third = Math.ceil(glyphs.length / 3);
|
|
74
|
+
[0.3, 0.8, 1.4].forEach((blur, k) => {
|
|
75
|
+
const part = glyphs.slice(k * third, (k + 1) * third).join('');
|
|
76
|
+
if (!part)
|
|
77
|
+
return;
|
|
78
|
+
const seg = document.createElement('span');
|
|
79
|
+
seg.textContent = part;
|
|
80
|
+
seg.style.filter = `blur(${blur}px)`;
|
|
81
|
+
seg.style.opacity = String(0.85 - k * 0.15);
|
|
82
|
+
span.appendChild(seg);
|
|
83
|
+
});
|
|
84
|
+
const t = Date.now() - lineStartAt;
|
|
85
|
+
const step = Math.floor(t / (ROLL_MS / ROLL_PX.length));
|
|
86
|
+
span.style.position = 'relative';
|
|
87
|
+
span.style.top = `${step < ROLL_PX.length ? ROLL_PX[step] : 0}px`;
|
|
88
|
+
return span;
|
|
89
|
+
}
|
|
90
|
+
function buildTail(effect, pending, cursor) {
|
|
91
|
+
const span = tailSpan(effect);
|
|
92
|
+
if (effect === 'typewriter') {
|
|
93
|
+
const caret = document.createElement('span');
|
|
94
|
+
caret.dataset.fxCaret = '';
|
|
95
|
+
caret.style.cssText = 'display:inline-block;width:.55em;height:1.05em;margin-left:1px;vertical-align:-2px;background:currentColor;opacity:.7';
|
|
96
|
+
span.appendChild(caret);
|
|
97
|
+
return span;
|
|
98
|
+
}
|
|
99
|
+
if (effect === 'teleprinter') {
|
|
100
|
+
// One persistent cursor node, moved into each rebuilt tail, so its single
|
|
101
|
+
// blink animation carries on (see LiveAnswer).
|
|
102
|
+
if (cursor)
|
|
103
|
+
span.appendChild(cursor);
|
|
104
|
+
return span;
|
|
105
|
+
}
|
|
106
|
+
const glyphs = tailGlyphs(effect, pending);
|
|
107
|
+
if (effect === 'splitflap') {
|
|
108
|
+
for (const g of glyphs) {
|
|
109
|
+
const tile = document.createElement('span');
|
|
110
|
+
tile.className = 'fx-tile';
|
|
111
|
+
tile.style.cssText = TILE;
|
|
112
|
+
tile.textContent = g === ' ' ? '' : g;
|
|
113
|
+
span.appendChild(tile);
|
|
114
|
+
}
|
|
115
|
+
return span;
|
|
116
|
+
}
|
|
117
|
+
span.textContent = glyphs.join('');
|
|
118
|
+
if (effect === 'matrix')
|
|
119
|
+
span.style.cssText = 'color:#b6ffb6;text-shadow:0 0 6px #33ff33;user-select:none;pointer-events:none';
|
|
120
|
+
else
|
|
121
|
+
span.style.cssText = 'opacity:.55;user-select:none;pointer-events:none';
|
|
122
|
+
return span;
|
|
123
|
+
}
|
|
124
|
+
function makeCursor() {
|
|
125
|
+
const cursor = document.createElement('span');
|
|
126
|
+
cursor.dataset.fxCursor = '';
|
|
127
|
+
cursor.style.cssText = 'display:inline-block;width:.6em;height:1em;vertical-align:-2px;background:currentColor';
|
|
128
|
+
return cursor;
|
|
129
|
+
}
|
|
130
|
+
/* The blocks Markdown rendered, in document order. Markdown wraps each prose
|
|
131
|
+
* run in a plain <div>, so the wrapper is never a block here; a nested list's
|
|
132
|
+
* items come after their parent item, so the deepest newest item is last. */
|
|
133
|
+
const BLOCKS = 'p, li, h1, h2, h3, h4, h5, h6, blockquote, pre, table';
|
|
134
|
+
function renderedBlocks(root) {
|
|
135
|
+
const md = root.querySelector('.agent-md');
|
|
136
|
+
return md ? Array.from(md.querySelectorAll(BLOCKS)) : [];
|
|
137
|
+
}
|
|
138
|
+
export function LiveAnswer({ text, effect, complete = true, startAt = 0, onProgress, onDone }) {
|
|
139
|
+
const active = effect !== 'none' && !prefersReducedMotion();
|
|
140
|
+
const shown = useReveal(text, active, paceFor(effect), Math.min(startAt, text.length));
|
|
141
|
+
/* Committed text never goes back within one answer: once Markdown has
|
|
142
|
+
* rendered something, a later delta must not turn it back into decoration
|
|
143
|
+
* (or hide it). A shorter text is a new answer and starts over. */
|
|
144
|
+
const maxCommit = useRef({ len: text.length, at: 0 });
|
|
145
|
+
if (text.length < maxCommit.current.len)
|
|
146
|
+
maxCommit.current = { len: text.length, at: 0 };
|
|
147
|
+
maxCommit.current.len = text.length;
|
|
148
|
+
const committed = active
|
|
149
|
+
? Math.min(text.length, Math.max(committedAt(effect, text, shown, complete), maxCommit.current.at))
|
|
150
|
+
: text.length;
|
|
151
|
+
maxCommit.current.at = committed;
|
|
152
|
+
const ref = useRef(null);
|
|
153
|
+
const beamRef = useRef(null);
|
|
154
|
+
const band = active && isBandEffect(effect) ? text.slice(committed, Math.max(committed, bandEnd(text, shown))) : '';
|
|
155
|
+
const pending = !active || effect === 'netsplit' ? ''
|
|
156
|
+
: isBandEffect(effect) ? band
|
|
157
|
+
: text.slice(shown, shown + (effect === 'signal' ? SIGNAL_TAIL : TAIL_MAX));
|
|
158
|
+
const cb = useRef({ onProgress, onDone });
|
|
159
|
+
cb.current = { onProgress, onDone };
|
|
160
|
+
const doneRef = useRef(false);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
cb.current.onProgress?.(shown);
|
|
163
|
+
if (!doneRef.current && text.length > 0 && shown >= text.length) {
|
|
164
|
+
doneRef.current = true;
|
|
165
|
+
cb.current.onDone?.();
|
|
166
|
+
}
|
|
167
|
+
}, [shown, text.length]);
|
|
168
|
+
/* Line breaks crossed so far: the teleprinter feeds the paper at each one,
|
|
169
|
+
* and a signal line starts rolling in. Tracked during render (not in an
|
|
170
|
+
* effect) so the feed lands on the same frame as the line. */
|
|
171
|
+
const lines = active ? lineCount(text, shown) : 0;
|
|
172
|
+
// `at`: when the current line started arriving (the answer's first line
|
|
173
|
+
// starts at mount). `feeds`: how many line ends the paper has fed for.
|
|
174
|
+
const [lineWatch, setLineWatch] = useState(() => ({ lines, at: Date.now(), feeds: 0 }));
|
|
175
|
+
if (lineWatch.lines !== lines) {
|
|
176
|
+
const next = lines > lineWatch.lines;
|
|
177
|
+
setLineWatch({ lines, at: next ? Date.now() : lineWatch.at, feeds: next ? lineWatch.feeds + 1 : lineWatch.feeds });
|
|
178
|
+
}
|
|
179
|
+
const [feeding, setFeeding] = useState(false);
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
if (effect !== 'teleprinter' || !active || lineWatch.feeds === 0)
|
|
182
|
+
return;
|
|
183
|
+
setFeeding(true);
|
|
184
|
+
const id = setTimeout(() => setFeeding(false), FEED_MS);
|
|
185
|
+
return () => clearTimeout(id);
|
|
186
|
+
}, [effect, active, lineWatch.feeds]);
|
|
187
|
+
/* Netsplit: each newly posted line slides in. Only NEW blocks (the block
|
|
188
|
+
* count grew) -- never one that already had text, and never the wrapper
|
|
189
|
+
* around the whole answer. -1: not counted yet (a hand-off resumes with
|
|
190
|
+
* blocks already on screen; those do not slide in). Web Animations leave
|
|
191
|
+
* the DOM and its text untouched, and do nothing where unsupported. */
|
|
192
|
+
const blockCount = useRef(-1);
|
|
193
|
+
useLayoutEffect(() => {
|
|
194
|
+
const root = ref.current;
|
|
195
|
+
if (effect !== 'netsplit' || !active || !root) {
|
|
196
|
+
blockCount.current = -1;
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const blocks = renderedBlocks(root);
|
|
200
|
+
const before = blockCount.current;
|
|
201
|
+
blockCount.current = blocks.length;
|
|
202
|
+
if (before < 0)
|
|
203
|
+
return;
|
|
204
|
+
for (const block of blocks.slice(before)) {
|
|
205
|
+
if (typeof block.animate === 'function') {
|
|
206
|
+
block.animate([{ opacity: 0, transform: 'translateY(4px)' }, { opacity: 1, transform: 'none' }], { duration: 200, easing: 'ease-out' });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}, [effect, active, committed]);
|
|
210
|
+
/* The teleprinter cursor: ONE node and ONE blink animation for as long as
|
|
211
|
+
* the cursor shows, moved into each rebuilt tail; cancelled when the
|
|
212
|
+
* cursor goes (caught up, effect change, unmount). */
|
|
213
|
+
const cursorRef = useRef(null);
|
|
214
|
+
const cursorOn = active && effect === 'teleprinter' && shown < text.length;
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
if (!cursorOn)
|
|
217
|
+
return;
|
|
218
|
+
return () => {
|
|
219
|
+
cursorRef.current?.anim?.cancel();
|
|
220
|
+
cursorRef.current = null;
|
|
221
|
+
};
|
|
222
|
+
}, [cursorOn]);
|
|
223
|
+
const lineStartAt = lineWatch.at;
|
|
224
|
+
useLayoutEffect(() => {
|
|
225
|
+
const root = ref.current;
|
|
226
|
+
if (!root)
|
|
227
|
+
return;
|
|
228
|
+
const beam = beamRef.current;
|
|
229
|
+
const clear = () => root.querySelectorAll('.fx-tail').forEach((n) => n.remove());
|
|
230
|
+
const draw = () => {
|
|
231
|
+
clear();
|
|
232
|
+
const host = pending ? tailHost(root, { outsideInline: isBandEffect(effect) }) : null;
|
|
233
|
+
if (!host) {
|
|
234
|
+
if (beam)
|
|
235
|
+
beam.style.display = 'none';
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
let cursor;
|
|
239
|
+
if (effect === 'teleprinter') {
|
|
240
|
+
if (!cursorRef.current)
|
|
241
|
+
cursorRef.current = { el: makeCursor(), anim: null };
|
|
242
|
+
cursor = cursorRef.current.el;
|
|
243
|
+
}
|
|
244
|
+
const tail = effect === 'signal' ? buildSignal(pending, lineStartAt)
|
|
245
|
+
: isBandEffect(effect) ? buildBand(effect, pending)
|
|
246
|
+
: buildTail(effect, pending, cursor);
|
|
247
|
+
host.appendChild(tail);
|
|
248
|
+
if (beam)
|
|
249
|
+
placeBeam(beam, root, tail);
|
|
250
|
+
if (cursor && cursorRef.current && !cursorRef.current.anim)
|
|
251
|
+
cursorRef.current.anim = blink(cursor);
|
|
252
|
+
};
|
|
253
|
+
draw();
|
|
254
|
+
if (!pending || !REROLL.has(effect))
|
|
255
|
+
return clear;
|
|
256
|
+
// Re-roll the glyphs between reveal ticks so the tail keeps moving.
|
|
257
|
+
const id = setInterval(draw, 60);
|
|
258
|
+
return () => { clearInterval(id); clear(); };
|
|
259
|
+
}, [effect, pending, shown, lineStartAt]);
|
|
260
|
+
const radar = active && effect === 'radar' && pending !== '';
|
|
261
|
+
const style = radar
|
|
262
|
+
? { position: 'relative' }
|
|
263
|
+
: effect === 'teleprinter' && active
|
|
264
|
+
? { transform: feeding ? 'translateY(-3px)' : '', transition: `transform ${FEED_MS - 20}ms steps(2, end)` }
|
|
265
|
+
: undefined;
|
|
266
|
+
return (_jsxs("div", { ref: ref, "data-fx": effect, style: style, children: [_jsx(Markdown, { text: active ? text.slice(0, committed) : text }), radar && _jsx("div", { ref: beamRef, "data-fx-beam": "", "aria-hidden": "true", style: S.beam })] }));
|
|
267
|
+
}
|
|
268
|
+
/** The teleprinter cursor blinks: on half a second, off half a second, no
|
|
269
|
+
* fade. Started once per cursor (LiveAnswer keeps the node and the
|
|
270
|
+
* Animation), pinned to the document timeline (startTime 0). Web Animations: nothing to inject, and a no-op
|
|
271
|
+
* where unsupported. Effects are already off under reduced motion. */
|
|
272
|
+
function blink(cursor) {
|
|
273
|
+
if (typeof cursor.animate !== 'function')
|
|
274
|
+
return null;
|
|
275
|
+
const a = cursor.animate([{ opacity: 1 }, { opacity: 1, offset: 0.5 }, { opacity: 0, offset: 0.5 }, { opacity: 0 }], { duration: 1000, iterations: Infinity });
|
|
276
|
+
a.startTime = 0;
|
|
277
|
+
return a;
|
|
278
|
+
}
|
|
279
|
+
/** The radar beam rides the newest contact: its leading edge at the end of
|
|
280
|
+
* the tail, on the tail's line. */
|
|
281
|
+
function placeBeam(beam, root, tail) {
|
|
282
|
+
const rects = tail.getClientRects();
|
|
283
|
+
const r = rects.length ? rects[rects.length - 1] : tail.getBoundingClientRect();
|
|
284
|
+
const base = root.getBoundingClientRect();
|
|
285
|
+
beam.style.display = 'block';
|
|
286
|
+
beam.style.left = `${r.right - base.left - BEAM_W}px`;
|
|
287
|
+
beam.style.top = `${r.top - base.top}px`;
|
|
288
|
+
beam.style.height = `${Math.max(r.height, 16)}px`;
|
|
289
|
+
}
|
|
290
|
+
const BEAM_W = 70;
|
|
291
|
+
const S = {
|
|
292
|
+
beam: {
|
|
293
|
+
position: 'absolute', left: 0, top: 0, width: BEAM_W, height: 16, pointerEvents: 'none', userSelect: 'none',
|
|
294
|
+
background: `linear-gradient(90deg, transparent, color-mix(in srgb, ${GLOW} 10%, transparent) 70%, color-mix(in srgb, ${GLOW} 45%, transparent) 97%, ${GLOW})`,
|
|
295
|
+
transition: 'left 90ms linear, top 90ms linear',
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=LiveAnswer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LiveAnswer.js","sourceRoot":"","sources":["../../fx/LiveAnswer.tsx"],"names":[],"mappings":";AAAA;;;;;;;0EAO0E;AAC1E,OAAc,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAsB,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7H,MAAM,IAAI,GACR,wHAAwH;IACxH,4GAA4G;IAC5G,0DAA0D,CAAC;AAE7D;;kCAEkC;AAClC,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,8EAA8E;AAC9E,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrC,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,wDAAwD;AACxD,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,oDAAoD;AACpD,MAAM,MAAM,GAA+B,IAAI,GAAG,CAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE7H,SAAS,QAAQ,CAAC,MAAqB;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7B,wEAAwE;IACxE,gEAAgE;IAChE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAAC,MAAqB,EAAE,IAAY;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC1C,EAAE,CAAC,WAAW,GAAG,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,CAAC;YAC1B,iEAAiE;YACjE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;YACzB,wEAAwE;YACxE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAC/D,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,CAAC;YAClE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,OAAe,EAAE,WAAmB;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,wEAAwE;IACxE,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3C,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;QACvB,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,IAAI,KAAK,CAAC;QACrC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IACjC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,MAAqB,EAAE,OAAe,EAAE,MAAwB;IACjF,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC;QAC3B,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,uHAAuH,CAAC;QAC9I,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,0EAA0E;QAC1E,+CAA+C;QAC/C,IAAI,MAAM;YAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,QAAQ;QAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,gFAAgF,CAAC;;QAC1H,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,kDAAkD,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC;IAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,wFAAwF,CAAC;IAChH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;6EAE6E;AAC7E,MAAM,MAAM,GAAG,uDAAuD,CAAC;AACvE,SAAS,cAAc,CAAC,IAAa;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,EAa1F;IACC,MAAM,MAAM,GAAG,MAAM,KAAK,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF;;uEAEmE;IACnE,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG;QAAE,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACzF,SAAS,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,MAAM,SAAS,GAAG,MAAM;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChB,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpH,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE;QACnD,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9E,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,EAAE,CAAC,OAAO,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAEzB;;kEAE8D;IAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxF,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACrC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,aAAa,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,CAAC;YAAE,OAAO;QACzE,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtC;;;;2EAIuE;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,MAAM,KAAK,UAAU,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACnF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;QAClC,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO;QACvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACxC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1I,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAEhC;;0DAEsD;IACtD,MAAM,SAAS,GAAG,MAAM,CAAyD,IAAI,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,MAAM,KAAK,aAAa,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAClC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IACjC,eAAe,CAAC,GAAG,EAAE;QACnB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,KAAK,EAAE,CAAC;YACR,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACtF,IAAI,CAAC,IAAI,EAAE,CAAC;gBAAC,IAAI,IAAI;oBAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC7D,IAAI,MAAmC,CAAC;YACxC,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,OAAO;oBAAE,SAAS,CAAC,OAAO,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC7E,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC;gBAClE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC;oBACnD,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,IAAI;gBAAE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI;gBAAE,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QACrG,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAClD,oEAAoE;QACpE,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,OAAO,GAAG,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAE1C,MAAM,KAAK,GAAG,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,EAAE,CAAC;IAC7D,MAAM,KAAK,GAAoC,KAAK;QAClD,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC1B,CAAC,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM;YAClC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,aAAa,OAAO,GAAG,EAAE,kBAAkB,EAAE;YAC3G,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO,CACL,eAAK,GAAG,EAAE,GAAG,aAAW,MAAM,EAAE,KAAK,EAAE,KAAK,aAC1C,KAAC,QAAQ,IAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAI,EAC3D,KAAK,IAAI,cAAK,GAAG,EAAE,OAAO,kBAAe,EAAE,iBAAa,MAAM,EAAC,KAAK,EAAE,CAAC,CAAC,IAAI,GAAI,IAC7E,CACP,CAAC;AACJ,CAAC;AAED;;;sEAGsE;AACtE,SAAS,KAAK,CAAC,MAAe;IAC5B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CACtB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAC1F,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CACzC,CAAC;IACF,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,CAAC;AACX,CAAC;AAED;mCACmC;AACnC,SAAS,SAAS,CAAC,IAAoB,EAAE,IAAiB,EAAE,IAAiB;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC;IACtD,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;AACpD,CAAC;AAED,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,CAAC,GAAwC;IAC7C,IAAI,EAAE;QACJ,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;QAC3G,UAAU,EAAE,0DAA0D,IAAI,8CAA8C,IAAI,2BAA2B,IAAI,GAAG;QAC9J,UAAU,EAAE,mCAAmC;KAChD;CACF,CAAC"}
|