summaryrefslogtreecommitdiff
path: root/apps/web/src/components/editor/panels/assets/tabbar.tsx
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-03-27 00:55:15 +0100
committerMaze Winther <mazewinther@gmail.com>2026-03-29 15:56:48 +0200
commit4d127a038bf768eded68aae3cfa5c1b12241bdac (patch)
tree16bbb801caf6770546cff4fdb37b6408ec9ead98 /apps/web/src/components/editor/panels/assets/tabbar.tsx
parent82817cb50cb0487350573d6129130aec705f924b (diff)
downloadopencut-4d127a038bf768eded68aae3cfa5c1b12241bdac.tar.gz
chore: normalize line endings
Diffstat (limited to 'apps/web/src/components/editor/panels/assets/tabbar.tsx')
-rw-r--r--apps/web/src/components/editor/panels/assets/tabbar.tsx222
1 files changed, 111 insertions, 111 deletions
diff --git a/apps/web/src/components/editor/panels/assets/tabbar.tsx b/apps/web/src/components/editor/panels/assets/tabbar.tsx
index a4e072f1..da53bed0 100644
--- a/apps/web/src/components/editor/panels/assets/tabbar.tsx
+++ b/apps/web/src/components/editor/panels/assets/tabbar.tsx
@@ -1,111 +1,111 @@
-"use client";
-
-import { useCallback, useEffect, useRef, useState } from "react";
-import {
- Tooltip,
- TooltipContent,
- TooltipTrigger,
-} from "@/components/ui/tooltip";
-import { Button } from "@/components/ui/button";
-import { cn } from "@/utils/ui";
-import {
- TAB_KEYS,
- tabs,
- useAssetsPanelStore,
-} from "@/stores/assets-panel-store";
-
-export function TabBar() {
- const { activeTab, setActiveTab } = useAssetsPanelStore();
- const [showTopFade, setShowTopFade] = useState(false);
- const [showBottomFade, setShowBottomFade] = useState(false);
- const scrollRef = useRef<HTMLDivElement>(null);
-
- const checkScrollPosition = useCallback(() => {
- const element = scrollRef.current;
- if (!element) return;
-
- const { scrollTop, scrollHeight, clientHeight } = element;
- setShowTopFade(scrollTop > 0);
- setShowBottomFade(scrollTop < scrollHeight - clientHeight - 1);
- }, []);
-
- useEffect(() => {
- const element = scrollRef.current;
- if (!element) return;
-
- checkScrollPosition();
- element.addEventListener("scroll", checkScrollPosition);
-
- const resizeObserver = new ResizeObserver(checkScrollPosition);
- resizeObserver.observe(element);
-
- return () => {
- element.removeEventListener("scroll", checkScrollPosition);
- resizeObserver.disconnect();
- };
- }, [checkScrollPosition]);
-
- return (
- <div className="relative flex">
- <div
- ref={scrollRef}
- className="scrollbar-hidden relative flex size-full p-1 flex-col items-center justify-start gap-0.5 overflow-y-auto"
- >
- {TAB_KEYS.map((tabKey) => {
- const tab = tabs[tabKey];
- return (
- <Tooltip key={tabKey} delayDuration={10}>
- <TooltipTrigger asChild>
- <Button
- variant={activeTab === tabKey ? "secondary" : "ghost"}
- size="icon"
- aria-label={tab.label}
- className={cn(
- "shrink-0",
- "h-8 w-8",
- activeTab !== tabKey && "text-muted-foreground",
- )}
- onClick={() => setActiveTab(tabKey)}
- >
- <tab.icon />
- </Button>
- </TooltipTrigger>
- <TooltipContent
- side="right"
- align="center"
- variant="sidebar"
- sideOffset={8}
- >
- <div className="text-foreground text-sm leading-none font-medium">
- {tab.label}
- </div>
- </TooltipContent>
- </Tooltip>
- );
- })}
- </div>
-
- <FadeOverlay direction="top" show={showTopFade} />
- <FadeOverlay direction="bottom" show={showBottomFade} />
- </div>
- );
-}
-
-function FadeOverlay({
- direction,
- show,
-}: {
- direction: "top" | "bottom";
- show: boolean;
-}) {
- return (
- <div
- className={cn(
- "pointer-events-none absolute right-0 left-0 h-6",
- direction === "top" && show
- ? "from-background top-0 bg-linear-to-b to-transparent"
- : "from-background bottom-0 bg-linear-to-t to-transparent",
- )}
- />
- );
-}
+"use client";
+
+import { useCallback, useEffect, useRef, useState } from "react";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { Button } from "@/components/ui/button";
+import { cn } from "@/utils/ui";
+import {
+ TAB_KEYS,
+ tabs,
+ useAssetsPanelStore,
+} from "@/stores/assets-panel-store";
+
+export function TabBar() {
+ const { activeTab, setActiveTab } = useAssetsPanelStore();
+ const [showTopFade, setShowTopFade] = useState(false);
+ const [showBottomFade, setShowBottomFade] = useState(false);
+ const scrollRef = useRef<HTMLDivElement>(null);
+
+ const checkScrollPosition = useCallback(() => {
+ const element = scrollRef.current;
+ if (!element) return;
+
+ const { scrollTop, scrollHeight, clientHeight } = element;
+ setShowTopFade(scrollTop > 0);
+ setShowBottomFade(scrollTop < scrollHeight - clientHeight - 1);
+ }, []);
+
+ useEffect(() => {
+ const element = scrollRef.current;
+ if (!element) return;
+
+ checkScrollPosition();
+ element.addEventListener("scroll", checkScrollPosition);
+
+ const resizeObserver = new ResizeObserver(checkScrollPosition);
+ resizeObserver.observe(element);
+
+ return () => {
+ element.removeEventListener("scroll", checkScrollPosition);
+ resizeObserver.disconnect();
+ };
+ }, [checkScrollPosition]);
+
+ return (
+ <div className="relative flex">
+ <div
+ ref={scrollRef}
+ className="scrollbar-hidden relative flex size-full p-1 flex-col items-center justify-start gap-0.5 overflow-y-auto"
+ >
+ {TAB_KEYS.map((tabKey) => {
+ const tab = tabs[tabKey];
+ return (
+ <Tooltip key={tabKey} delayDuration={10}>
+ <TooltipTrigger asChild>
+ <Button
+ variant={activeTab === tabKey ? "secondary" : "ghost"}
+ size="icon"
+ aria-label={tab.label}
+ className={cn(
+ "shrink-0",
+ "h-8 w-8",
+ activeTab !== tabKey && "text-muted-foreground",
+ )}
+ onClick={() => setActiveTab(tabKey)}
+ >
+ <tab.icon />
+ </Button>
+ </TooltipTrigger>
+ <TooltipContent
+ side="right"
+ align="center"
+ variant="sidebar"
+ sideOffset={8}
+ >
+ <div className="text-foreground text-sm leading-none font-medium">
+ {tab.label}
+ </div>
+ </TooltipContent>
+ </Tooltip>
+ );
+ })}
+ </div>
+
+ <FadeOverlay direction="top" show={showTopFade} />
+ <FadeOverlay direction="bottom" show={showBottomFade} />
+ </div>
+ );
+}
+
+function FadeOverlay({
+ direction,
+ show,
+}: {
+ direction: "top" | "bottom";
+ show: boolean;
+}) {
+ return (
+ <div
+ className={cn(
+ "pointer-events-none absolute right-0 left-0 h-6",
+ direction === "top" && show
+ ? "from-background top-0 bg-linear-to-b to-transparent"
+ : "from-background bottom-0 bg-linear-to-t to-transparent",
+ )}
+ />
+ );
+}