@import "tailwindcss"; @import "tw-animate-css"; @custom-variant dark (&:is(.dark *)); :root { /* ===== iOS/Apple Design System Colors ===== */ --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); --primary: oklch(0.205 0 0); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.205 0 0); --muted: oklch(0.97 0 0); --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.205 0 0); --destructive: oklch(0.577 0.245 27.325); --destructive-foreground: oklch(0.577 0.245 27.325); --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); --ring: oklch(0.708 0 0); --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); --chart-4: oklch(0.828 0.189 84.429); --chart-5: oklch(0.769 0.188 70.08); --radius: 1rem; --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); /* ===== Apple Frosted Glass Design Tokens ===== */ /* 深色主题背景 - 模拟iOS深色模式 */ --app-bg: #000000; --app-bg-secondary: #1c1c1e; --app-bg-tertiary: #2c2c2e; /* 毛玻璃效果 */ --glass-bg: rgba(28, 28, 30, 0.72); --glass-bg-light: rgba(44, 44, 46, 0.65); --glass-bg-heavy: rgba(18, 18, 20, 0.85); --glass-border: rgba(255, 255, 255, 0.08); --glass-border-light: rgba(255, 255, 255, 0.12); /* 品牌色 - 青绿色调 */ --app-brand: #30d158; --app-brand-secondary: #34c759; --app-brand-hover: #28a745; --app-brand-light: rgba(48, 209, 88, 0.15); /* iOS系统色 */ --ios-blue: #007aff; --ios-green: #30d158; --ios-indigo: #5856d6; --ios-orange: #ff9500; --ios-pink: #ff2d55; --ios-purple: #af52de; --ios-red: #ff3b30; --ios-teal: #5ac8fa; --ios-yellow: #ffcc00; /* 文字颜色 */ --app-text: #ffffff; --app-text-secondary: rgba(235, 235, 245, 0.6); --app-text-tertiary: rgba(235, 235, 245, 0.3); --app-text-muted: #8e8e93; /* 分隔线和边框 */ --app-separator: rgba(84, 84, 88, 0.65); --app-border: rgba(255, 255, 255, 0.1); /* 阴影 */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4); --shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5); --shadow-glow: 0 0 20px rgba(48, 209, 88, 0.3); } .dark { --background: oklch(0.145 0 0); --foreground: oklch(0.985 0 0); --card: oklch(0.145 0 0); --card-foreground: oklch(0.985 0 0); --popover: oklch(0.145 0 0); --popover-foreground: oklch(0.985 0 0); --primary: oklch(0.985 0 0); --primary-foreground: oklch(0.205 0 0); --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); --muted-foreground: oklch(0.708 0 0); --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); --destructive: oklch(0.396 0.141 25.723); --destructive-foreground: oklch(0.637 0.237 25.331); --border: oklch(0.269 0 0); --input: oklch(0.269 0 0); --ring: oklch(0.439 0 0); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); --chart-3: oklch(0.769 0.188 70.08); --chart-4: oklch(0.627 0.265 303.9); --chart-5: oklch(0.645 0.246 16.439); --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); --sidebar-primary: oklch(0.488 0.243 264.376); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(0.269 0 0); --sidebar-ring: oklch(0.439 0 0); } @theme inline { /* iOS San Francisco字体栈 */ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "Helvetica Neue", "PingFang SC", "Microsoft YaHei", sans-serif; --font-mono: "SF Mono", "Fira Code", "Fira Mono", Menlo, Monaco, Consolas, monospace; --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); --color-card-foreground: var(--card-foreground); --color-popover: var(--popover); --color-popover-foreground: var(--popover-foreground); --color-primary: var(--primary); --color-primary-foreground: var(--primary-foreground); --color-secondary: var(--secondary); --color-secondary-foreground: var(--secondary-foreground); --color-muted: var(--muted); --color-muted-foreground: var(--muted-foreground); --color-accent: var(--accent); --color-accent-foreground: var(--accent-foreground); --color-destructive: var(--destructive); --color-destructive-foreground: var(--destructive-foreground); --color-border: var(--border); --color-input: var(--input); --color-ring: var(--ring); --color-chart-1: var(--chart-1); --color-chart-2: var(--chart-2); --color-chart-3: var(--chart-3); --color-chart-4: var(--chart-4); --color-chart-5: var(--chart-5); --radius-sm: calc(var(--radius) - 8px); --radius-md: calc(var(--radius) - 4px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --radius-2xl: calc(var(--radius) + 8px); --color-sidebar: var(--sidebar); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-border: var(--sidebar-border); --color-sidebar-ring: var(--sidebar-ring); /* Custom semantic tokens for app */ --color-app-bg: var(--app-bg); --color-app-card: var(--glass-bg); --color-app-brand: var(--app-brand); --color-app-brand-hover: var(--app-brand-hover); --color-app-text: var(--app-text); --color-app-text-muted: var(--app-text-muted); --color-app-border: var(--app-border); } @layer base { * { @apply border-border outline-ring/50; } html { /* 启用iOS平滑滚动 */ scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } body { @apply bg-background text-foreground; /* iOS安全区域适配 */ padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); padding-left: env(safe-area-inset-left); padding-right: env(safe-area-inset-right); } } /* ===== Apple Frosted Glass Components ===== */ @layer components { /* 毛玻璃卡片 */ .glass-card { background: var(--glass-bg); backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px); border: 1px solid var(--glass-border); border-radius: 1rem; } .glass-card-light { background: var(--glass-bg-light); backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px); border: 1px solid var(--glass-border-light); border-radius: 1rem; } .glass-card-heavy { background: var(--glass-bg-heavy); backdrop-filter: saturate(200%) blur(30px); -webkit-backdrop-filter: saturate(200%) blur(30px); border: 1px solid var(--glass-border); border-radius: 1.25rem; } /* 毛玻璃导航栏 */ .glass-nav { background: var(--glass-bg-heavy); backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px); border-bottom: 0.5px solid var(--app-separator); } /* 毛玻璃弹窗 */ .glass-modal { background: var(--glass-bg-heavy); backdrop-filter: saturate(200%) blur(40px); -webkit-backdrop-filter: saturate(200%) blur(40px); border: 1px solid var(--glass-border); border-radius: 1.5rem; box-shadow: var(--shadow-lg); } /* iOS风格按钮 */ .btn-ios { @apply font-medium transition-all duration-200; background: var(--app-brand); color: white; border-radius: 0.75rem; padding: 0.875rem 1.5rem; font-size: 1rem; letter-spacing: -0.01em; } .btn-ios:hover { background: var(--app-brand-hover); transform: scale(0.98); } .btn-ios:active { transform: scale(0.95); } .btn-ios-secondary { @apply font-medium transition-all duration-200; background: var(--glass-bg); backdrop-filter: blur(10px); color: var(--app-brand); border: 1px solid var(--glass-border); border-radius: 0.75rem; padding: 0.875rem 1.5rem; } /* iOS风格输入框 */ .input-ios { background: var(--app-bg-secondary); border: none; border-radius: 0.625rem; padding: 0.875rem 1rem; font-size: 1rem; color: var(--app-text); transition: all 0.2s ease; } .input-ios:focus { outline: none; box-shadow: 0 0 0 4px var(--app-brand-light); } .input-ios::placeholder { color: var(--app-text-tertiary); } /* iOS风格分割线 */ .separator-ios { height: 0.5px; background: var(--app-separator); margin: 0 1rem; } /* iOS风格列表项 */ .list-item-ios { @apply flex items-center justify-between px-4 py-3; background: var(--glass-bg-light); border-bottom: 0.5px solid var(--app-separator); transition: background 0.15s ease; } .list-item-ios:first-child { border-top-left-radius: 0.75rem; border-top-right-radius: 0.75rem; } .list-item-ios:last-child { border-bottom-left-radius: 0.75rem; border-bottom-right-radius: 0.75rem; border-bottom: none; } .list-item-ios:active { background: var(--glass-bg-heavy); } /* 书籍阅读器样式 */ .book-reader { @apply min-h-screen; background: linear-gradient(180deg, #000000 0%, #1a1a1a 100%); } .book-page { @apply max-w-2xl mx-auto px-6 py-8; background: var(--glass-bg); backdrop-filter: blur(20px); border-radius: 1rem; margin: 1rem; } .book-content { @apply prose prose-invert max-w-none; font-size: 1.0625rem; line-height: 1.8; letter-spacing: 0.01em; } .book-content h1, .book-content h2, .book-content h3 { @apply font-semibold; letter-spacing: -0.02em; } .book-content p { margin-bottom: 1.5em; text-align: justify; } /* 章节导航 */ .chapter-nav { @apply fixed bottom-0 left-0 right-0; background: var(--glass-bg-heavy); backdrop-filter: saturate(180%) blur(20px); border-top: 0.5px solid var(--app-separator); padding-bottom: env(safe-area-inset-bottom); } /* 进度条 */ .progress-bar { height: 3px; background: var(--app-bg-tertiary); border-radius: 1.5px; overflow: hidden; } .progress-bar-fill { height: 100%; background: linear-gradient(90deg, var(--app-brand) 0%, var(--app-brand-secondary) 100%); border-radius: 1.5px; transition: width 0.3s ease; } /* 骨架屏动画 */ .skeleton { background: linear-gradient( 90deg, var(--app-bg-secondary) 25%, var(--app-bg-tertiary) 50%, var(--app-bg-secondary) 75% ); background-size: 200% 100%; animation: skeleton-loading 1.5s infinite; border-radius: 0.5rem; } @keyframes skeleton-loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } /* 页面过渡动画 */ .page-transition { animation: page-fade-in 0.3s ease-out; } @keyframes page-fade-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* 弹窗动画 */ .modal-overlay { animation: modal-overlay-in 0.25s ease-out; } .modal-content { animation: modal-content-in 0.3s cubic-bezier(0.32, 0.72, 0, 1); } @keyframes modal-overlay-in { from { opacity: 0; } to { opacity: 1; } } @keyframes modal-content-in { from { opacity: 0; transform: scale(0.95) translateY(10px); } to { opacity: 1; transform: scale(1) translateY(0); } } /* 发光效果 */ .glow { box-shadow: var(--shadow-glow); } .glow-text { text-shadow: 0 0 20px var(--app-brand); } } /* ===== 响应式适配 ===== */ @layer utilities { /* 移动端安全区域 */ .safe-top { padding-top: env(safe-area-inset-top); } .safe-bottom { padding-bottom: env(safe-area-inset-bottom); } .safe-left { padding-left: env(safe-area-inset-left); } .safe-right { padding-right: env(safe-area-inset-right); } /* 触摸反馈 */ .touch-feedback { -webkit-tap-highlight-color: transparent; } .touch-feedback:active { opacity: 0.7; transform: scale(0.98); } /* 隐藏滚动条但保持可滚动 */ .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } /* iOS风格文字省略 */ .text-ellipsis-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .text-ellipsis-3 { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } }