More FE changes
This commit is contained in:
parent
f114ada255
commit
a48eb945e0
48 changed files with 4127 additions and 1751 deletions
|
|
@ -72,18 +72,31 @@ export async function smoothMove(
|
|||
|
||||
/**
|
||||
* "Fake" type: progressively set the textarea value, dispatching
|
||||
* React-compatible input events. This stays Node-driven so typing cadence is
|
||||
* stable even when the map is busy rendering.
|
||||
* React-compatible input events.
|
||||
*
|
||||
* Cadence is generated as a per-char weight ratio (so spaces and punctuation
|
||||
* read as natural pauses), then **rescaled** so that the sum of delays equals
|
||||
* `totalDurationMs` exactly. The runner depends on this: it budgets a
|
||||
* specific number of ms for the type step, and any divergence would cascade
|
||||
* into narration drift.
|
||||
*/
|
||||
export async function fakeType(
|
||||
page: Page,
|
||||
selector: string,
|
||||
text: string,
|
||||
delayMs: number
|
||||
totalDurationMs: number
|
||||
): Promise<void> {
|
||||
const steps = text.length;
|
||||
if (steps === 0) {
|
||||
if (totalDurationMs > 0) await sleep(totalDurationMs);
|
||||
return;
|
||||
}
|
||||
|
||||
const weights = computeTypingWeights(text);
|
||||
const weightSum = weights.reduce((a, b) => a + b, 0);
|
||||
const msPerWeight = totalDurationMs / weightSum;
|
||||
|
||||
for (let i = 1; i <= steps; i++) {
|
||||
const end = Math.ceil((text.length * i) / steps);
|
||||
await page.evaluate(
|
||||
({ selector, value }) => {
|
||||
const ta = document.querySelector(selector) as HTMLTextAreaElement | null;
|
||||
|
|
@ -97,28 +110,25 @@ export async function fakeType(
|
|||
setValue.call(ta, value);
|
||||
ta.dispatchEvent(new Event('input', { bubbles: true }));
|
||||
},
|
||||
{ selector, value: text.slice(0, end) }
|
||||
{ selector, value: text.slice(0, i) }
|
||||
);
|
||||
if (delayMs > 0 && i < steps) {
|
||||
await new Promise((resolve) =>
|
||||
setTimeout(resolve, humanTypingDelay(text[i - 1], text[i], i, delayMs))
|
||||
);
|
||||
if (i < steps) {
|
||||
const ms = Math.max(0, Math.round(weights[i - 1] * msPerWeight));
|
||||
if (ms > 0) await sleep(ms);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function humanTypingDelay(
|
||||
char: string,
|
||||
nextChar: string | undefined,
|
||||
index: number,
|
||||
baseDelayMs: number
|
||||
): number {
|
||||
function computeTypingWeights(text: string): number[] {
|
||||
const cadence = [0.82, 1.08, 0.94, 1.22, 0.88, 1.14, 0.98, 1.28];
|
||||
let delay = baseDelayMs * cadence[index % cadence.length];
|
||||
if (char === ' ') delay += baseDelayMs * 0.9;
|
||||
if (/[,.!?;:]/.test(char)) delay += baseDelayMs * 1.8;
|
||||
if (nextChar === ' ' && index % 4 === 0) delay += baseDelayMs * 0.55;
|
||||
return Math.round(delay);
|
||||
return Array.from(text, (char, index) => {
|
||||
let weight = cadence[index % cadence.length];
|
||||
if (char === ' ') weight += 0.9;
|
||||
if (/[,.!?;:]/.test(char)) weight += 1.8;
|
||||
const next = text[index + 1];
|
||||
if (next === ' ' && index % 4 === 0) weight += 0.55;
|
||||
return weight;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue