/* source: assets/css/core/tokens.css */ /** * AKSRT Design Tokens v7 — 1:1 legacy Alignment * ------------------------------------------------------------ * 单一真理源(Single Source of Truth) * 所有颜色、字体、间距、动效都从此处读取,禁止在组件内硬编码。 * 严格对齐 legacy main.css 的视觉值。 */ :root { /* ===== Primary — legacy theme-color (#f04494 pink) ===== */ --color-primary: #f04494; --color-primary-hover: #e0307e; --color-primary-active: #c9206d; --color-primary-soft: rgba(240, 68, 148, 0.10); --color-primary-softer: rgba(240, 68, 148, 0.05); --color-on-primary: #FFFFFF; /* ===== Ink (text) — 对齐 legacy --key-color / --main-color / --muted-color ===== */ --color-ink: #333333; /* legacy --key-color */ --color-ink-2: #4e5358; /* legacy --main-color */ --color-ink-3: #777777; /* legacy --muted-color */ --color-ink-4: #999999; /* legacy --muted-2-color */ /* ===== Surface — 对齐 legacy --body-bg-color / --main-bg-color / --muted-bg-color ===== */ --surface-page: #f5f6f7; /* legacy --body-bg-color */ --surface-1: #FFFFFF; /* legacy --main-bg-color */ --surface-2: #eeeeee; /* legacy --muted-bg-color #eee */ --surface-3: #e9ecef; /* 输入框 / code / 次级面 */ --surface-4: #f8f8f8; /* 分页 / 标签 / hover 薄层 */ /* ===== Borders — 对齐 legacy --main-border-color ===== */ --color-line: rgba(50, 50, 50, 0.06); --color-line-soft: rgba(0, 0, 0, 0.03); --color-line-stronger: rgba(50, 50, 50, 0.12); /* ===== State colors ===== */ --color-success: #10B981; --color-warning: #F59E0B; --color-error: #EF4444; --color-info: #3B82F6; /* ===== Accent (action green — legacy tabbar/CTA) ===== */ --color-accent: #18a058; --color-accent-soft: rgba(24, 160, 88, 0.12); --color-accent-shadow: rgba(24, 160, 88, 0.28); /* ===== Fonts — 对齐 legacy(系统默认字体栈)===== */ --font-display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; --font-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif; --font-mono: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; /* ===== Type scale ===== */ --text-xs: 0.75rem; /* 12 */ --text-sm: 0.875rem; /* 14 */ --text-base: 1rem; /* 16 */ --text-md: 1.125rem; /* 18 */ --text-lg: 1.25rem; /* 20 */ --text-xl: 1.5rem; /* 24 */ --text-2xl: 1.875rem; /* 30 */ --text-3xl: 2.25rem; /* 36 */ --text-4xl: 3rem; /* 48 */ --text-5xl: 3.75rem; /* 60 */ --leading-tight: 1.2; --leading-snug: 1.4; --leading-normal: 1.6; /* legacy body line-height */ --leading-relaxed: 1.6; /* ===== Spacing (4px base) ===== */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 20px; --space-6: 24px; --space-7: 32px; --space-8: 40px; --space-9: 48px; --space-10: 64px; --space-11: 80px; --space-12: 96px; /* ===== Radius — 对齐 legacy --main-radius: 8px ===== */ --radius-xs: 3px; --radius-sm: 4px; --radius: 8px; --radius-lg: 8px; /* legacy main-radius — was 10px */ --radius-xl: 12px; --radius-2xl: 16px; --radius-pill: 100px; --radius-avatar: 50%; /* ===== Shadows — 对齐 legacy --main-shadow: rgba(116,116,116,0.08) ===== */ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.03); --shadow-sm: 0 0 10px rgba(116, 116, 116, 0.08); --shadow: 0 0 10px rgba(116, 116, 116, 0.12); --shadow-lg: 0 12px 32px rgba(18, 18, 18, 0.10); --shadow-drawer: 0 18px 60px rgba(0, 0, 0, 0.20); /* ===== Layout — 对齐 legacy --mian-max-width: 1200px ===== */ --nav-height: 60px; --container: 1200px; --container-wide: 1440px; --container-read: 760px; --container-page: 880px; --sidebar-width: 311px; --content-gap: 24px; --section-gap: 24px; --sidebar-bp: 992px; /* ===== Motion ===== */ --ease: cubic-bezier(.4, 0, .2, 1); --ease-out: cubic-bezier(.16, 1, .3, 1); --ease-spring: cubic-bezier(.34, 1.56, .64, 1); --dur-fast: 0.15s; --dur: 0.25s; --dur-slow: 0.4s; /* ===== Focus Ring — 对齐 legacy focus-shadow-color ===== */ --focus-ring: 0 0 2px 3px rgba(253, 83, 161, 0.4); /* ===== Z-index layers ===== */ --z-dropdown: 100; --z-sticky: 200; --z-fixed: 300; --z-overlay: 400; --z-modal: 500; --z-popover: 600; --z-toast: 700; --z-tooltip: 800; /* ===== Button sizes — 对齐 legacy ===== */ --radius-btn: 4px; --btn-sm-h: 28px; --btn-md-h: 34px; --btn-lg-h: 44px; /* ===== Card density — 对齐 legacy .box-body { padding: 15px } ===== */ --card-padding: 15px; --card-padding-sm: 10px; --card-padding-lg: 20px; --card-gap: 16px; --card-gap-lg: 20px; /* ===== Skeleton loader ===== */ --skeleton-base: var(--surface-2); --skeleton-shine: var(--surface-1); /* ===== Extended tokens (used by components) ===== */ --color-primary-light: var(--color-primary-soft); --color-surface: var(--surface-1); --color-line-strong: var(--color-line); --color-bg-hover: var(--surface-2); --color-border-light: var(--color-line-soft); --color-fill: var(--surface-2); --color-warning-bg: #fffbe6; --color-warning-text: #ad6800; --text-secondary: var(--color-ink-3); --text-tertiary: var(--color-ink-4); --surface-active: var(--surface-2); --surface-card: var(--surface-1); --surface-hover: var(--surface-2); --surface-secondary: var(--surface-2); --radius-code: var(--radius); --radius-full: 100px; --shadow-xl: 0 0 10px rgba(116, 116, 116, 0.12); --space-16: 64px; --z-floating: 900; --transition-fast: 0.15s ease; --transition-base: 0.25s ease; /* ===== Composite / Context tokens — 对齐 legacy ===== */ --header-bg: var(--blur-bg); --header-color: var(--color-ink-2); --footer-bg: var(--surface-1); --footer-color: var(--color-ink-4); --blur-bg: rgba(255, 255, 255, 0.80); --float-btn-bg: rgba(200, 200, 200, 0.40); /* ===== AKSRT-to-AKSRT canonical aliases ===== */ --content-max: var(--container); --font-heading: var(--font-ui); --radius-card: var(--radius); --radius-md: var(--radius); --color-primary-50: var(--color-primary-soft); --color-primary-dark: var(--color-primary-active); --shadow-md: var(--shadow); --mini-radius: calc(var(--radius) / 1.4); --single-cover-scale: 35%; /* ===== Avatar size system — legacy --this-size 等价 ===== */ --aksrt-avatar-size-xs: 24px; --aksrt-avatar-size-sm: 32px; --aksrt-avatar-size: 40px; --aksrt-avatar-size-lg: 56px; --aksrt-avatar-size-xl: 80px; /* ===== Post card thumbnail scale ===== */ --aksrt-card-thumb-scale: 56.25%; /* 16:9 */ /* ===== Multi-color palette (for buttons / badges / gradients) ===== */ --aksrt-rose: #f43f5e; --aksrt-rose-soft: rgba(244, 63, 94, 0.12); --aksrt-blue: #3b82f6; --aksrt-blue-soft: rgba(59, 130, 246, 0.12); --aksrt-green: #10b981; --aksrt-green-soft: rgba(16, 185, 129, 0.12); --aksrt-orange: #f97316; --aksrt-orange-soft:rgba(249, 115, 22, 0.12); --aksrt-purple: #8b5cf6; --aksrt-purple-soft:rgba(139, 92, 246, 0.12); --aksrt-cyan: #06b6d4; --aksrt-cyan-soft: rgba(6, 182, 212, 0.12); --aksrt-yellow: #eab308; --aksrt-yellow-soft:rgba(234, 179, 8, 0.12); --aksrt-red: #ef4444; --aksrt-red-soft: rgba(239, 68, 68, 0.12); --aksrt-teal: #14b8a6; --aksrt-teal-soft: rgba(20, 184, 166, 0.12); --aksrt-indigo: #6366f1; --aksrt-indigo-soft:rgba(99, 102, 241, 0.12); --aksrt-pink: #ec4899; --aksrt-pink-soft: rgba(236, 72, 153, 0.12); /* ===== VIP / special gradients ===== */ --aksrt-vip-gold-1: #f6d365; --aksrt-vip-gold-2: #fda085; --aksrt-grad-sunset-1: #f093fb; --aksrt-grad-sunset-2: #f5576c; --aksrt-grad-ocean-1: #4facfe; --aksrt-grad-ocean-2: #00f2fe; --aksrt-grad-forest-1: #43e97b; --aksrt-grad-forest-2: #38f9d7; --aksrt-grad-night-1: #a18cd1; --aksrt-grad-night-2: #fbc2eb; --aksrt-grad-fire-1: #f83600; --aksrt-grad-fire-2: #f9d423; /* ===== Component sizing ===== */ --aksrt-toggle-w: 44px; --aksrt-toggle-h: 24px; --aksrt-stepper-h: 36px; --aksrt-badge-h: 22px; /* ===== Legacy name bridge ===== */ --text-1: var(--color-ink); --text-2: var(--color-ink-2); --text-3: var(--color-ink-3); --border: var(--color-line); --color-text-1: var(--color-ink); --color-text-2: var(--color-ink-2); --color-text-3: var(--color-ink-3); --color-primary-bg: var(--color-primary-softer); --color-danger: var(--color-error); } /* ============================================================ * Blur-bg fallback cascade (mirrors legacy behaviour) * ============================================================ */ @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) { :root { --blur-bg: var(--surface-1); --header-bg: var(--surface-1); } } @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) { html.dark, body.dark-theme { --blur-bg: #37383a; --header-bg: #37383a; } } body.modal-open, body.dialog-open { --blur-bg: var(--surface-1); --header-bg: var(--surface-1); } body.modal-open .site-nav, body.modal-open .footer-tabbar, body.modal-open .float-right .float-btn, body.dialog-open .site-nav, body.dialog-open .footer-tabbar, body.dialog-open .float-right .float-btn { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } html.dark body.modal-open, html.dark body.dialog-open, body.dark-theme.modal-open, body.dark-theme.dialog-open { --blur-bg: #37383a; --header-bg: #37383a; } /* ============================================================ * Multi-level container responsive — 对齐 legacy --mian-max-width * 不同视口宽度下容器自动调整 * ============================================================ */ @media (min-width: 992px) { :root { --container: 960px; } } @media (min-width: 1200px) { :root { --container: 1140px; } } @media (min-width: 1400px) { :root { --container: 1200px; } } /* ============================================================ * Dark Theme — 对齐 legacy .dark-theme 精确 hex * body.dark-theme 与 html.dark 同权(legacy 用 body class) * ============================================================ */ html.dark, body.dark-theme { --color-ink: #f8fafc; /* legacy --key-color */ --color-ink-2: #e5eef7; /* legacy --main-color */ --color-ink-3: #b4b6bb; /* legacy --muted-color */ --color-ink-4: #888a8f; /* legacy --muted-2-color */ --surface-page: #292a2d; /* legacy --body-bg-color */ --surface-1: #323335; /* legacy --main-bg-color */ --surface-2: #2d2e31; /* legacy --muted-bg-color */ --surface-3: #3a3c42; --surface-4: #26282d; --color-line: rgba(114, 114, 114, 0.1); --color-line-soft: rgba(184, 184, 184, 0.02); --color-line-stronger: rgba(255, 255, 255, 0.12); --color-primary-soft: rgba(240, 68, 148, 0.16); --color-primary-softer: rgba(240, 68, 148, 0.08); --color-primary-light: var(--color-primary-soft); --color-surface: var(--surface-1); --color-line-strong: var(--color-line); --color-bg-hover: var(--surface-2); --color-border-light: var(--color-line-soft); --color-fill: var(--surface-2); --text-secondary: var(--color-ink-3); --text-tertiary: var(--color-ink-4); --surface-active: var(--surface-2); --surface-card: var(--surface-1); --surface-hover: var(--surface-2); --surface-secondary: var(--surface-2); --shadow-xl: 0 0 10px rgba(24, 24, 24, 0.18); --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.18); --shadow-sm: 0 0 10px rgba(24, 24, 24, 0.1); /* legacy --main-shadow dark */ --shadow: 0 0 10px rgba(24, 24, 24, 0.14); --shadow-lg: 0 14px 36px rgba(0, 0, 0, 0.32); --shadow-drawer: 0 20px 60px rgba(0, 0, 0, 0.60); --blur-bg: rgba(50, 51, 53, 0.80); --float-btn-bg: rgba(70, 70, 70, 0.40); --header-bg: var(--blur-bg); --footer-bg: var(--surface-1); --footer-color: var(--color-ink-4); --shadow-md: var(--shadow); --skeleton-base: #3a3b3e; --skeleton-shine: #444548; /* Multi-color palette — dark mode: same hue, softer tint backgrounds */ --aksrt-rose-soft: rgba(244, 63, 94, 0.18); --aksrt-blue-soft: rgba(59, 130, 246, 0.18); --aksrt-green-soft: rgba(16, 185, 129, 0.18); --aksrt-orange-soft:rgba(249, 115, 22, 0.18); --aksrt-purple-soft:rgba(139, 92, 246, 0.18); --aksrt-cyan-soft: rgba(6, 182, 212, 0.18); --aksrt-yellow-soft:rgba(234, 179, 8, 0.18); --aksrt-red-soft: rgba(239, 68, 68, 0.18); --aksrt-teal-soft: rgba(20, 184, 166, 0.18); --aksrt-indigo-soft:rgba(99, 102, 241, 0.18); --aksrt-pink-soft: rgba(236, 72, 153, 0.18); } /* Dark mode component refinements */ html.dark .site-nav, body.dark-theme .site-nav { border-bottom-color: var(--color-line); box-shadow: none; } html.dark .footer-tabbar, body.dark-theme .footer-tabbar { background: rgba(50, 51, 53, 0.80); box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.20); } html.dark .n-drawer, html.dark .n-modal, html.dark .n-dialog, body.dark-theme .n-drawer, body.dark-theme .n-modal, body.dark-theme .n-dialog { background: var(--surface-1); } html.dark .post-card, html.dark .widget, html.dark .aksrt-theme-box, html.dark .theme-box, body.dark-theme .post-card, body.dark-theme .widget, body.dark-theme .aksrt-theme-box, body.dark-theme .theme-box { border-color: transparent; } /* source: assets/css/core/reset.css */ /** * AKSRT Reset * 现代精简 reset,结合 box-sizing 与 a11y 友好的默认值。 */ *, *::before, *::after { box-sizing: border-box; } html { font-size: 16px; scroll-behavior: smooth; -webkit-text-size-adjust: 100%; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; text-rendering: optimizeLegibility; } body { margin: 0; font-family: var(--font-body); font-size: var(--text-base); line-height: var(--leading-normal); background-color: var(--surface-page); color: var(--color-ink-2); transition: background-color 0.25s ease, color 0.25s ease; overflow-x: hidden; } /* 媒体元素 */ img, picture, video, canvas, svg { display: block; max-width: 100%; height: auto; } /* 表单元素继承字体 */ input, button, textarea, select { font: inherit; color: inherit; } button { background: none; border: 0; padding: 0; cursor: pointer; } /* 链接 */ a { color: inherit; text-decoration: none; transition: color var(--dur-fast) var(--ease); } a:hover { color: var(--color-primary); } /* 焦点环:a11y 关键 */ :focus { outline: none; } :focus-visible { outline: none; box-shadow: var(--focus-ring); border-radius: 4px; } /* 选区色 */ ::selection { background: var(--color-primary-soft); color: var(--color-ink); } /* 屏幕阅读器隐藏 */ .screen-reader-text, .sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .screen-reader-text:focus, .sr-only:focus { position: fixed !important; top: 16px; left: 16px; width: auto; height: auto; padding: 8px 16px; background: var(--surface-1); color: var(--color-ink); z-index: 100000; clip: auto; box-shadow: var(--shadow-lg); border-radius: var(--radius); } /* 减少动效偏好 */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } /* source: assets/css/core/typography.css */ /** * AKSRT Typography — 1:1 legacy Alignment * * 对齐 legacy main.css 的排版系统 */ /* ===== 全局标题 — 对齐 legacy line 8947 ===== */ h1, h2, h3, h4, h5, h6 { font-weight: 700; margin: 20px 0 10px; color: var(--key-color, #333); } h1 { font-size: 22px; } h2 { font-size: 20px; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 15px; } h6 { font-size: 14px; } /* ===== 文章正文 — 对齐 legacy line 8740 ===== */ .wp-posts-content, .entry-content, .prose { font-size: 16px; line-height: 2; color: var(--main-color, #4e5358); min-height: 90px; } /* ===== 文章内标题 — 对齐 legacy line 8947 ===== */ .wp-posts-content h1, .wp-posts-content h2, .wp-posts-content h3, .wp-posts-content h4, .wp-posts-content h5, .entry-content h1, .entry-content h2, .entry-content h3, .entry-content h4, .entry-content h5, .prose h1, .prose h2, .prose h3, .prose h4, .prose h5 { font-weight: 700; margin: 20px 0 10px; color: var(--key-color, #333); } .wp-posts-content h1, .entry-content h1, .prose h1 { font-size: 22px; } .wp-posts-content h2, .entry-content h2, .prose h2 { font-size: 20px; } .wp-posts-content h3, .entry-content h3, .prose h3 { font-size: 18px; } .wp-posts-content h4, .entry-content h4, .prose h4 { font-size: 16px; } /* ===== 段落 — 对齐 legacy line 8999 ===== */ .wp-posts-content p, .entry-content p, .prose p { margin: 0 0 20px; word-wrap: break-word; } /* ===== 链接 — 对齐 legacy line 8836 ===== */ .wp-posts-content a, .entry-content a, .prose a { color: var(--focus-color, #f04494); text-decoration: none; } .wp-posts-content a:hover, .entry-content a:hover, .prose a:hover { color: var(--focus-color, #f04494); } /* ===== 图片 — 对齐 legacy line 8850 ===== */ .wp-posts-content img, .entry-content img, .prose img { max-width: 100%; height: auto; display: block; margin: auto; } /* ===== 内联代码 — 对齐 legacy line 8844 ===== */ .wp-posts-content code:not(pre code), .entry-content code:not(pre code), .prose code:not(pre code) { color: #ff3c98; background: rgba(253, 153, 153, 0.2); font-family: var(--font-mono, monospace); font-size: 0.9em; } /* ===== 代码块 — 对齐 legacy ===== */ .wp-posts-content pre, .entry-content pre, .prose pre { position: relative; background: #282c34; color: #abb2bf; padding: 15px; border-radius: var(--main-radius, 8px); overflow-x: auto; font-size: 14px; line-height: 1.5; margin: 0 0 20px; } .wp-posts-content pre code, .entry-content pre code, .prose pre code { color: inherit; background: none; padding: 0; font-size: inherit; } /* ===== 表格 — 对齐 legacy line 8897 ===== */ .wp-posts-content table, .entry-content table, .prose table { font-size: 14px; width: 100%; border-collapse: collapse; margin: 0 0 20px; } .wp-posts-content th, .wp-posts-content td, .entry-content th, .entry-content td, .prose th, .prose td { border: 1px solid var(--main-border-color, rgba(50, 50, 50, 0.06)); padding: 8px; } .wp-posts-content th, .entry-content th, .prose th { background: var(--muted-border-color, rgba(0, 0, 0, 0.03)); font-weight: 700; } .wp-posts-content tr:hover, .entry-content tr:hover, .prose tr:hover { background-color: rgba(240, 68, 148, 0.05); } /* ===== 列表 — 对齐 legacy line 8977 ===== */ .wp-posts-content ul, .wp-posts-content ol, .entry-content ul, .entry-content ol, .prose ul, .prose ol { margin: 10px 0 20px 15px; padding-left: 15px; } .wp-posts-content li, .entry-content li, .prose li { margin-bottom: 10px; } /* ===== 引用 — 对齐 legacy line 680 ===== */ .wp-posts-content blockquote, .entry-content blockquote, .prose blockquote { padding: 15px 20px; margin: 0 0 20px; border-left: 4px solid var(--main-border-color, rgba(50, 50, 50, 0.06)); background: var(--muted-border-color, rgba(0, 0, 0, 0.03)); font-size: 16px; color: var(--muted-color, #777); border-radius: 0; } .wp-posts-content blockquote p:last-child, .entry-content blockquote p:last-child, .prose blockquote p:last-child { margin-bottom: 0; } /* ===== 水平分割线 — 对齐 legacy line 676 ===== */ hr { border-color: var(--main-border-color, rgba(50, 50, 50, 0.06)); } /* ===== Strong / Bold ===== */ strong, b { font-weight: 700; } /* source: assets/css/core/buttons.css */ /** * AKSRT Buttons — 1:1 legacy Alignment * * 对齐 legacy .but 系统: * - 正常字重 (normal) * - 4px 圆角 * - 灰色默认背景 * - opacity hover */ .btn, .btn-primary, .btn-outline, .btn-ghost, .btn-danger { --btn-h: 34px; --btn-px: 14px; display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: var(--btn-h); padding: 0 var(--btn-px); font-size: var(--text-sm); font-weight: normal; /* legacy .but: normal — was 500 */ line-height: 1.44; border: 1px solid transparent; border-radius: var(--radius-btn); cursor: pointer; white-space: nowrap; user-select: none; text-decoration: none; box-shadow: none; transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease; } /* 尺寸变体 */ .btn-sm { --btn-h: 28px; --btn-px: 8px; font-size: var(--text-xs); } .btn-lg { --btn-h: 44px; --btn-px: 18px; font-size: var(--text-base); } /* === Default (gray background, like legacy .but default) === */ .btn { background: rgba(136, 136, 136, 0.1); color: #888; border-color: transparent; } .btn:hover { opacity: 0.8; color: #888; } /* === Primary — solid theme, opacity hover (no translateY / heavy glow) === */ .btn-primary { background: var(--color-primary); color: var(--color-on-primary); border-color: var(--color-primary); box-shadow: none; } .btn-primary:hover { opacity: 0.8; color: var(--color-on-primary); background: var(--color-primary); border-color: var(--color-primary); transform: none; box-shadow: none; } .btn-primary:active { opacity: 1; box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.08); } /* === Outline === */ .btn-outline { background: transparent; color: var(--color-ink-2); border-color: var(--color-ink-2); } .btn-outline:hover { opacity: 0.8; background: transparent; border-color: var(--color-ink-2); color: var(--color-ink-2); } /* === Ghost === */ .btn-ghost { background: transparent; color: var(--color-ink-2); border-color: transparent; } .btn-ghost:hover { background: rgba(136, 136, 136, 0.1); opacity: 0.8; } /* === Danger === */ .btn-danger { background: var(--color-error); color: #fff; border-color: var(--color-error); } .btn-danger:hover { opacity: 0.8; color: #fff; } /* === Disabled === */ .btn:disabled, .btn-primary:disabled, .btn-outline:disabled, .btn-ghost:disabled, .btn-danger:disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; } /* === Icon button === */ .btn-icon { width: var(--btn-h); padding: 0; justify-content: center; } .btn-icon.btn-sm { width: 28px; } .btn-icon.btn-lg { width: 44px; } /* === Full width === */ .btn-block { width: 100%; } /* ============================================================ * legacy .but / .badg compat layer — 1:1 legacy main.css (.but system) * ------------------------------------------------------------ * Additive: does NOT alter the AKSRT .btn system above. Lets reused * legacy-style markup (.but / .badg / .b-* / .jb-* / .c-* / .but-group / * .but-average / .toggle-radius) render via the --this-* context-coloring vars. * The --this-* DEFAULTS are set on the base rule here (BEFORE the .b-* and .jb-* * modifiers) so the cascade resolves colored variants correctly; scoped to * .but/.badg (never :root) so .float-btn's own var(--this-*, fallback) stays intact. * Consumes --focus-color-opacity* from compat-vars.css. * ============================================================ */ /* Base (legacy .but / .badg) */ .but, .badg { display: inline-block; vertical-align: middle; padding: 0.3em 0.6em; text-align: center; font-weight: normal; line-height: 1.44; border-radius: 4px; border: 1px solid var(--this-border); box-shadow: var(--this-shadow); background: var(--this-bg); color: var(--this-color); --main-color: var(--this-color); --this-bg: rgba(136, 136, 136, 0.1); --this-border: transparent; --this-shadow: none; --this-color: #888; text-shadow: 0 0 0; transition: 0.15s; cursor: pointer; } .but a { color: inherit; } .but .icon, .but > .fa:not(.fa-angle-right), .but > i[class*="fa-"]:not(.fa-angle-right) { margin-right: 0.25em; } /* hover / active */ .but:focus, .but:hover { opacity: 0.8; color: var(--this-color); } .but:active { --this-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.08); } /* radius variants */ .but.radius, .badg.radius, .radius > .but { border-radius: 50px; padding: 0.3em 1em; } .but.main-radius, .badg.main-radius { border-radius: var(--main-radius); } .but.mini-radius, .badg.mini-radius { border-radius: var(--mini-radius); } /* hollow (outline) */ .but.hollow, .badg.hollow { background: transparent; --this-border: var(--this-color); } .but.hollow:hover { background: var(--this-bg); } .badg.hollow[class*='b-'], .but.hollow[class*='b-'] { background: 0 0; --this-border: var(--this-bg); --this-color: var(--this-bg); } .but.hollow[class*='b-']:hover { color: #fff; } .but.hollow.c-white:hover { background: 0 0; --this-color: var(--focus-color); color: var(--focus-color); } /* circular icon button */ .circular, .badg.cir, .but.cir { padding: 0; border-radius: 5em; --this-size: 1.8em; display: inline-flex; justify-content: center; align-items: center; height: var(--this-size); min-width: var(--this-size); } .circular.radius4, .badg.cir.radius4, .but.cir.radius4 { border-radius: 4px; } .but.cir svg.icon, .but.cir > .fa { margin: 0; } /* button group (joined) */ .but-group { display: inline-flex; } .but-group > .but { border-radius: 0; margin: 0; } .but-group > .but:first-of-type { border-radius: 4px 0 0 4px; } .but-group > .but:last-of-type { border-radius: 0 4px 4px 0; } /* segmented control (equal-width) */ .but-average { display: flex; border-radius: 4px; overflow: hidden; } .but-average.inline { display: inline-flex; } .but-average.radius { border-radius: 100px; } .but-average.main-radius { border-radius: var(--main-radius); } .but-average.mini-radius { border-radius: var(--mini-radius); } .but-average > .but { margin: 0 !important; border-radius: 0; flex: auto; } .but-average > .but.active { --this-bg: var(--focus-color-opacity1); --this-color: var(--focus-color); } /* size variants */ .but.but-sm { font-size: 0.9em; padding: 0.1em 0.4em; vertical-align: 0.05em; } .but.badg-sm, .badg.badg-sm { font-size: 0.8em; padding: 0 0.2em; vertical-align: 0.1em; min-width: 1.6em; } .badg.badg-sm.cir { --this-size: 1.6em; } .padding-lg, .badg.badg-lg, .but.padding-lg { padding: 0.5em 2em; } /* active badge state */ .active.badg, .active > .badg:not(.vip-tag) { --this-bg: var(--focus-color); --this-color: #fff; } .active.badg.hollow, .active > .hollow:not(.vip-tag) { --this-color: var(--focus-color); } /* toggle-radius (round 29px toggle) — legacy 1:1 */ .toggle-radius { background: var(--this-bg); width: 29px; height: 29px; display: inline-block; text-align: center; border-radius: 100%; position: relative; vertical-align: text-top; --this-bg: var(--main-border-color); } /* legacy groups these with abs-* : absolute + vertical center; then pin left/right 0 */ .toggle-radius .fa, .toggle-radius .icon, .toggle-radius > i { position: absolute; top: 50%; right: 0 !important; left: 0 !important; margin: auto; transform: translateY(-50%); line-height: 1; width: 1em; height: 1em; display: inline-flex; align-items: center; justify-content: center; text-align: center; } /* solid color modifiers — set --this-bg; default --this-color white */ .b-gray, .b-theme, .b-red, .b-yellow, .b-blue, .b-blue-2, .b-black, .b-cyan, .b-green, .b-purple, .jb-red, .jb-pink, .jb-yellow, .jb-blue, .jb-green, .jb-purple, .jb-vip1, .jb-vip2 { color: var(--this-color); background: var(--this-bg); --this-color: #fff; } .jb-red, .jb-pink, .jb-yellow, .jb-blue, .jb-green, .jb-purple, .jb-vip1, .jb-vip2 { border: none; } .b-theme { --this-bg: var(--focus-color); } .b-gray { --this-bg: #818b95; } .b-red { --this-bg: #ff5473; } .b-yellow { --this-bg: #ff6f06; } .b-cyan { --this-bg: #08c4c1; } .b-blue { --this-bg: #2997f7; } .b-blue-2 { --this-bg: #5c7cff; } .b-green { --this-bg: #12b928; } .b-purple { --this-bg: #d448f5; } .b-black { --this-bg: #121517; } /* gradient modifiers (legacy .jb-*) */ .jb-red { --this-bg: linear-gradient(135deg, #fd7a64 10%, #fb2d2d 100%); } .jb-yellow { --this-bg: linear-gradient(135deg, #f99d4d 10%, #f7631d 100%); } .jb-blue { --this-bg: linear-gradient(135deg, #59c3fb 10%, #268df7 100%); } .jb-green { --this-bg: linear-gradient(135deg, #60e464 10%, #5cb85b 100%); } .jb-purple { --this-bg: linear-gradient(135deg, #f98dfb 10%, #ea00f9 100%); } .jb-pink { --this-bg: linear-gradient(135deg, #ff5e7f 30%, #ff967e 100%); } .jb-vip1 { --this-bg: linear-gradient(25deg, #eabe7b 10%, #f5e3c7 70%, #edc788 100%); --this-color: #866127; } .jb-vip2 { --this-bg: linear-gradient(317deg, #4d4c4c 30%, #7b7b7b 70%, #5f5c5c 100%); --this-color: #ddd; } /* text-color modifiers (legacy .c-*) — set --this-color + light --this-bg */ .c-theme, .c-gray, .c-white, .c-red, .c-red-2, .c-yellow, .c-blue, .c-blue-2, .c-green, .c-cyan, .c-purple { color: var(--this-color); } .c-theme { --this-color: var(--focus-color); --this-bg: var(--focus-color-opacity1); } .c-gray { --this-color: #888; --this-bg: rgba(136, 136, 136, 0.1); } .c-white { --this-color: #fff; --this-bg: rgba(255, 255, 255, 0.1); } .c-red { --this-color: #ff5473; --this-bg: rgba(255, 84, 115, 0.1); } .c-red-2 { --this-color: #d6064c; --this-bg: rgba(194, 41, 46, 0.1); } .c-yellow { --this-color: #ff6f06; --this-bg: rgba(255, 111, 6, 0.1); } .c-blue { --this-color: #2997f7; --this-bg: rgba(41, 151, 247, 0.1); } /* source: assets/css/core/forms.css */ /** * AKSRT Forms — 1:1 legacy Alignment * * 对齐 legacy .form-control: * - 灰色背景 (#f5f6f7) * - 透明边框 * - 34px 高度 * - 8px 圆角 * - focus 时粉色边框 + 光晕 */ /* ===== Field Wrapper ===== */ .field { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--space-4); } .field-label { font-size: var(--text-sm); font-weight: 600; color: var(--color-ink); } .field-help { font-size: var(--text-xs); color: var(--color-ink-3); } .field-error { font-size: var(--text-xs); color: var(--color-error); } /* ===== Input / Textarea / Select — 对齐 legacy .form-control ===== */ .input, .textarea, .select, input[type="text"].form-input, input[type="email"].form-input, input[type="password"].form-input, input[type="search"].form-input, input[type="url"].form-input, input[type="tel"].form-input, textarea.form-textarea, select.form-select { width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; color: var(--color-ink); background: var(--surface-page); border: 1px solid transparent; border-radius: var(--radius); transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease); } .textarea, textarea.form-textarea { height: auto; min-height: 120px; padding: 12px; line-height: var(--leading-snug); resize: vertical; } .input:hover, .textarea:hover, .select:hover { border-color: var(--color-primary); } .input:focus, .textarea:focus, .select:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 2px 3px rgba(253, 83, 161, 0.4); } .input::placeholder, .textarea::placeholder { color: var(--color-ink-4); } /* ===== Select ===== */ .select, select.form-select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23777' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 32px; } /* ===== Checkbox / Radio ===== */ .checkbox, .radio { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: var(--text-sm); color: var(--color-ink-2); } .checkbox input, .radio input { width: 16px; height: 16px; accent-color: var(--color-primary); cursor: pointer; } /* ===== Input Group ===== */ .input-group { display: flex; align-items: stretch; } .input-group .input { border-radius: var(--radius) 0 0 var(--radius); } .input-group .btn { border-radius: 0 var(--radius) var(--radius) 0; } /* ===== Form Layout ===== */ .form-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-4); } .form-actions { display: flex; gap: var(--space-3); margin-top: var(--space-5); } /* source: assets/css/core/alerts.css */ /** * AKSRT Alerts * 统一提示组件:error / warning / info / success * 用于替代各页面 inline 的 .login-error / .bind-error 等 */ .alert { display: flex; align-items: flex-start; gap: 10px; padding: 12px 14px; margin-bottom: var(--space-4); font-size: var(--text-sm); line-height: var(--leading-snug); border-radius: var(--radius); border: 1px solid transparent; } .alert > svg { flex-shrink: 0; width: 18px; height: 18px; margin-top: 1px; } .alert--error { color: #B91C1C; background: rgba(239, 68, 68, 0.08); border-color: rgba(239, 68, 68, 0.3); } .alert--warning { color: #B45309; background: rgba(245, 158, 11, 0.08); border-color: rgba(245, 158, 11, 0.3); } .alert--success { color: #047857; background: rgba(16, 185, 129, 0.08); border-color: rgba(16, 185, 129, 0.3); } .alert--info { color: #1D4ED8; background: rgba(59, 130, 246, 0.08); border-color: rgba(59, 130, 246, 0.3); } html.dark .alert--error { color: #FCA5A5; } html.dark .alert--warning { color: #FCD34D; } html.dark .alert--success { color: #6EE7B7; } html.dark .alert--info { color: #93C5FD; } /* source: assets/css/core/animations.css */ /** * AKSRT Animations — animate.css 等价(独立重写) * ------------------------------------------------------------ * 关键帧 + 工具类 + IntersectionObserver 触发配合 * 触发 JS 已在 enhancements2.js([data-aksrt-animate] 属性) * 本文件仅定义 @keyframes 和 .aksrt-anim-* 工具类 */ /* ============================================================ * Keyframes * ============================================================ */ /* Fade 系列 */ @keyframes aksrtFadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes aksrtFadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } } @keyframes aksrtFadeInDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: none; } } @keyframes aksrtFadeInLeft { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: none; } } @keyframes aksrtFadeInRight { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: none; } } /* Zoom 系列 */ @keyframes aksrtZoomIn { from { opacity: 0; transform: scale(.85); } to { opacity: 1; transform: none; } } @keyframes aksrtZoomInUp { from { opacity: 0; transform: scale(.85) translateY(20px); } to { opacity: 1; transform: none; } } /* Bounce 系列 */ @keyframes aksrtBounceIn { 0% { opacity: 0; transform: scale(.3); } 50% { opacity: 1; transform: scale(1.08); } 70% { transform: scale(.95); } 100% { opacity: 1; transform: none; } } @keyframes aksrtBounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-12px); } 60% { transform: translateY(-6px); } } /* Pulse */ @keyframes aksrtPulse { 0% { transform: scale(1); } 50% { transform: scale(1.06); } 100% { transform: scale(1); } } /* Flash */ @keyframes aksrtFlash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0; } } /* RubberBand */ @keyframes aksrtRubberBand { 0% { transform: scale(1); } 30% { transform: scaleX(1.25) scaleY(0.75); } 40% { transform: scaleX(0.75) scaleY(1.25); } 50% { transform: scaleX(1.15) scaleY(0.85); } 65% { transform: scaleX(0.95) scaleY(1.05); } 75% { transform: scaleX(1.05) scaleY(0.95); } 100% { transform: scale(1); } } /* Shake */ @keyframes aksrtShake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-4px); } 20%, 40%, 60%, 80% { transform: translateX(4px); } } /* Swing */ @keyframes aksrtSwing { 20% { transform: rotate(15deg); } 40% { transform: rotate(-10deg); } 60% { transform: rotate(5deg); } 80% { transform: rotate(-5deg); } 100% { transform: none; } } /* Tada */ @keyframes aksrtTada { 0% { transform: scale(1); } 10%, 20% { transform: scale(0.9) rotate(-3deg); } 30%, 50%, 70%, 90% { transform: scale(1.1) rotate(3deg); } 40%, 60%, 80% { transform: scale(1.1) rotate(-3deg); } 100% { transform: scale(1) rotate(0); } } /* Wobble */ @keyframes aksrtWobble { 0% { transform: none; } 15% { transform: translateX(-25%) rotate(-5deg); } 30% { transform: translateX(20%) rotate(3deg); } 45% { transform: translateX(-15%) rotate(-3deg); } 60% { transform: translateX(10%) rotate(2deg); } 75% { transform: translateX(-5%) rotate(-1deg); } 100% { transform: none; } } /* Slide 系列 */ @keyframes aksrtSlideInUp { from { opacity: 0; transform: translateY(100%); } to { opacity: 1; transform: none; } } @keyframes aksrtSlideInDown { from { opacity: 0; transform: translateY(-100%); } to { opacity: 1; transform: none; } } @keyframes aksrtSlideInLeft { from { opacity: 0; transform: translateX(-100%); } to { opacity: 1; transform: none; } } @keyframes aksrtSlideInRight { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: none; } } /* HeartBeat */ @keyframes aksrtHeartBeat { 0% { transform: scale(1); } 14% { transform: scale(1.3); } 28% { transform: scale(1); } 42% { transform: scale(1.3); } 70% { transform: scale(1); } 100% { transform: scale(1); } } /* Jello */ @keyframes aksrtJello { 0%, 100% { transform: none; } 11% { transform: skewX(-12.5deg) skewY(-12.5deg); } 22% { transform: skewX(6.25deg) skewY(6.25deg); } 33% { transform: skewX(-6.25deg) skewY(-6.25deg); } 44% { transform: skewX(3.125deg) skewY(3.125deg); } 55% { transform: skewX(-3.125deg) skewY(-3.125deg); } 66% { transform: skewX(1.5625deg) skewY(1.5625deg); } 77% { transform: skewX(-1.5625deg) skewY(-1.5625deg); } 88% { transform: skewX(0.78125deg) skewY(0.78125deg); } } /* HeadShake */ @keyframes aksrtHeadShake { 0% { transform: translateX(0); } 6.5% { transform: translateX(-6px) rotateY(-9deg); } 18.5% { transform: translateX(5px) rotateY(7deg); } 31.5% { transform: translateX(-3px) rotateY(-5deg); } 43.5% { transform: translateX(2px) rotateY(3deg); } 50% { transform: translateX(0); } 100% { transform: translateX(0); } } /* BounceOut — 退出动画 */ @keyframes aksrtBounceOut { 0% { transform: scale(1); } 25% { transform: scale(0.95); } 50% { transform: scale(1.1); } 75% { transform: scale(0.97); } 100% { transform: scale(1); opacity: 0; } } /* ZoomOut — 退出动画 */ @keyframes aksrtZoomOut { 0% { opacity: 1; transform: none; } 100% { opacity: 0; transform: scale(0.85); } } /* BackIn/BackOut */ @keyframes aksrtBackInUp { 0% { opacity: 0; transform: translateY(30px) scale(0.7); } 80% { opacity: 0.8; transform: translateY(-5px) scale(1.02); } 100% { opacity: 1; transform: none; } } @keyframes aksrtBackInDown { 0% { opacity: 0; transform: translateY(-30px) scale(0.7); } 80% { opacity: 0.8; transform: translateY(5px) scale(1.02); } 100% { opacity: 1; transform: none; } } /* Flip */ @keyframes aksrtFlip { 0% { transform: perspective(400px) rotateY(90deg); opacity: 0; } 40% { transform: perspective(400px) rotateY(-10deg); } 70% { transform: perspective(400px) rotateY(10deg); } 100% { transform: perspective(400px) rotateY(0deg); opacity: 1; } } @keyframes aksrtFlipInX { 0% { transform: perspective(400px) rotateX(90deg); opacity: 0; } 40% { transform: perspective(400px) rotateX(-10deg); } 70% { transform: perspective(400px) rotateX(10deg); } 100% { transform: perspective(400px) rotateX(0deg); opacity: 1; } } /* ============================================================ * Animation utility classes * ============================================================ */ .aksrt-anim-fade-in { animation: aksrtFadeIn var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-fade-up { animation: aksrtFadeInUp var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-fade-down { animation: aksrtFadeInDown var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-fade-left { animation: aksrtFadeInLeft var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-fade-right { animation: aksrtFadeInRight var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-zoom-in { animation: aksrtZoomIn var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-zoom-in-up { animation: aksrtZoomInUp var(--dur-base, .4s) var(--ease-out, ease) both; } .aksrt-anim-bounce-in { animation: aksrtBounceIn .6s var(--ease-out, ease) both; } .aksrt-anim-bounce { animation: aksrtBounce 1s ease both; } .aksrt-anim-pulse { animation: aksrtPulse 1s ease infinite; } .aksrt-anim-flash { animation: aksrtFlash 1s ease both; } .aksrt-anim-rubber-band { animation: aksrtRubberBand .8s ease both; } .aksrt-anim-shake { animation: aksrtShake .5s ease both; } .aksrt-anim-swing { animation: aksrtSwing .6s var(--ease-out, ease) both; } .aksrt-anim-tada { animation: aksrtTada 1s ease both; } .aksrt-anim-wobble { animation: aksrtWobble .8s ease both; } .aksrt-anim-heart-beat { animation: aksrtHeartBeat 1.3s ease both; } .aksrt-anim-jello { animation: aksrtJello .8s ease both; } .aksrt-anim-head-shake { animation: aksrtHeadShake .8s ease both; } /* 退出动画 */ .aksrt-anim-bounce-out { animation: aksrtBounceOut .5s ease both; } .aksrt-anim-zoom-out { animation: aksrtZoomOut .3s ease both; } /* BackIn 动画 */ .aksrt-anim-back-in-up { animation: aksrtBackInUp .5s var(--ease-out, ease) both; } .aksrt-anim-back-in-down { animation: aksrtBackInDown .5s var(--ease-out, ease) both; } .aksrt-anim-slide-up { animation: aksrtSlideInUp .5s var(--ease-out, ease) both; } .aksrt-anim-slide-down { animation: aksrtSlideInDown .5s var(--ease-out, ease) both; } .aksrt-anim-slide-left { animation: aksrtSlideInLeft .5s var(--ease-out, ease) both; } .aksrt-anim-slide-right { animation: aksrtSlideInRight .5s var(--ease-out, ease) both; } .aksrt-anim-flip { animation: aksrtFlip .6s var(--ease-out, ease) both; } .aksrt-anim-flip-x { animation: aksrtFlipInX .6s var(--ease-out, ease) both; } /* ============================================================ * Duration modifiers * ============================================================ */ .aksrt-anim-fast { --dur-base: .2s; } .aksrt-anim-slow { --dur-base: .6s; } /* ============================================================ * Delay modifiers (配合 data-aksrt-delay 使用时为 inline, * 也可用 class 方式独立设置) * ============================================================ */ .aksrt-anim-delay-1 { animation-delay: .1s; } .aksrt-anim-delay-2 { animation-delay: .2s; } .aksrt-anim-delay-3 { animation-delay: .3s; } .aksrt-anim-delay-4 { animation-delay: .4s; } .aksrt-anim-delay-5 { animation-delay: .5s; } .aksrt-anim-delay-6 { animation-delay: .6s; } .aksrt-anim-delay-7 { animation-delay: .7s; } .aksrt-anim-delay-8 { animation-delay: .8s; } /* ============================================================ * Infinite modifier * ============================================================ */ .aksrt-anim-infinite { animation-iteration-count: infinite; } /* ============================================================ * Reduced-motion — 尊重用户偏好 * ============================================================ */ @media (prefers-reduced-motion: reduce) { .aksrt-anim-fade-in, .aksrt-anim-fade-up, .aksrt-anim-fade-down, .aksrt-anim-fade-left, .aksrt-anim-fade-right, .aksrt-anim-zoom-in, .aksrt-anim-zoom-in-up, .aksrt-anim-bounce-in, .aksrt-anim-bounce, .aksrt-anim-pulse, .aksrt-anim-flash, .aksrt-anim-rubber-band, .aksrt-anim-shake, .aksrt-anim-swing, .aksrt-anim-tada, .aksrt-anim-wobble, .aksrt-anim-heart-beat, .aksrt-anim-jello, .aksrt-anim-head-shake, .aksrt-anim-bounce-out, .aksrt-anim-zoom-out, .aksrt-anim-back-in-up, .aksrt-anim-back-in-down, .aksrt-anim-slide-up, .aksrt-anim-slide-down, .aksrt-anim-slide-left, .aksrt-anim-slide-right, .aksrt-anim-flip, .aksrt-anim-flip-x { animation: none !important; } } /* source: assets/css/core/components-ext.css */ /** * AKSRT Extended Components — 时间轴 / 步骤向导 / 九宫格 / 定价卡片 / * Toggle 开关 / 自定义复选框 / 数字步进器 * ------------------------------------------------------------ * 全部使用 aksrt- 前缀,保持原生语义可访问性。 */ /* ============================================================ * 1. 时间轴 — .aksrt-timeline * ============================================================ */ .aksrt-timeline { position: relative; padding-left: 28px; margin: 0; list-style: none; } /* 竖线 */ .aksrt-timeline::before { content: ''; position: absolute; left: 8px; top: 4px; bottom: 4px; width: 2px; background: var(--color-line, rgba(50, 50, 50, 0.1)); border-radius: 1px; } .aksrt-timeline__item { position: relative; padding-bottom: 24px; } .aksrt-timeline__item:last-child { padding-bottom: 0; } /* 圆点 */ .aksrt-timeline__dot { position: absolute; left: -24px; top: 4px; width: 12px; height: 12px; border-radius: 50%; background: var(--color-primary); border: 2px solid var(--surface-1, #fff); box-shadow: 0 0 0 2px var(--color-primary-soft, rgba(240, 68, 148, 0.12)); z-index: 1; } /* 空心圆点变体 */ .aksrt-timeline__dot--outline { background: var(--surface-1, #fff); border: 2px solid var(--color-primary); box-shadow: none; } /* 灰色圆点 — 已完成/已过去 */ .aksrt-timeline__dot--muted { background: var(--color-ink-4, #999); box-shadow: 0 0 0 2px var(--surface-2, #eee); } .aksrt-timeline__time { display: block; font-size: 12px; color: var(--color-ink-4, #999); margin-bottom: 4px; } .aksrt-timeline__title { font-weight: 600; color: var(--color-ink, #333); margin-bottom: 4px; } .aksrt-timeline__content { font-size: 14px; color: var(--color-ink-3, #777); line-height: 1.6; } /* ============================================================ * 2. 步骤向导 — .aksrt-steps * ============================================================ */ .aksrt-steps { display: flex; align-items: flex-start; gap: 0; margin: 0; padding: 0; list-style: none; counter-reset: aksrt-step; } .aksrt-steps__item { flex: 1; position: relative; text-align: center; counter-increment: aksrt-step; } /* 连接线 */ .aksrt-steps__item:not(:last-child)::after { content: ''; position: absolute; top: 16px; left: calc(50% + 20px); right: calc(-50% + 20px); height: 2px; background: var(--color-line, rgba(50, 50, 50, 0.1)); } .aksrt-steps__icon { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; background: var(--surface-2, #eee); color: var(--color-ink-3, #777); font-size: 14px; font-weight: 700; margin: 0 auto 8px; position: relative; z-index: 1; } .aksrt-steps__item--active .aksrt-steps__icon { background: var(--color-primary); color: var(--color-on-primary, #fff); } .aksrt-steps__item--done .aksrt-steps__icon { background: var(--color-success); color: #fff; } .aksrt-steps__item--done:not(:last-child)::after { background: var(--color-success); } .aksrt-steps__label { font-size: 13px; font-weight: 600; color: var(--color-ink-3, #777); } .aksrt-steps__item--active .aksrt-steps__label { color: var(--color-primary); } .aksrt-steps__item--done .aksrt-steps__label { color: var(--color-success); } /* 垂直模式 */ .aksrt-steps--vertical { flex-direction: column; gap: 0; padding-left: 20px; } .aksrt-steps--vertical .aksrt-steps__item { text-align: left; padding-left: 28px; padding-bottom: 20px; } .aksrt-steps--vertical .aksrt-steps__item:not(:last-child)::after { top: 34px; left: 36px; right: auto; width: 2px; height: calc(100% - 34px); } .aksrt-steps--vertical .aksrt-steps__icon { position: absolute; left: 0; margin: 0; } /* ============================================================ * 3. 九宫格 — .aksrt-img-grid * ============================================================ */ .aksrt-img-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; border-radius: var(--radius, 8px); overflow: hidden; } .aksrt-img-grid img { width: 100%; aspect-ratio: 1; object-fit: cover; display: block; cursor: pointer; transition: transform .2s ease; } .aksrt-img-grid img:hover { transform: scale(1.03); } /* 自适应列数 */ .aksrt-img-grid--2 { grid-template-columns: repeat(2, 1fr); } .aksrt-img-grid--4 { grid-template-columns: repeat(4, 1fr); } @media (max-width: 480px) { .aksrt-img-grid--4 { grid-template-columns: repeat(3, 1fr); } } /* ============================================================ * 5. Toggle 开关 — .aksrt-toggle (纯 CSS + :checked) * 保持原生 可访问性 * ============================================================ */ .aksrt-toggle { position: relative; display: inline-flex; align-items: center; cursor: pointer; user-select: none; gap: 8px; } .aksrt-toggle__input { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; } .aksrt-toggle__track { position: relative; width: var(--aksrt-toggle-w, 44px); height: var(--aksrt-toggle-h, 24px); background: var(--surface-3, #e8e8e8); border-radius: var(--aksrt-toggle-h, 24px); transition: background .2s ease; flex-shrink: 0; } .aksrt-toggle__track::after { content: ''; position: absolute; top: 2px; left: 2px; width: calc(var(--aksrt-toggle-h, 24px) - 4px); height: calc(var(--aksrt-toggle-h, 24px) - 4px); background: #fff; border-radius: 50%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); transition: transform .2s ease; } /* Checked */ .aksrt-toggle__input:checked + .aksrt-toggle__track { background: var(--color-primary); } .aksrt-toggle__input:checked + .aksrt-toggle__track::after { transform: translateX(calc(var(--aksrt-toggle-w, 44px) - var(--aksrt-toggle-h, 24px))); } /* Focus-visible */ .aksrt-toggle__input:focus-visible + .aksrt-toggle__track { box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4)); } /* Disabled */ .aksrt-toggle__input:disabled + .aksrt-toggle__track { opacity: 0.5; cursor: not-allowed; } .aksrt-toggle__label { font-size: 14px; color: var(--color-ink-2, #4e5358); } /* ============================================================ * 6. 自定义复选框 — .aksrt-checkbox (纯 CSS + :checked) * 保持原生 可访问性 * ============================================================ */ .aksrt-checkbox { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; } .aksrt-checkbox__input { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; } .aksrt-checkbox__box { position: relative; width: 18px; height: 18px; border: 2px solid var(--color-line, rgba(50, 50, 50, 0.15)); border-radius: 4px; background: var(--surface-1, #fff); transition: background .15s ease, border-color .15s ease; flex-shrink: 0; } /* 打勾 SVG */ .aksrt-checkbox__box::after { content: ''; position: absolute; top: 2px; left: 5px; width: 5px; height: 9px; border: 2px solid #fff; border-top: none; border-left: none; transform: rotate(45deg) scale(0); transition: transform .15s ease; } .aksrt-checkbox__input:checked + .aksrt-checkbox__box { background: var(--color-primary); border-color: var(--color-primary); } .aksrt-checkbox__input:checked + .aksrt-checkbox__box::after { transform: rotate(45deg) scale(1); } .aksrt-checkbox__input:focus-visible + .aksrt-checkbox__box { box-shadow: var(--focus-ring, 0 0 2px 3px rgba(253, 83, 161, 0.4)); } .aksrt-checkbox__input:disabled + .aksrt-checkbox__box { opacity: 0.5; cursor: not-allowed; } .aksrt-checkbox__label { font-size: 14px; color: var(--color-ink-2, #4e5358); } /* ============================================================ * 7. 数字步进器 — .aksrt-stepper * ============================================================ */ .aksrt-stepper { display: inline-flex; align-items: center; border: 1px solid var(--color-line, rgba(50, 50, 50, 0.1)); border-radius: var(--radius, 8px); overflow: hidden; height: var(--aksrt-stepper-h, 36px); } .aksrt-stepper__btn { display: flex; align-items: center; justify-content: center; width: var(--aksrt-stepper-h, 36px); height: 100%; background: var(--surface-2, #eee); color: var(--color-ink-2, #4e5358); border: none; cursor: pointer; font-size: 16px; font-weight: 600; transition: background .15s ease, color .15s ease; user-select: none; } .aksrt-stepper__btn:hover { background: var(--surface-3, #e8e8e8); color: var(--color-ink, #333); } .aksrt-stepper__btn:disabled { opacity: 0.4; cursor: not-allowed; } .aksrt-stepper__input { width: 48px; height: 100%; border: none; text-align: center; font-size: 14px; font-weight: 600; color: var(--color-ink, #333); background: var(--surface-1, #fff); -moz-appearance: textfield; } .aksrt-stepper__input::-webkit-outer-spin-button, .aksrt-stepper__input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; } .aksrt-stepper__input:focus { outline: none; background: var(--color-primary-softer, rgba(240, 68, 148, 0.05)); } /* ============================================================ * 8. 头像尺寸变量系统 — .aksrt-avatar--{size} * ============================================================ */ .aksrt-avatar--xs { width: var(--aksrt-avatar-size-xs); height: var(--aksrt-avatar-size-xs); } .aksrt-avatar--sm { width: var(--aksrt-avatar-size-sm); height: var(--aksrt-avatar-size-sm); } .aksrt-avatar { width: var(--aksrt-avatar-size); height: var(--aksrt-avatar-size); } .aksrt-avatar--lg { width: var(--aksrt-avatar-size-lg); height: var(--aksrt-avatar-size-lg); } .aksrt-avatar--xl { width: var(--aksrt-avatar-size-xl); height: var(--aksrt-avatar-size-xl); } /* ============================================================ * 9. 涟漪点击效果 — .aksrt-ripple * 容器加此类,点击时 JS 注入 span.aksrt-ripple__wave * ============================================================ */ .aksrt-ripple { position: relative; overflow: hidden; } .aksrt-ripple__wave { position: absolute; border-radius: 50%; background: rgba(255, 255, 255, 0.35); transform: scale(0); animation: aksrtRippleWave .6s ease-out forwards; pointer-events: none; } @keyframes aksrtRippleWave { to { transform: scale(4); opacity: 0; } } /* Runtime broad ripple (.aksrt-wave injected into .but/.btn). * MUST stay out of flow — missing absolute made header CTA grow on click. */ .aksrt-wave { position: absolute !important; border-radius: 50%; background: rgba(255, 255, 255, 0.35); pointer-events: none !important; z-index: 1; transform: scale(0); animation: aksrtWaveRipple 0.6s ease-out forwards; } @keyframes aksrtWaveRipple { to { transform: scale(1); opacity: 0; } } .nowave { overflow: hidden; } /* ============================================================ * 10. 模态框堆叠动画 — 父模态缩小 * ============================================================ */ .modal-stacked .modal-dialog { transition: transform .25s var(--ease, ease), filter .25s ease; } .modal-stacked .modal-dialog.modal-behind { transform: scale(0.92); filter: brightness(0.85); pointer-events: none; } /* source: assets/css/core/color-utilities.css */ /** * AKSRT Color Utilities — 多色按钮 / 渐变按钮 / 文字渐变 / Badge * ------------------------------------------------------------ * 所有颜色走 CSS 变量(定义在 tokens.css),不硬编码十六进制。 */ /* ============================================================ * 1. 多色按钮 — .aksrt-btn--{color} * ============================================================ */ .aksrt-btn--rose { background: var(--aksrt-rose); color: #fff; } .aksrt-btn--rose:hover, .aksrt-btn--rose:focus-visible { background: #e11d48; } .aksrt-btn--blue { background: var(--aksrt-blue); color: #fff; } .aksrt-btn--blue:hover, .aksrt-btn--blue:focus-visible { background: #2563eb; } .aksrt-btn--green { background: var(--aksrt-green); color: #fff; } .aksrt-btn--green:hover, .aksrt-btn--green:focus-visible { background: #059669; } .aksrt-btn--orange { background: var(--aksrt-orange); color: #fff; } .aksrt-btn--orange:hover, .aksrt-btn--orange:focus-visible { background: #ea580c; } .aksrt-btn--purple { background: var(--aksrt-purple); color: #fff; } .aksrt-btn--purple:hover, .aksrt-btn--purple:focus-visible { background: #7c3aed; } .aksrt-btn--cyan { background: var(--aksrt-cyan); color: #fff; } .aksrt-btn--cyan:hover, .aksrt-btn--cyan:focus-visible { background: #0891b2; } .aksrt-btn--yellow { background: var(--aksrt-yellow); color: #422006; } .aksrt-btn--yellow:hover, .aksrt-btn--yellow:focus-visible { background: #ca8a04; color: #fff; } .aksrt-btn--red { background: var(--aksrt-red); color: #fff; } .aksrt-btn--red:hover, .aksrt-btn--red:focus-visible { background: #dc2626; } .aksrt-btn--teal { background: var(--aksrt-teal); color: #fff; } .aksrt-btn--teal:hover, .aksrt-btn--teal:focus-visible { background: #0d9488; } .aksrt-btn--indigo { background: var(--aksrt-indigo); color: #fff; } .aksrt-btn--indigo:hover, .aksrt-btn--indigo:focus-visible { background: #4f46e5; } .aksrt-btn--pink { background: var(--aksrt-pink); color: #fff; } .aksrt-btn--pink:hover, .aksrt-btn--pink:focus-visible { background: #db2777; } /* Soft variant — 浅色背景 + 深色文字 */ .aksrt-btn--rose-soft { background: var(--aksrt-rose-soft); color: var(--aksrt-rose); } .aksrt-btn--blue-soft { background: var(--aksrt-blue-soft); color: var(--aksrt-blue); } .aksrt-btn--green-soft { background: var(--aksrt-green-soft); color: var(--aksrt-green); } .aksrt-btn--orange-soft { background: var(--aksrt-orange-soft); color: var(--aksrt-orange); } .aksrt-btn--purple-soft { background: var(--aksrt-purple-soft); color: var(--aksrt-purple); } .aksrt-btn--cyan-soft { background: var(--aksrt-cyan-soft); color: var(--aksrt-cyan); } .aksrt-btn--yellow-soft { background: var(--aksrt-yellow-soft); color: #92400e; } .aksrt-btn--red-soft { background: var(--aksrt-red-soft); color: var(--aksrt-red); } .aksrt-btn--teal-soft { background: var(--aksrt-teal-soft); color: var(--aksrt-teal); } .aksrt-btn--indigo-soft { background: var(--aksrt-indigo-soft); color: var(--aksrt-indigo); } .aksrt-btn--pink-soft { background: var(--aksrt-pink-soft); color: var(--aksrt-pink); } /* ============================================================ * 2. 渐变按钮 — .aksrt-btn--grad-{name} * ============================================================ */ .aksrt-btn--grad-vip { background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2)); color: #5a3d00; border: none; } .aksrt-btn--grad-sunset { background: linear-gradient(135deg, var(--aksrt-grad-sunset-1), var(--aksrt-grad-sunset-2)); color: #fff; border: none; } .aksrt-btn--grad-ocean { background: linear-gradient(135deg, var(--aksrt-grad-ocean-1), var(--aksrt-grad-ocean-2)); color: #fff; border: none; } .aksrt-btn--grad-forest { background: linear-gradient(135deg, var(--aksrt-grad-forest-1), var(--aksrt-grad-forest-2)); color: #064e3b; border: none; } .aksrt-btn--grad-night { background: linear-gradient(135deg, var(--aksrt-grad-night-1), var(--aksrt-grad-night-2)); color: #4c1d95; border: none; } .aksrt-btn--grad-fire { background: linear-gradient(135deg, var(--aksrt-grad-fire-1), var(--aksrt-grad-fire-2)); color: #fff; border: none; } .aksrt-btn--grad-primary { background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active)); color: var(--color-on-primary); border: none; } /* 渐变按钮 hover — 亮度微调 */ .aksrt-btn--grad-vip:hover, .aksrt-btn--grad-sunset:hover, .aksrt-btn--grad-ocean:hover, .aksrt-btn--grad-forest:hover, .aksrt-btn--grad-night:hover, .aksrt-btn--grad-fire:hover, .aksrt-btn--grad-primary:hover { filter: brightness(1.08); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); } /* ============================================================ * 3. 文字渐变 — .aksrt-text-grad-{name} * ============================================================ */ .aksrt-text-grad-primary { background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-vip { background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-sunset { background: linear-gradient(135deg, var(--aksrt-grad-sunset-1), var(--aksrt-grad-sunset-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-ocean { background: linear-gradient(135deg, var(--aksrt-grad-ocean-1), var(--aksrt-grad-ocean-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-forest { background: linear-gradient(135deg, var(--aksrt-grad-forest-1), var(--aksrt-grad-forest-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-night { background: linear-gradient(135deg, var(--aksrt-grad-night-1), var(--aksrt-grad-night-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .aksrt-text-grad-fire { background: linear-gradient(135deg, var(--aksrt-grad-fire-1), var(--aksrt-grad-fire-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ============================================================ * 4. Badge 系统 — .aksrt-badge / .aksrt-badge--{color} * ============================================================ */ .aksrt-badge { display: inline-flex; align-items: center; justify-content: center; height: var(--aksrt-badge-h, 22px); padding: 0 8px; border-radius: var(--radius-pill, 100px); font-size: 12px; font-weight: 600; line-height: 1; white-space: nowrap; vertical-align: middle; } .aksrt-badge--primary { background: var(--color-primary-soft); color: var(--color-primary); } .aksrt-badge--success { background: rgba(16, 185, 129, 0.12); color: var(--color-success); } .aksrt-badge--warning { background: rgba(245, 158, 11, 0.12); color: var(--color-warning); } .aksrt-badge--error { background: rgba(239, 68, 68, 0.12); color: var(--color-error); } .aksrt-badge--info { background: rgba(59, 130, 246, 0.12); color: var(--color-info); } .aksrt-badge--rose { background: var(--aksrt-rose-soft); color: var(--aksrt-rose); } .aksrt-badge--blue { background: var(--aksrt-blue-soft); color: var(--aksrt-blue); } .aksrt-badge--green { background: var(--aksrt-green-soft); color: var(--aksrt-green); } .aksrt-badge--orange { background: var(--aksrt-orange-soft); color: var(--aksrt-orange); } .aksrt-badge--purple { background: var(--aksrt-purple-soft); color: var(--aksrt-purple); } .aksrt-badge--cyan { background: var(--aksrt-cyan-soft); color: var(--aksrt-cyan); } .aksrt-badge--yellow { background: var(--aksrt-yellow-soft); color: #92400e; } .aksrt-badge--red { background: var(--aksrt-red-soft); color: var(--aksrt-red); } .aksrt-badge--teal { background: var(--aksrt-teal-soft); color: var(--aksrt-teal); } .aksrt-badge--indigo { background: var(--aksrt-indigo-soft); color: var(--aksrt-indigo); } .aksrt-badge--pink { background: var(--aksrt-pink-soft); color: var(--aksrt-pink); } /* 渐变 Badge */ .aksrt-badge--grad-vip { background: linear-gradient(135deg, var(--aksrt-vip-gold-1), var(--aksrt-vip-gold-2)); color: #5a3d00; } .aksrt-badge--grad-primary { background: linear-gradient(135deg, var(--color-primary), var(--color-primary-active)); color: var(--color-on-primary); } /* Solid badge variant — 纯色背景 + 白色文字 */ .aksrt-badge--solid-primary { background: var(--color-primary); color: #fff; } .aksrt-badge--solid-success { background: var(--color-success); color: #fff; } .aksrt-badge--solid-warning { background: var(--color-warning); color: #fff; } .aksrt-badge--solid-error { background: var(--color-error); color: #fff; } .aksrt-badge--solid-info { background: var(--color-info); color: #fff; } .aksrt-badge--solid-rose { background: var(--aksrt-rose); color: #fff; } .aksrt-badge--solid-blue { background: var(--aksrt-blue); color: #fff; } .aksrt-badge--solid-green { background: var(--aksrt-green); color: #fff; } .aksrt-badge--solid-orange { background: var(--aksrt-orange); color: #fff; } .aksrt-badge--solid-purple { background: var(--aksrt-purple); color: #fff; } .aksrt-badge--solid-cyan { background: var(--aksrt-cyan); color: #fff; } .aksrt-badge--solid-yellow { background: var(--aksrt-yellow); color: #422006; } .aksrt-badge--solid-red { background: var(--aksrt-red); color: #fff; } .aksrt-badge--solid-teal { background: var(--aksrt-teal); color: #fff; } .aksrt-badge--solid-indigo { background: var(--aksrt-indigo); color: #fff; } .aksrt-badge--solid-pink { background: var(--aksrt-pink); color: #fff; } /* Badge sizes */ .aksrt-badge--sm { height: 18px; padding: 0 6px; font-size: 11px; } .aksrt-badge--lg { height: 28px; padding: 0 12px; font-size: 13px; } /* ============================================================ * 5. 背景色工具类 — .aksrt-bg-{color} * ============================================================ */ .aksrt-bg-rose { background-color: var(--aksrt-rose-soft); } .aksrt-bg-blue { background-color: var(--aksrt-blue-soft); } .aksrt-bg-green { background-color: var(--aksrt-green-soft); } .aksrt-bg-orange { background-color: var(--aksrt-orange-soft); } .aksrt-bg-purple { background-color: var(--aksrt-purple-soft); } .aksrt-bg-cyan { background-color: var(--aksrt-cyan-soft); } .aksrt-bg-yellow { background-color: var(--aksrt-yellow-soft); } .aksrt-bg-red { background-color: var(--aksrt-red-soft); } .aksrt-bg-teal { background-color: var(--aksrt-teal-soft); } .aksrt-bg-indigo { background-color: var(--aksrt-indigo-soft); } .aksrt-bg-pink { background-color: var(--aksrt-pink-soft); } /* ============================================================ * 6. 文字色工具类 — .aksrt-text-{color} * ============================================================ */ .aksrt-text-rose { color: var(--aksrt-rose); } .aksrt-text-blue { color: var(--aksrt-blue); } .aksrt-text-green { color: var(--aksrt-green); } .aksrt-text-orange { color: var(--aksrt-orange); } .aksrt-text-purple { color: var(--aksrt-purple); } .aksrt-text-cyan { color: var(--aksrt-cyan); } .aksrt-text-yellow { color: var(--aksrt-yellow); } .aksrt-text-red { color: var(--aksrt-red); } .aksrt-text-teal { color: var(--aksrt-teal); } .aksrt-text-indigo { color: var(--aksrt-indigo); } .aksrt-text-pink { color: var(--aksrt-pink); }