Spaces:
Running
Running
fix
Browse files- src/lib/components/flow/FitViewOnResize.svelte +13 -3
- src/lib/components/flow/actions/PanelCanvasActions.svelte +39 -16
- src/lib/components/model/SettingsModel.svelte +7 -3
- src/lib/components/ui/button/button.svelte +4 -2
- src/lib/components/ui/tooltip/index.ts +19 -0
- src/lib/components/ui/tooltip/tooltip-content.svelte +52 -0
- src/lib/components/ui/tooltip/tooltip-portal.svelte +7 -0
- src/lib/components/ui/tooltip/tooltip-provider.svelte +7 -0
- src/lib/components/ui/tooltip/tooltip-trigger.svelte +7 -0
- src/lib/components/ui/tooltip/tooltip.svelte +7 -0
- src/lib/state/view.svelte.ts +1 -2
- src/routes/+layout.svelte +6 -5
- src/routes/+page.svelte +1 -1
src/lib/components/flow/FitViewOnResize.svelte
CHANGED
|
@@ -64,11 +64,16 @@
|
|
| 64 |
|
| 65 |
function doFitView(opts?: { animate?: boolean; forceAnimate?: boolean }) {
|
| 66 |
if (!viewState.draggable) return;
|
|
|
|
|
|
|
|
|
|
| 67 |
const shouldAnimate = opts?.forceAnimate || (opts?.animate !== false && !isFirstLayout);
|
| 68 |
fitView({
|
|
|
|
|
|
|
| 69 |
padding: 0.15,
|
| 70 |
...(shouldAnimate ? { interpolate: 'smooth' as const, duration: 250 } : {}),
|
| 71 |
-
nodes:
|
| 72 |
});
|
| 73 |
}
|
| 74 |
|
|
@@ -381,8 +386,13 @@
|
|
| 381 |
}
|
| 382 |
|
| 383 |
if (viewState.draggable) {
|
| 384 |
-
|
| 385 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 386 |
}
|
| 387 |
}
|
| 388 |
</script>
|
|
|
|
| 64 |
|
| 65 |
function doFitView(opts?: { animate?: boolean; forceAnimate?: boolean }) {
|
| 66 |
if (!viewState.draggable) return;
|
| 67 |
+
const nodes = nodesStore.current;
|
| 68 |
+
if (nodes.length === 0) return;
|
| 69 |
+
|
| 70 |
const shouldAnimate = opts?.forceAnimate || (opts?.animate !== false && !isFirstLayout);
|
| 71 |
fitView({
|
| 72 |
+
maxZoom: breakpointsState.isMobile ? 1 : 1.15,
|
| 73 |
+
minZoom: breakpointsState.isMobile ? 1 : 0.7,
|
| 74 |
padding: 0.15,
|
| 75 |
...(shouldAnimate ? { interpolate: 'smooth' as const, duration: 250 } : {}),
|
| 76 |
+
nodes: nodes.map((n) => ({ id: n.id }))
|
| 77 |
});
|
| 78 |
}
|
| 79 |
|
|
|
|
| 386 |
}
|
| 387 |
|
| 388 |
if (viewState.draggable) {
|
| 389 |
+
// Defer so layout is applied and nodes are measured before fitting
|
| 390 |
+
tick().then(() => {
|
| 391 |
+
requestAnimationFrame(() => {
|
| 392 |
+
doFitView();
|
| 393 |
+
isFirstLayout = false;
|
| 394 |
+
});
|
| 395 |
+
});
|
| 396 |
}
|
| 397 |
}
|
| 398 |
</script>
|
src/lib/components/flow/actions/PanelCanvasActions.svelte
CHANGED
|
@@ -1,12 +1,21 @@
|
|
| 1 |
<script lang="ts">
|
| 2 |
-
import { Maximize, Minus, Plus,
|
| 3 |
-
import { Panel
|
| 4 |
|
| 5 |
import { Button } from '$lib/components/ui/button';
|
| 6 |
import { viewState } from '$lib/state/view.svelte';
|
| 7 |
import { useSvelteFlow } from '@xyflow/svelte';
|
|
|
|
| 8 |
|
| 9 |
const { fitView, zoomIn, zoomOut, getZoom } = useSvelteFlow();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
</script>
|
| 11 |
|
| 12 |
<Panel position="bottom-center" class="flex items-center justify-start gap-2 p-1 lg:p-2">
|
|
@@ -45,19 +54,33 @@
|
|
| 45 |
<div
|
| 46 |
class="inline-flex w-fit flex-row gap-0.5 rounded-lg border border-border bg-background/30 p-1 backdrop-blur-sm dark:bg-gray-900/30"
|
| 47 |
>
|
| 48 |
-
<
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
<
|
| 61 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
</div>
|
| 63 |
</Panel>
|
|
|
|
| 1 |
<script lang="ts">
|
| 2 |
+
import { Maximize, Minus, Plus, MousePointer, HandGrab, Spotlight } from '@lucide/svelte';
|
| 3 |
+
import { Panel } from '@xyflow/svelte';
|
| 4 |
|
| 5 |
import { Button } from '$lib/components/ui/button';
|
| 6 |
import { viewState } from '$lib/state/view.svelte';
|
| 7 |
import { useSvelteFlow } from '@xyflow/svelte';
|
| 8 |
+
import * as Tooltip from '$lib/components/ui/tooltip/index.js';
|
| 9 |
|
| 10 |
const { fitView, zoomIn, zoomOut, getZoom } = useSvelteFlow();
|
| 11 |
+
|
| 12 |
+
$effect(() => {
|
| 13 |
+
localStorage.setItem('hf-playground-draggable-option', viewState.draggable.toString());
|
| 14 |
+
});
|
| 15 |
+
|
| 16 |
+
function handleDraggable() {
|
| 17 |
+
viewState.draggable = !viewState.draggable;
|
| 18 |
+
}
|
| 19 |
</script>
|
| 20 |
|
| 21 |
<Panel position="bottom-center" class="flex items-center justify-start gap-2 p-1 lg:p-2">
|
|
|
|
| 54 |
<div
|
| 55 |
class="inline-flex w-fit flex-row gap-0.5 rounded-lg border border-border bg-background/30 p-1 backdrop-blur-sm dark:bg-gray-900/30"
|
| 56 |
>
|
| 57 |
+
<Tooltip.Root>
|
| 58 |
+
<Tooltip.Trigger>
|
| 59 |
+
<Button
|
| 60 |
+
variant={!viewState.draggable ? 'default' : 'ghost'}
|
| 61 |
+
size="icon-sm"
|
| 62 |
+
onclick={handleDraggable}
|
| 63 |
+
>
|
| 64 |
+
<MousePointer />
|
| 65 |
+
</Button>
|
| 66 |
+
</Tooltip.Trigger>
|
| 67 |
+
<Tooltip.Content>
|
| 68 |
+
<p class="flex items-center gap-1"><MousePointer class="size-3.5" /> Free mode</p>
|
| 69 |
+
</Tooltip.Content>
|
| 70 |
+
</Tooltip.Root>
|
| 71 |
+
<Tooltip.Root>
|
| 72 |
+
<Tooltip.Trigger>
|
| 73 |
+
<Button
|
| 74 |
+
variant={viewState.draggable ? 'default' : 'ghost'}
|
| 75 |
+
size="icon-sm"
|
| 76 |
+
onclick={handleDraggable}
|
| 77 |
+
>
|
| 78 |
+
<Spotlight />
|
| 79 |
+
</Button>
|
| 80 |
+
</Tooltip.Trigger>
|
| 81 |
+
<Tooltip.Content>
|
| 82 |
+
<p class="flex items-center gap-1"><Spotlight class="size-3.5" /> Spotlight mode</p>
|
| 83 |
+
</Tooltip.Content>
|
| 84 |
+
</Tooltip.Root>
|
| 85 |
</div>
|
| 86 |
</Panel>
|
src/lib/components/model/SettingsModel.svelte
CHANGED
|
@@ -61,7 +61,9 @@
|
|
| 61 |
<h4 class="text-sm leading-none font-medium">Temperature</h4>
|
| 62 |
<div class="flex items-center gap-1">
|
| 63 |
{#if temperature === undefined}
|
| 64 |
-
<Button variant="blue" size="2xs" onclick={() => (temperature = 0.5)}
|
|
|
|
|
|
|
| 65 |
{:else}
|
| 66 |
<Input
|
| 67 |
type="number"
|
|
@@ -94,7 +96,9 @@
|
|
| 94 |
<h4 class="text-sm leading-none font-medium">Max Tokens</h4>
|
| 95 |
<div class="flex items-center gap-1">
|
| 96 |
{#if max_tokens === undefined}
|
| 97 |
-
<Button variant="blue" size="2xs" onclick={() => (max_tokens = 32000)}
|
|
|
|
|
|
|
| 98 |
{:else}
|
| 99 |
<Input
|
| 100 |
type="number"
|
|
@@ -128,7 +132,7 @@
|
|
| 128 |
<h4 class="text-sm leading-none font-medium">Top-P</h4>
|
| 129 |
<div class="flex items-center gap-1">
|
| 130 |
{#if top_p === undefined}
|
| 131 |
-
<Button variant="blue" size="2xs" onclick={() => (top_p = 0.7)}>Set</Button>
|
| 132 |
{:else}
|
| 133 |
<Input
|
| 134 |
type="number"
|
|
|
|
| 61 |
<h4 class="text-sm leading-none font-medium">Temperature</h4>
|
| 62 |
<div class="flex items-center gap-1">
|
| 63 |
{#if temperature === undefined}
|
| 64 |
+
<Button variant="outline-blue" size="2xs" onclick={() => (temperature = 0.5)}
|
| 65 |
+
>Set</Button
|
| 66 |
+
>
|
| 67 |
{:else}
|
| 68 |
<Input
|
| 69 |
type="number"
|
|
|
|
| 96 |
<h4 class="text-sm leading-none font-medium">Max Tokens</h4>
|
| 97 |
<div class="flex items-center gap-1">
|
| 98 |
{#if max_tokens === undefined}
|
| 99 |
+
<Button variant="outline-blue" size="2xs" onclick={() => (max_tokens = 32000)}
|
| 100 |
+
>Set</Button
|
| 101 |
+
>
|
| 102 |
{:else}
|
| 103 |
<Input
|
| 104 |
type="number"
|
|
|
|
| 132 |
<h4 class="text-sm leading-none font-medium">Top-P</h4>
|
| 133 |
<div class="flex items-center gap-1">
|
| 134 |
{#if top_p === undefined}
|
| 135 |
+
<Button variant="outline-blue" size="2xs" onclick={() => (top_p = 0.7)}>Set</Button>
|
| 136 |
{:else}
|
| 137 |
<Input
|
| 138 |
type="number"
|
src/lib/components/ui/button/button.svelte
CHANGED
|
@@ -18,9 +18,11 @@
|
|
| 18 |
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-xs',
|
| 19 |
ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
|
| 20 |
link: 'text-primary underline-offset-4 hover:underline',
|
| 21 |
-
|
|
|
|
| 22 |
'outline-destructive':
|
| 23 |
-
'bg-rose-500/10 hover:bg-rose-500/20 text-rose-600 border border-rose-500/20 shadow-xs'
|
|
|
|
| 24 |
},
|
| 25 |
size: {
|
| 26 |
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
|
|
|
|
| 18 |
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-xs',
|
| 19 |
ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',
|
| 20 |
link: 'text-primary underline-offset-4 hover:underline',
|
| 21 |
+
'outline-blue':
|
| 22 |
+
'bg-blue-500/10 text-blue-500 border border-blue-500/20 hover:bg-blue-500/20 shadow-xs',
|
| 23 |
'outline-destructive':
|
| 24 |
+
'bg-rose-500/10 hover:bg-rose-500/20 text-rose-600 border border-rose-500/20 shadow-xs',
|
| 25 |
+
amber: 'bg-amber-500 text-white hover:brightness-110 shadow-xs'
|
| 26 |
},
|
| 27 |
size: {
|
| 28 |
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
|
src/lib/components/ui/tooltip/index.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Root from "./tooltip.svelte";
|
| 2 |
+
import Trigger from "./tooltip-trigger.svelte";
|
| 3 |
+
import Content from "./tooltip-content.svelte";
|
| 4 |
+
import Provider from "./tooltip-provider.svelte";
|
| 5 |
+
import Portal from "./tooltip-portal.svelte";
|
| 6 |
+
|
| 7 |
+
export {
|
| 8 |
+
Root,
|
| 9 |
+
Trigger,
|
| 10 |
+
Content,
|
| 11 |
+
Provider,
|
| 12 |
+
Portal,
|
| 13 |
+
//
|
| 14 |
+
Root as Tooltip,
|
| 15 |
+
Content as TooltipContent,
|
| 16 |
+
Trigger as TooltipTrigger,
|
| 17 |
+
Provider as TooltipProvider,
|
| 18 |
+
Portal as TooltipPortal,
|
| 19 |
+
};
|
src/lib/components/ui/tooltip/tooltip-content.svelte
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
| 3 |
+
import { cn } from "$lib/utils.js";
|
| 4 |
+
import TooltipPortal from "./tooltip-portal.svelte";
|
| 5 |
+
import type { ComponentProps } from "svelte";
|
| 6 |
+
import type { WithoutChildrenOrChild } from "$lib/utils.js";
|
| 7 |
+
|
| 8 |
+
let {
|
| 9 |
+
ref = $bindable(null),
|
| 10 |
+
class: className,
|
| 11 |
+
sideOffset = 0,
|
| 12 |
+
side = "top",
|
| 13 |
+
children,
|
| 14 |
+
arrowClasses,
|
| 15 |
+
portalProps,
|
| 16 |
+
...restProps
|
| 17 |
+
}: TooltipPrimitive.ContentProps & {
|
| 18 |
+
arrowClasses?: string;
|
| 19 |
+
portalProps?: WithoutChildrenOrChild<ComponentProps<typeof TooltipPortal>>;
|
| 20 |
+
} = $props();
|
| 21 |
+
</script>
|
| 22 |
+
|
| 23 |
+
<TooltipPortal {...portalProps}>
|
| 24 |
+
<TooltipPrimitive.Content
|
| 25 |
+
bind:ref
|
| 26 |
+
data-slot="tooltip-content"
|
| 27 |
+
{sideOffset}
|
| 28 |
+
{side}
|
| 29 |
+
class={cn(
|
| 30 |
+
"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-end-2 data-[side=right]:slide-in-from-start-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--bits-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
|
| 31 |
+
className
|
| 32 |
+
)}
|
| 33 |
+
{...restProps}
|
| 34 |
+
>
|
| 35 |
+
{@render children?.()}
|
| 36 |
+
<TooltipPrimitive.Arrow>
|
| 37 |
+
{#snippet child({ props })}
|
| 38 |
+
<div
|
| 39 |
+
class={cn(
|
| 40 |
+
"bg-foreground z-50 size-2.5 rotate-45 rounded-[2px]",
|
| 41 |
+
"data-[side=top]:translate-x-1/2 data-[side=top]:translate-y-[calc(-50%_+_2px)]",
|
| 42 |
+
"data-[side=bottom]:-translate-x-1/2 data-[side=bottom]:-translate-y-[calc(-50%_+_1px)]",
|
| 43 |
+
"data-[side=right]:translate-x-[calc(50%_+_2px)] data-[side=right]:translate-y-1/2",
|
| 44 |
+
"data-[side=left]:-translate-y-[calc(50%_-_3px)]",
|
| 45 |
+
arrowClasses
|
| 46 |
+
)}
|
| 47 |
+
{...props}
|
| 48 |
+
></div>
|
| 49 |
+
{/snippet}
|
| 50 |
+
</TooltipPrimitive.Arrow>
|
| 51 |
+
</TooltipPrimitive.Content>
|
| 52 |
+
</TooltipPortal>
|
src/lib/components/ui/tooltip/tooltip-portal.svelte
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
| 3 |
+
|
| 4 |
+
let { ...restProps }: TooltipPrimitive.PortalProps = $props();
|
| 5 |
+
</script>
|
| 6 |
+
|
| 7 |
+
<TooltipPrimitive.Portal {...restProps} />
|
src/lib/components/ui/tooltip/tooltip-provider.svelte
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
| 3 |
+
|
| 4 |
+
let { ...restProps }: TooltipPrimitive.ProviderProps = $props();
|
| 5 |
+
</script>
|
| 6 |
+
|
| 7 |
+
<TooltipPrimitive.Provider {...restProps} />
|
src/lib/components/ui/tooltip/tooltip-trigger.svelte
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
| 3 |
+
|
| 4 |
+
let { ref = $bindable(null), ...restProps }: TooltipPrimitive.TriggerProps = $props();
|
| 5 |
+
</script>
|
| 6 |
+
|
| 7 |
+
<TooltipPrimitive.Trigger bind:ref data-slot="tooltip-trigger" {...restProps} />
|
src/lib/components/ui/tooltip/tooltip.svelte
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<script lang="ts">
|
| 2 |
+
import { Tooltip as TooltipPrimitive } from "bits-ui";
|
| 3 |
+
|
| 4 |
+
let { open = $bindable(false), ...restProps }: TooltipPrimitive.RootProps = $props();
|
| 5 |
+
</script>
|
| 6 |
+
|
| 7 |
+
<TooltipPrimitive.Root bind:open {...restProps} />
|
src/lib/state/view.svelte.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
| 1 |
export const viewState = $state({
|
| 2 |
-
|
| 3 |
-
draggable: true
|
| 4 |
});
|
|
|
|
| 1 |
export const viewState = $state({
|
| 2 |
+
draggable: localStorage.getItem('hf-playground-draggable-option') === 'true' ? true : false
|
|
|
|
| 3 |
});
|
src/routes/+layout.svelte
CHANGED
|
@@ -4,12 +4,11 @@
|
|
| 4 |
|
| 5 |
import './layout.css';
|
| 6 |
import HuggingFaceLogo from '$lib/assets/hf-logo.svg';
|
| 7 |
-
import { fetchModels
|
| 8 |
-
import MainLoading from '$lib/components/loading/MainLoading.svelte';
|
| 9 |
import { breakpointsState } from '$lib/state/breakpoints.svelte';
|
| 10 |
-
import { initAuth, handleAuthCallback
|
| 11 |
import SigninModal from '$lib/components/auth/SigninModal.svelte';
|
| 12 |
-
|
| 13 |
interface Props {
|
| 14 |
children?: import('svelte').Snippet;
|
| 15 |
}
|
|
@@ -47,7 +46,9 @@
|
|
| 47 |
<MainLoading />
|
| 48 |
{:else}
|
| 49 |
{/if} -->
|
| 50 |
-
|
|
|
|
|
|
|
| 51 |
<SigninModal />
|
| 52 |
</div>
|
| 53 |
</svelte:boundary>
|
|
|
|
| 4 |
|
| 5 |
import './layout.css';
|
| 6 |
import HuggingFaceLogo from '$lib/assets/hf-logo.svg';
|
| 7 |
+
import { fetchModels } from '$lib/state/models.svelte';
|
|
|
|
| 8 |
import { breakpointsState } from '$lib/state/breakpoints.svelte';
|
| 9 |
+
import { initAuth, handleAuthCallback } from '$lib/state/auth.svelte';
|
| 10 |
import SigninModal from '$lib/components/auth/SigninModal.svelte';
|
| 11 |
+
import * as Tooltip from '$lib/components/ui/tooltip/index.js';
|
| 12 |
interface Props {
|
| 13 |
children?: import('svelte').Snippet;
|
| 14 |
}
|
|
|
|
| 46 |
<MainLoading />
|
| 47 |
{:else}
|
| 48 |
{/if} -->
|
| 49 |
+
<Tooltip.Provider>
|
| 50 |
+
{@render children?.()}
|
| 51 |
+
</Tooltip.Provider>
|
| 52 |
<SigninModal />
|
| 53 |
</div>
|
| 54 |
</svelte:boundary>
|
src/routes/+page.svelte
CHANGED
|
@@ -93,7 +93,7 @@
|
|
| 93 |
patternColor={mode.current === 'dark' ? 'rgba(255, 255, 255, 0.04)' : 'rgba(0, 0, 0, 0.04)'}
|
| 94 |
class="bg-background!"
|
| 95 |
/>
|
| 96 |
-
<PanelLeftMenu />
|
| 97 |
<PanelRightActions canReset={nodes.length > 1} />
|
| 98 |
<PanelCanvasActions />
|
| 99 |
</SvelteFlow>
|
|
|
|
| 93 |
patternColor={mode.current === 'dark' ? 'rgba(255, 255, 255, 0.04)' : 'rgba(0, 0, 0, 0.04)'}
|
| 94 |
class="bg-background!"
|
| 95 |
/>
|
| 96 |
+
<!-- <PanelLeftMenu /> -->
|
| 97 |
<PanelRightActions canReset={nodes.length > 1} />
|
| 98 |
<PanelCanvasActions />
|
| 99 |
</SvelteFlow>
|