From 92caa27d7c31cd7eb120d00c841fcacabf7c85e7 Mon Sep 17 00:00:00 2001 From: Luis Esteban Acevedo Ladino Date: Wed, 29 Apr 2026 12:57:27 -0500 Subject: [PATCH] feat: add theme system with swappable palettes and rebrand to NeuralCut - Add multi-palette theme system using CSS custom properties via data-palette attribute - Create NeuralCut palette (rose/pink accent #F55385, dark charcoal #1B212B) as default - Preserve Classic (OpenCut blue) palette as selectable alternative - Add PaletteSelector component with dark/light toggle and palette picker - Migrate export button hardcoded colors to theme tokens - Rebrand all user-visible OpenCut references to NeuralCut across UI - Update package names and turbo filters for new identity --- apps/web/package.json | 2 +- apps/web/public/manifest.json | 2 +- apps/web/src/app/blog/page.tsx | 10 +- apps/web/src/app/brand/page.tsx | 14 +- apps/web/src/app/changelog/[version]/page.tsx | 2 +- apps/web/src/app/changelog/page.tsx | 16 +-- apps/web/src/app/contributors/page.tsx | 16 +-- apps/web/src/app/editor/[project_id]/page.tsx | 2 +- apps/web/src/app/globals.css | 125 ++++++++++++++++++ apps/web/src/app/layout.tsx | 10 +- apps/web/src/app/metadata.ts | 4 +- apps/web/src/app/privacy/page.tsx | 18 +-- apps/web/src/app/roadmap/page.tsx | 20 +-- apps/web/src/app/sponsors/page.tsx | 10 +- apps/web/src/app/terms/page.tsx | 38 +++--- .../dialogs/storage-persistence-dialog.tsx | 2 +- .../src/components/editor/editor-header.tsx | 4 +- .../src/components/editor/export-button.tsx | 6 +- .../web/src/components/editor/mobile-gate.tsx | 2 +- apps/web/src/components/editor/onboarding.tsx | 12 +- apps/web/src/components/footer.tsx | 14 +- apps/web/src/components/header.tsx | 17 +-- apps/web/src/components/landing/hero.tsx | 2 +- apps/web/src/components/palette-selector.tsx | 93 +++++++++++++ apps/web/src/hooks/use-storage-persistence.ts | 2 +- apps/web/src/lib/auth/server.ts | 2 +- apps/web/src/lib/site/brand.ts | 4 +- apps/web/src/lib/site/external-tools.ts | 4 +- apps/web/src/lib/site/sponsors.ts | 2 +- apps/web/src/lib/themes/index.ts | 3 + apps/web/src/lib/themes/palettes/classic.ts | 11 ++ apps/web/src/lib/themes/palettes/index.ts | 9 ++ apps/web/src/lib/themes/palettes/neuralcut.ts | 11 ++ apps/web/src/lib/themes/theme-provider.tsx | 48 +++++++ apps/web/src/lib/themes/theme-store.ts | 22 +++ apps/web/src/lib/themes/types.ts | 5 + apps/web/src/stores/keybindings-store.ts | 2 +- package.json | 16 +-- 38 files changed, 450 insertions(+), 132 deletions(-) create mode 100644 apps/web/src/components/palette-selector.tsx create mode 100644 apps/web/src/lib/themes/index.ts create mode 100644 apps/web/src/lib/themes/palettes/classic.ts create mode 100644 apps/web/src/lib/themes/palettes/index.ts create mode 100644 apps/web/src/lib/themes/palettes/neuralcut.ts create mode 100644 apps/web/src/lib/themes/theme-provider.tsx create mode 100644 apps/web/src/lib/themes/theme-store.ts create mode 100644 apps/web/src/lib/themes/types.ts diff --git a/apps/web/package.json b/apps/web/package.json index b8f38950..01566e09 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,5 +1,5 @@ { - "name": "@opencut/web", + "name": "@neuralcut/web", "version": "0.1.0", "private": true, "packageManager": "bun@1.2.18", diff --git a/apps/web/public/manifest.json b/apps/web/public/manifest.json index 3b05a125..1bc66845 100644 --- a/apps/web/public/manifest.json +++ b/apps/web/public/manifest.json @@ -1,5 +1,5 @@ { - "name": "OpenCut", + "name": "NeuralCut", "description": "A simple but powerful video editor that gets the job done. In your browser.", "display": "standalone", "start_url": "/", diff --git a/apps/web/src/app/blog/page.tsx b/apps/web/src/app/blog/page.tsx index 9f5a8972..d24e8a73 100644 --- a/apps/web/src/app/blog/page.tsx +++ b/apps/web/src/app/blog/page.tsx @@ -6,13 +6,13 @@ import { getPosts } from "@/lib/blog/query"; import type { Post } from "@/lib/blog/types"; export const metadata: Metadata = { - title: "Blog - OpenCut", + title: "Blog - NeuralCut", description: - "Read the latest news and updates about OpenCut, the free and open-source video editor.", + "Read the latest news and updates about NeuralCut, the free and open-source video editor.", openGraph: { - title: "Blog - OpenCut", + title: "Blog - NeuralCut", description: - "Read the latest news and updates about OpenCut, the free and open-source video editor.", + "Read the latest news and updates about NeuralCut, the free and open-source video editor.", type: "website", }, }; @@ -24,7 +24,7 @@ export default async function BlogPage() { return (
{data.posts.map((post) => ( diff --git a/apps/web/src/app/brand/page.tsx b/apps/web/src/app/brand/page.tsx index a7085154..9f20de4b 100644 --- a/apps/web/src/app/brand/page.tsx +++ b/apps/web/src/app/brand/page.tsx @@ -48,7 +48,7 @@ const ASSET_SECTIONS: AssetSection[] = [ { title: "Symbol", description: - "Use the symbol on its own when the OpenCut name is already present nearby or space is limited.", + "Use the symbol on its own when the NeuralCut name is already present nearby or space is limited.", cols: "2", assets: [ { @@ -112,7 +112,7 @@ export default function BrandPage() { title="Brand" description={ <> - Download OpenCut brand assets for use in your projects.{" "} + Download NeuralCut brand assets for use in your projects.{" "}

Usage

- OpenCut is open source — the code is free to use under its license. + NeuralCut is open source — the code is free to use under its license. That license does not cover the name or logo. You can say you use - OpenCut, that your project integrates with OpenCut, or that it was - built on top of OpenCut. You cannot name your product OpenCut, imply + NeuralCut, that your project integrates with NeuralCut, or that it was + built on top of NeuralCut. You cannot name your product NeuralCut, imply we made or endorse your product, or use the marks commercially without asking first. For anything unclear, reach out at{" "} What's not allowed

    {[ - "Using OpenCut in the name of your product, service, or domain.", - "Implying that OpenCut made, sponsors, or endorses your work.", + "Using NeuralCut in the name of your product, service, or domain.", + "Implying that NeuralCut made, sponsors, or endorses your work.", "Using the logo or name on merchandise or commercial marketing.", "Modifying the marks.", ].map((item) => ( diff --git a/apps/web/src/app/changelog/[version]/page.tsx b/apps/web/src/app/changelog/[version]/page.tsx index f069832b..09c2f040 100644 --- a/apps/web/src/app/changelog/[version]/page.tsx +++ b/apps/web/src/app/changelog/[version]/page.tsx @@ -24,7 +24,7 @@ export async function generateMetadata({ params }: Props): Promise { const release = getReleaseByVersion({ version }); if (!release) return {}; return { - title: `${release.title} (${release.version}) - OpenCut Changelog`, + title: `${release.title} (${release.version}) - NeuralCut Changelog`, description: release.description, }; } diff --git a/apps/web/src/app/changelog/page.tsx b/apps/web/src/app/changelog/page.tsx index 8440eaa2..a89f6cdd 100644 --- a/apps/web/src/app/changelog/page.tsx +++ b/apps/web/src/app/changelog/page.tsx @@ -14,25 +14,25 @@ import { } from "@/lib/changelog/components/release"; export const metadata: Metadata = { - title: "Changelog - OpenCut", - description: "What's new in OpenCut", + title: "Changelog - NeuralCut", + description: "What's new in NeuralCut", openGraph: { - title: "Changelog - OpenCut", - description: "Every update, improvement, and fix to OpenCut — documented.", + title: "Changelog - NeuralCut", + description: "Every update, improvement, and fix to NeuralCut — documented.", type: "website", images: [ { url: "/open-graph/changlog.jpg", width: 1200, height: 630, - alt: "OpenCut Changelog", + alt: "NeuralCut Changelog", }, ], }, twitter: { card: "summary_large_image", - title: "Changelog - OpenCut", - description: "What's new in OpenCut", + title: "Changelog - NeuralCut", + description: "What's new in NeuralCut", images: ["/open-graph/changlog.jpg"], }, }; @@ -41,7 +41,7 @@ export default function ChangelogPage() { const releases = getSortedReleases(); return ( - +
    @@ -87,7 +87,7 @@ export default async function ContributorsPage() {
    @@ -169,7 +169,7 @@ function AllContributorsSection({

    All contributors

    - Everyone who makes OpenCut better + Everyone who makes NeuralCut better

    @@ -211,7 +211,7 @@ function ExternalToolsSection() {

    External tools

    -

    Tools we use to build OpenCut

    +

    Tools we use to build NeuralCut

    diff --git a/apps/web/src/app/editor/[project_id]/page.tsx b/apps/web/src/app/editor/[project_id]/page.tsx index b6bf5f62..09d2b93e 100644 --- a/apps/web/src/app/editor/[project_id]/page.tsx +++ b/apps/web/src/app/editor/[project_id]/page.tsx @@ -55,7 +55,7 @@ function DegradedRendererBanner() { return (
    - For the best experience, open OpenCut in Chrome. + For the best experience, open NeuralCut in Chrome.