@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.
Files changed (108) hide show
  1. package/dist/Composer.d.ts.map +1 -1
  2. package/dist/Composer.js +184 -172
  3. package/dist/Composer.js.map +1 -1
  4. package/dist/ContextBar.d.ts +1 -4
  5. package/dist/ContextBar.d.ts.map +1 -1
  6. package/dist/ContextBar.js +2 -2
  7. package/dist/ContextBar.js.map +1 -1
  8. package/dist/ContextManager.d.ts +3 -6
  9. package/dist/ContextManager.d.ts.map +1 -1
  10. package/dist/ContextManager.js +58 -10
  11. package/dist/ContextManager.js.map +1 -1
  12. package/dist/SummaryTranscript.d.ts +11 -1
  13. package/dist/SummaryTranscript.d.ts.map +1 -1
  14. package/dist/SummaryTranscript.js +47 -10
  15. package/dist/SummaryTranscript.js.map +1 -1
  16. package/dist/ToolFold.d.ts +9 -0
  17. package/dist/ToolFold.d.ts.map +1 -0
  18. package/dist/ToolFold.js +32 -0
  19. package/dist/ToolFold.js.map +1 -0
  20. package/dist/Transcript.d.ts +30 -1
  21. package/dist/Transcript.d.ts.map +1 -1
  22. package/dist/Transcript.js +132 -23
  23. package/dist/Transcript.js.map +1 -1
  24. package/dist/agentChat/AgentChat.d.ts +11 -3
  25. package/dist/agentChat/AgentChat.d.ts.map +1 -1
  26. package/dist/agentChat/AgentChat.js +171 -88
  27. package/dist/agentChat/AgentChat.js.map +1 -1
  28. package/dist/agentChat/OptionsDrawer.d.ts +0 -23
  29. package/dist/agentChat/OptionsDrawer.d.ts.map +1 -1
  30. package/dist/agentChat/OptionsDrawer.js +10 -45
  31. package/dist/agentChat/OptionsDrawer.js.map +1 -1
  32. package/dist/agentChat/PlanReview.d.ts +24 -0
  33. package/dist/agentChat/PlanReview.d.ts.map +1 -0
  34. package/dist/agentChat/PlanReview.js +103 -0
  35. package/dist/agentChat/PlanReview.js.map +1 -0
  36. package/dist/agentChat/SkillsSection.js +4 -2
  37. package/dist/agentChat/SkillsSection.js.map +1 -1
  38. package/dist/agentChat/controller.d.ts +10 -2
  39. package/dist/agentChat/controller.d.ts.map +1 -1
  40. package/dist/agentChat/controller.js.map +1 -1
  41. package/dist/arrivalEffect.d.ts +28 -0
  42. package/dist/arrivalEffect.d.ts.map +1 -0
  43. package/dist/arrivalEffect.js +114 -0
  44. package/dist/arrivalEffect.js.map +1 -0
  45. package/dist/commandTurn.d.ts.map +1 -1
  46. package/dist/commandTurn.js +3 -2
  47. package/dist/commandTurn.js.map +1 -1
  48. package/dist/fx/AsteroidsOverlay.d.ts +6 -0
  49. package/dist/fx/AsteroidsOverlay.d.ts.map +1 -0
  50. package/dist/fx/AsteroidsOverlay.js +166 -0
  51. package/dist/fx/AsteroidsOverlay.js.map +1 -0
  52. package/dist/fx/FlapRow.d.ts +8 -0
  53. package/dist/fx/FlapRow.d.ts.map +1 -0
  54. package/dist/fx/FlapRow.js +12 -0
  55. package/dist/fx/FlapRow.js.map +1 -0
  56. package/dist/fx/FxText.d.ts +11 -0
  57. package/dist/fx/FxText.d.ts.map +1 -0
  58. package/dist/fx/FxText.js +50 -0
  59. package/dist/fx/FxText.js.map +1 -0
  60. package/dist/fx/LiveAnswer.d.ts +17 -0
  61. package/dist/fx/LiveAnswer.d.ts.map +1 -0
  62. package/dist/fx/LiveAnswer.js +298 -0
  63. package/dist/fx/LiveAnswer.js.map +1 -0
  64. package/dist/fx/MatrixRain.d.ts +5 -0
  65. package/dist/fx/MatrixRain.d.ts.map +1 -0
  66. package/dist/fx/MatrixRain.js +73 -0
  67. package/dist/fx/MatrixRain.js.map +1 -0
  68. package/dist/fx/NetsplitJoin.d.ts +3 -0
  69. package/dist/fx/NetsplitJoin.d.ts.map +1 -0
  70. package/dist/fx/NetsplitJoin.js +13 -0
  71. package/dist/fx/NetsplitJoin.js.map +1 -0
  72. package/dist/fx/arrivalModes.d.ts +27 -0
  73. package/dist/fx/arrivalModes.d.ts.map +1 -0
  74. package/dist/fx/arrivalModes.js +107 -0
  75. package/dist/fx/arrivalModes.js.map +1 -0
  76. package/dist/fx/tail.d.ts +16 -0
  77. package/dist/fx/tail.d.ts.map +1 -0
  78. package/dist/fx/tail.js +54 -0
  79. package/dist/fx/tail.js.map +1 -0
  80. package/dist/fx/useReveal.d.ts +2 -0
  81. package/dist/fx/useReveal.d.ts.map +1 -0
  82. package/dist/fx/useReveal.js +59 -0
  83. package/dist/fx/useReveal.js.map +1 -0
  84. package/dist/observed.d.ts +16 -0
  85. package/dist/observed.d.ts.map +1 -0
  86. package/dist/observed.js +33 -0
  87. package/dist/observed.js.map +1 -0
  88. package/dist/toolRender.d.ts +6 -2
  89. package/dist/toolRender.d.ts.map +1 -1
  90. package/dist/toolRender.js +27 -17
  91. package/dist/toolRender.js.map +1 -1
  92. package/dist/transcriptSkin.d.ts +23 -0
  93. package/dist/transcriptSkin.d.ts.map +1 -0
  94. package/dist/transcriptSkin.js +255 -0
  95. package/dist/transcriptSkin.js.map +1 -0
  96. package/dist/transcriptSkinCss.d.ts +4 -0
  97. package/dist/transcriptSkinCss.d.ts.map +1 -0
  98. package/dist/transcriptSkinCss.js +136 -0
  99. package/dist/transcriptSkinCss.js.map +1 -0
  100. package/dist/usageSummary.d.ts +31 -0
  101. package/dist/usageSummary.d.ts.map +1 -0
  102. package/dist/usageSummary.js +39 -0
  103. package/dist/usageSummary.js.map +1 -0
  104. package/dist/verificationView.d.ts +3 -0
  105. package/dist/verificationView.d.ts.map +1 -0
  106. package/dist/verificationView.js +37 -0
  107. package/dist/verificationView.js.map +1 -0
  108. 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":"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"}