MapComplete/src/UI/Reviews/StarElement.svelte

36 lines
1.1 KiB
Svelte
Raw Normal View History

2023-09-28 04:02:42 +02:00
<script lang="ts">
2023-09-28 23:50:27 +02:00
import ToSvelte from "../Base/ToSvelte.svelte"
import Svg from "../../Svg"
import { createEventDispatcher } from "svelte"
import Star from "../../assets/svg/Star.svelte";
import Star_half from "../../assets/svg/Star_half.svelte";
import Star_outline from "../../assets/svg/Star_outline.svelte";
2023-09-28 04:02:42 +02:00
2023-09-28 23:50:27 +02:00
export let score: number
export let cutoff: number
export let starSize = "w-h h-4"
2023-09-28 04:02:42 +02:00
2023-09-28 23:50:27 +02:00
let dispatch = createEventDispatcher<{ hover: { score: number } }>()
let container: HTMLElement
2023-09-28 04:02:42 +02:00
function getScore(e: MouseEvent): number {
2023-09-28 23:50:27 +02:00
const x = e.clientX - e.target.getBoundingClientRect().x
const w = container.getClientRects()[0]?.width
return x / w < 0.5 ? cutoff - 10 : cutoff
2023-09-28 04:02:42 +02:00
}
</script>
2023-09-28 23:50:27 +02:00
<div
bind:this={container}
on:click={(e) => dispatch("click", { score: getScore(e) })}
on:mousemove={(e) => dispatch("hover", { score: getScore(e) })}
>
2023-09-28 04:02:42 +02:00
{#if score >= cutoff}
<Star class={starSize}/>
2023-09-28 04:02:42 +02:00
{:else if score + 10 >= cutoff}
<Star_half class={starSize}/>
2023-09-28 04:02:42 +02:00
{:else}
<Star_outline class={starSize}/>
2023-09-28 04:02:42 +02:00
{/if}
</div>