diff --git a/src/widgets/ComparisonView/ui/Line/Line.svelte b/src/widgets/ComparisonView/ui/Line/Line.svelte index 9258138..98879e5 100644 --- a/src/widgets/ComparisonView/ui/Line/Line.svelte +++ b/src/widgets/ComparisonView/ui/Line/Line.svelte @@ -6,15 +6,21 @@ import type { Snippet } from 'svelte'; import { comparisonStore } from '../../model'; +interface LineChar { + char: string; + xA: number; + widthA: number; + xB: number; + widthB: number; +} + interface Props { /** - * Line text + * Pre-computed grapheme array from CharacterComparisonEngine. + * Using the engine's chars array (rather than splitting line.text) ensures + * correct grapheme-cluster boundaries for emoji and multi-codepoint characters. */ - text: string; - /** - * DOM element reference - */ - element?: HTMLElement; + chars: LineChar[]; /** * Character render snippet */ @@ -22,18 +28,15 @@ interface Props { } const typography = $derived(comparisonStore.typography); -let { text, element = $bindable(), character }: Props = $props(); - -const characters = $derived(text.split('')); +let { chars, character }: Props = $props();
- {#each characters as char, index} - {@render character?.({ char, index })} + {#each chars as c, index} + {@render character?.({ char: c.char, index })} {/each}
diff --git a/src/widgets/ComparisonView/ui/SliderArea/SliderArea.svelte b/src/widgets/ComparisonView/ui/SliderArea/SliderArea.svelte index 3fa1948..c6d1f45 100644 --- a/src/widgets/ComparisonView/ui/SliderArea/SliderArea.svelte +++ b/src/widgets/ComparisonView/ui/SliderArea/SliderArea.svelte @@ -9,11 +9,12 @@ --> - - -