enzostvs HF Staff commited on
Commit
3109fce
·
1 Parent(s): c82022f
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: nodesStore.current
72
  });
73
  }
74
 
@@ -381,8 +386,13 @@
381
  }
382
 
383
  if (viewState.draggable) {
384
- doFitView();
385
- isFirstLayout = false;
 
 
 
 
 
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, Move, MousePointer } from '@lucide/svelte';
3
- import { Panel, useNodes } 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
 
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
- <Button
49
- variant={!viewState.draggable ? 'default' : 'ghost'}
50
- size="icon-sm"
51
- onclick={() => (viewState.draggable = false)}
52
- >
53
- <MousePointer />
54
- </Button>
55
- <Button
56
- variant={viewState.draggable ? 'default' : 'ghost'}
57
- size="icon-sm"
58
- onclick={() => (viewState.draggable = true)}
59
- >
60
- <Move />
61
- </Button>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)}>Set</Button>
 
 
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)}>Set</Button>
 
 
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
- blue: 'bg-blue-500/10 text-blue-500 border border-blue-500/20 hover:bg-blue-500/20 shadow-xs',
 
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
- freeView: false,
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, modelsState } from '$lib/state/models.svelte';
8
- import MainLoading from '$lib/components/loading/MainLoading.svelte';
9
  import { breakpointsState } from '$lib/state/breakpoints.svelte';
10
- import { initAuth, handleAuthCallback, authState } from '$lib/state/auth.svelte';
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
- {@render children?.()}
 
 
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>