|
<script>import cc from 'classcat'; |
|
import Panel from '../../container/Panel/Panel.svelte'; |
|
import { useStore } from '../../store'; |
|
import ControlButton from './ControlButton.svelte'; |
|
import PlusIcon from './Icons/Plus.svelte'; |
|
import MinusIcon from './Icons/Minus.svelte'; |
|
import FitViewIcon from './Icons/Fit.svelte'; |
|
import LockIcon from './Icons/Lock.svelte'; |
|
import UnlockIcon from './Icons/Unlock.svelte'; |
|
export let position = 'bottom-left'; |
|
export let showZoom = true; |
|
export let showFitView = true; |
|
export let showLock = true; |
|
export let buttonBgColor = undefined; |
|
export let buttonBgColorHover = undefined; |
|
export let buttonColor = undefined; |
|
export let buttonColorHover = undefined; |
|
export let buttonBorderColor = undefined; |
|
export let ariaLabel = undefined; |
|
export let style = undefined; |
|
export let orientation = 'vertical'; |
|
export let fitViewOptions = undefined; |
|
let className = ''; |
|
export { className as class }; |
|
const { zoomIn, zoomOut, fitView, viewport, minZoom, maxZoom, nodesDraggable, nodesConnectable, elementsSelectable } = useStore(); |
|
const buttonProps = { |
|
bgColor: buttonBgColor, |
|
bgColorHover: buttonBgColorHover, |
|
color: buttonColor, |
|
colorHover: buttonColorHover, |
|
borderColor: buttonBorderColor |
|
}; |
|
$: isInteractive = $nodesDraggable || $nodesConnectable || $elementsSelectable; |
|
$: minZoomReached = $viewport.zoom <= $minZoom; |
|
$: maxZoomReached = $viewport.zoom >= $maxZoom; |
|
const onZoomInHandler = () => { |
|
zoomIn(); |
|
}; |
|
const onZoomOutHandler = () => { |
|
zoomOut(); |
|
}; |
|
const onFitViewHandler = () => { |
|
fitView(fitViewOptions); |
|
}; |
|
const onToggleInteractivity = () => { |
|
isInteractive = !isInteractive; |
|
nodesDraggable.set(isInteractive); |
|
nodesConnectable.set(isInteractive); |
|
elementsSelectable.set(isInteractive); |
|
}; |
|
$: orientationClass = orientation === 'horizontal' ? 'horizontal' : 'vertical'; |
|
</script> |
|
|
|
<Panel |
|
class={cc(['svelte-flow__controls', orientationClass, className])} |
|
{position} |
|
data-testid="svelte-flow__controls" |
|
aria-label={ariaLabel ?? 'Svelte Flow controls'} |
|
{style} |
|
> |
|
<slot name="before" /> |
|
{#if showZoom} |
|
<ControlButton |
|
on:click={onZoomInHandler} |
|
class="svelte-flow__controls-zoomin" |
|
title="zoom in" |
|
aria-label="zoom in" |
|
disabled={maxZoomReached} |
|
{...buttonProps} |
|
> |
|
<PlusIcon /> |
|
</ControlButton> |
|
<ControlButton |
|
on:click={onZoomOutHandler} |
|
class="svelte-flow__controls-zoomout" |
|
title="zoom out" |
|
aria-label="zoom out" |
|
disabled={minZoomReached} |
|
{...buttonProps} |
|
> |
|
<MinusIcon /> |
|
</ControlButton> |
|
{/if} |
|
{#if showFitView} |
|
<ControlButton |
|
class="svelte-flow__controls-fitview" |
|
on:click={onFitViewHandler} |
|
title="fit view" |
|
aria-label="fit view" |
|
{...buttonProps} |
|
> |
|
<FitViewIcon /> |
|
</ControlButton> |
|
{/if} |
|
{#if showLock} |
|
<ControlButton |
|
class="svelte-flow__controls-interactive" |
|
on:click={onToggleInteractivity} |
|
title="toggle interactivity" |
|
aria-label="toggle interactivity" |
|
{...buttonProps} |
|
> |
|
{#if isInteractive}<UnlockIcon />{:else}<LockIcon />{/if} |
|
</ControlButton> |
|
{/if} |
|
<slot /> |
|
<slot name="after" /> |
|
</Panel> |
|
|