From deac121b4e9aa05b2e98949a1804ee0ee06acb53 Mon Sep 17 00:00:00 2001 From: cd Date: Sun, 14 Jun 2026 04:46:28 +0000 Subject: [PATCH 1/2] feat(vidl): redesign UI as a signal-capture console MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reimagine the video downloader with a broadcast signal-capture deck aesthetic — warm iron/paper palette, signal-amber accent and phosphor status colors, IBM Plex Sans/Mono + Bricolage Grotesque type, and a scanline/grain atmosphere. - Add app-scoped theme.css overriding light/dark tokens (raised selector specificity so they win regardless of CSS chunk load order), console panel treatment for cards, and the segment grid 'tape transport' styles - Replace the shared IK header with a custom deck header (wordmark, REC pulse, privacy call-sign) - Restructure the page into a hero band + channel selector toolbar - Slim the source/batch input card headers and drop the now-unused headerAction prop - Remove the clashing full-screen gradient background layer; the deck atmosphere is painted on body instead - Add console.* i18n keys (en/zh) --- apps/vidl/messages/en.json | 13 + apps/vidl/messages/zh.json | 13 + apps/vidl/src/app/[locale]/layout.tsx | 39 +-- apps/vidl/src/app/[locale]/page.tsx | 93 ++++-- apps/vidl/src/app/theme.css | 300 ++++++++++++++++++ .../downloader/batch-input-card.tsx | 10 +- .../components/downloader/progress-card.tsx | 22 +- .../src/components/downloader/source-card.tsx | 11 +- .../components/layout/client-providers.tsx | 50 +-- apps/vidl/src/components/layout/index.ts | 1 + .../src/components/layout/site-header.tsx | 53 ++++ 11 files changed, 491 insertions(+), 114 deletions(-) create mode 100644 apps/vidl/src/app/theme.css create mode 100644 apps/vidl/src/components/layout/site-header.tsx diff --git a/apps/vidl/messages/en.json b/apps/vidl/messages/en.json index fc572186..63491a9f 100644 --- a/apps/vidl/messages/en.json +++ b/apps/vidl/messages/en.json @@ -12,6 +12,19 @@ "footer": { "copyright": "Copyright © 2025-PRESENT |" }, + "console": { + "callsign": "Signal Capture Deck", + "privacy": "Browser-side · Zero upload", + "inputTitle": "Input Signal", + "inputHint": "Paste a stream URL — capture runs entirely on this device", + "channelSingle": "Single", + "channelBatch": "Batch", + "caps": { + "formats": "M3U8 / HLS / MP4", + "decrypt": "AES-128 decrypt", + "memory": "Near-zero memory" + } + }, "tool": { "title": "Video Downloader", "description": "Supports M3U8/HLS, MP4, and other video formats with range download, streaming, AES decryption, MP4 conversion" diff --git a/apps/vidl/messages/zh.json b/apps/vidl/messages/zh.json index e3e85632..b772b093 100644 --- a/apps/vidl/messages/zh.json +++ b/apps/vidl/messages/zh.json @@ -12,6 +12,19 @@ "footer": { "copyright": "Copyright © 2025-PRESENT |" }, + "console": { + "callsign": "信号捕获终端", + "privacy": "纯浏览器处理 · 零上传", + "inputTitle": "输入信号", + "inputHint": "粘贴流媒体链接 — 全程在本机捕获", + "channelSingle": "单条", + "channelBatch": "批量", + "caps": { + "formats": "M3U8 / HLS / MP4", + "decrypt": "AES-128 解密", + "memory": "近零内存占用" + } + }, "tool": { "title": "视频在线下载工具", "description": "支持 M3U8/HLS、MP4 等视频格式,范围下载、流式下载、AES 解密、转 MP4" diff --git a/apps/vidl/src/app/[locale]/layout.tsx b/apps/vidl/src/app/[locale]/layout.tsx index e5a1dd6f..b0ad2dfd 100644 --- a/apps/vidl/src/app/[locale]/layout.tsx +++ b/apps/vidl/src/app/[locale]/layout.tsx @@ -2,28 +2,37 @@ import { Toaster } from '@cdlab996/ui/components/sonner' import type { Metadata } from 'next' -import { Geist, Geist_Mono } from 'next/font/google' +import { + Bricolage_Grotesque, + IBM_Plex_Mono, + IBM_Plex_Sans, +} from 'next/font/google' import { notFound } from 'next/navigation' import type { Locale } from 'next-intl' import { hasLocale, NextIntlClientProvider } from 'next-intl' import { getMessages, setRequestLocale } from 'next-intl/server' import '@cdlab996/ui/globals.css' -import { IKHeader } from '@cdlab996/ui/IK' -import { - ClientProviders, - LanguageSelector, - ThemeToggle, -} from '@/components/layout' +import '../theme.css' +import { ClientProviders, SiteHeader } from '@/components/layout' import { routing } from '@/i18n/routing' -const geistSans = Geist({ - variable: '--font-geist-sans', +const plexSans = IBM_Plex_Sans({ + variable: '--font-plex-sans', + weight: ['400', '500', '600', '700'], subsets: ['latin'], }) -const geistMono = Geist_Mono({ +// keep the `--font-geist-mono` name so existing `font-mono` utilities resolve +const plexMono = IBM_Plex_Mono({ variable: '--font-geist-mono', + weight: ['400', '500', '600'], + subsets: ['latin'], +}) + +const bricolage = Bricolage_Grotesque({ + variable: '--font-bricolage', + weight: ['600', '700', '800'], subsets: ['latin'], }) @@ -324,17 +333,11 @@ export default async function LocaleLayout({ /> - - - - + {children} diff --git a/apps/vidl/src/app/[locale]/page.tsx b/apps/vidl/src/app/[locale]/page.tsx index 9f2af57e..be5f3eef 100644 --- a/apps/vidl/src/app/[locale]/page.tsx +++ b/apps/vidl/src/app/[locale]/page.tsx @@ -7,7 +7,7 @@ import { TabsTrigger, } from '@cdlab996/ui/components/tabs' import { IKPageContainer } from '@cdlab996/ui/IK' -import { ListPlus, Video } from 'lucide-react' +import { ListPlus, Lock, Radio, Video, Zap } from 'lucide-react' import Script from 'next/script' import { useTranslations } from 'next-intl' import { useEffect, useState } from 'react' @@ -45,26 +45,6 @@ export default function VideoDownloaderPage() { const busy = isDownloading || batch.isBatchRunning - const cardAction = ( -
- - - - - - - - -
- ) - return (