feat(overlay): add loading OSD spinner and queue notifications until ren

- Show mpv OSD spinner from start-file until subminer-overlay-loading-ready; force-shown for visible-overlay startup regardless of osd_messages setting
- Gate non-macOS overlay visibility on content-ready so first subtitle line is immediately hoverable and clickable
- Queue startup notifications in main process until overlay window finishes loading; upsert progress cards by id to avoid cold-start floods
- Defer background warmups until after overlay runtime init so queued notifications can deliver promptly
- Preserve character dictionary checking/building/importing/ready phases as distinct history entries; route building and importing to system notifications when notificationType is both
This commit is contained in:
2026-06-07 23:13:51 -07:00
parent 8111deac44
commit cf16587547
49 changed files with 1613 additions and 132 deletions
+16
View File
@@ -58,6 +58,22 @@ test('renderer reports subtitle bounds immediately after initial subtitle layout
assert.ok(immediateMeasurementIndex < listenerIndex);
});
test('renderer wires subtitle pointer handlers before first subtitle paint', () => {
const primaryMouseEnterIndex = indexOfRequired(
"ctx.dom.subtitleContainer.addEventListener('mouseenter', mouseHandlers.handlePrimaryMouseEnter);",
);
const pointerTrackingIndex = indexOfRequired('mouseHandlers.setupPointerTracking();');
const initialRenderIndex = indexOfRequired('subtitleRenderer.renderSubtitle(initialSubtitle);');
const initialMeasurementIndex = indexOfRequired(
'positioning.applyYPercent(positioning.getCurrentYPercent());\n measurementReporter.emitNow();',
);
assert.ok(primaryMouseEnterIndex < initialRenderIndex);
assert.ok(pointerTrackingIndex < initialRenderIndex);
assert.ok(primaryMouseEnterIndex < initialMeasurementIndex);
assert.ok(pointerTrackingIndex < initialMeasurementIndex);
});
test('renderer reports subtitle bounds immediately after live subtitle layout', () => {
const liveRenderIndex = indexOfRequired('subtitleRenderer.renderSubtitle(data);');
const liveLayoutIndex = indexOfRequired(