refactor: create base view for media panel tabs

This commit is contained in:
Maze Winther
2025-08-05 08:46:17 +02:00
parent 949228f0bb
commit efbbc48bc5
5 changed files with 89 additions and 29 deletions
@@ -7,6 +7,7 @@ import { TextView } from "./views/text";
import { SoundsView } from "./views/sounds"; import { SoundsView } from "./views/sounds";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import { SettingsView } from "./views/settings"; import { SettingsView } from "./views/settings";
import { Captions } from "./views/captions";
export function MediaPanel() { export function MediaPanel() {
const { activeTab } = useMediaPanelStore(); const { activeTab } = useMediaPanelStore();
@@ -30,11 +31,7 @@ export function MediaPanel() {
Transitions view coming soon... Transitions view coming soon...
</div> </div>
), ),
captions: ( captions: <Captions />,
<div className="p-4 text-muted-foreground">
Captions view coming soon...
</div>
),
filters: ( filters: (
<div className="p-4 text-muted-foreground"> <div className="p-4 text-muted-foreground">
Filters view coming soon... Filters view coming soon...
@@ -0,0 +1,59 @@
import { ScrollArea } from "@/components/ui/scroll-area";
import { Separator } from "@/components/ui/separator";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
interface BaseViewProps {
children: React.ReactNode;
defaultTab?: string;
tabs?: {
value: string;
label: string;
content: React.ReactNode;
}[];
className?: string;
}
function ViewContent({ children }: { children: React.ReactNode }) {
return (
<ScrollArea className="flex-1">
<div className="p-5">{children}</div>
</ScrollArea>
);
}
export function BaseView({
children,
defaultTab,
tabs,
className = "",
}: BaseViewProps) {
return (
<div className={`h-full flex flex-col ${className}`}>
{!tabs || tabs.length === 0 ? (
<ViewContent>{children}</ViewContent>
) : (
<Tabs defaultValue={defaultTab} className="flex flex-col h-full">
<div className="px-3 pt-4 pb-0">
<TabsList>
{tabs.map((tab) => (
<TabsTrigger key={tab.value} value={tab.value}>
{tab.label}
</TabsTrigger>
))}
</TabsList>
</div>
<Separator className="mt-4" />
{tabs.map((tab) => (
<TabsContent
key={tab.value}
value={tab.value}
className="mt-0 flex-1 flex flex-col min-h-0"
>
<ViewContent>{tab.content}</ViewContent>
</TabsContent>
))}
</Tabs>
)}
</div>
);
}
@@ -0,0 +1,9 @@
import { BaseView } from "./base-view";
export function Captions() {
return (
<BaseView>
<div>Captions</div>
</BaseView>
);
}
@@ -7,9 +7,7 @@ import {
SelectTrigger, SelectTrigger,
SelectValue, SelectValue,
} from "@/components/ui/select"; } from "@/components/ui/select";
import { Separator } from "@/components/ui/separator"; import { BaseView } from "./base-view";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { import {
PropertyItem, PropertyItem,
PropertyItemLabel, PropertyItemLabel,
@@ -34,25 +32,21 @@ export function SettingsView() {
function ProjectSettingsTabs() { function ProjectSettingsTabs() {
return ( return (
<div className="h-full flex flex-col"> <BaseView
<Tabs defaultValue="project-info" className="flex flex-col h-full"> defaultTab="project-info"
<div className="px-3 pt-4 pb-0"> tabs={[
<TabsList> {
<TabsTrigger value="project-info">Project info</TabsTrigger> value: "project-info",
<TabsTrigger value="background">Background</TabsTrigger> label: "Project info",
</TabsList> content: <ProjectInfoView />,
</div> },
<Separator className="my-4" /> {
<ScrollArea className="flex-1"> value: "background",
<TabsContent value="project-info" className="p-5 pt-0 mt-0"> label: "Background",
<ProjectInfoView /> content: <BackgroundView />,
</TabsContent> },
<TabsContent value="background" className="p-4 pt-0"> ]}
<BackgroundView /> />
</TabsContent>
</ScrollArea>
</Tabs>
</div>
); );
} }
@@ -1,4 +1,5 @@
import { DraggableMediaItem } from "@/components/ui/draggable-item"; import { DraggableMediaItem } from "@/components/ui/draggable-item";
import { BaseView } from "./base-view";
import { TIMELINE_CONSTANTS } from "@/constants/timeline-constants"; import { TIMELINE_CONSTANTS } from "@/constants/timeline-constants";
import { useTimelineStore } from "@/stores/timeline-store"; import { useTimelineStore } from "@/stores/timeline-store";
import { type TextElement } from "@/types/timeline"; import { type TextElement } from "@/types/timeline";
@@ -28,7 +29,7 @@ const textData: TextElement = {
export function TextView() { export function TextView() {
return ( return (
<div className="p-4"> <BaseView>
<DraggableMediaItem <DraggableMediaItem
name="Default text" name="Default text"
preview={ preview={
@@ -48,6 +49,6 @@ export function TextView() {
} }
showLabel={false} showLabel={false}
/> />
</div> </BaseView>
); );
} }