@corenel/web-ui 0.7.0 → 0.9.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 +19 -5
- package/dist/agentChat/AgentChat.d.ts.map +1 -1
- package/dist/agentChat/AgentChat.js +174 -91
- 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 +56 -0
- package/dist/agentChat/PlanReview.d.ts.map +1 -0
- package/dist/agentChat/PlanReview.js +269 -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 +12 -3
- 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,114 @@
|
|
|
1
|
+
/* Arrival effect -- how NEW text arrives in the in-progress turn, separate from
|
|
2
|
+
* how the transcript looks (transcriptSkin.tsx) and how much tool detail it
|
|
3
|
+
* shows (transcriptView.tsx). Settled turns never animate, and nothing animates
|
|
4
|
+
* when the system asks for reduced motion. Persisted per browser and kept in
|
|
5
|
+
* step across every mounted chat.
|
|
6
|
+
*
|
|
7
|
+
* The SETTING is not the effect: 'match' (the default) plays the current
|
|
8
|
+
* skin's paired effect, or nothing on a skin with no pairing. Everything that
|
|
9
|
+
* draws an effect takes the resolved ArrivalEffect, never the setting. */
|
|
10
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
11
|
+
import { TRANSCRIPT_SKIN_LABELS } from './transcriptSkin';
|
|
12
|
+
/** The effects this build ships. */
|
|
13
|
+
export const ARRIVAL_EFFECTS = [
|
|
14
|
+
'none', 'matrix', 'splitflap', 'typewriter', 'decode', 'teleprinter', 'signal', 'radar', 'pencil', 'netsplit',
|
|
15
|
+
];
|
|
16
|
+
/** Every value the setting takes, in menu order: Match skin first. */
|
|
17
|
+
export const ARRIVAL_EFFECT_SETTINGS = ['match', ...ARRIVAL_EFFECTS];
|
|
18
|
+
export const ARRIVAL_EFFECT_LABELS = {
|
|
19
|
+
match: 'Match skin', none: 'None', matrix: 'Matrix rain', splitflap: 'Split-flap', typewriter: 'Typewriter', decode: 'Hacker decode',
|
|
20
|
+
teleprinter: 'Teleprinter', signal: 'Signal lock', radar: 'Radar sweep', pencil: 'Pencil draft', netsplit: 'Netsplit',
|
|
21
|
+
};
|
|
22
|
+
/** The effect each skin brings under 'match'. A skin not listed has none. */
|
|
23
|
+
export const SKIN_PAIRED_EFFECT = {
|
|
24
|
+
receipt: 'teleprinter', crt: 'signal', mission: 'radar', blueprint: 'pencil', irc: 'netsplit',
|
|
25
|
+
};
|
|
26
|
+
const KEY = 'prompd.web.arrivalEffect';
|
|
27
|
+
const EVENT = 'prompd:arrivalEffect';
|
|
28
|
+
export function isArrivalEffect(v) {
|
|
29
|
+
return typeof v === 'string' && ARRIVAL_EFFECTS.includes(v);
|
|
30
|
+
}
|
|
31
|
+
export function isArrivalEffectSetting(v) {
|
|
32
|
+
return typeof v === 'string' && ARRIVAL_EFFECT_SETTINGS.includes(v);
|
|
33
|
+
}
|
|
34
|
+
/** The effect that plays for `setting` on `skin`. Reduced motion is off, always. */
|
|
35
|
+
export function resolveArrivalEffect(setting, skin, reducedMotion) {
|
|
36
|
+
if (reducedMotion)
|
|
37
|
+
return 'none';
|
|
38
|
+
if (setting === 'match')
|
|
39
|
+
return SKIN_PAIRED_EFFECT[skin] ?? 'none';
|
|
40
|
+
return setting;
|
|
41
|
+
}
|
|
42
|
+
/** One short line saying what will play, for Settings. */
|
|
43
|
+
export function describeArrivalEffect(setting, skin, reducedMotion) {
|
|
44
|
+
if (reducedMotion)
|
|
45
|
+
return 'Off: your system asks for reduced motion.';
|
|
46
|
+
if (setting === 'none')
|
|
47
|
+
return 'Effects are off.';
|
|
48
|
+
if (setting === 'match') {
|
|
49
|
+
const paired = SKIN_PAIRED_EFFECT[skin];
|
|
50
|
+
return paired
|
|
51
|
+
? `Plays ${ARRIVAL_EFFECT_LABELS[paired]} (paired with ${TRANSCRIPT_SKIN_LABELS[skin]}).`
|
|
52
|
+
: `${TRANSCRIPT_SKIN_LABELS[skin]} has no paired effect - answers appear as plain text.`;
|
|
53
|
+
}
|
|
54
|
+
// Picking the skin's own pairing overrides nothing.
|
|
55
|
+
if (SKIN_PAIRED_EFFECT[skin] === setting)
|
|
56
|
+
return `Plays ${ARRIVAL_EFFECT_LABELS[setting]}.`;
|
|
57
|
+
return `Plays ${ARRIVAL_EFFECT_LABELS[setting]} (your pick overrides the skin).`;
|
|
58
|
+
}
|
|
59
|
+
/* Nothing stored reads as the default, 'match'. A stored value that is no
|
|
60
|
+
* longer shipped (a removed effect) reads as 'none': that browser had chosen an
|
|
61
|
+
* effect, so it is not silently switched to a different one. */
|
|
62
|
+
function read() {
|
|
63
|
+
try {
|
|
64
|
+
const v = localStorage.getItem(KEY);
|
|
65
|
+
if (v === null)
|
|
66
|
+
return 'match';
|
|
67
|
+
return isArrivalEffectSetting(v) ? v : 'none';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return 'match';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export function useArrivalEffect() {
|
|
74
|
+
const [effect, setState] = useState(read);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
const sync = () => setState(read());
|
|
77
|
+
window.addEventListener('storage', sync);
|
|
78
|
+
window.addEventListener(EVENT, sync);
|
|
79
|
+
return () => {
|
|
80
|
+
window.removeEventListener('storage', sync);
|
|
81
|
+
window.removeEventListener(EVENT, sync);
|
|
82
|
+
};
|
|
83
|
+
}, []);
|
|
84
|
+
const set = useCallback((e) => {
|
|
85
|
+
setState(e);
|
|
86
|
+
try {
|
|
87
|
+
localStorage.setItem(KEY, e);
|
|
88
|
+
}
|
|
89
|
+
catch { /* storage blocked: this tab still switches */ }
|
|
90
|
+
window.dispatchEvent(new CustomEvent(EVENT));
|
|
91
|
+
}, []);
|
|
92
|
+
return [effect, set];
|
|
93
|
+
}
|
|
94
|
+
/** The `/effect [id]` command as a pure function. `next` is the effect to
|
|
95
|
+
* switch to, or null to leave it alone. */
|
|
96
|
+
export function effectCommand(arg, current) {
|
|
97
|
+
const want = arg.trim().toLowerCase();
|
|
98
|
+
const list = ARRIVAL_EFFECT_SETTINGS.map((e) => (e === current ? `${e} (current)` : e)).join(', ');
|
|
99
|
+
if (!want)
|
|
100
|
+
return { next: null, note: `Arrival effects: ${list}. Use \`/effect <name>\` to switch.` };
|
|
101
|
+
if (isArrivalEffectSetting(want))
|
|
102
|
+
return { next: want, note: `Arrival effect set to ${ARRIVAL_EFFECT_LABELS[want]}.` };
|
|
103
|
+
return { next: null, note: `No effect named "${arg.trim()}". Effects: ${ARRIVAL_EFFECT_SETTINGS.join(', ')}.` };
|
|
104
|
+
}
|
|
105
|
+
/** True when the system asks for reduced motion; every effect is off then. */
|
|
106
|
+
export function prefersReducedMotion() {
|
|
107
|
+
try {
|
|
108
|
+
return window.matchMedia?.('(prefers-reduced-motion: reduce)').matches === true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=arrivalEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivalEffect.js","sourceRoot":"","sources":["../arrivalEffect.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandTurn.d.ts","sourceRoot":"","sources":["../commandTurn.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,oFAAoF;AACpF,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd;;;oBAGgB;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"commandTurn.d.ts","sourceRoot":"","sources":["../commandTurn.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,oFAAoF;AACpF,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,yEAAyE;IACzE,IAAI,EAAE,OAAO,CAAC;IACd;;;oBAGgB;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAQD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,eAAe,GAAG,IAAI,CAmB9E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,eAAe,GAAG,IAAI,CAO7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAE7E"}
|
package/dist/commandTurn.js
CHANGED
|
@@ -11,7 +11,8 @@ const SHELL_MARK = '!';
|
|
|
11
11
|
* turn" rather than throwing inside a render.
|
|
12
12
|
*/
|
|
13
13
|
export function readCommandTurn(turn) {
|
|
14
|
-
const
|
|
14
|
+
const msgs = Array.isArray(turn?.messages) ? turn.messages : [];
|
|
15
|
+
const first = msgs[0];
|
|
15
16
|
const call = first?.tool_calls?.[0];
|
|
16
17
|
if (call?.function?.name !== COMMAND_TOOL)
|
|
17
18
|
return null;
|
|
@@ -25,7 +26,7 @@ export function readCommandTurn(turn) {
|
|
|
25
26
|
ok = args.ok !== false;
|
|
26
27
|
}
|
|
27
28
|
catch { /* unparseable arguments: keep the empty command */ }
|
|
28
|
-
const result =
|
|
29
|
+
const result = msgs[1];
|
|
29
30
|
const output = typeof result?.content === 'string' ? result.content : '';
|
|
30
31
|
return { turnId: turn.id, command, output, ok, kept: turn.included, shell: command.startsWith(SHELL_MARK) };
|
|
31
32
|
}
|
package/dist/commandTurn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandTurn.js","sourceRoot":"","sources":["../commandTurn.ts"],"names":[],"mappings":"AAWA,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAgB9C;wCACwC;AACxC,MAAM,UAAU,GAAG,GAAG,CAAC;AAIvB;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"commandTurn.js","sourceRoot":"","sources":["../commandTurn.ts"],"names":[],"mappings":"AAWA,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAgB9C;wCACwC;AACxC,MAAM,UAAU,GAAG,GAAG,CAAC;AAIvB;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,IAAI,GAAc,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAA+C,CAAC;IACpE,MAAM,IAAI,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAEvD,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAuC,CAAC;QAC/F,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,wEAAwE;QACxE,2EAA2E;QAC3E,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAsC,CAAC;IAC5D,MAAM,MAAM,GAAG,OAAO,MAAM,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAC9G,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAyB;IACvD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AsteroidsOverlay.d.ts","sourceRoot":"","sources":["../../fx/AsteroidsOverlay.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAYjE,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAA;CAAE,4BA2HzG"}
|
|
@@ -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":";AAAA;;;;;;;gFAOgF;AAChF,OAAc,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AAOjE,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,6EAA6E;AAC7E,iEAAiE;AACjE,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,MAAM,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAwD;IACxG,MAAM,GAAG,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;YAAE,OAAO;QACpC,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;QACpC,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAU,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,GAAc,IAAI,CAAC;QAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,MAAM,MAAM,GAAG,CAAC,EAAW,EAAM,EAAE;YACjC,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACvE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/E,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,CAAK,EAAE,CAAS,EAAE,GAAY,EAAE,GAAW,EAAE,EAAE;YAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;gBACnE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACtG,CAAC;QACH,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,EAAe,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;YACtF,IAAI,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC1E,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAClE,CAAC;YACD,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1B,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC;YACpB,MAAM,IAAI,GAAO,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC;YAEzC,6DAA6D;YAC7D,IAAI,CAAC,gBAAgB,CAAc,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC/D,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;gBACjC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAO;gBACzB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACb,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACb,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;gBAErB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAClH,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,KAAK;oBAAE,SAAS;gBACtB,wEAAwE;gBACxE,mEAAmE;gBACnE,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAc,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzG,IAAI,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;oBAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;gBAAC,CAAC;gBACvD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,0BAA0B,CAAC,KAAK,IAAI,CAAC;gBAC3G,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC9C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpF,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjD,GAAG,CAAC,IAAI,EAAE,CAAC;gBAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,SAAS,EAAE,CAAC;gBAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBACxH,GAAG,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACX,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;oBACf,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;oBAChB,GAAG,GAAG,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpG,CAAC;YACH,CAAC;YAED,iDAAiD;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC;YACtE,IAAI,IAAI,IAAI,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvB,GAAG,GAAG,CAAC,CAAC;gBACR,QAAQ,GAAG,GAAG,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAC,CAAC,CAAC,GAAG,EAAE,CAAC;oBAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACtD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7E,GAAG,CAAC,SAAS,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC1H,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;oBAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACpD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACjD,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBAC7E,GAAG,CAAC,SAAS,EAAE,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;gBAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChG,CAAC;YAED,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC1E,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;YAC5B,GAAG,CAAC,IAAI,EAAE,CAAC;YAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvE,GAAG,CAAC,SAAS,EAAE,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAC1H,GAAG,CAAC,OAAO,EAAE,CAAC;YAEd,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC;QACF,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,iBAAQ,GAAG,EAAE,GAAG,iBAAc,MAAM,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,GAAI,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,GAAwC;IAC7C,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE;CAC5G,CAAC"}
|
|
@@ -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"}
|