|
|
@ -1,6 +1,6 @@ |
|
|
<script> |
|
|
<script> |
|
|
import { onMount, createEventDispatcher } from "svelte" |
|
|
import { onMount, createEventDispatcher } from "svelte" |
|
|
import dragable from "./drag.js" |
|
|
import {drag, keyevents} from "../actions" |
|
|
|
|
|
|
|
|
export let value = 1 |
|
|
export let value = 1 |
|
|
export let type = "hue" |
|
|
export let type = "hue" |
|
|
@ -9,6 +9,10 @@ |
|
|
|
|
|
|
|
|
let slider |
|
|
let slider |
|
|
let sliderWidth = 0 |
|
|
let sliderWidth = 0 |
|
|
|
|
|
let upperLimit = type === "hue" ? 360 : 1 |
|
|
|
|
|
let incrementFactor = type === "hue" ? 1 : 0.01 |
|
|
|
|
|
|
|
|
|
|
|
const isWithinLimit = value => value >= 0 && value <= upperLimit |
|
|
|
|
|
|
|
|
function onSliderChange(mouseX, isDrag = false) { |
|
|
function onSliderChange(mouseX, isDrag = false) { |
|
|
const { left, width } = slider.getBoundingClientRect() |
|
|
const { left, width } = slider.getBoundingClientRect() |
|
|
@ -17,12 +21,29 @@ |
|
|
let percentageClick = (clickPosition / sliderWidth).toFixed(2) |
|
|
let percentageClick = (clickPosition / sliderWidth).toFixed(2) |
|
|
|
|
|
|
|
|
if (percentageClick >= 0 && percentageClick <= 1) { |
|
|
if (percentageClick >= 0 && percentageClick <= 1) { |
|
|
|
|
|
|
|
|
let value = type === "hue" ? 360 * percentageClick : percentageClick |
|
|
let value = type === "hue" ? 360 * percentageClick : percentageClick |
|
|
|
|
|
|
|
|
dispatch("change", { color: value, isDrag }) |
|
|
dispatch("change", { color: value, isDrag }) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function handleLeftKey() { |
|
|
|
|
|
let v = value - incrementFactor |
|
|
|
|
|
if(isWithinLimit(v)) { |
|
|
|
|
|
value = v |
|
|
|
|
|
dispatch("change", { color: value }) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function handleRightKey() { |
|
|
|
|
|
let v = value + incrementFactor |
|
|
|
|
|
if(isWithinLimit(v)) { |
|
|
|
|
|
value = v |
|
|
|
|
|
dispatch("change", { color: value }) |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
$: thumbPosition = |
|
|
$: thumbPosition = |
|
|
type === "hue" ? sliderWidth * (value / 360) : sliderWidth * value |
|
|
type === "hue" ? sliderWidth * (value / 360) : sliderWidth * value |
|
|
|
|
|
|
|
|
@ -30,14 +51,16 @@ |
|
|
</script> |
|
|
</script> |
|
|
|
|
|
|
|
|
<div |
|
|
<div |
|
|
|
|
|
tabindex="0" |
|
|
bind:this={slider} |
|
|
bind:this={slider} |
|
|
|
|
|
use:keyevents={{37: handleLeftKey, 39: handleRightKey}} |
|
|
bind:clientWidth={sliderWidth} |
|
|
bind:clientWidth={sliderWidth} |
|
|
on:click={event => onSliderChange(event.clientX)} |
|
|
on:click={event => onSliderChange(event.clientX)} |
|
|
class="color-format-slider" |
|
|
class="color-format-slider" |
|
|
class:hue={type === 'hue'} |
|
|
class:hue={type === 'hue'} |
|
|
class:alpha={type === 'alpha'}> |
|
|
class:alpha={type === 'alpha'}> |
|
|
<div |
|
|
<div |
|
|
use:dragable |
|
|
use:drag |
|
|
on:drag={e => onSliderChange(e.detail, true)} |
|
|
on:drag={e => onSliderChange(e.detail, true)} |
|
|
on:dragend |
|
|
on:dragend |
|
|
class="slider-thumb" |
|
|
class="slider-thumb" |
|
|
@ -54,6 +77,8 @@ |
|
|
margin: 10px 0px; |
|
|
margin: 10px 0px; |
|
|
border: 1px solid #e8e8ef; |
|
|
border: 1px solid #e8e8ef; |
|
|
cursor: pointer; |
|
|
cursor: pointer; |
|
|
|
|
|
outline-color: #003cb0; |
|
|
|
|
|
outline-width: thin; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
.hue { |
|
|
.hue { |