diff --git a/apps/web/src/components/editor/properties-panel.tsx b/apps/web/src/components/editor/properties-panel.tsx
deleted file mode 100644
index a0532ab..0000000
--- a/apps/web/src/components/editor/properties-panel.tsx
+++ /dev/null
@@ -1,115 +0,0 @@
-"use client";
-
-import { useProjectStore } from "@/stores/project-store";
-import { useAspectRatio } from "@/hooks/use-aspect-ratio";
-import { Label } from "../ui/label";
-import { ScrollArea } from "../ui/scroll-area";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { Textarea } from "../ui/textarea";
-import { MediaElement, TextElement } from "@/types/timeline";
-import { useMediaStore } from "@/stores/media-store";
-import {
- Select,
- SelectContent,
- SelectTrigger,
- SelectValue,
- SelectItem,
-} from "../ui/select";
-import { FONT_OPTIONS, type FontFamily } from "@/constants/font-constants";
-
-export function PropertiesPanel() {
- const { activeProject } = useProjectStore();
- const { getDisplayName, canvasSize } = useAspectRatio();
- const { selectedElements, tracks, updateTextElement } = useTimelineStore();
- const { mediaItems } = useMediaStore();
-
- const emptyView = (
-
- {/* Media Properties */}
-
-
- );
-
- const TextProperties = (element: TextElement, trackId: string) => (
-
- );
-
- const MediaProperties = (element: MediaElement) => {
- const mediaItem = mediaItems.find((item) => item.id === element.mediaId);
-
- if (mediaItem?.type === "audio") {
- return Audio properties
;
- }
-
- // video or image
- return Video/Image properties
;
- };
-
- const ElementProperties = (
- <>
- {selectedElements.map(({ trackId, elementId }) => {
- const track = tracks.find((t) => t.id === trackId);
- const element = track?.elements.find((e) => e.id === elementId);
-
- if (element?.type === "text") {
- return {TextProperties(element, trackId)}
;
- }
- if (element?.type === "media") {
- return {MediaProperties(element)}
;
- }
- })}
- >
- );
-
- return (
-
- {selectedElements.length > 0 ? ElementProperties : emptyView}
-
- );
-}
-
-function PropertyItem({ label, value }: { label: string; value: string }) {
- return (
-
-
- {value}
-
- );
-}
diff --git a/apps/web/src/components/editor/properties-panel/audio-properties.tsx b/apps/web/src/components/editor/properties-panel/audio-properties.tsx
new file mode 100644
index 0000000..384f0c5
--- /dev/null
+++ b/apps/web/src/components/editor/properties-panel/audio-properties.tsx
@@ -0,0 +1,5 @@
+import { MediaElement } from "@/types/timeline";
+
+export function AudioProperties({ element }: { element: MediaElement }) {
+ return Audio properties
;
+}
\ No newline at end of file
diff --git a/apps/web/src/components/editor/properties-panel/index.tsx b/apps/web/src/components/editor/properties-panel/index.tsx
new file mode 100644
index 0000000..0e6cb8a
--- /dev/null
+++ b/apps/web/src/components/editor/properties-panel/index.tsx
@@ -0,0 +1,77 @@
+"use client";
+
+import { useProjectStore } from "@/stores/project-store";
+import { useAspectRatio } from "@/hooks/use-aspect-ratio";
+import { Label } from "../../ui/label";
+import { ScrollArea } from "../../ui/scroll-area";
+import { useTimelineStore } from "@/stores/timeline-store";
+import { useMediaStore } from "@/stores/media-store";
+import { AudioProperties } from "./audio-properties";
+import { MediaProperties } from "./media-properties";
+import { TextProperties } from "./text-properties";
+
+export function PropertiesPanel() {
+ const { activeProject } = useProjectStore();
+ const { getDisplayName, canvasSize } = useAspectRatio();
+ const { selectedElements, tracks } = useTimelineStore();
+ const { mediaItems } = useMediaStore();
+
+ const emptyView = (
+
+ {/* Media Properties */}
+
+
+ );
+
+ return (
+
+ {selectedElements.length > 0
+ ? selectedElements.map(({ trackId, elementId }) => {
+ const track = tracks.find((t) => t.id === trackId);
+ const element = track?.elements.find((e) => e.id === elementId);
+
+ if (element?.type === "text") {
+ return (
+
+
+
+ );
+ }
+ if (element?.type === "media") {
+ const mediaItem = mediaItems.find(
+ (item) => item.id === element.mediaId
+ );
+
+ if (mediaItem?.type === "audio") {
+ return ;
+ }
+
+ return (
+
+
+
+ );
+ }
+ return null;
+ })
+ : emptyView}
+
+ );
+}
+
+function PropertyItem({ label, value }: { label: string; value: string }) {
+ return (
+
+
+ {value}
+
+ );
+}
diff --git a/apps/web/src/components/editor/properties-panel/media-properties.tsx b/apps/web/src/components/editor/properties-panel/media-properties.tsx
new file mode 100644
index 0000000..c2c514c
--- /dev/null
+++ b/apps/web/src/components/editor/properties-panel/media-properties.tsx
@@ -0,0 +1,5 @@
+import { MediaElement } from "@/types/timeline";
+
+export function MediaProperties({ element }: { element: MediaElement }) {
+ return Media properties
;
+}
diff --git a/apps/web/src/components/editor/properties-panel/text-properties.tsx b/apps/web/src/components/editor/properties-panel/text-properties.tsx
new file mode 100644
index 0000000..c28a9ed
--- /dev/null
+++ b/apps/web/src/components/editor/properties-panel/text-properties.tsx
@@ -0,0 +1,55 @@
+import { Textarea } from "@/components/ui/textarea";
+import { Label } from "@/components/ui/label";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { FONT_OPTIONS, FontFamily } from "@/constants/font-constants";
+import { TextElement } from "@/types/timeline";
+import { useTimelineStore } from "@/stores/timeline-store";
+
+export function TextProperties({
+ element,
+ trackId,
+}: {
+ element: TextElement;
+ trackId: string;
+}) {
+ const { updateTextElement } = useTimelineStore();
+
+ return (
+
+ );
+}