Spaces:
Running
Running
<script lang="ts"> | |
import { Slider as SliderPrimitive } from "bits-ui"; | |
import { cn, type WithoutChildrenOrChild } from "$lib/utils.js"; | |
let { | |
ref = $bindable(null), | |
value = $bindable(), | |
orientation = "horizontal", | |
class: className, | |
...restProps | |
} | |
</script> | |
<!-- | |
Discriminated Unions + Destructing (required for bindable) do not | |
get along, so we shut typescript up by casting `value` to `never`. | |
--> | |
<SliderPrimitive.Root | |
bind:ref | |
bind:value={value as never} | |
data-slot="slider" | |
{orientation} | |
class={cn( | |
"relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col", | |
className | |
)} | |
{...restProps} | |
> | |
{#snippet children({ thumbs })} | |
<span | |
data-orientation={orientation} | |
data-slot="slider-track" | |
class={cn( | |
"bg-muted relative grow overflow-hidden rounded-full data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5" | |
)} | |
> | |
<SliderPrimitive.Range | |
data-slot="slider-range" | |
class={cn( | |
"bg-primary absolute data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full" | |
)} | |
/> | |
</span> | |
{#each thumbs as thumb (thumb)} | |
<SliderPrimitive.Thumb | |
data-slot="slider-thumb" | |
index={thumb} | |
class="border-primary bg-background ring-ring/50 block size-4 shrink-0 rounded-full border shadow-sm transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50" | |
/> | |
{/each} | |
{/snippet} | |
</SliderPrimitive.Root> | |