From 8ca80c38f1de29a7e40a467f1e0e36ddd870b647 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Wed, 8 Apr 2026 02:29:48 +0200 Subject: [PATCH] feat(app): add TransposeBar collapsible header --- app/app/components/transpose-bar.tsx | 85 ++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 app/app/components/transpose-bar.tsx diff --git a/app/app/components/transpose-bar.tsx b/app/app/components/transpose-bar.tsx new file mode 100644 index 0000000..e16c782 --- /dev/null +++ b/app/app/components/transpose-bar.tsx @@ -0,0 +1,85 @@ +import { useState } from "react"; +import { Button } from "~/components/ui/button"; +import { ChevronUp, ChevronDown, Minus, Plus } from "lucide-react"; +import type { SongMeta } from "~/lib/types"; + +interface Props { + meta: SongMeta; + offset: number; + onOffsetChange: (offset: number) => void; +} + +export function TransposeBar({ meta, offset, onOffsetChange }: Props) { + const [expanded, setExpanded] = useState(true); + + const label = offset === 0 + ? "±0" + : offset > 0 + ? `+${offset}` + : `${offset}`; + + if (!expanded) { + return ( +
+ {meta.title} + +
+ ); + } + + return ( +
+
+
+ {meta.title} + {meta.artist} +
+ +
+ +
+
+ {meta.original_key && Key: {meta.original_key}} + {meta.capo != null && Capo: {meta.capo}} + {meta.tuning && {meta.tuning}} +
+ +
+ + + {label} + + +
+
+
+ ); +}