diff --git a/apps/frontend/src/components/ui/bars-loader.tsx b/apps/frontend/src/components/ui/bars-loader.tsx
new file mode 100644
index 00000000..ed26b560
--- /dev/null
+++ b/apps/frontend/src/components/ui/bars-loader.tsx
@@ -0,0 +1,76 @@
+/*
+ * Bars animation adapted from https://github.com/starc007/ui-components
+ * MIT License — Copyright (c) 2026 Saurabh Chauhan
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+import { motion, useReducedMotion } from "motion/react";
+import { cn } from "@/lib/utilities";
+
+interface BarsLoaderProps {
+ size?: number;
+ label?: string;
+ showLabel?: boolean;
+ className?: string;
+}
+
+export function BarsLoader({
+ size = 32,
+ label = "Loading",
+ showLabel = false,
+ className,
+}: BarsLoaderProps) {
+ const reduceMotion = useReducedMotion();
+
+ return (
+
+
+ {[0, 1, 2, 3].map((index) => (
+
+ ))}
+
+
+ {label}
+
+
+ );
+}
diff --git a/apps/frontend/src/components/ui/scroll-area.tsx b/apps/frontend/src/components/ui/scroll-area.tsx
index 234c52ff..e684ff80 100644
--- a/apps/frontend/src/components/ui/scroll-area.tsx
+++ b/apps/frontend/src/components/ui/scroll-area.tsx
@@ -2,6 +2,20 @@ import { ScrollArea as BaseScrollArea } from "@base-ui/react/scroll-area";
import * as React from "react";
import { cn } from "@/lib/utilities";
+export function handleHorizontalScrollKeyDown(
+ event: React.KeyboardEvent,
+) {
+ if (
+ event.target !== event.currentTarget ||
+ (event.key !== "ArrowLeft" && event.key !== "ArrowRight")
+ ) {
+ return;
+ }
+ event.preventDefault();
+ event.stopPropagation();
+ event.currentTarget.scrollBy({ left: event.key === "ArrowRight" ? 32 : -32 });
+}
+
type ScrollAreaProperties = React.ComponentPropsWithoutRef<
typeof BaseScrollArea.Root
> & {
@@ -68,7 +82,7 @@ const ScrollBar = React.forwardRef(
>
{children}
-
+
);
@@ -51,8 +51,10 @@ function SelectTrigger({
function SelectContent({
className,
children,
- position = "item-aligned",
- align = "center",
+ position = "popper",
+ align = "start",
+ sideOffset = 8,
+ collisionPadding = 12,
...props
}: React.ComponentProps) {
return (
@@ -60,21 +62,21 @@ function SelectContent({
{children}
@@ -107,7 +109,7 @@ function SelectItem({
- Loading editor...
+
);
}
diff --git a/apps/frontend/src/routes/local.edit.$sessionId.tsx b/apps/frontend/src/routes/local.edit.$sessionId.tsx
index 855ded1b..4e8bdd76 100644
--- a/apps/frontend/src/routes/local.edit.$sessionId.tsx
+++ b/apps/frontend/src/routes/local.edit.$sessionId.tsx
@@ -4,6 +4,7 @@ import { useCallback, useEffect, useState } from "react";
import { useAuth } from "@/auth";
import { editorDrafts } from "@/components/editor/editorDrafts";
import EditorScreen from "@/components/editor/EditorScreen";
+import { BarsLoader } from "@/components/ui/bars-loader";
import { LocalVideoOpenDialog } from "@/components/local-media/LocalVideoOpenDialog";
import {
primaryButtonClasses,
@@ -56,7 +57,7 @@ function LocalEditorRouteComponent() {
if (loading) {
return (