diff --git a/app/creator/layout.tsx b/app/creator/(home)/layout.tsx
similarity index 100%
rename from app/creator/layout.tsx
rename to app/creator/(home)/layout.tsx
diff --git a/app/creator/page.tsx b/app/creator/(home)/page.tsx
similarity index 100%
rename from app/creator/page.tsx
rename to app/creator/(home)/page.tsx
diff --git a/app/creator/studio/layout.tsx b/app/creator/studio/layout.tsx
new file mode 100644
index 0000000..ccdf5fa
--- /dev/null
+++ b/app/creator/studio/layout.tsx
@@ -0,0 +1,116 @@
+import { Button } from '@/components/ui/button';
+import { Add, ArrowDown2, Book1, Eye, Layer, Link2, Message, PlayCircle, Pointer, SearchNormal1 } from 'iconsax-react';
+import { Download, PointerIcon, Redo2, Share2, Square, Undo2 } from 'lucide-react';
+import type { Metadata } from 'next';
+import Image from 'next/image';
+import Link from 'next/link';
+import React from 'react';
+import Sidebar from '../../../components/common/SideBar';
+
+export const metadata: Metadata = {
+ title: 'Studio',
+}
+
+export interface Props {
+ children: React.ReactNode
+}
+
+function layout({ children }: Props) {
+ return (
+
+
+ {/* NavBar */}
+
+
+
+
+
Home
+
View
+
Help
+
+
Last saved 5 seconds ago
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* End of NavBar */}
+
+ {/* Main Content with Sidebar */}
+
+ {/* Sidebar - Hidden on mobile by default, can be toggled */}
+
+
+
+
+ {/* Inner NavBar */}
+
+
+
Pages 1
+
794 * 1123 px
+
+
+
+ {/* End of Inner NavBar */}
+
+ {/* Main Editor */}
+
+
+ {children}
+
+ {/* Inner Editor SideBar */}
+
+
+
+
+
+ );
+}
+
+export default layout
diff --git a/app/creator/trash/page.tsx b/app/creator/trash/page.tsx
index d0e779e..2017932 100644
--- a/app/creator/trash/page.tsx
+++ b/app/creator/trash/page.tsx
@@ -1,7 +1,7 @@
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
-import TrashCards, { Trash } from "@/app/components/cards/TrashCards";
-import EmptyRecords from "@/app/components/common/EmptyRecords";
+import TrashCards, { Trash } from "@/components/cards/TrashCards";
+import EmptyRecords from "@/components/common/EmptyRecords";
const TrashPage = () => {
const trashData: Trash[] = [
diff --git a/app/globals.css b/app/globals.css
index f01c3e1..7a19fbc 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -121,3 +121,10 @@
@apply bg-background text-foreground;
}
}
+
+
+/* custom css */
+
+.no-scrollbar::-webkit-scrollbar {
+ display: none;
+}
diff --git a/app/components/cards/TrashCards.tsx b/components/cards/TrashCards.tsx
similarity index 100%
rename from app/components/cards/TrashCards.tsx
rename to components/cards/TrashCards.tsx
diff --git a/components/common/ActionButtons.tsx b/components/common/ActionButtons.tsx
new file mode 100644
index 0000000..7d2859e
--- /dev/null
+++ b/components/common/ActionButtons.tsx
@@ -0,0 +1,32 @@
+'use client'
+
+import { Button } from '@/components/ui/button'
+import React from 'react'
+
+
+export interface ActionButtonsProps {
+ icon: React.ReactNode,
+ label?: string,
+ buttonWidth?: number,
+ isGhost?: boolean,
+ onClick?: () => void
+}
+
+function ActionButtons({ icon, label, onClick, isGhost=false, buttonWidth}: ActionButtonsProps) {
+ return (
+
+
+ {label &&
{label}
}
+
+ )
+}
+
+
+export default ActionButtons
diff --git a/app/components/common/EmptyRecords.tsx b/components/common/EmptyRecords.tsx
similarity index 100%
rename from app/components/common/EmptyRecords.tsx
rename to components/common/EmptyRecords.tsx
diff --git a/components/common/SideBar.tsx b/components/common/SideBar.tsx
new file mode 100644
index 0000000..b176495
--- /dev/null
+++ b/components/common/SideBar.tsx
@@ -0,0 +1,205 @@
+import React from 'react';
+import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs";
+import {
+ Tag, Image as Images, Upload, TextSelect,
+ ImageDownIcon,
+ UploadIcon
+} from "lucide-react";
+import ActionButtons from "./ActionButtons";
+import {
+ ArrowLeft2, ArrowRight2, AudioSquare, Cardano, Chart, CodeCircle,
+ Element2, ExportSquare, Gift, Link, LinkSquare, Magicpen,
+ MessageAdd1, MessageQuestion, Next, Note, Photoshop, Previous,
+ SearchNormal1,
+ Setting2, Setting4, Shapes, Smallcaps, Snapchat, Spotify,
+ Sticker,
+ TableDocument,
+ Text, Video, VideoHorizontal, Whatsapp,
+} from 'iconsax-react';
+import { Button } from '@/components/ui/button';
+import { Skeleton } from '@/components/ui/skeleton';
+import { Input } from '@/components/ui/input';
+import Image from "next/image";
+
+
+
+const CategoryHeading = ({ title }: { title: string }) => (
+
+ {title}
+
+);
+
+const Sidebar = () => {
+ return (
+
+
+
+
+
+ } label="Text" isGhost={false} />
+
+
+ } label="Upload" isGhost={true} />
+
+
+ } label="Elements" isGhost={true} />
+
+
+ } label="Interactions" isGhost={true} />
+
+
+ } label="Templates" isGhost={true} />
+
+
+ } label="Ai Write" isGhost={true} />
+
+
+
+ } label="Settings" isGhost={true} />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ Array.from({ length: 4 }).map((_, index) => {
+ return (
+
+
+
+ )
+ })
+ }
+
+
+
+
+
+ {/* search input box */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
} label="Stock Photo" isGhost={false} buttonWidth={65} />
+
} label="Stock Video" isGhost={false} buttonWidth={65} />
+
} label="Shapes" isGhost={false} buttonWidth={65} />
+
} label="Gif" isGhost={false} buttonWidth={65} />
+
} label="Sticker" isGhost={false} buttonWidth={65} />
+
} label="Audio" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Chart" isGhost={false} buttonWidth={65} />
+
} label="Table" isGhost={false} buttonWidth={65} />
+
+
+
+
+
+
+
} label="Link Area" isGhost={false} buttonWidth={65} />
+
} label="Link Button" isGhost={false} buttonWidth={65} />
+
} label="Tag" isGhost={false} buttonWidth={65} />
+
} label="Caption" isGhost={false} buttonWidth={65} />
+
} label="Embed code" isGhost={false} buttonWidth={65} />
+
} label="Pop-up frame" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Spotlight" isGhost={false} buttonWidth={65} />
+
} label="Slideshow" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Video embed" isGhost={false} buttonWidth={65} />
+
} label="Video Button" isGhost={false} buttonWidth={65} />
+
} label="Audio Button" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Question" isGhost={false} buttonWidth={65} />
+
} label="Contact Form" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Previous Page" isGhost={false} buttonWidth={65} />
+
} label="Next Page" isGhost={false} buttonWidth={65} />
+
} label="Go to page" isGhost={false} buttonWidth={65} />
+
} label="First page" isGhost={false} buttonWidth={65} />
+
} label="Last page" isGhost={false} buttonWidth={65} />
+
+
+
+
+
} label="Snapchat" isGhost={false} buttonWidth={65} />
+
} label="WhatsApp" isGhost={false} buttonWidth={65} />
+
} label="Spotify" isGhost={false} buttonWidth={65} />
+
+
+
+
+
Templates section
+
This section is under development
+
+
+
+
+
+
AI Write section
+
This section is under development
+
+
+
+
+
+
Settings section
+
This section is under development
+
+
+
+
+
+ );
+};
+
+export default Sidebar;
diff --git a/components/custom/Play_Ground.tsx b/components/custom/Play_Ground.tsx
index e1c84cb..49d5574 100644
--- a/components/custom/Play_Ground.tsx
+++ b/components/custom/Play_Ground.tsx
@@ -2,7 +2,7 @@ import Frame from "./Frame";
export default function PlayGround() {
return (
-
+
);
diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx
new file mode 100644
index 0000000..71e428b
--- /dev/null
+++ b/components/ui/avatar.tsx
@@ -0,0 +1,53 @@
+"use client"
+
+import * as React from "react"
+import * as AvatarPrimitive from "@radix-ui/react-avatar"
+
+import { cn } from "@/lib/utils"
+
+function Avatar({
+ className,
+ ...props
+}: React.ComponentProps
) {
+ return (
+
+ )
+}
+
+function AvatarImage({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function AvatarFallback({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export { Avatar, AvatarImage, AvatarFallback }
diff --git a/components/ui/skeleton.tsx b/components/ui/skeleton.tsx
new file mode 100644
index 0000000..32ea0ef
--- /dev/null
+++ b/components/ui/skeleton.tsx
@@ -0,0 +1,13 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+export { Skeleton }
diff --git a/package.json b/package.json
index d469964..7234686 100644
--- a/package.json
+++ b/package.json
@@ -11,10 +11,12 @@
"dependencies": {
"lucide-react": "^0.503.0",
"next": "15.3.1",
+ "@radix-ui/react-avatar": "^1.1.7",
"@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.9",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
+ "iconsax-react": "^0.0.8",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"tailwind-merge": "^3.2.0"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8ac6d86..d60506b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,6 +8,9 @@ importers:
.:
dependencies:
+ '@radix-ui/react-avatar':
+ specifier: ^1.1.7
+ version: 1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@radix-ui/react-slot':
specifier: ^1.2.0
version: 1.2.0(@types/react@19.1.2)(react@19.1.0)
@@ -20,6 +23,9 @@ importers:
clsx:
specifier: ^2.1.1
version: 2.1.1
+ iconsax-react:
+ specifier: ^0.0.8
+ version: 0.0.8(react@19.1.0)
lucide-react:
specifier: ^0.503.0
version: 0.503.0(react@19.1.0)
@@ -326,6 +332,19 @@ packages:
'@radix-ui/primitive@1.1.2':
resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==}
+ '@radix-ui/react-avatar@1.1.7':
+ resolution: {integrity: sha512-V7ODUt4mUoJTe3VUxZw6nfURxaPALVqmDQh501YmaQsk3D8AZQrOPRnfKn4H7JGDLBc0KqLhT94H79nV88ppNg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
'@radix-ui/react-collection@1.1.4':
resolution: {integrity: sha512-cv4vSf7HttqXilDnAnvINd53OTl1/bjUYVZrkFnA7nwmY9Ob2POUy0WY0sfqBAe1s5FyKsyceQlqiEGPYNTadg==}
peerDependencies:
@@ -463,6 +482,15 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-is-hydrated@0.1.0':
+ resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@radix-ui/react-use-layout-effect@1.1.1':
resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
peerDependencies:
@@ -1219,6 +1247,11 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
+ iconsax-react@0.0.8:
+ resolution: {integrity: sha512-l3dVk4zGtkkJHgvNYqAf0wDKqnKxXykee5/DoESGo2JvSYwaxajJUHSX2YrPRXSov8Hd8ClGFwJxCEaEjrFD1Q==}
+ peerDependencies:
+ react: '*'
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -1872,6 +1905,11 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-sync-external-store@1.5.0:
+ resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
which-boxed-primitive@1.1.1:
resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
engines: {node: '>= 0.4'}
@@ -2109,6 +2147,19 @@ snapshots:
'@radix-ui/primitive@1.1.2': {}
+ '@radix-ui/react-avatar@1.1.7(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@radix-ui/react-context': 1.1.2(@types/react@19.1.2)(react@19.1.0)
+ '@radix-ui/react-primitive': 2.1.0(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.2)(react@19.1.0)
+ '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.1.2)(react@19.1.0)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.2)(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.2
+ '@types/react-dom': 19.1.2(@types/react@19.1.2)
+
'@radix-ui/react-collection@1.1.4(@types/react-dom@19.1.2(@types/react@19.1.2))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.2)(react@19.1.0)
@@ -2226,6 +2277,13 @@ snapshots:
optionalDependencies:
'@types/react': 19.1.2
+ '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.1.2)(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+ use-sync-external-store: 1.5.0(react@19.1.0)
+ optionalDependencies:
+ '@types/react': 19.1.2
+
'@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.2)(react@19.1.0)':
dependencies:
react: 19.1.0
@@ -3136,6 +3194,11 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ iconsax-react@0.0.8(react@19.1.0):
+ dependencies:
+ prop-types: 15.8.1
+ react: 19.1.0
+
ignore@5.3.2: {}
import-fresh@3.3.1:
@@ -3874,6 +3937,10 @@ snapshots:
dependencies:
punycode: 2.3.1
+ use-sync-external-store@1.5.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
which-boxed-primitive@1.1.1:
dependencies:
is-bigint: 1.1.0
diff --git a/public/images/Ebook.png b/public/images/Ebook.png
new file mode 100644
index 0000000..89a5020
Binary files /dev/null and b/public/images/Ebook.png differ
diff --git a/public/images/Unconfirmed 311847.crdownload b/public/images/Unconfirmed 311847.crdownload
new file mode 100644
index 0000000..cc73baf
Binary files /dev/null and b/public/images/Unconfirmed 311847.crdownload differ
diff --git a/public/images/logo.png b/public/images/logo.png
new file mode 100644
index 0000000..e2e546e
Binary files /dev/null and b/public/images/logo.png differ
diff --git a/public/images/noUploads.png b/public/images/noUploads.png
new file mode 100644
index 0000000..172d753
Binary files /dev/null and b/public/images/noUploads.png differ
diff --git a/public/images/profile.jpeg b/public/images/profile.jpeg
new file mode 100644
index 0000000..c3d5590
Binary files /dev/null and b/public/images/profile.jpeg differ