From 844f7fe7c1976f07f35ad04ee74264f594522c51 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 19:19:45 +0000 Subject: [PATCH] feat(media): web project, editor, review, and brand kit views Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01NLSCTnhge4umMnemGXWr1w --- .../src/components/media/editor/Player.tsx | 210 ++++++ .../components/media/editor/PublishPanel.tsx | 191 ++++++ .../src/components/media/editor/Timeline.tsx | 320 ++++++++++ .../src/components/media/editor/chrome.tsx | 60 ++ .../src/components/media/editor/fields.tsx | 147 +++++ .../components/media/editor/media-files.ts | 93 +++ .../components/media/editor/renders.test.ts | 135 ++++ .../src/components/media/editor/renders.ts | 108 ++++ .../components/media/editor/review-parts.tsx | 162 +++++ .../components/media/editor/timeline.test.ts | 152 +++++ .../src/components/media/editor/timeline.ts | 271 ++++++++ apps/web/src/pages/media/BrandKitView.tsx | 587 ++++++++++++++++- apps/web/src/pages/media/EditorView.tsx | 450 ++++++++++++- apps/web/src/pages/media/ProjectView.tsx | 292 ++++++++- apps/web/src/pages/media/ReviewView.tsx | 597 +++++++++++++++++- 15 files changed, 3763 insertions(+), 12 deletions(-) create mode 100644 apps/web/src/components/media/editor/Player.tsx create mode 100644 apps/web/src/components/media/editor/PublishPanel.tsx create mode 100644 apps/web/src/components/media/editor/Timeline.tsx create mode 100644 apps/web/src/components/media/editor/chrome.tsx create mode 100644 apps/web/src/components/media/editor/fields.tsx create mode 100644 apps/web/src/components/media/editor/media-files.ts create mode 100644 apps/web/src/components/media/editor/renders.test.ts create mode 100644 apps/web/src/components/media/editor/renders.ts create mode 100644 apps/web/src/components/media/editor/review-parts.tsx create mode 100644 apps/web/src/components/media/editor/timeline.test.ts create mode 100644 apps/web/src/components/media/editor/timeline.ts diff --git a/apps/web/src/components/media/editor/Player.tsx b/apps/web/src/components/media/editor/Player.tsx new file mode 100644 index 0000000..82c3756 --- /dev/null +++ b/apps/web/src/components/media/editor/Player.tsx @@ -0,0 +1,210 @@ +import type { Edl } from "@rakazo/contracts"; +import { cn } from "@rakazo/ui-web"; +import { useCallback, useEffect, useImperativeHandle, useRef, useState } from "react"; +import { assetFileUrl, useMediaObjectUrl } from "./media-files"; +import { clipLengthMs, clipOutputStartMs, edlDurationMs, locateOutputTime } from "./timeline"; + +export interface PlayerHandle { + /** Jump to an output timestamp in ms. */ + seek(ms: number): void; +} + +/** What the source player currently shows, in source coordinates. */ +export interface SourceFrame { + outputMs: number; + clipId: string; + assetId: string; + sourceMs: number; +} + +/** Plays a finished render. Reports the playhead in output ms. */ +export function RenderVideo({ + src, + poster, + handleRef, + onTime, + className, + label, +}: { + src: string | null; + poster?: string | null; + handleRef?: React.Ref; + onTime?: (ms: number) => void; + className?: string; + label: string; +}) { + const video = useRef(null); + const pending = useRef(null); + useImperativeHandle(handleRef, () => ({ + seek(ms) { + const element = video.current; + if (!element || element.readyState < 1) { + pending.current = ms; + return; + } + element.currentTime = ms / 1000; + onTime?.(ms); + }, + })); + return ( + // biome-ignore lint/a11y/useMediaCaption: renders carry burned-in or sidecar captions. +