From d8060147ed53bc624a142520ccbd5d5c0b80d9a6 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sat, 12 Sep 2026 15:57:27 +0800 Subject: [PATCH] chore: remove temporary files --- fix-colors.mjs | 128 -- old-index.vue | 3661 ------------------------------------------- old-nuxt.config.ts | 447 ------ old-nuxt2.config.ts | 433 ----- old-variables.css | 556 ------- old-variables2.css | 556 ------- 6 files changed, 5781 deletions(-) delete mode 100644 fix-colors.mjs delete mode 100644 old-index.vue delete mode 100644 old-nuxt.config.ts delete mode 100644 old-nuxt2.config.ts delete mode 100644 old-variables.css delete mode 100644 old-variables2.css diff --git a/fix-colors.mjs b/fix-colors.mjs deleted file mode 100644 index 003e18b..0000000 --- a/fix-colors.mjs +++ /dev/null @@ -1,128 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; - -async function walk(dir) { - const files = await fs.readdir(dir, { withFileTypes: true }); - let results = []; - for (const file of files) { - const res = path.resolve(dir, file.name); - if (file.isDirectory()) { - results = results.concat(await walk(res)); - } else if (file.name.endsWith('.vue')) { - results.push(res); - } - } - return results; -} - -async function fixColors() { - const dirs = [path.resolve('app', 'components'), path.resolve('app', 'pages'), path.resolve('app', 'layouts')]; - let files = []; - for (const dir of dirs) { - try { - files = files.concat(await walk(dir)); - } catch (e) { - // Ignore if dir doesn't exist - } - } - - for (const file of files) { - let content = await fs.readFile(file, 'utf-8'); - let original = content; - - // Generic regex for hardcoded grayscales in styles - const grayscales = { - '#000000': 'var(--bg-primary, #111111)', - '#000': 'var(--bg-primary, #111111)', - '#111111': 'var(--bg-primary, #111111)', - '#111': 'var(--bg-primary, #111111)', - '#1a1a1a': 'var(--bg-secondary, #1a1a1a)', - '#222222': 'var(--bg-tertiary, #222222)', - '#222': 'var(--bg-tertiary, #222222)', - '#2a2a2a': 'var(--bg-tertiary, #2a2a2a)', - '#333333': 'var(--bg-quaternary, #333333)', - '#333': 'var(--bg-quaternary, #333333)', - '#3a3a3a': 'var(--bg-quaternary, #3a3a3a)', - '#444444': 'var(--text-disabled, #444444)', - '#444': 'var(--text-disabled, #444444)', - '#666666': 'var(--text-quaternary, #666666)', - '#666': 'var(--text-quaternary, #666666)', - '#888888': 'var(--text-tertiary, #888888)', - '#888': 'var(--text-tertiary, #888888)', - '#999999': 'var(--text-tertiary, #999999)', - '#999': 'var(--text-tertiary, #999999)', - '#aaaaaa': 'var(--text-secondary, #aaaaaa)', - '#aaa': 'var(--text-secondary, #aaaaaa)', - '#cccccc': 'var(--text-secondary, #cccccc)', - '#ccc': 'var(--text-secondary, #cccccc)', - '#dddddd': 'var(--border-secondary, #dddddd)', - '#ddd': 'var(--border-secondary, #dddddd)', - '#eeeeee': 'var(--border-primary, #eeeeee)', - '#eee': 'var(--border-primary, #eeeeee)', - '#ffffff': 'var(--text-primary, #ffffff)', - '#fff': 'var(--text-primary, #ffffff)' - }; - - // We only want to replace inside diff --git a/old-nuxt.config.ts b/old-nuxt.config.ts deleted file mode 100644 index b5c3581..0000000 --- a/old-nuxt.config.ts +++ /dev/null @@ -1,447 +0,0 @@ -import wasm from 'vite-plugin-wasm' -import glsl from 'vite-plugin-glsl' -import { fileURLToPath } from 'url' -import { index, uniqueIndex } from 'drizzle-orm' - -const customSeoConfig: Record | null = (() => { - const raw = process.env.NUXT_PUBLIC_SEO_CONFIG - if (!raw) return null - try { - const parsed = JSON.parse(raw) - if (parsed && typeof parsed === 'object') return parsed as Record - return null - } catch { - return null - } -})() - -function readNumberEnv(name: string, defaultValue: number): number { - const raw = process.env[name] - if (raw === undefined || raw === '') return defaultValue - const num = Number(raw) - return Number.isFinite(num) ? num : defaultValue -} - -// https://nuxt.com/docs/api/configuration/nuxt-config -export default defineNuxtConfig({ - compatibilityDate: '2026-01-30', - future: { - compatibilityVersion: 4 - }, - srcDir: 'app', - serverDir: fileURLToPath(new URL('./server', import.meta.url)), - dir: { - public: fileURLToPath(new URL('./public', import.meta.url)) - }, - devtools: { enabled: process.env.NODE_ENV === 'development' }, - devServer: { - host: '0.0.0.0', - port: 3000 - }, - modules: [ - '@nuxtjs/tailwindcss', - ...((process.env.NODE_ENV === 'development' || process.env.npm_lifecycle_event?.includes('lint')) - ? ['@nuxt/eslint'] - : []), - ...((process.env.PWA_ENABLED || 'false') === 'true' - ? ['@vite-pwa/nuxt'] - : []) - ], - - pwa: (process.env.PWA_ENABLED || 'false') === 'true' - ? { - registerType: 'autoUpdate', - manifest: { - name: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - short_name: process.env.NUXT_PUBLIC_SITE_TITLE || 'VoiceHub', - description: process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - display: (process.env.PWA_DISPLAY as any) || 'standalone', - background_color: process.env.PWA_BACKGROUND_COLOR || '#000000', - theme_color: process.env.PWA_THEME_COLOR || '#111111', - icons: [ - { - src: '/images/logo.png', - sizes: '192x192', - type: 'image/png' - }, - { - src: '/images/logo.png', - sizes: '512x512', - type: 'image/png' - } - ] - }, - workbox: { - navigateFallback: '/', - globPatterns: ['**/*.{js,css,html,png,jpg,jpeg,svg,ico,webp,woff2}'] - }, - client: { - installPrompt: true, - periodicSyncForUpdates: 3600 - }, - devOptions: { - enabled: process.env.NODE_ENV === 'development' - } - } - : {}, - - // 寮曞叆鍏ㄥ眬CSS - css: [ - '~/assets/css/variables.css', - '~/assets/css/components.css', - '~/assets/css/main.css', - '~/assets/css/transitions.css', - '~/assets/css/mobile-admin.css', - '~/assets/css/print-fix.css', - '~/assets/css/sf-pro-icons.css' - ], - - build: { - transpile: [] - }, - - // 瀹為獙鎬т紭鍖栧姛鑳? experimental: { - payloadExtraction: true, - renderJsonPayloads: true, - viewTransition: true - }, - - // 閰嶇疆杩愯鏃堕厤缃? runtimeConfig: { - // 鏈嶅姟鍣ㄧ鏈夐敭锛堜笉浼氭毚闇插埌瀹㈡埛绔級 - jwtSecret: process.env.JWT_SECRET || 'your-secret-key', - // Redis閰嶇疆锛堝彲閫夛級 - redisUrl: process.env.REDIS_URL || '', - redisKeyPrefix: process.env.REDIS_KEY_PREFIX || '', - // Sentry 鏈嶅姟绔厤缃紙涓嶄細鏆撮湶鍒板鎴风锛? sentry: { - serverDsn: process.env.SENTRY_SERVER_DSN || process.env.SENTRY_DSN || '', - dsn: process.env.SENTRY_DSN || '', - errorSampleRate: readNumberEnv('SENTRY_ERROR_SAMPLE_RATE', 1.0), - tracesSampleRate: readNumberEnv('SENTRY_TRACES_SAMPLE_RATE', 1.0), - replaySessionSampleRate: readNumberEnv('SENTRY_REPLAY_SESSION_SAMPLE_RATE', 0), - replayOnErrorSampleRate: readNumberEnv('SENTRY_REPLAY_ON_ERROR_SAMPLE_RATE', 0), - release: process.env.SENTRY_RELEASE || '', - environment: process.env.SENTRY_ENVIRONMENT || process.env.NODE_ENV || 'production' - }, - // 鍏叡閿紙浼氭毚闇插埌瀹㈡埛绔級 - public: { - host: process.env.NUXT_PUBLIC_HOST || '', - apiBase: '/api', - oauth: { - github: !!process.env.GITHUB_CLIENT_ID, - casdoor: !!process.env.CASDOOR_CLIENT_ID, - google: !!process.env.GOOGLE_CLIENT_ID, - aggregate: !!process.env.AGGREGATE_OAUTH_APP_ID - }, - siteTitle: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - siteLogo: process.env.NUXT_PUBLIC_SITE_LOGO || '', - siteDescription: - process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?- 璁╀綘鐨勫0闊宠鍚', - isNetlify: process.env.NETLIFY === 'true', - // SEO 鑷畾涔夐厤缃紙閫氳繃 NUXT_PUBLIC_SEO_CONFIG 娉ㄥ叆 JSON 瀛楃涓诧級 - seoConfig: customSeoConfig ?? {}, - // 鍥惧舰楠岃瘉鐮佺浉鍏? captcha: { - enabled: (process.env.CAPTCHA_ENABLED || 'false') === 'true', - provider: process.env.CAPTCHA_PROVIDER || 'turnstile', - siteKey: process.env.CAPTCHA_SITE_KEY || '' - }, - // PWA 鐩稿叧缁撴瀯锛堟湰鍦颁笉鍚敤妯″潡锛屼絾淇濈暀閰嶇疆椤逛互渚夸笂灞傚簲鐢ㄤ娇鐢級 - pwa: { - enabled: (process.env.PWA_ENABLED || 'false') === 'true', - display: process.env.PWA_DISPLAY || 'standalone', - backgroundColor: process.env.PWA_BACKGROUND_COLOR || '#000000', - themeColor: process.env.PWA_THEME_COLOR || '#111111' - }, - // 涓婚閰嶇疆 - defaultTheme: process.env.NUXT_PUBLIC_DEFAULT_THEME || 'ClassicLight', - enabledThemes: (process.env.NUXT_PUBLIC_ENABLED_THEMES || 'ClassicLight,ModernLight') - .split(',') - .map((s) => s.trim()) - .filter(Boolean), - // Sentry 瀹㈡埛绔厤缃紙浠呭叕寮€ DSN 涓庨噰鏍风巼锛? sentry: { - dsn: process.env.SENTRY_DSN || '', - tracesSampleRate: readNumberEnv('SENTRY_TRACES_SAMPLE_RATE', 1.0), - replaySessionSampleRate: readNumberEnv('SENTRY_REPLAY_SESSION_SAMPLE_RATE', 0), - replayOnErrorSampleRate: readNumberEnv('SENTRY_REPLAY_ON_ERROR_SAMPLE_RATE', 0) - } - } - }, - - // 閰嶇疆鐜鍙橀噺 - app: { - head: { - title: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - htmlAttrs: { lang: 'zh-CN' }, - meta: [ - { charset: 'utf-8' }, - { - name: 'viewport', - content: - 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover' - }, - { - name: 'description', - content: - process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?- 璁╀綘鐨勫0闊宠鍚' - }, - // 绉诲姩绔紭鍖? { name: 'theme-color', content: '#111111' }, - { - name: 'x-default-theme', - content: process.env.NUXT_PUBLIC_DEFAULT_THEME || 'ClassicLight' - }, - { - name: 'x-enabled-themes', - content: process.env.NUXT_PUBLIC_ENABLED_THEMES || 'ClassicLight,ModernLight' - }, - { name: 'apple-mobile-web-app-capable', content: 'yes' }, - { name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' }, - { name: 'apple-mobile-web-app-title', content: 'VoiceHub绠$悊' }, - { name: 'mobile-web-app-capable', content: 'yes' }, - { name: 'format-detection', content: 'telephone=no' } - ], - script: [ - { - type: 'text/javascript', - tagPosition: 'head', - children: [ - `(function(){try{`, - ` var k='voicehub:theme', d=document, r=d.documentElement, s=null, eff=null, def=null, list=[];`, - ` try{`, - ` var mt=d.querySelector('meta[name="x-enabled-themes"]');`, - ` if(mt && mt.content){list=String(mt.content).split(',').map(function(x){return x.replace(/^\\s+|\\s+$/g,'')}).filter(Boolean)}`, - ` }catch(e){list=[]}`, - ` try{`, - ` var md=d.querySelector('meta[name="x-default-theme"]');`, - ` if(md && md.content){def=md.content}`, - ` }catch(e){def=null}`, - ` if(!def){def='ClassicLight'}`, - ` if(list.length===0){list=['ClassicLight','ModernLight']}`, - ` function valid(t){`, - ` if(list.indexOf(t)!==-1){return t}`, - ` if(list.indexOf(def)!==-1){return def}`, - ` return list[0]`, - ` }`, - ` try{s=localStorage.getItem(k)}catch(e){s=null}`, - ` if(!s){s=def}`, - ` else{s=valid(s)}`, - ` if(typeof s==='string' && (s==='System'||s==='system')){eff=window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light'}`, - ` else if(typeof s==='string'){eff=s.endsWith('Dark')||s==='dark'?'dark':(s.endsWith('Light')||s==='light'?'light':s)}`, - ` else{eff='light'}`, - ` r.setAttribute('data-theme', (typeof s==='string'?s:eff));`, - ` if(eff==='dark'){r.classList.add('dark'); r.classList.remove('light'); r.style.colorScheme='dark'}`, - ` else if(eff==='light'){r.classList.add('light'); r.classList.remove('dark'); r.style.colorScheme='light'}`, - ` else{r.classList.remove('dark','light'); r.style.colorScheme='light dark'}`, - ` try{`, - ` var tm=d.querySelector('meta[name="theme-color"]');`, - ` if(tm){tm.content=(eff==='light'?'#f8fafc':'#111111')}`, - ` }catch(e){}`, - `}catch(e){}})();` - ].join('') - } - ], - link: [ - { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, - { rel: 'preload', as: 'image', href: '/images/logo.png' }, - { rel: 'preload', as: 'image', href: '/images/site-logo.png' }, - { rel: 'preload', as: 'image', href: '/images/school-logo-white.png' }, - // 浼樺厛鍔犺浇甯歌瀛椾綋锛岀‘淇濋〉闈㈠揩閫熸樉绀? { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Regular.min.css' - }, - { - rel: 'stylesheet', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Regular.min.css' - }, - // 寤惰繜鍔犺浇鍏朵粬瀛楅噸锛岄伩鍏嶉樆濉為〉闈㈡覆鏌? { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Medium.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - }, - { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Semibold.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - }, - { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Bold.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - } - ] - } - }, - - features: { - inlineStyles: false - }, - - // TypeScript閰嶇疆 - typescript: { - strict: true - }, - - // 鏈嶅姟鍣ㄧ閰嶇疆 - nitro: { - compressPublicAssets: true, - preset: process.env.VERCEL - ? 'vercel' - : process.env.NETLIFY - ? 'netlify' - : process.env.NITRO_PRESET || 'node-server', - // 澧炲己閿欒澶勭悊鍜岀ǔ瀹氭€? experimental: { - wasm: true, - asyncContext: true - }, - timing: true, - // 澧炲姞璇锋眰瓒呮椂鏃堕棿 - routeRules: { - // 瀹屽叏绂佺敤鎵€鏈堿PI璺敱鐨勭紦瀛橈紝纭繚姣忔閮借姹傛暟鎹簱 - '/api/**': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0', - Connection: 'keep-alive' - } - }, - // 闈欐€佽祫婧愭枃浠剁紦瀛橀厤缃? '/_nuxt/**': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/assets/**': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/favicon.ico': { - headers: { - 'Cache-Control': 'public, max-age=86400' - } - }, - // 鍥剧墖銆丆SS銆丣S绛夐潤鎬佽祫婧愮紦瀛? '/**/*.{png,jpg,jpeg,gif,webp,svg,ico}': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/**/*.{css,js}': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - // 璁よ瘉鐩稿叧椤甸潰涓嶇紦瀛? '/login': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/dashboard': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/change-password': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/auth/**': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/notification-settings': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - } - }, - // 鏍规嵁閮ㄧ讲鐜璋冩暣閰嶇疆 - ...(process.env.VERCEL - ? { - // Vercel 鐜锛氫娇鐢ㄦ爣鍑嗛厤缃? } - : process.env.NETLIFY - ? { - // Netlify 鐜锛氱‘淇?Drizzle 姝g‘鎵撳寘 - experimental: { - wasm: true - } - } - : { - // 鍏朵粬鐜锛氫娇鐢ㄦ爣鍑嗛厤缃? }) - }, - - // Vite 閰嶇疆 - vite: { - build: { - chunkSizeWarningLimit: 2000, - cssCodeSplit: true, - rollupOptions: { - maxParallelFileOps: 2, - output: { - manualChunks(id) { - if (id.includes('node_modules/lucide-vue-next')) { - return 'lucide' - } - } - } - } - }, - resolve: { - alias: [ - { - find: '@applemusic-like-lyrics/core/style.css', - replacement: fileURLToPath( - new URL('./vendor/amll-core/src/styles/index.css', import.meta.url) - ) - }, - { - find: '@applemusic-like-lyrics/core', - replacement: fileURLToPath(new URL('./vendor/amll-core/src/index.ts', import.meta.url)) - } - ] - }, - plugins: [wasm(), glsl()], - optimizeDeps: { - include: ['drizzle-orm'], - exclude: ['@applemusic-like-lyrics/vue', '@applemusic-like-lyrics/lyric'] - }, - build: { - sourcemap: false, - rollupOptions: { - output: { - manualChunks(id) { - if (!id.includes('node_modules')) return - if (id.includes('lucide-vue-next')) return 'icons' - if (id.includes('@pixi')) return 'pixi' - if (id.includes('@applemusic-like-lyrics')) return 'lyric-engine' - if (id.includes('drizzle-orm') || id.includes('postgres')) return 'database' - if (id.includes('xlsx') || id.includes('jspdf') || id.includes('jszip')) return 'office' - } - } - } - }, - // 娣诲姞 WASM 鏀寔閰嶇疆 - assetsInclude: ['**/*.wasm'], - // SSR閰嶇疆 - ssr: { - noExternal: process.env.NETLIFY - ? ['drizzle-orm', 'postgres'] - : process.env.VERCEL - ? [] - : ['drizzle-orm', 'postgres'] - } - } -}) diff --git a/old-nuxt2.config.ts b/old-nuxt2.config.ts deleted file mode 100644 index 41bc534..0000000 --- a/old-nuxt2.config.ts +++ /dev/null @@ -1,433 +0,0 @@ -import wasm from 'vite-plugin-wasm' -import glsl from 'vite-plugin-glsl' -import { fileURLToPath } from 'url' -import { index, uniqueIndex } from 'drizzle-orm' - -const customSeoConfig: Record | null = (() => { - const raw = process.env.NUXT_PUBLIC_SEO_CONFIG - if (!raw) return null - try { - const parsed = JSON.parse(raw) - if (parsed && typeof parsed === 'object') return parsed as Record - return null - } catch { - return null - } -})() - -function readNumberEnv(name: string, defaultValue: number): number { - const raw = process.env[name] - if (raw === undefined || raw === '') return defaultValue - const num = Number(raw) - return Number.isFinite(num) ? num : defaultValue -} - -// https://nuxt.com/docs/api/configuration/nuxt-config -export default defineNuxtConfig({ - compatibilityDate: '2026-01-30', - future: { - compatibilityVersion: 4 - }, - srcDir: 'app', - serverDir: fileURLToPath(new URL('./server', import.meta.url)), - dir: { - public: fileURLToPath(new URL('./public', import.meta.url)) - }, - devtools: { enabled: process.env.NODE_ENV === 'development' }, - devServer: { - host: '0.0.0.0', - port: 3000 - }, - modules: [ - '@nuxtjs/tailwindcss', - ...((process.env.NODE_ENV === 'development' || process.env.npm_lifecycle_event?.includes('lint')) - ? ['@nuxt/eslint'] - : []), - ...((process.env.PWA_ENABLED || 'false') === 'true' - ? ['@vite-pwa/nuxt'] - : []) - ], - - pwa: (process.env.PWA_ENABLED || 'false') === 'true' - ? { - registerType: 'autoUpdate', - manifest: { - name: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - short_name: process.env.NUXT_PUBLIC_SITE_TITLE || 'VoiceHub', - description: process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - display: (process.env.PWA_DISPLAY as any) || 'standalone', - background_color: process.env.PWA_BACKGROUND_COLOR || '#000000', - theme_color: process.env.PWA_THEME_COLOR || '#111111', - icons: [ - { - src: '/images/logo.png', - sizes: '192x192', - type: 'image/png' - }, - { - src: '/images/logo.png', - sizes: '512x512', - type: 'image/png' - } - ] - }, - workbox: { - navigateFallback: '/', - globPatterns: ['**/*.{js,css,html,png,jpg,jpeg,svg,ico,webp,woff2}'] - }, - client: { - installPrompt: true, - periodicSyncForUpdates: 3600 - }, - devOptions: { - enabled: process.env.NODE_ENV === 'development' - } - } - : {}, - - // 寮曞叆鍏ㄥ眬CSS - css: [ - '~/assets/css/variables.css', - '~/assets/css/components.css', - '~/assets/css/main.css', - '~/assets/css/transitions.css', - '~/assets/css/mobile-admin.css', - '~/assets/css/print-fix.css', - '~/assets/css/sf-pro-icons.css' - ], - - build: { - transpile: [] - }, - - // 瀹為獙鎬т紭鍖栧姛鑳? experimental: { - payloadExtraction: true, - renderJsonPayloads: true, - viewTransition: true - }, - - // 閰嶇疆杩愯鏃堕厤缃? runtimeConfig: { - // 鏈嶅姟鍣ㄧ鏈夐敭锛堜笉浼氭毚闇插埌瀹㈡埛绔級 - jwtSecret: process.env.JWT_SECRET || 'your-secret-key', - // Redis閰嶇疆锛堝彲閫夛級 - redisUrl: process.env.REDIS_URL || '', - redisKeyPrefix: process.env.REDIS_KEY_PREFIX || '', - // Sentry 鏈嶅姟绔厤缃紙涓嶄細鏆撮湶鍒板鎴风锛? sentry: { - serverDsn: process.env.SENTRY_SERVER_DSN || process.env.SENTRY_DSN || '', - dsn: process.env.SENTRY_DSN || '', - errorSampleRate: readNumberEnv('SENTRY_ERROR_SAMPLE_RATE', 1.0), - tracesSampleRate: readNumberEnv('SENTRY_TRACES_SAMPLE_RATE', 1.0), - replaySessionSampleRate: readNumberEnv('SENTRY_REPLAY_SESSION_SAMPLE_RATE', 0), - replayOnErrorSampleRate: readNumberEnv('SENTRY_REPLAY_ON_ERROR_SAMPLE_RATE', 0), - release: process.env.SENTRY_RELEASE || '', - environment: process.env.SENTRY_ENVIRONMENT || process.env.NODE_ENV || 'production' - }, - // 鍏叡閿紙浼氭毚闇插埌瀹㈡埛绔級 - public: { - host: process.env.NUXT_PUBLIC_HOST || '', - apiBase: '/api', - oauth: { - github: !!process.env.GITHUB_CLIENT_ID, - casdoor: !!process.env.CASDOOR_CLIENT_ID, - google: !!process.env.GOOGLE_CLIENT_ID, - aggregate: !!process.env.AGGREGATE_OAUTH_APP_ID - }, - siteTitle: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - siteLogo: process.env.NUXT_PUBLIC_SITE_LOGO || '', - siteDescription: - process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?- 璁╀綘鐨勫0闊宠鍚', - isNetlify: process.env.NETLIFY === 'true', - // SEO 鑷畾涔夐厤缃紙閫氳繃 NUXT_PUBLIC_SEO_CONFIG 娉ㄥ叆 JSON 瀛楃涓诧級 - seoConfig: customSeoConfig ?? {}, - // 鍥惧舰楠岃瘉鐮佺浉鍏? captcha: { - enabled: (process.env.CAPTCHA_ENABLED || 'false') === 'true', - provider: process.env.CAPTCHA_PROVIDER || 'turnstile', - siteKey: process.env.CAPTCHA_SITE_KEY || '' - }, - // PWA 鐩稿叧缁撴瀯锛堟湰鍦颁笉鍚敤妯″潡锛屼絾淇濈暀閰嶇疆椤逛互渚夸笂灞傚簲鐢ㄤ娇鐢級 - pwa: { - enabled: (process.env.PWA_ENABLED || 'false') === 'true', - display: process.env.PWA_DISPLAY || 'standalone', - backgroundColor: process.env.PWA_BACKGROUND_COLOR || '#000000', - themeColor: process.env.PWA_THEME_COLOR || '#111111' - }, - // 涓婚閰嶇疆 - defaultTheme: process.env.NUXT_PUBLIC_DEFAULT_THEME || 'ClassicLight', - enabledThemes: (process.env.NUXT_PUBLIC_ENABLED_THEMES || 'ClassicLight,ModernLight') - .split(',') - .map((s) => s.trim()) - .filter(Boolean), - // Sentry 瀹㈡埛绔厤缃紙浠呭叕寮€ DSN 涓庨噰鏍风巼锛? sentry: { - dsn: process.env.SENTRY_DSN || '', - tracesSampleRate: readNumberEnv('SENTRY_TRACES_SAMPLE_RATE', 1.0), - replaySessionSampleRate: readNumberEnv('SENTRY_REPLAY_SESSION_SAMPLE_RATE', 0), - replayOnErrorSampleRate: readNumberEnv('SENTRY_REPLAY_ON_ERROR_SAMPLE_RATE', 0) - } - } - }, - - // 閰嶇疆鐜鍙橀噺 - app: { - head: { - title: process.env.NUXT_PUBLIC_SITE_TITLE || '鏍″洯骞挎挱绔欑偣姝岀郴缁?, - htmlAttrs: { lang: 'zh-CN' }, - meta: [ - { charset: 'utf-8' }, - { - name: 'viewport', - content: - 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover' - }, - { - name: 'description', - content: - process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '鏍″洯骞挎挱绔欑偣姝岀郴缁?- 璁╀綘鐨勫0闊宠鍚' - }, - // 绉诲姩绔紭鍖? { name: 'theme-color', content: '#111111' }, - { - name: 'x-default-theme', - content: process.env.NUXT_PUBLIC_DEFAULT_THEME || 'System' - }, - { name: 'apple-mobile-web-app-capable', content: 'yes' }, - { name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' }, - { name: 'apple-mobile-web-app-title', content: 'VoiceHub绠$悊' }, - { name: 'mobile-web-app-capable', content: 'yes' }, - { name: 'format-detection', content: 'telephone=no' } - ], - script: [ - { - type: 'text/javascript', - tagPosition: 'head', - children: [ - `(function(){try{`, - ` var k='voicehub:theme', d=document, r=d.documentElement, s=null, eff=null;`, - ` try{s=localStorage.getItem(k)}catch(e){s=null}`, - ` if(!s){`, - ` try{`, - ` var meta=document.querySelector('meta[name="x-default-theme"]');`, - ` if(meta && meta.content){s=meta.content}`, - ` }catch(e){s=null}`, - ` if(!s){s='System'}`, - ` }`, - ` if(s==='System'||s==='system'){eff=window.matchMedia('(prefers-color-scheme: dark)').matches?'dark':'light'}`, - ` else if(typeof s==='string'){eff=s.endsWith('Dark')||s==='dark'?'dark':(s.endsWith('Light')||s==='light'?'light':s)}`, - ` else{eff='dark'}`, - ` r.setAttribute('data-theme', (typeof s==='string'?s:eff));`, - ` if(eff==='dark'){r.classList.add('dark'); r.classList.remove('light'); r.style.colorScheme='dark'}`, - ` else if(eff==='light'){r.classList.add('light'); r.classList.remove('dark'); r.style.colorScheme='light'}`, - ` else{r.classList.remove('dark','light'); r.style.colorScheme='light dark'}`, - ` try{`, - ` var tm=d.querySelector('meta[name="theme-color"]');`, - ` if(tm){tm.content=(eff==='light'?'#f8fafc':'#111111')}`, - ` }catch(e){}`, - `}catch(e){}})();` - ].join('') - } - ], - link: [ - { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }, - { rel: 'preload', as: 'image', href: '/images/logo.png' }, - { rel: 'preload', as: 'image', href: '/images/site-logo.png' }, - { rel: 'preload', as: 'image', href: '/images/school-logo-white.png' }, - // 浼樺厛鍔犺浇甯歌瀛椾綋锛岀‘淇濋〉闈㈠揩閫熸樉绀? { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Regular.min.css' - }, - { - rel: 'stylesheet', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Regular.min.css' - }, - // 寤惰繜鍔犺浇鍏朵粬瀛楅噸锛岄伩鍏嶉樆濉為〉闈㈡覆鏌? { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Medium.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - }, - { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Semibold.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - }, - { - rel: 'preload', - as: 'style', - href: 'https://cdn.jsdelivr.net/npm/misans@4.1.0/lib/Normal/MiSans-Bold.min.css', - onload: "this.onload=null;this.rel='stylesheet'" - } - ] - } - }, - - features: { - inlineStyles: false - }, - - // TypeScript閰嶇疆 - typescript: { - strict: true - }, - - // 鏈嶅姟鍣ㄧ閰嶇疆 - nitro: { - compressPublicAssets: true, - preset: process.env.VERCEL - ? 'vercel' - : process.env.NETLIFY - ? 'netlify' - : process.env.NITRO_PRESET || 'node-server', - // 澧炲己閿欒澶勭悊鍜岀ǔ瀹氭€? experimental: { - wasm: true, - asyncContext: true - }, - timing: true, - // 澧炲姞璇锋眰瓒呮椂鏃堕棿 - routeRules: { - // 瀹屽叏绂佺敤鎵€鏈堿PI璺敱鐨勭紦瀛橈紝纭繚姣忔閮借姹傛暟鎹簱 - '/api/**': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0', - Connection: 'keep-alive' - } - }, - // 闈欐€佽祫婧愭枃浠剁紦瀛橀厤缃? '/_nuxt/**': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/assets/**': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/favicon.ico': { - headers: { - 'Cache-Control': 'public, max-age=86400' - } - }, - // 鍥剧墖銆丆SS銆丣S绛夐潤鎬佽祫婧愮紦瀛? '/**/*.{png,jpg,jpeg,gif,webp,svg,ico}': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - '/**/*.{css,js}': { - headers: { - 'Cache-Control': 'public, max-age=31536000, immutable' - } - }, - // 璁よ瘉鐩稿叧椤甸潰涓嶇紦瀛? '/login': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/dashboard': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/change-password': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/auth/**': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - }, - '/notification-settings': { - headers: { - 'Cache-Control': 'no-cache, no-store, must-revalidate', - Pragma: 'no-cache', - Expires: '0' - } - } - }, - // 鏍规嵁閮ㄧ讲鐜璋冩暣閰嶇疆 - ...(process.env.VERCEL - ? { - // Vercel 鐜锛氫娇鐢ㄦ爣鍑嗛厤缃? } - : process.env.NETLIFY - ? { - // Netlify 鐜锛氱‘淇?Drizzle 姝g‘鎵撳寘 - experimental: { - wasm: true - } - } - : { - // 鍏朵粬鐜锛氫娇鐢ㄦ爣鍑嗛厤缃? }) - }, - - // Vite 閰嶇疆 - vite: { - build: { - chunkSizeWarningLimit: 2000, - cssCodeSplit: true, - rollupOptions: { - maxParallelFileOps: 2, - output: { - manualChunks(id) { - if (id.includes('node_modules/lucide-vue-next')) { - return 'lucide' - } - } - } - } - }, - resolve: { - alias: [ - { - find: '@applemusic-like-lyrics/core/style.css', - replacement: fileURLToPath( - new URL('./vendor/amll-core/src/styles/index.css', import.meta.url) - ) - }, - { - find: '@applemusic-like-lyrics/core', - replacement: fileURLToPath(new URL('./vendor/amll-core/src/index.ts', import.meta.url)) - } - ] - }, - plugins: [wasm(), glsl()], - optimizeDeps: { - include: ['drizzle-orm'], - exclude: ['@applemusic-like-lyrics/vue', '@applemusic-like-lyrics/lyric'] - }, - build: { - sourcemap: false, - rollupOptions: { - output: { - manualChunks(id) { - if (!id.includes('node_modules')) return - if (id.includes('lucide-vue-next')) return 'icons' - if (id.includes('@pixi')) return 'pixi' - if (id.includes('@applemusic-like-lyrics')) return 'lyric-engine' - if (id.includes('drizzle-orm') || id.includes('postgres')) return 'database' - if (id.includes('xlsx') || id.includes('jspdf') || id.includes('jszip')) return 'office' - } - } - } - }, - // 娣诲姞 WASM 鏀寔閰嶇疆 - assetsInclude: ['**/*.wasm'], - // SSR閰嶇疆 - ssr: { - noExternal: process.env.NETLIFY - ? ['drizzle-orm', 'postgres'] - : process.env.VERCEL - ? [] - : ['drizzle-orm', 'postgres'] - } - } -}) diff --git a/old-variables.css b/old-variables.css deleted file mode 100644 index 3fe2829..0000000 --- a/old-variables.css +++ /dev/null @@ -1,556 +0,0 @@ -/* 鍏ㄥ眬CSS鍙橀噺 - 缁熶竴閰嶈壊鏂规 */ -:root { - /* 涓昏壊璋?*/ - --primary: #3b82f6; - --primary-hover: #2563eb; - --primary-light: rgba(59, 130, 246, 0.1); - --primary-border: rgba(59, 130, 246, 0.2); - - /* 鎴愬姛鑹?*/ - --success: #10b981; - --success-hover: #059669; - --success-light: rgba(16, 185, 129, 0.1); - --success-border: rgba(16, 185, 129, 0.2); - - /* 璀﹀憡鑹?*/ - --warning: #f59e0b; - --warning-hover: #d97706; - --warning-light: rgba(245, 158, 11, 0.1); - --warning-border: rgba(245, 158, 11, 0.2); - - /* 閿欒鑹?*/ - --error: #ef4444; - --error-hover: #dc2626; - --error-light: rgba(239, 68, 68, 0.1); - --error-border: rgba(239, 68, 68, 0.2); - - /* 淇℃伅鑹?*/ - --info: #3b82f6; - --info-hover: #2563eb; - --info-light: rgba(59, 130, 246, 0.1); - --info-border: rgba(59, 130, 246, 0.2); - - /* 鑳屾櫙鑹?*/ - --bg-primary: #111111; - --bg-secondary: #1a1a1a; - --bg-tertiary: #2a2a2a; - --bg-quaternary: #3a3a3a; - --bg-hover: #1f1f1f; - - /* 鏂囧瓧棰滆壊 */ - --text-primary: #ffffff; - --text-secondary: #cccccc; - --text-tertiary: #888888; - --text-quaternary: #666666; - --text-disabled: #444444; - - /* 杈规棰滆壊 */ - --border-primary: #1f1f1f; - --border-secondary: #2a2a2a; - --border-tertiary: #3a3a3a; - --border-quaternary: #4a4a4a; - - /* 闃村奖 */ - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1); - - /* 鍦嗚 */ - --radius-sm: 4px; - --radius-md: 6px; - --radius-lg: 8px; - --radius-xl: 12px; - --radius-2xl: 16px; - - /* 闂磋窛 */ - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 12px; - --spacing-lg: 16px; - --spacing-xl: 20px; - --spacing-2xl: 24px; - --spacing-3xl: 32px; - - /* 瀛椾綋澶у皬 */ - --text-xs: 12px; - --text-sm: 14px; - --text-base: 16px; - --text-lg: 18px; - --text-xl: 20px; - --text-2xl: 24px; - --text-3xl: 30px; - - /* 瀛椾綋绮楃粏 */ - --font-normal: 400; - --font-medium: 500; - --font-semibold: 600; - --font-bold: 700; - - /* 杩囨浮鍔ㄧ敾 */ - --transition-fast: 0.15s ease; - --transition-normal: 0.2s ease; - --transition-slow: 0.3s ease; - - /* Z-index灞傜骇 */ - --z-dropdown: 100; - --z-sticky: 200; - --z-fixed: 300; - --z-modal-backdrop: 400; - --z-modal: 500; - --z-popover: 600; - --z-tooltip: 700; - --z-toast: 800; - - /* 鐗规畩鐘舵€侀鑹?*/ - --status-pending: #fbbf24; - --status-pending-light: rgba(251, 191, 36, 0.1); - --status-approved: #10b981; - --status-approved-light: rgba(16, 185, 129, 0.1); - --status-played: #6b7280; - --status-played-light: rgba(107, 114, 128, 0.1); - - /* 鎶曠エ鐩稿叧棰滆壊 */ - --vote-heart: #ef4444; - --vote-heart-hover: #dc2626; - --vote-count: var(--text-tertiary); - - /* 鎷栨嫿鐘舵€侀鑹?*/ - --drag-over: var(--primary-light); - --drag-over-border: var(--primary); - --dragging-opacity: 0.5; - - /* 琛ㄦ牸棰滆壊 */ - --table-header-bg: var(--bg-tertiary); - --table-row-hover: var(--bg-hover); - --table-border: var(--border-secondary); - --table-selected: var(--primary-light); - - /* 鍗$墖棰滆壊 */ - --card-bg: var(--bg-secondary); - --card-border: var(--border-secondary); - --card-hover-border: var(--border-tertiary); - --card-shadow: var(--shadow-md); - - /* 鎸夐挳棰滆壊 */ - --btn-primary-bg: var(--primary); - --btn-primary-hover: var(--primary-hover); - --btn-primary-text: var(--text-primary); - --btn-primary-border: var(--primary-border); - - --btn-secondary-bg: #3a3a3a; - --btn-secondary-hover: #4a4a4a; - --btn-secondary-text: var(--text-primary); - --btn-secondary-border: #555555; - - --btn-success-bg: var(--success); - --btn-success-hover: var(--success-hover); - --btn-success-text: var(--text-primary); - --btn-success-border: var(--success-border); - - --btn-warning-bg: var(--warning); - --btn-warning-hover: var(--warning-hover); - --btn-warning-text: var(--text-primary); - --btn-warning-border: var(--warning-border); - - --btn-error-bg: var(--error); - --btn-error-hover: var(--error-hover); - --btn-error-text: var(--text-primary); - --btn-error-border: var(--error-border); - - --btn-disabled-bg: var(--bg-tertiary); - --btn-disabled-text: var(--text-disabled); - - /* 杈撳叆妗嗛鑹?*/ - --input-bg: var(--bg-tertiary); - --input-border: var(--border-tertiary); - --input-border-focus: var(--primary); - --input-text: var(--text-primary); - --input-placeholder: var(--text-quaternary); - --input-shadow-focus: 0 0 0 3px var(--primary-light); - - /* 妯℃€佹棰滆壊 */ - --modal-backdrop: rgba(0, 0, 0, 0.7); - --modal-bg: var(--bg-secondary); - --modal-border: var(--border-secondary); - --modal-header-border: var(--border-secondary); - --modal-footer-border: var(--border-secondary); - - /* 閫氱煡棰滆壊 */ - --notification-success-bg: var(--success-light); - --notification-success-border: var(--success-border); - --notification-success-text: var(--success); - - --notification-warning-bg: var(--warning-light); - --notification-warning-border: var(--warning-border); - --notification-warning-text: var(--warning); - - --notification-error-bg: var(--error-light); - --notification-error-border: var(--error-border); - --notification-error-text: var(--error); - - --notification-info-bg: var(--info-light); - --notification-info-border: var(--info-border); - --notification-info-text: var(--info); - - /* 鍔犺浇鍔ㄧ敾棰滆壊 */ - --spinner-primary: var(--primary); - --spinner-secondary: var(--bg-tertiary); - - /* 婊氬姩鏉¢鑹?*/ - --scrollbar-track: var(--bg-tertiary); - --scrollbar-thumb: var(--bg-quaternary); - --scrollbar-thumb-hover: #4a4a4a; -} - -:root[data-theme='light'], -:root[data-theme='ClassicLight'], -:root[data-theme='ModernLight'] { - --bg-primary: #f8fafc; - --bg-secondary: #f1f5f9; - --bg-tertiary: #e2e8f0; - --bg-quaternary: #cbd5e1; - --bg-hover: #e2e8f0; - - --text-primary: #0f172a; - --text-secondary: #334155; - --text-tertiary: #475569; - --text-quaternary: #64748b; - --text-disabled: #94a3b8; - - --border-primary: #e2e8f0; - --border-secondary: #cbd5e1; - --border-tertiary: #94a3b8; - --border-quaternary: #64748b; - - --modal-backdrop: rgba(0, 0, 0, 0.4); - --scrollbar-thumb-hover: #94a3b8; - - --btn-secondary-bg: #f1f5f9; - --btn-secondary-hover: #e2e8f0; - --btn-secondary-text: #0f172a; - --btn-secondary-border: #cbd5e1; - - --card-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); -} - -:root[data-theme='ClassicLight'] { - --primary: #1e40af; - --primary-hover: #1e3a8a; - --primary-light: rgba(30, 64, 175, 0.08); - --primary-border: rgba(30, 64, 175, 0.15); - - --bg-primary: #ffffff; - --bg-secondary: #f5f7fa; - --bg-tertiary: #edf0f5; - --bg-quaternary: #d9dee7; - --bg-hover: #f0f3f8; - - --success: #059669; - --success-hover: #047857; - --success-light: rgba(5, 150, 105, 0.08); - --success-border: rgba(5, 150, 105, 0.15); - - --warning: #d97706; - --warning-hover: #b45309; - --warning-light: rgba(217, 119, 6, 0.08); - --warning-border: rgba(217, 119, 6, 0.15); - - --error: #dc2626; - --error-hover: #b91c1c; - --error-light: rgba(220, 38, 38, 0.08); - --error-border: rgba(220, 38, 38, 0.15); - - --info: #2563eb; - --info-hover: #1d4ed8; - --info-light: rgba(37, 99, 235, 0.08); - --info-border: rgba(37, 99, 235, 0.15); - - --text-primary: #1a2332; - --text-secondary: #4a5568; - --text-tertiary: #6b7280; - --text-quaternary: #9ca3af; - --text-disabled: #c5cbd3; - - --border-primary: #e5e7eb; - --border-secondary: #d1d5db; - --border-tertiary: #9ca3af; - --border-quaternary: #6b7280; - - --input-bg: #ffffff; - --input-border: #d1d5db; - --input-border-focus: #1e40af; - --input-text: #1a2332; - --input-placeholder: #9ca3af; - --input-shadow-focus: 0 0 0 3px rgba(30, 64, 175, 0.1); - - --card-bg: #ffffff; - --card-border: #e5e7eb; - --card-hover-border: #d1d5db; - - --table-header-bg: #f5f7fa; - --table-row-hover: #f9fafb; - --table-border: #e5e7eb; - --table-selected: rgba(30, 64, 175, 0.06); - - --scrollbar-track: #f1f5f9; - --scrollbar-thumb: #cbd5e1; - --scrollbar-thumb-hover: #94a3b8; - - --status-pending: #ca8a04; - --status-pending-light: rgba(202, 138, 4, 0.08); - --status-approved: #059669; - --status-approved-light: rgba(5, 150, 105, 0.08); - --status-played: #6b7280; - --status-played-light: rgba(107, 114, 128, 0.08); - - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.04); - --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -2px rgba(0, 0, 0, 0.04); - --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.06), 0 4px 6px -4px rgba(0, 0, 0, 0.04); - --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.06), 0 8px 10px -6px rgba(0, 0, 0, 0.04); - - --radius-sm: 3px; - --radius-md: 5px; - --radius-lg: 6px; - --radius-xl: 8px; - --radius-2xl: 10px; -} - -:root[data-theme='ModernLight'] { - --primary: #4f46e5; - --primary-hover: #4338ca; - --primary-light: rgba(79, 70, 229, 0.1); - --primary-border: rgba(79, 70, 229, 0.2); - - --bg-primary: #fafafa; - --bg-secondary: #f4f4f5; - --bg-tertiary: #e4e4e7; - --bg-quaternary: #d4d4d8; - --bg-hover: #eeeeef; - - --success: #16a34a; - --success-hover: #15803d; - --success-light: rgba(22, 163, 74, 0.1); - --success-border: rgba(22, 163, 74, 0.2); - - --warning: #ea580c; - --warning-hover: #c2410c; - --warning-light: rgba(234, 88, 12, 0.1); - --warning-border: rgba(234, 88, 12, 0.2); - - --error: #e11d48; - --error-hover: #be123c; - --error-light: rgba(225, 29, 72, 0.1); - --error-border: rgba(225, 29, 72, 0.2); - - --info: #0ea5e9; - --info-hover: #0284c7; - --info-light: rgba(14, 165, 233, 0.1); - --info-border: rgba(14, 165, 233, 0.2); - - --text-primary: #09090b; - --text-secondary: #3f3f46; - --text-tertiary: #71717a; - --text-quaternary: #a1a1aa; - --text-disabled: #d4d4d8; - - --border-primary: #e4e4e7; - --border-secondary: #d4d4d8; - --border-tertiary: #a1a1aa; - --border-quaternary: #71717a; - - --input-bg: #ffffff; - --input-border: #e4e4e7; - --input-border-focus: #4f46e5; - --input-text: #09090b; - --input-placeholder: #a1a1aa; - --input-shadow-focus: 0 0 0 3px rgba(79, 70, 229, 0.12); - - --card-bg: #ffffff; - --card-border: #e4e4e7; - --card-hover-border: #d4d4d8; - - --table-header-bg: #f4f4f5; - --table-row-hover: #fafafa; - --table-border: #e4e4e7; - --table-selected: rgba(79, 70, 229, 0.08); - - --scrollbar-track: #f4f4f5; - --scrollbar-thumb: #d4d4d8; - --scrollbar-thumb-hover: #a1a1aa; - - --status-pending: #eab308; - --status-pending-light: rgba(234, 179, 8, 0.12); - --status-approved: #22c55e; - --status-approved-light: rgba(34, 197, 94, 0.12); - --status-played: #71717a; - --status-played-light: rgba(113, 113, 122, 0.12); - - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.03); - --shadow-md: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(0, 0, 0, 0.03); - --shadow-lg: 0 8px 24px -4px rgba(0, 0, 0, 0.06), 0 2px 8px -4px rgba(0, 0, 0, 0.04); - --shadow-xl: 0 16px 40px -8px rgba(0, 0, 0, 0.08), 0 4px 16px -8px rgba(0, 0, 0, 0.05); - - --radius-sm: 4px; - --radius-md: 6px; - --radius-lg: 8px; - --radius-xl: 10px; - --radius-2xl: 12px; -} - -/* 娣辫壊涓婚鐗瑰畾璋冩暣 */ -@media (prefers-color-scheme: dark) { - :root { - /* 鍦ㄦ繁鑹叉ā寮忎笅鍙互杩涜寰皟 */ - } -} - -/* 楂樺姣斿害妯″紡鏀寔 */ -@media (prefers-contrast: high) { - :root { - --border-primary: #444444; - --border-secondary: #555555; - --border-tertiary: #666666; - --text-tertiary: #aaaaaa; - --text-quaternary: #888888; - } -} - -/* 鍑忓皯鍔ㄧ敾妯″紡鏀寔 */ -@media (prefers-reduced-motion: reduce) { - :root { - --transition-fast: 0s; - --transition-normal: 0s; - --transition-slow: 0s; - } -} - -/* 鍏ㄥ眬婊氬姩鏉℃牱寮?*/ -* { - scrollbar-width: thin; - scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); -} - -*::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -*::-webkit-scrollbar-track { - background: var(--scrollbar-track); -} - -*::-webkit-scrollbar-thumb { - background: var(--scrollbar-thumb); - border-radius: var(--radius-md); -} - -*::-webkit-scrollbar-thumb:hover { - background: var(--scrollbar-thumb-hover); -} - -/* 鍏ㄥ眬閫夋嫨鏂囨湰鏍峰紡 */ -::selection { - background: var(--primary-light); - color: var(--text-primary); -} - -/* 鍏ㄥ眬鐒︾偣鏍峰紡 */ -*:focus { - outline: 2px solid var(--primary); - outline-offset: 2px; -} - -*:focus:not(:focus-visible) { - outline: none; -} - -/* 鍏ㄥ眬绂佺敤鐘舵€佹牱寮?*/ -*:disabled { - cursor: not-allowed; - opacity: 0.6; -} - -/* 鍏ㄥ眬閾炬帴鏍峰紡 */ -a { - color: var(--primary); - text-decoration: none; - transition: color var(--transition-normal); -} - -a:hover { - color: var(--primary-hover); -} - -/* 鍏ㄥ眬鎸夐挳閲嶇疆 */ -button { - border: none; - background: none; - cursor: pointer; - font-family: inherit; -} - -* { - -webkit-tap-highlight-color: transparent; -} - -button, -a, -input, -textarea { - -webkit-tap-highlight-color: transparent; -} - -@media (hover: none) and (pointer: coarse) { - *:focus { - outline: none !important; - } - button, - a { - -webkit-user-select: none; - user-select: none; - } -} - -/* 鍏ㄥ眬杈撳叆妗嗛噸缃?*/ -input, -textarea, -select { - font-family: inherit; - font-size: inherit; -} - -/* 鍏ㄥ眬鍥剧墖鏍峰紡 */ -img { - max-width: 100%; - height: auto; -} - -/* 鍏ㄥ眬琛ㄦ牸鏍峰紡 */ -table { - border-collapse: collapse; - width: 100%; -} - -/* 鍏ㄥ眬浠g爜鏍峰紡 */ -code, -pre { - font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; - background: var(--bg-tertiary); - border-radius: var(--radius-sm); -} - -code { - padding: 2px 4px; - font-size: 0.875em; -} - -pre { - padding: var(--spacing-lg); - overflow-x: auto; -} - -pre code { - padding: 0; - background: none; -} diff --git a/old-variables2.css b/old-variables2.css deleted file mode 100644 index 3fe2829..0000000 --- a/old-variables2.css +++ /dev/null @@ -1,556 +0,0 @@ -/* 鍏ㄥ眬CSS鍙橀噺 - 缁熶竴閰嶈壊鏂规 */ -:root { - /* 涓昏壊璋?*/ - --primary: #3b82f6; - --primary-hover: #2563eb; - --primary-light: rgba(59, 130, 246, 0.1); - --primary-border: rgba(59, 130, 246, 0.2); - - /* 鎴愬姛鑹?*/ - --success: #10b981; - --success-hover: #059669; - --success-light: rgba(16, 185, 129, 0.1); - --success-border: rgba(16, 185, 129, 0.2); - - /* 璀﹀憡鑹?*/ - --warning: #f59e0b; - --warning-hover: #d97706; - --warning-light: rgba(245, 158, 11, 0.1); - --warning-border: rgba(245, 158, 11, 0.2); - - /* 閿欒鑹?*/ - --error: #ef4444; - --error-hover: #dc2626; - --error-light: rgba(239, 68, 68, 0.1); - --error-border: rgba(239, 68, 68, 0.2); - - /* 淇℃伅鑹?*/ - --info: #3b82f6; - --info-hover: #2563eb; - --info-light: rgba(59, 130, 246, 0.1); - --info-border: rgba(59, 130, 246, 0.2); - - /* 鑳屾櫙鑹?*/ - --bg-primary: #111111; - --bg-secondary: #1a1a1a; - --bg-tertiary: #2a2a2a; - --bg-quaternary: #3a3a3a; - --bg-hover: #1f1f1f; - - /* 鏂囧瓧棰滆壊 */ - --text-primary: #ffffff; - --text-secondary: #cccccc; - --text-tertiary: #888888; - --text-quaternary: #666666; - --text-disabled: #444444; - - /* 杈规棰滆壊 */ - --border-primary: #1f1f1f; - --border-secondary: #2a2a2a; - --border-tertiary: #3a3a3a; - --border-quaternary: #4a4a4a; - - /* 闃村奖 */ - --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); - --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); - --shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1); - --shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1); - - /* 鍦嗚 */ - --radius-sm: 4px; - --radius-md: 6px; - --radius-lg: 8px; - --radius-xl: 12px; - --radius-2xl: 16px; - - /* 闂磋窛 */ - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 12px; - --spacing-lg: 16px; - --spacing-xl: 20px; - --spacing-2xl: 24px; - --spacing-3xl: 32px; - - /* 瀛椾綋澶у皬 */ - --text-xs: 12px; - --text-sm: 14px; - --text-base: 16px; - --text-lg: 18px; - --text-xl: 20px; - --text-2xl: 24px; - --text-3xl: 30px; - - /* 瀛椾綋绮楃粏 */ - --font-normal: 400; - --font-medium: 500; - --font-semibold: 600; - --font-bold: 700; - - /* 杩囨浮鍔ㄧ敾 */ - --transition-fast: 0.15s ease; - --transition-normal: 0.2s ease; - --transition-slow: 0.3s ease; - - /* Z-index灞傜骇 */ - --z-dropdown: 100; - --z-sticky: 200; - --z-fixed: 300; - --z-modal-backdrop: 400; - --z-modal: 500; - --z-popover: 600; - --z-tooltip: 700; - --z-toast: 800; - - /* 鐗规畩鐘舵€侀鑹?*/ - --status-pending: #fbbf24; - --status-pending-light: rgba(251, 191, 36, 0.1); - --status-approved: #10b981; - --status-approved-light: rgba(16, 185, 129, 0.1); - --status-played: #6b7280; - --status-played-light: rgba(107, 114, 128, 0.1); - - /* 鎶曠エ鐩稿叧棰滆壊 */ - --vote-heart: #ef4444; - --vote-heart-hover: #dc2626; - --vote-count: var(--text-tertiary); - - /* 鎷栨嫿鐘舵€侀鑹?*/ - --drag-over: var(--primary-light); - --drag-over-border: var(--primary); - --dragging-opacity: 0.5; - - /* 琛ㄦ牸棰滆壊 */ - --table-header-bg: var(--bg-tertiary); - --table-row-hover: var(--bg-hover); - --table-border: var(--border-secondary); - --table-selected: var(--primary-light); - - /* 鍗$墖棰滆壊 */ - --card-bg: var(--bg-secondary); - --card-border: var(--border-secondary); - --card-hover-border: var(--border-tertiary); - --card-shadow: var(--shadow-md); - - /* 鎸夐挳棰滆壊 */ - --btn-primary-bg: var(--primary); - --btn-primary-hover: var(--primary-hover); - --btn-primary-text: var(--text-primary); - --btn-primary-border: var(--primary-border); - - --btn-secondary-bg: #3a3a3a; - --btn-secondary-hover: #4a4a4a; - --btn-secondary-text: var(--text-primary); - --btn-secondary-border: #555555; - - --btn-success-bg: var(--success); - --btn-success-hover: var(--success-hover); - --btn-success-text: var(--text-primary); - --btn-success-border: var(--success-border); - - --btn-warning-bg: var(--warning); - --btn-warning-hover: var(--warning-hover); - --btn-warning-text: var(--text-primary); - --btn-warning-border: var(--warning-border); - - --btn-error-bg: var(--error); - --btn-error-hover: var(--error-hover); - --btn-error-text: var(--text-primary); - --btn-error-border: var(--error-border); - - --btn-disabled-bg: var(--bg-tertiary); - --btn-disabled-text: var(--text-disabled); - - /* 杈撳叆妗嗛鑹?*/ - --input-bg: var(--bg-tertiary); - --input-border: var(--border-tertiary); - --input-border-focus: var(--primary); - --input-text: var(--text-primary); - --input-placeholder: var(--text-quaternary); - --input-shadow-focus: 0 0 0 3px var(--primary-light); - - /* 妯℃€佹棰滆壊 */ - --modal-backdrop: rgba(0, 0, 0, 0.7); - --modal-bg: var(--bg-secondary); - --modal-border: var(--border-secondary); - --modal-header-border: var(--border-secondary); - --modal-footer-border: var(--border-secondary); - - /* 閫氱煡棰滆壊 */ - --notification-success-bg: var(--success-light); - --notification-success-border: var(--success-border); - --notification-success-text: var(--success); - - --notification-warning-bg: var(--warning-light); - --notification-warning-border: var(--warning-border); - --notification-warning-text: var(--warning); - - --notification-error-bg: var(--error-light); - --notification-error-border: var(--error-border); - --notification-error-text: var(--error); - - --notification-info-bg: var(--info-light); - --notification-info-border: var(--info-border); - --notification-info-text: var(--info); - - /* 鍔犺浇鍔ㄧ敾棰滆壊 */ - --spinner-primary: var(--primary); - --spinner-secondary: var(--bg-tertiary); - - /* 婊氬姩鏉¢鑹?*/ - --scrollbar-track: var(--bg-tertiary); - --scrollbar-thumb: var(--bg-quaternary); - --scrollbar-thumb-hover: #4a4a4a; -} - -:root[data-theme='light'], -:root[data-theme='ClassicLight'], -:root[data-theme='ModernLight'] { - --bg-primary: #f8fafc; - --bg-secondary: #f1f5f9; - --bg-tertiary: #e2e8f0; - --bg-quaternary: #cbd5e1; - --bg-hover: #e2e8f0; - - --text-primary: #0f172a; - --text-secondary: #334155; - --text-tertiary: #475569; - --text-quaternary: #64748b; - --text-disabled: #94a3b8; - - --border-primary: #e2e8f0; - --border-secondary: #cbd5e1; - --border-tertiary: #94a3b8; - --border-quaternary: #64748b; - - --modal-backdrop: rgba(0, 0, 0, 0.4); - --scrollbar-thumb-hover: #94a3b8; - - --btn-secondary-bg: #f1f5f9; - --btn-secondary-hover: #e2e8f0; - --btn-secondary-text: #0f172a; - --btn-secondary-border: #cbd5e1; - - --card-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); -} - -:root[data-theme='ClassicLight'] { - --primary: #1e40af; - --primary-hover: #1e3a8a; - --primary-light: rgba(30, 64, 175, 0.08); - --primary-border: rgba(30, 64, 175, 0.15); - - --bg-primary: #ffffff; - --bg-secondary: #f5f7fa; - --bg-tertiary: #edf0f5; - --bg-quaternary: #d9dee7; - --bg-hover: #f0f3f8; - - --success: #059669; - --success-hover: #047857; - --success-light: rgba(5, 150, 105, 0.08); - --success-border: rgba(5, 150, 105, 0.15); - - --warning: #d97706; - --warning-hover: #b45309; - --warning-light: rgba(217, 119, 6, 0.08); - --warning-border: rgba(217, 119, 6, 0.15); - - --error: #dc2626; - --error-hover: #b91c1c; - --error-light: rgba(220, 38, 38, 0.08); - --error-border: rgba(220, 38, 38, 0.15); - - --info: #2563eb; - --info-hover: #1d4ed8; - --info-light: rgba(37, 99, 235, 0.08); - --info-border: rgba(37, 99, 235, 0.15); - - --text-primary: #1a2332; - --text-secondary: #4a5568; - --text-tertiary: #6b7280; - --text-quaternary: #9ca3af; - --text-disabled: #c5cbd3; - - --border-primary: #e5e7eb; - --border-secondary: #d1d5db; - --border-tertiary: #9ca3af; - --border-quaternary: #6b7280; - - --input-bg: #ffffff; - --input-border: #d1d5db; - --input-border-focus: #1e40af; - --input-text: #1a2332; - --input-placeholder: #9ca3af; - --input-shadow-focus: 0 0 0 3px rgba(30, 64, 175, 0.1); - - --card-bg: #ffffff; - --card-border: #e5e7eb; - --card-hover-border: #d1d5db; - - --table-header-bg: #f5f7fa; - --table-row-hover: #f9fafb; - --table-border: #e5e7eb; - --table-selected: rgba(30, 64, 175, 0.06); - - --scrollbar-track: #f1f5f9; - --scrollbar-thumb: #cbd5e1; - --scrollbar-thumb-hover: #94a3b8; - - --status-pending: #ca8a04; - --status-pending-light: rgba(202, 138, 4, 0.08); - --status-approved: #059669; - --status-approved-light: rgba(5, 150, 105, 0.08); - --status-played: #6b7280; - --status-played-light: rgba(107, 114, 128, 0.08); - - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.04); - --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.06), 0 2px 4px -2px rgba(0, 0, 0, 0.04); - --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.06), 0 4px 6px -4px rgba(0, 0, 0, 0.04); - --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.06), 0 8px 10px -6px rgba(0, 0, 0, 0.04); - - --radius-sm: 3px; - --radius-md: 5px; - --radius-lg: 6px; - --radius-xl: 8px; - --radius-2xl: 10px; -} - -:root[data-theme='ModernLight'] { - --primary: #4f46e5; - --primary-hover: #4338ca; - --primary-light: rgba(79, 70, 229, 0.1); - --primary-border: rgba(79, 70, 229, 0.2); - - --bg-primary: #fafafa; - --bg-secondary: #f4f4f5; - --bg-tertiary: #e4e4e7; - --bg-quaternary: #d4d4d8; - --bg-hover: #eeeeef; - - --success: #16a34a; - --success-hover: #15803d; - --success-light: rgba(22, 163, 74, 0.1); - --success-border: rgba(22, 163, 74, 0.2); - - --warning: #ea580c; - --warning-hover: #c2410c; - --warning-light: rgba(234, 88, 12, 0.1); - --warning-border: rgba(234, 88, 12, 0.2); - - --error: #e11d48; - --error-hover: #be123c; - --error-light: rgba(225, 29, 72, 0.1); - --error-border: rgba(225, 29, 72, 0.2); - - --info: #0ea5e9; - --info-hover: #0284c7; - --info-light: rgba(14, 165, 233, 0.1); - --info-border: rgba(14, 165, 233, 0.2); - - --text-primary: #09090b; - --text-secondary: #3f3f46; - --text-tertiary: #71717a; - --text-quaternary: #a1a1aa; - --text-disabled: #d4d4d8; - - --border-primary: #e4e4e7; - --border-secondary: #d4d4d8; - --border-tertiary: #a1a1aa; - --border-quaternary: #71717a; - - --input-bg: #ffffff; - --input-border: #e4e4e7; - --input-border-focus: #4f46e5; - --input-text: #09090b; - --input-placeholder: #a1a1aa; - --input-shadow-focus: 0 0 0 3px rgba(79, 70, 229, 0.12); - - --card-bg: #ffffff; - --card-border: #e4e4e7; - --card-hover-border: #d4d4d8; - - --table-header-bg: #f4f4f5; - --table-row-hover: #fafafa; - --table-border: #e4e4e7; - --table-selected: rgba(79, 70, 229, 0.08); - - --scrollbar-track: #f4f4f5; - --scrollbar-thumb: #d4d4d8; - --scrollbar-thumb-hover: #a1a1aa; - - --status-pending: #eab308; - --status-pending-light: rgba(234, 179, 8, 0.12); - --status-approved: #22c55e; - --status-approved-light: rgba(34, 197, 94, 0.12); - --status-played: #71717a; - --status-played-light: rgba(113, 113, 122, 0.12); - - --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.03); - --shadow-md: 0 2px 8px -2px rgba(0, 0, 0, 0.05), 0 1px 3px 0 rgba(0, 0, 0, 0.03); - --shadow-lg: 0 8px 24px -4px rgba(0, 0, 0, 0.06), 0 2px 8px -4px rgba(0, 0, 0, 0.04); - --shadow-xl: 0 16px 40px -8px rgba(0, 0, 0, 0.08), 0 4px 16px -8px rgba(0, 0, 0, 0.05); - - --radius-sm: 4px; - --radius-md: 6px; - --radius-lg: 8px; - --radius-xl: 10px; - --radius-2xl: 12px; -} - -/* 娣辫壊涓婚鐗瑰畾璋冩暣 */ -@media (prefers-color-scheme: dark) { - :root { - /* 鍦ㄦ繁鑹叉ā寮忎笅鍙互杩涜寰皟 */ - } -} - -/* 楂樺姣斿害妯″紡鏀寔 */ -@media (prefers-contrast: high) { - :root { - --border-primary: #444444; - --border-secondary: #555555; - --border-tertiary: #666666; - --text-tertiary: #aaaaaa; - --text-quaternary: #888888; - } -} - -/* 鍑忓皯鍔ㄧ敾妯″紡鏀寔 */ -@media (prefers-reduced-motion: reduce) { - :root { - --transition-fast: 0s; - --transition-normal: 0s; - --transition-slow: 0s; - } -} - -/* 鍏ㄥ眬婊氬姩鏉℃牱寮?*/ -* { - scrollbar-width: thin; - scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track); -} - -*::-webkit-scrollbar { - width: 8px; - height: 8px; -} - -*::-webkit-scrollbar-track { - background: var(--scrollbar-track); -} - -*::-webkit-scrollbar-thumb { - background: var(--scrollbar-thumb); - border-radius: var(--radius-md); -} - -*::-webkit-scrollbar-thumb:hover { - background: var(--scrollbar-thumb-hover); -} - -/* 鍏ㄥ眬閫夋嫨鏂囨湰鏍峰紡 */ -::selection { - background: var(--primary-light); - color: var(--text-primary); -} - -/* 鍏ㄥ眬鐒︾偣鏍峰紡 */ -*:focus { - outline: 2px solid var(--primary); - outline-offset: 2px; -} - -*:focus:not(:focus-visible) { - outline: none; -} - -/* 鍏ㄥ眬绂佺敤鐘舵€佹牱寮?*/ -*:disabled { - cursor: not-allowed; - opacity: 0.6; -} - -/* 鍏ㄥ眬閾炬帴鏍峰紡 */ -a { - color: var(--primary); - text-decoration: none; - transition: color var(--transition-normal); -} - -a:hover { - color: var(--primary-hover); -} - -/* 鍏ㄥ眬鎸夐挳閲嶇疆 */ -button { - border: none; - background: none; - cursor: pointer; - font-family: inherit; -} - -* { - -webkit-tap-highlight-color: transparent; -} - -button, -a, -input, -textarea { - -webkit-tap-highlight-color: transparent; -} - -@media (hover: none) and (pointer: coarse) { - *:focus { - outline: none !important; - } - button, - a { - -webkit-user-select: none; - user-select: none; - } -} - -/* 鍏ㄥ眬杈撳叆妗嗛噸缃?*/ -input, -textarea, -select { - font-family: inherit; - font-size: inherit; -} - -/* 鍏ㄥ眬鍥剧墖鏍峰紡 */ -img { - max-width: 100%; - height: auto; -} - -/* 鍏ㄥ眬琛ㄦ牸鏍峰紡 */ -table { - border-collapse: collapse; - width: 100%; -} - -/* 鍏ㄥ眬浠g爜鏍峰紡 */ -code, -pre { - font-family: 'Fira Code', 'Monaco', 'Consolas', monospace; - background: var(--bg-tertiary); - border-radius: var(--radius-sm); -} - -code { - padding: 2px 4px; - font-size: 0.875em; -} - -pre { - padding: var(--spacing-lg); - overflow-x: auto; -} - -pre code { - padding: 0; - background: none; -}