From 954160d03b3018691d13acce79e34de8361ff6f3 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Sat, 24 Jan 2026 15:53:46 +0100 Subject: [PATCH] lots more icons to do but --- .cursor/rules/codebase-index.mdc | 43 +---- apps/web/package.json | 2 + apps/web/src/app/contributors/page.tsx | 36 +--- apps/web/src/app/projects/page-legacy.tsx | 64 ++++--- apps/web/src/app/projects/page.tsx | 102 ++++++----- apps/web/src/app/sponsors/page.tsx | 16 +- .../editor/assets-panel/drag-overlay.tsx | 5 +- .../components/editor/assets-panel/tabbar.tsx | 4 +- .../editor/assets-panel/views/captions.tsx | 6 +- .../editor/assets-panel/views/media.tsx | 55 +++--- .../editor/assets-panel/views/settings.tsx | 5 +- .../editor/assets-panel/views/sounds.tsx | 32 ++-- .../editor/assets-panel/views/stickers.tsx | 56 +++--- .../src/components/editor/draggable-item.tsx | 4 +- .../src/components/editor/editor-header.tsx | 53 ++++-- .../src/components/editor/export-button.tsx | 5 +- .../editor/properties-panel/index.tsx | 16 +- .../editor/properties-panel/property-item.tsx | 8 +- .../properties-panel/text-properties.tsx | 5 +- .../shortcuts-dialog.tsx} | 45 +++-- .../components/editor/timeline/bookmarks.tsx | 7 +- .../src/components/editor/timeline/index.tsx | 46 +++-- .../editor/timeline/timeline-element.tsx | 13 +- .../editor/timeline/timeline-toolbar.tsx | 111 +++++++----- .../editor/timeline/timeline-track.tsx | 7 +- .../components/gitHub-contribute-section.tsx | 11 +- apps/web/src/components/header.tsx | 7 +- apps/web/src/components/theme-toggle.tsx | 5 +- apps/web/src/components/ui/color-picker.tsx | 2 +- apps/web/src/components/ui/spinner.tsx | 17 ++ apps/web/src/constants/timeline-constants.tsx | 31 +++- .../element/use-element-interaction.ts | 12 +- .../src/hooks/timeline/use-selection-box.ts | 14 +- ...-panel-store.ts => assets-panel-store.tsx} | 58 +++--- bun.lock | 6 + packages/ui/src/icons/brand.tsx | 42 ----- packages/ui/src/icons/editor.tsx | 165 ------------------ packages/ui/src/icons/index.tsx | 1 - packages/ui/src/icons/ui.tsx | 112 ++---------- 39 files changed, 519 insertions(+), 710 deletions(-) rename apps/web/src/components/{keyboard-shortcuts-help.tsx => editor/shortcuts-dialog.tsx} (84%) create mode 100644 apps/web/src/components/ui/spinner.tsx rename apps/web/src/stores/{assets-panel-store.ts => assets-panel-store.tsx} (55%) delete mode 100644 packages/ui/src/icons/editor.tsx diff --git a/.cursor/rules/codebase-index.mdc b/.cursor/rules/codebase-index.mdc index ecb93e2d..9d0d3d85 100644 --- a/.cursor/rules/codebase-index.mdc +++ b/.cursor/rules/codebase-index.mdc @@ -1179,7 +1179,7 @@ worker.ts ## apps/web/src/stores -assets-panel-store.ts +assets-panel-store.tsx export const TAB_KEYS export type Tab = (typeof TAB_KEYS)[number] export const tabs @@ -1678,8 +1678,6 @@ ui.ts ## packages/ui/src/icons brand.tsx - export function OcGoogleIcon({ className }: { className?: string }) - export function OcGithubIcon({ className }: { className?: string }) export function OcVercelIcon({ className }: { className?: string }) export function OcMarbleIcon({ className = "", @@ -1696,48 +1694,17 @@ brand.tsx size?: number; }) -editor.tsx - export function OcBackgroundIcon({ className }: { className?: string }) - export function OcSocialsIcon({ +ui.tsx + export function OcSplitKeepLeftIcon({ className = "", size = 32, }: { className?: string; size?: number; }) - export function OcTransitionUpIcon({ + export function OcSplitKeepRightIcon({ className = "", - size = 16, - }: { - className?: string; - size?: number; - }) - -ui.tsx - export function OcMenuIcon({ - className = "", - size = 16, - }: { - className?: string; - size?: number; - }) - export function OcPencilIcon({ - className = "", - size = 24, - }: { - className?: string; - size?: number; - }) - export function OcLeftArrowIcon({ - className = "", - size = 24, - }: { - className?: string; - size?: number; - }) - export function OcTrashIcon({ - className = "", - size = 24, + size = 32, }: { className?: string; size?: number; diff --git a/apps/web/package.json b/apps/web/package.json index 3a0e4725..09e8d7ca 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -21,6 +21,8 @@ "@ffmpeg/util": "^0.12.2", "@hello-pangea/dnd": "^18.0.1", "@hookform/resolvers": "^3.9.1", + "@hugeicons/core-free-icons": "^3.1.1", + "@hugeicons/react": "^1.1.4", "@huggingface/transformers": "^3.8.1", "@opencut/env": "workspace:*", "@opencut/ui": "workspace:*", diff --git a/apps/web/src/app/contributors/page.tsx b/apps/web/src/app/contributors/page.tsx index 25501f92..2e8c49cd 100644 --- a/apps/web/src/app/contributors/page.tsx +++ b/apps/web/src/app/contributors/page.tsx @@ -1,12 +1,9 @@ -import { OcGithubIcon } from "@opencut/ui/icons"; -import { ExternalLink } from "lucide-react"; import type { Metadata } from "next"; import Link from "next/link"; import { GitHubContributeSection } from "@/components/gitHub-contribute-section"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; -import { EXTERNAL_TOOLS, SOCIAL_LINKS } from "@/constants/site-constants"; +import { EXTERNAL_TOOLS } from "@/constants/site-constants"; import { BasePage } from "../base-page"; export const metadata: Metadata = { @@ -87,7 +84,6 @@ export default async function ContributorsPage() { {otherContributors.length > 0 && ( )} - {contributors.length === 0 && } -
-
- -
-
-

No contributors found

-

- Unable to load contributors at the moment. Check back later or view - on GitHub. -

-
-
- - - - - ); -} - function ExternalToolsSection() { return (
diff --git a/apps/web/src/app/projects/page-legacy.tsx b/apps/web/src/app/projects/page-legacy.tsx index 84971a91..7aeb9523 100644 --- a/apps/web/src/app/projects/page-legacy.tsx +++ b/apps/web/src/app/projects/page-legacy.tsx @@ -1,16 +1,5 @@ "use client"; -import { - ArrowDown01, - Calendar, - ChevronLeft, - MoreHorizontal, - Plus, - Search, - Trash2, - Video, - X, -} from "lucide-react"; import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/navigation"; @@ -41,6 +30,18 @@ import { import { useEditor } from "@/hooks/use-editor"; import type { TProjectMetadata } from "@/types/project"; import { formatDate } from "@/utils/date"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { + ArrowHorizontalIcon, + ArrowLeft01Icon, + Calendar04Icon, + Delete02Icon, + MultiplicationSignIcon, + PlusSignIcon, + Search01Icon, + SortingNineOneIcon, + Video01Icon, +} from "@hugeicons/core-free-icons"; export default function ProjectsPage() { const [isSelectionMode, setIsSelectionMode] = useState(false); @@ -160,7 +161,7 @@ export default function ProjectsPage() { href="/" className="hover:text-muted-foreground flex items-center gap-1 transition-colors" > - + Back
@@ -171,7 +172,7 @@ export default function ProjectsPage() { size="sm" onClick={handleCancelSelection} > - + Cancel {selectedProjects.size > 0 && ( @@ -180,7 +181,7 @@ export default function ProjectsPage() { size="sm" onClick={() => setIsBulkDeleteDialogOpen(true)} > - + Delete ({selectedProjects.size}) )} @@ -210,7 +211,7 @@ export default function ProjectsPage() { {isSelectionMode ? (
@@ -257,9 +258,8 @@ export default function ProjectsPage() { variant="outline" className="size-9 items-center justify-center" > -
@@ -458,7 +461,10 @@ function ProjectCard({ }`} onClick={(event) => event.preventDefault()} > -
@@ -575,7 +581,7 @@ function ProjectsLoader() { function CreateButton({ onClick }: { onClick?: () => void }) { return ( ); @@ -596,7 +602,10 @@ function EmptyState({
- +

No results found

@@ -614,7 +623,10 @@ function EmptyState({

-

No projects yet

@@ -623,7 +635,7 @@ function EmptyState({

diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx index 32243987..39a5b018 100644 --- a/apps/web/src/app/projects/page.tsx +++ b/apps/web/src/app/projects/page.tsx @@ -1,17 +1,18 @@ "use client"; -import { - ArrowDown, - Clock3, - Folder, - LayoutGrid, - List, - MoreHorizontal, - Plus, - Search, -} from "lucide-react"; import Image from "next/image"; import { useEffect, useMemo, useRef, useState } from "react"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { + ArrowHorizontalIcon, + Clock03Icon, + Folder03Icon, + GridViewIcon, + LeftToRightListDashIcon, + PlusSignIcon, + SearchIcon, + SortingNineOneIcon, +} from "@hugeicons/core-free-icons"; const projects = [ { @@ -110,7 +111,7 @@ export default function ProjectsPage() { href="/projects" className="flex items-center gap-3 rounded-2xl bg-blue-50/50 px-4 py-3 text-sm font-medium text-[#00A3FF]" > - + Projects
@@ -122,14 +123,20 @@ export default function ProjectsPage() { href="/projects" className="flex items-center gap-3 rounded-2xl px-4 py-3 text-sm font-medium text-slate-500 hover:bg-slate-50 hover:text-slate-900" > - + Marketing - + Social media @@ -143,7 +150,10 @@ export default function ProjectsPage() {
- + - +
@@ -176,7 +190,7 @@ export default function ProjectsPage() { type="button" className="flex items-center gap-2 rounded-full bg-[#00A3FF] px-5 py-2.5 text-sm font-semibold text-white hover:bg-[#008BE0] active:scale-95" > - + New project
@@ -210,7 +224,7 @@ export default function ProjectsPage() { className="inline-flex items-center gap-1.5 rounded-lg p-1 text-sm font-medium text-slate-500 hover:text-slate-900" > Name - +
@@ -243,9 +257,11 @@ export default function ProjectsPage() { className="rounded-full bg-white/90 p-2 text-slate-600 backdrop-blur-sm hover:bg-white hover:text-[#00A3FF]" aria-label="Project menu" > - +
@@ -268,7 +284,11 @@ export default function ProjectsPage() { {name}
-
@@ -281,42 +301,33 @@ export default function ProjectsPage() { ); diff --git a/apps/web/src/app/sponsors/page.tsx b/apps/web/src/app/sponsors/page.tsx index e674c935..5d8b4e6d 100644 --- a/apps/web/src/app/sponsors/page.tsx +++ b/apps/web/src/app/sponsors/page.tsx @@ -1,10 +1,11 @@ -import { ExternalLink } from "lucide-react"; import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; import { BasePage } from "@/app/base-page"; import { Card, CardContent } from "@/components/ui/card"; import { SPONSORS, type Sponsor } from "@/constants/site-constants"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { LinkSquare02Icon } from "@hugeicons/core-free-icons"; export const metadata: Metadata = { title: "Sponsors - OpenCut", @@ -25,9 +26,9 @@ export default function SponsorsPage() {

Sponsors

-

- Support OpenCut and help us build the future of free and open-source - video editing. +

+ Support OpenCut and help us build the future of privacy-first video + editing.

@@ -51,7 +52,7 @@ function SponsorCard({ sponsor }: { sponsor: Sponsor }) { href={sponsor.url} target="_blank" rel="noopener noreferrer" - className="size-full" + className="size-full" > @@ -67,7 +68,10 @@ function SponsorCard({ sponsor }: { sponsor: Sponsor }) {

{sponsor.name}

- +

{sponsor.description}

diff --git a/apps/web/src/components/editor/assets-panel/drag-overlay.tsx b/apps/web/src/components/editor/assets-panel/drag-overlay.tsx index 193ba966..3f69d1ed 100644 --- a/apps/web/src/components/editor/assets-panel/drag-overlay.tsx +++ b/apps/web/src/components/editor/assets-panel/drag-overlay.tsx @@ -1,4 +1,5 @@ -import { Upload } from "lucide-react"; +import { HugeiconsIcon } from "@hugeicons/react"; +import { UploadIcon } from "@hugeicons/core-free-icons"; interface MediaDragOverlayProps { isVisible: boolean; @@ -34,7 +35,7 @@ export function MediaDragOverlay({ onClick={(event) => handleClick({ event })} >
- +
diff --git a/apps/web/src/components/editor/assets-panel/tabbar.tsx b/apps/web/src/components/editor/assets-panel/tabbar.tsx index 140f6a83..8034ea56 100644 --- a/apps/web/src/components/editor/assets-panel/tabbar.tsx +++ b/apps/web/src/components/editor/assets-panel/tabbar.tsx @@ -59,7 +59,7 @@ export function TabBar() { type="button" aria-label={tab.label} className={cn( - "flex cursor-pointer flex-col items-center gap-0.5", + "flex cursor-pointer flex-col items-center gap-0.5 [&>svg]:size-4.5! opacity-100 hover:opacity-75", activeTab === tabKey ? "text-primary !opacity-100" : "text-muted-foreground", @@ -72,7 +72,7 @@ export function TabBar() { } }} > - + - {isProcessing && } + {isProcessing && } {isProcessing ? processingStep : "Generate transcript"}
diff --git a/apps/web/src/components/editor/assets-panel/views/media.tsx b/apps/web/src/components/editor/assets-panel/views/media.tsx index 394a2b90..7be18614 100644 --- a/apps/web/src/components/editor/assets-panel/views/media.tsx +++ b/apps/web/src/components/editor/assets-panel/views/media.tsx @@ -1,16 +1,5 @@ "use client"; -import type { LucideIcon } from "lucide-react"; -import { - ArrowDown01, - CloudUpload, - Grid2X2, - ImageIcon, - List, - Loader2, - Music, - Video, -} from "lucide-react"; import Image from "next/image"; import { useMemo, useState } from "react"; import { toast } from "sonner"; @@ -44,6 +33,17 @@ import { useAssetsPanelStore } from "@/stores/assets-panel-store"; import type { MediaAsset } from "@/types/assets"; import type { CreateTimelineElement } from "@/types/timeline"; import { cn } from "@/utils/ui"; +import { + CloudUploadIcon, + GridViewIcon, + LeftToRightListDashIcon, + SortingOneNineIcon, + Image02Icon, + Loading03Icon, + MusicNote03Icon, + Video01Icon, +} from "@hugeicons/core-free-icons"; +import { HugeiconsIcon, type IconSvgElement } from "@hugeicons/react"; export function MediaView() { const editor = useEditor(); @@ -207,9 +207,9 @@ export function MediaView() { className="w-full" > {isProcessing ? ( - + ) : ( - + )} Upload @@ -229,12 +229,9 @@ export function MediaView() { className="items-center justify-center" > {mediaViewMode === "grid" ? ( - + ) : ( - + )} @@ -255,10 +252,7 @@ export function MediaView() { disabled={isProcessing} className="items-center justify-center" > - + @@ -531,12 +525,12 @@ function MediaDurationLabel({ duration }: { duration?: number }) { } function MediaTypePlaceholder({ - icon: Icon, + icon, label, duration, variant, }: { - icon: LucideIcon; + icon: IconSvgElement; label: string; duration?: number; variant: "muted" | "bordered"; @@ -550,7 +544,7 @@ function MediaTypePlaceholder({ variant === "muted" ? "bg-muted/30" : "border", )} > -