├── app ├── favicon.ico ├── page.tsx ├── layout.tsx ├── api │ ├── video-title │ │ └── route.ts │ ├── videos │ │ └── [id] │ │ │ ├── content │ │ │ └── route.ts │ │ │ └── route.ts │ ├── remix-video │ │ └── route.ts │ ├── generate-images │ │ └── route.ts │ ├── suggest-prompt │ │ └── route.ts │ └── generate-video │ │ └── route.ts └── globals.css ├── public ├── sora-2.png └── sora-demo-visual.jpg ├── postcss.config.mjs ├── next.config.ts ├── types └── generated.ts ├── lib ├── utils.ts └── sora.ts ├── ui ├── index.ts ├── Card.tsx ├── CardContent.tsx ├── Label.tsx ├── Input.tsx ├── Select.tsx ├── Textarea.tsx └── Button.tsx ├── eslint.config.mjs ├── .gitignore ├── components ├── ui │ ├── label.tsx │ ├── textarea.tsx │ ├── separator.tsx │ ├── input.tsx │ ├── tooltip.tsx │ ├── button.tsx │ ├── empty.tsx │ ├── input-group.tsx │ ├── select.tsx │ └── field.tsx ├── VideoSidebar.tsx ├── VideoPreviewOverlay.tsx ├── VideoCard.tsx ├── VideoForm.tsx └── App.tsx ├── tsconfig.json ├── LICENSE ├── package.json ├── hooks ├── useVideoPolling.ts ├── usePersistedState.ts ├── useThumbnails.ts ├── usePreview.ts └── useVideoForm.ts ├── utils ├── titles.ts ├── formatters.ts ├── image.ts └── video.ts ├── middleware.ts ├── README.md └── services └── soraApi.ts /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openai/openai-sora-sample-app/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/sora-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openai/openai-sora-sample-app/HEAD/public/sora-2.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /public/sora-demo-visual.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/openai/openai-sora-sample-app/HEAD/public/sora-demo-visual.jpg -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import App from "@/components/App"; 4 | 5 | export default function Page() { 6 | return ; 7 | } 8 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | import type { NextConfig } from "next"; 2 | 3 | const nextConfig: NextConfig = { 4 | devIndicators: false, 5 | }; 6 | 7 | export default nextConfig; 8 | -------------------------------------------------------------------------------- /types/generated.ts: -------------------------------------------------------------------------------- 1 | export interface GeneratedImageSuggestion { 2 | id: string; 3 | url: string; 4 | base64?: string | null; 5 | description?: string | null; 6 | } 7 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /ui/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Card } from "./Card"; 2 | export { default as CardContent } from "./CardContent"; 3 | export { default as Input } from "./Input"; 4 | export { default as Label } from "./Label"; 5 | export { default as Select } from "./Select"; 6 | export { default as Textarea } from "./Textarea"; 7 | -------------------------------------------------------------------------------- /ui/Card.tsx: -------------------------------------------------------------------------------- 1 | import type { PropsWithChildren } from "react"; 2 | 3 | export type CardProps = PropsWithChildren<{ className?: string }>; 4 | 5 | const Card = ({ children, className = "" }: CardProps) => ( 6 |
7 | {children} 8 |
9 | ); 10 | 11 | export default Card; 12 | -------------------------------------------------------------------------------- /ui/CardContent.tsx: -------------------------------------------------------------------------------- 1 | import type { PropsWithChildren } from "react"; 2 | 3 | export type CardContentProps = PropsWithChildren<{ className?: string }>; 4 | 5 | const CardContent = ({ children, className = "" }: CardContentProps) => ( 6 |
7 | {children} 8 |
9 | ); 10 | 11 | export default CardContent; 12 | -------------------------------------------------------------------------------- /ui/Label.tsx: -------------------------------------------------------------------------------- 1 | import type { LabelHTMLAttributes, PropsWithChildren } from "react"; 2 | 3 | export type LabelProps = PropsWithChildren>; 4 | 5 | const Label = ({ children, className = "", ...rest }: LabelProps) => ( 6 | 9 | ); 10 | 11 | export default Label; 12 | -------------------------------------------------------------------------------- /ui/Input.tsx: -------------------------------------------------------------------------------- 1 | import type { InputHTMLAttributes } from "react"; 2 | 3 | export type InputProps = InputHTMLAttributes; 4 | 5 | const Input = ({ className = "", ...props }: InputProps) => ( 6 | 10 | ); 11 | 12 | export default Input; 13 | -------------------------------------------------------------------------------- /ui/Select.tsx: -------------------------------------------------------------------------------- 1 | import type { SelectHTMLAttributes } from "react"; 2 | 3 | export type SelectProps = SelectHTMLAttributes; 4 | 5 | const Select = ({ className = "", ...props }: SelectProps) => ( 6 |