Extract EditorTooltip component for consistent tooltip positioning

Refactored tooltip markup into reusable EditorTooltip component used by
both ScoreCube and VehicleEditor. Tooltip now consistently appears in
top right corner of the editor section.
This commit is contained in:
Christian Semmler 2026-02-01 15:48:27 -08:00
parent 50a25a802c
commit a86013e552
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C
3 changed files with 58 additions and 51 deletions

View File

@ -0,0 +1,32 @@
<script>
export let text = '';
</script>
<div class="editor-tooltip-wrapper">
<span class="tooltip-trigger">?
<span class="tooltip-content">{text}</span>
</span>
<div class="editor-tooltip-content">
<slot />
</div>
</div>
<style>
.editor-tooltip-wrapper {
position: relative;
width: 100%;
}
.tooltip-trigger {
position: absolute;
top: 0;
right: 0;
z-index: 1;
}
.editor-tooltip-content {
display: flex;
flex-direction: column;
align-items: center;
}
</style>

View File

@ -2,6 +2,7 @@
import { onMount, onDestroy } from 'svelte';
import { ScoreCubeRenderer } from '../../core/rendering/ScoreCubeRenderer.js';
import { WdbParser, findRoi } from '../../core/formats/WdbParser.js';
import EditorTooltip from '../EditorTooltip.svelte';
export let missions = {};
export let onUpdate = () => {};
@ -120,44 +121,34 @@
}
</script>
<div class="score-cube-container">
<div class="score-cube-header">
<span class="tooltip-trigger">?
<span class="tooltip-content">Click on the cube to cycle high scores. Changes are automatically saved.</span>
</span>
</div>
<canvas
bind:this={canvas}
width="200"
height="200"
onclick={handleClick}
class:hidden={loading || error}
role="button"
tabindex="0"
aria-label="Score cube - click to edit scores"
></canvas>
<EditorTooltip text="Click on the cube to cycle high scores. Changes are automatically saved.">
<div class="score-cube-container">
<canvas
bind:this={canvas}
width="200"
height="200"
onclick={handleClick}
class:hidden={loading || error}
role="button"
tabindex="0"
aria-label="Score cube - click to edit scores"
></canvas>
{#if loading}
<div class="overlay">
<div class="spinner"></div>
</div>
{:else if error}
<div class="overlay error">Error: {error}</div>
{/if}
</div>
{#if loading}
<div class="overlay">
<div class="spinner"></div>
</div>
{:else if error}
<div class="overlay error">Error: {error}</div>
{/if}
</div>
</EditorTooltip>
<style>
.score-cube-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
min-width: 0;
}
.score-cube-header {
align-self: flex-end;
margin-bottom: 4px;
margin-top: 16px;
}
canvas {

View File

@ -11,6 +11,7 @@
} from '../../core/savegame/constants.js';
import NavButton from '../NavButton.svelte';
import ResetButton from '../ResetButton.svelte';
import EditorTooltip from '../EditorTooltip.svelte';
export let slot;
export let onUpdate = () => {};
@ -180,13 +181,7 @@
</script>
<div class="vehicle-editor">
<div class="vehicle-editor-header">
<span class="tooltip-trigger">?
<span class="tooltip-content">Click on the part to cycle through colors. Changes are automatically saved.</span>
</span>
</div>
<EditorTooltip text="Click on the part to cycle through colors. Changes are automatically saved.">
<!-- 3D Preview (clickable to cycle color) -->
<div class="preview-container">
<canvas
@ -226,20 +221,9 @@
<ResetButton onclick={resetColor} />
{/if}
</div>
</div>
</EditorTooltip>
<style>
.vehicle-editor {
display: flex;
flex-direction: column;
align-items: center;
}
.vehicle-editor-header {
align-self: flex-end;
margin-bottom: 4px;
}
.preview-container {
position: relative;
}