主要更新: 1. 按H5网页端完全重构匹配功能(match页面) - 4种匹配类型: 创业合伙/资源对接/导师顾问/团队招募 - 资源对接等类型弹出手机号/微信号输入框 - 去掉重新匹配按钮,改为返回按钮 2. 修复所有卡片对齐和宽度问题 - 目录页附录卡片居中 - 首页阅读进度卡片满宽度 - 我的页面菜单卡片对齐 - 推广中心分享卡片统一宽度 3. 修复目录页图标和文字对齐 - section-icon固定40rpx宽高 - section-title与图标垂直居中 4. 更新真实完整文章标题(62篇) - 从book目录读取真实markdown文件名 - 替换之前的简化标题 5. 新增文章数据API - /api/db/chapters - 获取完整书籍结构 - 支持按ID获取单篇文章内容
520 lines
13 KiB
CSS
520 lines
13 KiB
CSS
@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);
|
|
|
|
/* ===== Soul App Style - Cyan/Teal Theme ===== */
|
|
/* 深色主题背景 */
|
|
--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);
|
|
|
|
/* 品牌色改为Soul青色 */
|
|
--app-brand: #00ced1;
|
|
--app-brand-secondary: #20b2aa;
|
|
--app-brand-hover: #00b4b7;
|
|
--app-brand-light: rgba(0, 206, 209, 0.15);
|
|
--app-brand-dark: #008b8b;
|
|
|
|
/* 强调色 */
|
|
--app-accent: #5ac8fa;
|
|
--app-gold: #ffd700;
|
|
|
|
/* 文字颜色 */
|
|
--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(0, 206, 209, 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 {
|
|
font-size: 1.0625rem;
|
|
line-height: 1.8;
|
|
letter-spacing: 0.01em;
|
|
color: var(--app-text);
|
|
}
|
|
|
|
.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;
|
|
}
|
|
}
|
|
|
|
/* 抑制 Next.js 开发环境错误遮罩 */
|
|
nextjs-portal,
|
|
#nextjs-portal,
|
|
[data-nextjs-dialog-overlay],
|
|
[data-nextjs-toast],
|
|
.nextjs-static-indicator-base {
|
|
display: none !important;
|
|
visibility: hidden !important;
|
|
pointer-events: none !important;
|
|
opacity: 0 !important;
|
|
}
|