globals.css 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. @import "tailwindcss";
  2. /* 参考 Edulan 类 LMS:清爽蓝系主色、大留白、卡片阴影与分区背景;结合本站金融教育调性 */
  3. :root {
  4. --background: #f0f4fa;
  5. --foreground: #0f172a;
  6. --muted: #64748b;
  7. --card: #ffffff;
  8. --border: #e2e8f0;
  9. --accent: #d4a012;
  10. --accent-hover: #e5b82a;
  11. --accent-foreground: #0f172a;
  12. --navy: #0c1929;
  13. --navy-soft: #152a45;
  14. --primary: #1d4ed8;
  15. --primary-soft: #3b82f6;
  16. --surface-muted: #e8eef7;
  17. --hero-glow: rgba(59, 130, 246, 0.35);
  18. --container-max: 80rem;
  19. --container-px: 1rem;
  20. --section-py: 4rem;
  21. }
  22. @theme inline {
  23. --color-background: var(--background);
  24. --color-foreground: var(--foreground);
  25. --color-muted: var(--muted);
  26. --color-card: var(--card);
  27. --color-border: var(--border);
  28. --color-accent: var(--accent);
  29. --color-accent-hover: var(--accent-hover);
  30. --color-navy: var(--navy);
  31. --color-navy-soft: var(--navy-soft);
  32. --color-primary-500: var(--primary-soft);
  33. --color-primary-600: #2563eb;
  34. --color-primary-700: #1d4ed8;
  35. --font-sans: var(--font-noto-sans);
  36. --font-serif: var(--font-noto-serif);
  37. --shadow-card: 0 4px 6px -1px rgb(15 23 42 / 0.06), 0 12px 24px -4px rgb(15 23 42 / 0.08);
  38. --shadow-card-hover: 0 12px 32px -8px rgb(15 23 42 / 0.12), 0 4px 12px -2px rgb(15 23 42 / 0.06);
  39. --radius-card: 1.25rem;
  40. }
  41. body {
  42. background: var(--background);
  43. color: var(--foreground);
  44. font-family: var(--font-sans), system-ui, sans-serif;
  45. }
  46. .site-container {
  47. margin-inline: auto;
  48. width: 100%;
  49. max-width: var(--container-max);
  50. padding-inline: var(--container-px);
  51. }
  52. .section-block {
  53. padding-block: var(--section-py);
  54. }
  55. .section-block-compact {
  56. padding-block: clamp(2.25rem, 7vw, 3.5rem);
  57. }
  58. .mobile-safe-pb {
  59. padding-bottom: max(1rem, env(safe-area-inset-bottom));
  60. }
  61. /*
  62. 布局约定(新页面请按类型选一种,勿混用 site-container + max-w-*):
  63. - .site-container:全站主栏 max 80rem,与顶栏/底栏对齐。
  64. - .section-block / .section-block-compact:区块上下留白。
  65. - .page-shell*:正文阅读区,横向 padding 用 --container-px,与顶栏一致。
  66. - .auth-page-shell:表单窄页 max 28rem,禁止再包 site-container。
  67. */
  68. .page-shell {
  69. box-sizing: border-box;
  70. margin-inline: auto;
  71. width: 100%;
  72. max-width: 48rem;
  73. padding-inline: var(--container-px);
  74. padding-block: clamp(2.5rem, 5vw, 3rem);
  75. }
  76. @media (min-width: 768px) {
  77. .page-shell {
  78. padding-block: 3rem;
  79. }
  80. }
  81. .page-shell-wide {
  82. max-width: 1200px;
  83. }
  84. .page-shell-md {
  85. max-width: 36rem;
  86. }
  87. .page-shell-sm {
  88. max-width: 32rem;
  89. }
  90. /* 登录/注册等窄页:不要用 site-container(会与 max-w-md 抢 max-width,导致 PC 上表单过宽) */
  91. .auth-page-shell {
  92. margin-inline: auto;
  93. width: 100%;
  94. max-width: 28rem;
  95. padding-inline: 1rem;
  96. padding-block: clamp(2.5rem, 8vw, 4rem);
  97. }
  98. @media (min-width: 768px) {
  99. .auth-page-shell {
  100. padding-block: 4rem;
  101. }
  102. }
  103. .font-serif {
  104. font-family: var(--font-serif), "Noto Serif SC", serif;
  105. }
  106. .text-muted-foreground {
  107. color: var(--muted);
  108. }
  109. /* 页面底纹:网格 + 柔光(Edulan 常见层次) */
  110. .bg-page {
  111. background-color: var(--background);
  112. background-image:
  113. linear-gradient(180deg, rgb(255 255 255 / 0.72) 0%, transparent 32%),
  114. radial-gradient(ellipse 80% 50% at 50% -20%, rgb(59 130 246 / 0.12), transparent),
  115. linear-gradient(
  116. rgb(15 23 42 / 0.03) 1px,
  117. transparent 1px
  118. ),
  119. linear-gradient(
  120. 90deg,
  121. rgb(15 23 42 / 0.03) 1px,
  122. transparent 1px
  123. );
  124. background-size: auto, auto, 48px 48px, 48px 48px;
  125. }
  126. @media (min-width: 640px) {
  127. :root {
  128. --container-px: 1.25rem;
  129. }
  130. }
  131. @media (min-width: 768px) {
  132. :root {
  133. --container-px: 2rem;
  134. --section-py: 5rem;
  135. }
  136. }
  137. @media (min-width: 1024px) {
  138. :root {
  139. --container-px: 2rem;
  140. --section-py: 5rem;
  141. }
  142. }
  143. @media (max-width: 767px) {
  144. .bg-page {
  145. background-size: auto, auto, 32px 32px, 32px 32px;
  146. }
  147. }
  148. .shadow-card {
  149. box-shadow: var(--shadow-card);
  150. }
  151. .shadow-card-hover {
  152. box-shadow: var(--shadow-card-hover);
  153. }
  154. /* 英雄区网格纹理 */
  155. .hero-grid {
  156. background-image:
  157. linear-gradient(rgb(255 255 255 / 0.04) 1px, transparent 1px),
  158. linear-gradient(90deg, rgb(255 255 255 / 0.04) 1px, transparent 1px);
  159. background-size: 40px 40px;
  160. }
  161. /* 底部波浪装饰 */
  162. .footer-wave {
  163. background: linear-gradient(180deg, var(--background) 0%, var(--navy) 100%);
  164. }
  165. /* Reusable interaction primitives */
  166. @keyframes ui-fade-up {
  167. from {
  168. opacity: 0;
  169. transform: translateY(10px);
  170. }
  171. to {
  172. opacity: 1;
  173. transform: translateY(0);
  174. }
  175. }
  176. @keyframes ui-skeleton-shimmer {
  177. 0% {
  178. background-position: 200% 0;
  179. }
  180. 100% {
  181. background-position: -200% 0;
  182. }
  183. }
  184. .ui-enter {
  185. animation: ui-fade-up 0.45s ease both;
  186. }
  187. .ui-enter-delay-1 {
  188. animation-delay: 0.08s;
  189. }
  190. .ui-enter-delay-2 {
  191. animation-delay: 0.16s;
  192. }
  193. .ui-enter-delay-3 {
  194. animation-delay: 0.24s;
  195. }
  196. .ui-interactive-card {
  197. transition: transform 280ms ease, box-shadow 280ms ease, border-color 280ms ease;
  198. transform: translateY(0);
  199. }
  200. .ui-interactive-card:hover {
  201. transform: translateY(-4px);
  202. box-shadow: var(--shadow-card-hover);
  203. border-color: rgb(148 163 184 / 0.35);
  204. }
  205. .ui-interactive-btn {
  206. transition: transform 220ms ease, box-shadow 220ms ease, filter 220ms ease;
  207. }
  208. .ui-interactive-btn:hover {
  209. transform: translateY(-1px);
  210. filter: brightness(1.03);
  211. }
  212. .ui-interactive-btn:active {
  213. transform: translateY(0);
  214. }
  215. .ui-skeleton {
  216. background: linear-gradient(90deg, #e8edf5 25%, #f3f6fb 37%, #e8edf5 63%);
  217. background-size: 400% 100%;
  218. animation: ui-skeleton-shimmer 1.4s ease infinite;
  219. }