Enforce explicit WebGL book playback timeline

This commit is contained in:
2026-06-10 09:35:00 +02:00
parent 5a84923884
commit ce8147b5b1
7 changed files with 199 additions and 185 deletions
-42
View File
@@ -71,7 +71,6 @@ class UIDisplayHandlerModule extends BaseModule {
'isWebGLMode',
'playWebGLBookSentence',
'prepareWebGLBookReveal',
'waitForWebGLPageFlip',
'renderStoryBlock',
'prepareRenderableBlock',
'prepareTextRenderable',
@@ -1070,47 +1069,6 @@ class UIDisplayHandlerModule extends BaseModule {
return timeline.prepareSentence(sentence, { immediate: true });
}
waitForWebGLPageFlip(detail = {}) {
return new Promise((resolve) => {
let resolved = false;
const cleanup = () => {
window.clearTimeout(timeout);
document.removeEventListener('webgl-book:page-flip-started', onStarted);
document.removeEventListener('webgl-book:page-flip-finished', onFinished);
};
const finish = (result) => {
if (resolved) return;
resolved = true;
cleanup();
resolve(result);
};
const requestedTargetSpread = Number.isFinite(Number(detail.targetSpread))
? Math.max(0, Math.round(Number(detail.targetSpread)))
: null;
const matchesTarget = (eventDetail = {}) => requestedTargetSpread == null
|| Math.max(0, Math.round(Number(eventDetail.targetSpread || 0))) === requestedTargetSpread;
const onStarted = (event) => {
if (!matchesTarget(event.detail || {})) return;
document.documentElement.dataset.webglLastStartedPageFlip = JSON.stringify(event.detail || {});
};
const onFinished = (event) => {
if (!matchesTarget(event.detail || {})) return;
finish(true);
};
const timeout = window.setTimeout(() => finish(false), 2400);
document.addEventListener('webgl-book:page-flip-started', onStarted);
document.addEventListener('webgl-book:page-flip-finished', onFinished);
document.dispatchEvent(new CustomEvent('webgl-book:request-page-flip', {
detail: {
direction: Math.sign(Number(detail.direction || 1)) || 1,
reason: detail.reason || 'pending-block-overflow',
force: true,
targetSpread: requestedTargetSpread
}
}));
});
}
async rerenderStory() {
if (!this.paragraphContainer || this.renderedItems.length === 0) return;
console.log('UIDisplayHandler: Re-typesetting story after page resize');