From b6fab4100c66591ec0e8619dfd58e86bbff49ef9 Mon Sep 17 00:00:00 2001 From: Mat4m0 Date: Sat, 12 Sep 2026 20:53:01 +0200 Subject: [PATCH] feat(hud): compose native skill labels and timers without flicker --- .../components/SkillLabelsSettings.test.ts | 2 + .../src/components/SkillLabelsSettings.vue | 6 +- docs/effect-timers.md | 38 + docs/skill-cooldowns.md | 32 +- docs/wasm-host.md | 11 +- internal/research/native-ui-coverage.md | 825 ++++++++++++++++++ scripts/enhancements-visual.ts | 43 +- scripts/skill-cooldown-visual.ts | 132 +-- src/main/certification/client-module.ts | 1 + .../certification/enhancement-build-model.ts | 6 + .../certification/enhancement-transform.ts | 7 +- .../local-client-verification-boundary.ts | 8 + .../local-client-verification-contract.ts | 9 + .../certification/local-client-verifier.ts | 10 + .../certification/native-hud-transform.ts | 344 ++++++++ src/main/certification/semantic-proof.ts | 2 +- src/main/client-runtime.ts | 4 + src/main/renderer-client-sessions.ts | 1 + .../certified-companion-tools-installation.ts | 14 +- src/renderer/effect-timer-overlay-consumer.ts | 16 +- src/renderer/effect-timer-overlay.ts | 51 -- .../effective-enhancement-capabilities.ts | 1 + src/renderer/gw-native.d.ts | 1 + src/renderer/native-hud-layer.ts | 217 +++++ .../skill-cooldown-overlay-consumer.ts | 19 +- src/renderer/skill-cooldown-overlay.ts | 75 -- src/renderer/skill-cooldown-view.ts | 92 -- src/renderer/skill-key-artwork.ts | 76 ++ src/renderer/skill-key-binding-view.ts | 199 ----- src/renderer/skill-key-overlay-consumer.ts | 29 +- src/renderer/skill-key-overlay.ts | 145 --- src/renderer/skill-overlays-installation.ts | 18 +- src/shared/contracts.ts | 1 + src/shared/enhancement-contracts.ts | 13 +- src/shared/native-hud.ts | 12 + .../client-chain-qualification.test.ts | 12 + .../core-rebuild-recert.test.ts | 1 + .../native-hud-certification.test.ts | 44 + tests/client-artifact/native-hud.test.ts | 228 +++++ .../template-save-recert.test.ts | 5 +- tests/fixtures/enhancement-transform.ts | 10 + tests/helpers/packaged-enhancement-fixture.ts | 4 + .../effect-timers-are-display-only.test.ts | 2 +- .../skill-cooldowns-are-display-only.test.ts | 3 +- tests/unit/active-client.test.ts | 1 + tests/unit/client-certification.test.ts | 1 + tests/unit/client-module.test.ts | 4 + .../client-recertification-evidence.test.ts | 27 +- ...effective-enhancement-capabilities.test.ts | 3 + tests/unit/enhancement-client-chain.test.ts | 2 + .../enhancement-command-transform.test.ts | 1 + .../unit/enhancement-skill-transform.test.ts | 1 + tests/unit/enhancement-transform.test.ts | 3 + ...ts-are-derived-from-their-registry.test.ts | 18 +- tests/unit/feature-contracts.test.ts | 3 +- tests/unit/local-client-verifier.test.ts | 2 + tests/unit/native-hud.test.ts | 199 +++++ tests/unit/renderer-client-sessions.test.ts | 1 + tests/unit/skill-cooldown-overlay.test.ts | 220 ----- tests/unit/skill-key-overlay.test.ts | 346 -------- .../unit/skill-overlays-installation.test.ts | 12 + 61 files changed, 2337 insertions(+), 1276 deletions(-) create mode 100644 internal/research/native-ui-coverage.md create mode 100644 src/main/certification/native-hud-transform.ts delete mode 100644 src/renderer/effect-timer-overlay.ts create mode 100644 src/renderer/native-hud-layer.ts delete mode 100644 src/renderer/skill-cooldown-overlay.ts delete mode 100644 src/renderer/skill-cooldown-view.ts create mode 100644 src/renderer/skill-key-artwork.ts delete mode 100644 src/renderer/skill-key-binding-view.ts delete mode 100644 src/renderer/skill-key-overlay.ts create mode 100644 src/shared/native-hud.ts create mode 100644 tests/client-artifact/native-hud-certification.test.ts create mode 100644 tests/client-artifact/native-hud.test.ts create mode 100644 tests/unit/native-hud.test.ts delete mode 100644 tests/unit/skill-cooldown-overlay.test.ts delete mode 100644 tests/unit/skill-key-overlay.test.ts diff --git a/apps/launcher/src/components/SkillLabelsSettings.test.ts b/apps/launcher/src/components/SkillLabelsSettings.test.ts index b21d8c7b..bb3d8ee9 100644 --- a/apps/launcher/src/components/SkillLabelsSettings.test.ts +++ b/apps/launcher/src/components/SkillLabelsSettings.test.ts @@ -8,6 +8,8 @@ describe("skill label customization", () => { it("captures physical keyboard labels without changing other slots", async () => { const save = vi.fn<(patch: LauncherSettingsPatch) => Promise>(async () => undefined); const wrapper = mount(SkillLabelsSettings, { props: { bindings: EMPTY_SKILL_KEY_BINDINGS, save } }); + expect(wrapper.text()).toContain("Skill 1 · 1 (default)"); + expect(wrapper.text()).toContain("Skill 8 · 8 (default)"); await wrapper.get('[aria-label="Set skill 3 label"]').trigger("click"); await wrapper.get('[aria-label="Skill label capture"]').trigger("keydown", { code: "KeyG", key: "g", ctrlKey: true }); await flushPromises(); diff --git a/apps/launcher/src/components/SkillLabelsSettings.vue b/apps/launcher/src/components/SkillLabelsSettings.vue index cba4925c..bf32b4d0 100644 --- a/apps/launcher/src/components/SkillLabelsSettings.vue +++ b/apps/launcher/src/components/SkillLabelsSettings.vue @@ -40,11 +40,11 @@ async function capture(input: SkillKeyInput, event: KeyboardEvent | MouseEvent |