c318829ff3
Task 10a (Phase 3 first layout task). home.html now mirrors the cms astro-site-runtime homepage section sequence: full-bleed hero (single active slide; the platform has no multi-slide config, so the carousel dots/JS are not ported), trustbar, two-col about with floating stats, soft products band (4-card grid), dark applications band (2x2 case tiles), advantages feature grid, soft news band (3-card grid), and the closing cta band. Data maps to SiteForge context (page.cover/summary, showcase, cases, stories, category/brand counts); empty sections hide instead of rendering shells. All new component classes are sf-tp-* prefixed and compose on the Task 8 base utilities in theme.css (.wrap/.section/.eyebrow/.icon-circle/.sf-tp-btn). CSS: the five cms components' scoped styles (PageHero, FeatureGrid, CardGrid, Cta, SectionHead + the inline homepage bands) are extracted into pro.css as the sf-tp-* component layer, tokens rewritten to --sf-tp-*, breakpoints 900/767/620 preserved. theme.css accordingly drops the superseded generic .cards/.card/.feature mobile baselines and the .pro-home-hero em bridge, and retargets the dark-surface ghost button hook from .cta-band to .sf-tp-cta. Reveal: cms uses data-reveal everywhere; a ~15-line inline script at the pro.html tail adds html.js + an IntersectionObserver that toggles is-visible (the reduced-motion/no-JS exemptions already live in theme.css from Task 8). Tests: test_theme_registry gains test_trade_pro_home_layout_structure (preview-render contract: sf-tp-hero, card grid, feature grid, cta, no pro-industrial-hero residue, reveal script). The distinct-markup tripwire in test_theme_pro_v3 is legitimately updated 4 -> 5 (renamed to drop the stale "four"): with trade-pro now carrying its own sf-tp-hero class, five themes yield five distinct hero signatures, which is what the test always meant to enforce. Co-Authored-By: Claude Code <noreply@anthropic.com>
750 lines
24 KiB
CSS
750 lines
24 KiB
CSS
/**
|
||
* trade-pro theme.css — cms 设计令牌与基础样式全量移植(Task 8)
|
||
*
|
||
* 来源:
|
||
* - D:/project/cms/runtimes/astro-site-runtime/src/styles/tokens.css
|
||
* (ThemeTokenSet V2「bright-blue」,183 令牌,2026-10-09 设计稿)
|
||
* - D:/project/cms/runtimes/astro-site-runtime/src/styles/base.css
|
||
* (元素基线 + 布局/按钮/表单/FAQ 工具类,约 445 行)
|
||
* 像素基准:D:/project/cms/runtimes/astro-site-runtime/dist/hesupipe/en/
|
||
* 移植日期:2026-10-23
|
||
*
|
||
* 移植规则:
|
||
* 1. cms 变量统一加 --sf-tp- 前缀并保留语义名
|
||
* (--color-brand-primary → --sf-tp-color-brand-primary,引用处同步)。
|
||
* 2. 按钮/交互类名一律 sf-tp- 前缀:.btn → .sf-tp-btn(尺寸 --sm/--lg、
|
||
* 变体 solid/--ghost/--outline/--round)。严禁 .btn/.primary/.request/
|
||
* .button/.nav-btn——平台 custom.css 会无条件覆盖这些选择器。
|
||
* 3. base.css 的元素选择器(html/body/h1-h4/p/a/:focus-visible/表单/details)
|
||
* 保留全局形态:本文件只作用于静态站点产物与预览,不进管理后台 UI。
|
||
* 4. cms 源文件无 Astro scoped(.astro-XXXX 哈希)规则,零跳过;组件级
|
||
* 样式(卡片/特性栅格桌面形态等)随 Task 10 布局移植。
|
||
* 5. 文件末尾保留 Phase 2 骨架的短令牌别名(--sf-tp-primary 等,供
|
||
* pro.css 与既有模板引用)与 .pro-* 桥接规则,值全部改由 cms 令牌驱动。
|
||
*/
|
||
|
||
:root {
|
||
/* ── 3.1 品牌(10)明亮蓝 + 天蓝辅助 + 强调蓝 ── */
|
||
--sf-tp-color-brand-primary: #0874df;
|
||
--sf-tp-color-brand-primary-strong: #075ebc;
|
||
--sf-tp-color-brand-primary-deep: #054a94;
|
||
--sf-tp-color-brand-primary-soft: #edf7ff;
|
||
--sf-tp-color-brand-secondary: #4bc4ff;
|
||
--sf-tp-color-brand-secondary-strong: #2fa8e8;
|
||
--sf-tp-color-brand-secondary-soft: #eaf6ff;
|
||
--sf-tp-color-brand-accent: #075bb5;
|
||
--sf-tp-color-brand-accent-strong: #054a94;
|
||
--sf-tp-color-brand-accent-soft: #e9f4ff;
|
||
|
||
/* ── 3.2 中性(11)冷调蓝灰 ── */
|
||
--sf-tp-color-neutral-0: #ffffff;
|
||
--sf-tp-color-neutral-50: #f8fbff;
|
||
--sf-tp-color-neutral-100: #f3f7fb;
|
||
--sf-tp-color-neutral-200: #e5ecf4;
|
||
--sf-tp-color-neutral-300: #dfe8f2;
|
||
--sf-tp-color-neutral-400: #b7c5d5;
|
||
--sf-tp-color-neutral-500: #8497aa;
|
||
--sf-tp-color-neutral-600: #64748b;
|
||
--sf-tp-color-neutral-700: #52647b;
|
||
--sf-tp-color-neutral-800: #27415f;
|
||
--sf-tp-color-neutral-900: #071b38;
|
||
|
||
/* ── 3.3 语义(12)── */
|
||
--sf-tp-color-success-default: #1e7a46;
|
||
--sf-tp-color-success-strong: #175e35;
|
||
--sf-tp-color-success-soft: #e3f2e9;
|
||
--sf-tp-color-warning-default: #9a6700;
|
||
--sf-tp-color-warning-strong: #7a5200;
|
||
--sf-tp-color-warning-soft: #fbf0d9;
|
||
--sf-tp-color-danger-default: #c42b1c;
|
||
--sf-tp-color-danger-strong: #9e2114;
|
||
--sf-tp-color-danger-soft: #fbe7e4;
|
||
--sf-tp-color-info-default: #0b5fa5;
|
||
--sf-tp-color-info-strong: #094a80;
|
||
--sf-tp-color-info-soft: #e5f0f9;
|
||
|
||
/* ── 3.4 文本(13)── */
|
||
--sf-tp-color-text-primary: #071b38;
|
||
--sf-tp-color-text-secondary: #52647b;
|
||
--sf-tp-color-text-muted: #64748b;
|
||
--sf-tp-color-text-inverse: #ffffff;
|
||
--sf-tp-color-text-inverse-muted: #b7c5d5;
|
||
--sf-tp-color-text-brand: #0874df;
|
||
--sf-tp-color-text-link: #075bb5;
|
||
--sf-tp-color-text-link-hover: #054a94;
|
||
--sf-tp-color-text-on-brand: #ffffff;
|
||
--sf-tp-color-text-on-brand-muted: #d9ecff;
|
||
--sf-tp-color-text-disabled: #b7c5d5;
|
||
--sf-tp-color-text-success: #1e7a46;
|
||
--sf-tp-color-text-danger: #c42b1c;
|
||
|
||
/* ── 3.5 表面(8)── */
|
||
--sf-tp-color-surface-page: #ffffff;
|
||
--sf-tp-color-surface-default: #ffffff;
|
||
--sf-tp-color-surface-muted: #f3f7fb;
|
||
--sf-tp-color-surface-inverse: #03192f;
|
||
--sf-tp-color-surface-inverse-muted: #0b2440;
|
||
--sf-tp-color-surface-brand: #0874df;
|
||
--sf-tp-color-surface-brand-soft: #edf7ff;
|
||
--sf-tp-color-surface-overlay: rgba(3, 25, 47, 0.55);
|
||
|
||
/* ── 3.6 边框(5)── */
|
||
--sf-tp-color-border-subtle: #e5ecf4;
|
||
--sf-tp-color-border-default: #dfe8f2;
|
||
--sf-tp-color-border-strong: #b7c5d5;
|
||
--sf-tp-color-border-brand: #0874df;
|
||
--sf-tp-color-border-inverse: rgba(255, 255, 255, 0.16);
|
||
|
||
/* ── 3.7 字体家族(3)── */
|
||
--sf-tp-font-family-sans: "Inter", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
|
||
--sf-tp-font-family-heading: var(--sf-tp-font-family-sans);
|
||
--sf-tp-font-family-mono: "JetBrains Mono", "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;
|
||
|
||
/* ── 3.8 字号阶梯(11)── */
|
||
--sf-tp-font-size-root: 16px;
|
||
--sf-tp-font-size-xs: 12px;
|
||
--sf-tp-font-size-sm: 13px;
|
||
--sf-tp-font-size-md: 16px;
|
||
--sf-tp-font-size-lg: 17px;
|
||
--sf-tp-font-size-xl: 20px;
|
||
--sf-tp-font-size-2xl: 24px;
|
||
--sf-tp-font-size-3xl: 31px;
|
||
--sf-tp-font-size-4xl: 38px;
|
||
--sf-tp-font-size-5xl: 48px;
|
||
--sf-tp-font-size-display: clamp(42px, 5vw, 62px);
|
||
|
||
/* ── 3.9 字重/行高/字间距(11)── */
|
||
--sf-tp-font-weight-regular: 400;
|
||
--sf-tp-font-weight-medium: 500;
|
||
--sf-tp-font-weight-semibold: 650;
|
||
--sf-tp-font-weight-bold: 800;
|
||
--sf-tp-line-height-tight: 1.05;
|
||
--sf-tp-line-height-snug: 1.35;
|
||
--sf-tp-line-height-normal: 1.55;
|
||
--sf-tp-line-height-relaxed: 1.7;
|
||
--sf-tp-letter-spacing-tight: -0.035em;
|
||
--sf-tp-letter-spacing-normal: 0;
|
||
--sf-tp-letter-spacing-wide: 0.16em;
|
||
|
||
/* ── 3.10 间距(16)4/8px 体系 ── */
|
||
--sf-tp-space-0: 0;
|
||
--sf-tp-space-1: 4px;
|
||
--sf-tp-space-2: 8px;
|
||
--sf-tp-space-3: 12px;
|
||
--sf-tp-space-4: 16px;
|
||
--sf-tp-space-5: 20px;
|
||
--sf-tp-space-6: 24px;
|
||
--sf-tp-space-8: 32px;
|
||
--sf-tp-space-10: 40px;
|
||
--sf-tp-space-12: 48px;
|
||
--sf-tp-space-16: 64px;
|
||
--sf-tp-space-20: 80px;
|
||
--sf-tp-space-24: 96px;
|
||
--sf-tp-space-section-y: clamp(48px, 6vw, 84px);
|
||
--sf-tp-space-field-gap: 20px;
|
||
--sf-tp-space-grid-gutter: 20px;
|
||
|
||
/* ── 3.11 布局(13)── */
|
||
--sf-tp-container-page-max: 1160px;
|
||
--sf-tp-container-content-max: 768px;
|
||
--sf-tp-container-narrow-max: 640px;
|
||
--sf-tp-container-page-margin-mobile: 20px;
|
||
--sf-tp-container-page-margin-desktop: 40px;
|
||
--sf-tp-grid-columns-mobile: 4;
|
||
--sf-tp-grid-columns-tablet: 8;
|
||
--sf-tp-grid-columns-desktop: 12;
|
||
--sf-tp-breakpoint-mobile-min: 320px;
|
||
--sf-tp-breakpoint-tablet: 768px;
|
||
--sf-tp-breakpoint-desktop: 1024px;
|
||
--sf-tp-breakpoint-wide: 1440px;
|
||
--sf-tp-container-wide-gutter: auto;
|
||
|
||
/* ── 3.12 形制(15)明亮蓝灰调阴影 ── */
|
||
--sf-tp-radius-none: 0;
|
||
--sf-tp-radius-xs: 4px;
|
||
--sf-tp-radius-sm: 10px;
|
||
--sf-tp-radius-md: 8px;
|
||
--sf-tp-radius-lg: 12px;
|
||
--sf-tp-radius-full: 999px;
|
||
--sf-tp-border-width-hairline: 1px;
|
||
--sf-tp-border-width-medium: 2px;
|
||
--sf-tp-border-width-strong: 3px;
|
||
--sf-tp-shadow-none: none;
|
||
--sf-tp-shadow-xs: 0 7px 22px rgba(4, 32, 64, 0.05);
|
||
--sf-tp-shadow-sm: 0 10px 26px rgba(10, 45, 85, 0.08);
|
||
--sf-tp-shadow-md: 0 14px 38px rgba(10, 45, 85, 0.10);
|
||
--sf-tp-shadow-lg: 0 18px 48px rgba(10, 45, 85, 0.16);
|
||
--sf-tp-shadow-focus-ring: 0 0 0 3px rgba(8, 116, 223, 0.30);
|
||
|
||
/* ── 3.13 Button(8)── */
|
||
--sf-tp-button-height-sm: 36px;
|
||
--sf-tp-button-height-md: 46px;
|
||
--sf-tp-button-height-lg: 52px;
|
||
--sf-tp-button-padding-x-sm: 18px;
|
||
--sf-tp-button-padding-x-md: 26px;
|
||
--sf-tp-button-padding-x-lg: 34px;
|
||
--sf-tp-button-border-radius: 10px;
|
||
--sf-tp-button-font-weight: 700;
|
||
|
||
/* ── 3.14 Input(6)── */
|
||
--sf-tp-input-height-sm: 36px;
|
||
--sf-tp-input-height-md: 46px;
|
||
--sf-tp-input-padding-x: 14px;
|
||
--sf-tp-input-border-radius: 6px;
|
||
--sf-tp-input-border-width: 1px;
|
||
--sf-tp-input-font-size: 16px;
|
||
|
||
/* ── 3.15 Card(5)── */
|
||
--sf-tp-card-border-radius: 8px;
|
||
--sf-tp-card-border-width: 1px;
|
||
--sf-tp-card-padding-sm: 16px;
|
||
--sf-tp-card-padding-md: 20px;
|
||
--sf-tp-card-padding-lg: 30px;
|
||
|
||
/* ── 3.16 图片比例(9)── */
|
||
--sf-tp-ratio-square: 1 / 1;
|
||
--sf-tp-ratio-portrait: 3 / 4;
|
||
--sf-tp-ratio-landscape: 4 / 3;
|
||
--sf-tp-ratio-photo: 3 / 2;
|
||
--sf-tp-ratio-cinema: 21 / 9;
|
||
--sf-tp-ratio-product-main: 4 / 3;
|
||
--sf-tp-ratio-product-thumb: 1 / 1;
|
||
--sf-tp-ratio-case-cover: 16 / 9;
|
||
--sf-tp-ratio-news-cover: 3 / 2;
|
||
|
||
/* ── 3.17 动效(8)── */
|
||
--sf-tp-duration-instant: 100ms;
|
||
--sf-tp-duration-fast: 180ms;
|
||
--sf-tp-duration-normal: 240ms;
|
||
--sf-tp-duration-slow: 400ms;
|
||
--sf-tp-easing-standard: cubic-bezier(0.2, 0, 0, 1);
|
||
--sf-tp-easing-emphasized: cubic-bezier(0.4, 0, 0.2, 1);
|
||
--sf-tp-easing-entry: cubic-bezier(0.05, 0.7, 0.1, 1);
|
||
--sf-tp-easing-exit: cubic-bezier(0.3, 0, 0.8, 0.15);
|
||
|
||
/* ── 3.18 z-index(10)── */
|
||
--sf-tp-z-base: 0;
|
||
--sf-tp-z-raised: 10;
|
||
--sf-tp-z-dropdown: 100;
|
||
--sf-tp-z-sticky: 200;
|
||
--sf-tp-z-drawer: 300;
|
||
--sf-tp-z-overlay: 400;
|
||
--sf-tp-z-modal: 500;
|
||
--sf-tp-z-tooltip: 600;
|
||
--sf-tp-z-toast: 700;
|
||
--sf-tp-z-skip-link: 1000;
|
||
|
||
/* ── 3.19 焦点(5)── */
|
||
--sf-tp-focus-outline-width: 2px;
|
||
--sf-tp-focus-outline-style: solid;
|
||
--sf-tp-focus-outline-color: #0874df;
|
||
--sf-tp-focus-outline-offset: 2px;
|
||
--sf-tp-focus-outline-color-inverse: #4bc4ff;
|
||
|
||
/* ── 3.20 图标(4)── */
|
||
--sf-tp-icon-size-sm: 16px;
|
||
--sf-tp-icon-size-md: 20px;
|
||
--sf-tp-icon-size-lg: 24px;
|
||
--sf-tp-icon-size-xl: 46px;
|
||
|
||
/* ── Phase 2 短令牌别名(pro.css 与既有模板引用;值随 cms 令牌走)── */
|
||
--sf-tp-primary: var(--sf-tp-color-brand-primary);
|
||
--sf-tp-accent: var(--sf-tp-color-brand-secondary);
|
||
--sf-tp-bg: var(--sf-tp-color-surface-page);
|
||
--sf-tp-text: var(--sf-tp-color-text-primary);
|
||
--sf-tp-muted: var(--sf-tp-color-text-muted);
|
||
--sf-tp-radius: var(--sf-tp-radius-md);
|
||
--sf-tp-font: var(--sf-tp-font-family-sans);
|
||
}
|
||
|
||
/* ── 元素基线(base.css)── */
|
||
|
||
*,
|
||
*::before,
|
||
*::after {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
html {
|
||
font-size: var(--sf-tp-font-size-root);
|
||
scroll-behavior: smooth;
|
||
}
|
||
|
||
/* Element baselines are scoped to the theme body class so they win the cascade
|
||
over platform pro-base.css (same specificity would lose to later loads). */
|
||
body.sf-theme-trade-pro {
|
||
margin: 0;
|
||
background: var(--sf-tp-color-surface-page);
|
||
color: var(--sf-tp-color-text-primary);
|
||
font-family: var(--sf-tp-font-family-sans);
|
||
font-size: var(--sf-tp-font-size-md);
|
||
line-height: var(--sf-tp-line-height-normal);
|
||
-webkit-font-smoothing: antialiased;
|
||
overflow-x: hidden;
|
||
}
|
||
|
||
.sf-theme-trade-pro h1,
|
||
.sf-theme-trade-pro h2,
|
||
.sf-theme-trade-pro h3,
|
||
.sf-theme-trade-pro h4 {
|
||
font-family: var(--sf-tp-font-family-heading);
|
||
font-weight: var(--sf-tp-font-weight-bold);
|
||
line-height: var(--sf-tp-line-height-tight);
|
||
letter-spacing: var(--sf-tp-letter-spacing-tight);
|
||
margin: 0 0 var(--sf-tp-space-4);
|
||
text-wrap: balance;
|
||
}
|
||
|
||
.sf-theme-trade-pro h1 { font-size: var(--sf-tp-font-size-display); }
|
||
.sf-theme-trade-pro h2 { font-size: var(--sf-tp-font-size-3xl); }
|
||
.sf-theme-trade-pro h3 { font-size: var(--sf-tp-font-size-xl); }
|
||
.sf-theme-trade-pro h4 { font-size: var(--sf-tp-font-size-lg); }
|
||
|
||
.sf-theme-trade-pro p {
|
||
margin: 0 0 var(--sf-tp-space-4);
|
||
}
|
||
|
||
.sf-theme-trade-pro a {
|
||
color: inherit;
|
||
text-decoration: none;
|
||
}
|
||
|
||
.sf-theme-trade-pro :focus-visible {
|
||
outline: var(--sf-tp-focus-outline-width) var(--sf-tp-focus-outline-style) var(--sf-tp-focus-outline-color);
|
||
outline-offset: var(--sf-tp-focus-outline-offset);
|
||
}
|
||
|
||
/* ── 布局工具 ── */
|
||
|
||
.wrap {
|
||
width: min(1440px, 90vw);
|
||
margin-inline: auto;
|
||
}
|
||
|
||
.section {
|
||
padding-block: var(--sf-tp-space-section-y);
|
||
}
|
||
|
||
.section--soft {
|
||
background: linear-gradient(135deg, var(--sf-tp-color-neutral-50), var(--sf-tp-color-surface-brand-soft));
|
||
}
|
||
|
||
.section--dark {
|
||
color: var(--sf-tp-color-text-inverse);
|
||
background: linear-gradient(
|
||
90deg,
|
||
color-mix(in srgb, var(--sf-tp-color-surface-inverse) 94%, transparent),
|
||
color-mix(in srgb, var(--sf-tp-color-brand-primary) 60%, transparent)
|
||
);
|
||
}
|
||
|
||
.section--dark h2,
|
||
.section--dark h3 {
|
||
color: var(--sf-tp-color-text-inverse);
|
||
}
|
||
|
||
/* 眉题(eyebrow):强调蓝 + 宽字距大写(.pro-eyebrow 为 Phase 2 桥接同款) */
|
||
.eyebrow,
|
||
.pro-eyebrow {
|
||
color: var(--sf-tp-color-brand-accent);
|
||
font-weight: var(--sf-tp-font-weight-bold);
|
||
letter-spacing: var(--sf-tp-letter-spacing-wide);
|
||
text-transform: uppercase;
|
||
font-size: var(--sf-tp-font-size-xs);
|
||
margin-block-end: var(--sf-tp-space-3);
|
||
display: block;
|
||
}
|
||
|
||
.section--dark .eyebrow {
|
||
color: var(--sf-tp-color-text-inverse-muted);
|
||
}
|
||
|
||
/* 圆形图标位 */
|
||
.icon-circle {
|
||
width: var(--sf-tp-icon-size-xl);
|
||
height: var(--sf-tp-icon-size-xl);
|
||
margin: 0 auto 8px;
|
||
border-radius: var(--sf-tp-radius-full);
|
||
display: grid;
|
||
place-items: center;
|
||
color: var(--sf-tp-color-text-brand);
|
||
background: var(--sf-tp-color-surface-brand-soft);
|
||
font-size: var(--sf-tp-font-size-2xl);
|
||
font-weight: var(--sf-tp-font-weight-bold);
|
||
}
|
||
|
||
/* 等宽数据 */
|
||
.mono {
|
||
font-family: var(--sf-tp-font-family-mono);
|
||
font-variant-numeric: tabular-nums;
|
||
}
|
||
|
||
/* ── Button(cms §4.2 V2:蓝底白字 + 悬浮上抬;类名 sf-tp- 前缀隔离平台 custom.css)── */
|
||
|
||
.sf-tp-btn {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: var(--sf-tp-space-2);
|
||
min-height: var(--sf-tp-button-height-md);
|
||
padding-inline: var(--sf-tp-button-padding-x-md);
|
||
font-family: var(--sf-tp-font-family-sans);
|
||
font-size: var(--sf-tp-font-size-md);
|
||
font-weight: var(--sf-tp-button-font-weight);
|
||
line-height: var(--sf-tp-line-height-snug);
|
||
border-radius: var(--sf-tp-button-border-radius);
|
||
border: var(--sf-tp-border-width-hairline) solid var(--sf-tp-color-border-brand);
|
||
background: var(--sf-tp-color-surface-brand);
|
||
color: var(--sf-tp-color-text-on-brand);
|
||
cursor: pointer;
|
||
text-decoration: none;
|
||
transition:
|
||
background-color var(--sf-tp-duration-fast) var(--sf-tp-easing-standard),
|
||
border-color var(--sf-tp-duration-fast) var(--sf-tp-easing-standard),
|
||
color var(--sf-tp-duration-fast) var(--sf-tp-easing-standard),
|
||
box-shadow var(--sf-tp-duration-fast) var(--sf-tp-easing-standard),
|
||
transform var(--sf-tp-duration-fast) var(--sf-tp-easing-standard);
|
||
}
|
||
|
||
.sf-tp-btn:hover {
|
||
transform: translateY(calc(-1 * var(--sf-tp-space-1)));
|
||
background: var(--sf-tp-color-brand-primary-strong);
|
||
box-shadow: var(--sf-tp-shadow-sm);
|
||
}
|
||
|
||
.sf-tp-btn:active {
|
||
background: var(--sf-tp-color-brand-primary-deep);
|
||
transform: none;
|
||
}
|
||
|
||
/* 尺寸 */
|
||
.sf-tp-btn--sm {
|
||
min-height: var(--sf-tp-button-height-sm);
|
||
padding-inline: var(--sf-tp-button-padding-x-sm);
|
||
font-size: var(--sf-tp-font-size-sm);
|
||
}
|
||
|
||
.sf-tp-btn--lg {
|
||
min-height: var(--sf-tp-button-height-lg);
|
||
padding-inline: var(--sf-tp-button-padding-x-lg);
|
||
font-size: var(--sf-tp-font-size-lg);
|
||
}
|
||
|
||
/* 变体:ghost(浅底品牌字) */
|
||
.sf-tp-btn--ghost {
|
||
background: var(--sf-tp-color-surface-default);
|
||
color: var(--sf-tp-color-text-brand);
|
||
}
|
||
|
||
.sf-tp-btn--ghost:hover {
|
||
background: var(--sf-tp-color-surface-brand-soft);
|
||
color: var(--sf-tp-color-text-brand);
|
||
}
|
||
|
||
/* 变体:outline(描边品牌字;.sf-tp-btn-outline 为 Phase 2 骨架既有类名) */
|
||
.sf-tp-btn--outline,
|
||
.sf-tp-btn-outline {
|
||
background: transparent;
|
||
color: var(--sf-tp-color-text-brand);
|
||
}
|
||
|
||
.sf-tp-btn--outline:hover,
|
||
.sf-tp-btn-outline:hover {
|
||
background: var(--sf-tp-color-surface-brand-soft);
|
||
color: var(--sf-tp-color-text-link-hover);
|
||
}
|
||
|
||
/* 变体:round(药丸) */
|
||
.sf-tp-btn--round {
|
||
border-radius: var(--sf-tp-radius-full);
|
||
min-height: var(--sf-tp-space-10);
|
||
padding-inline: var(--sf-tp-space-6);
|
||
font-size: var(--sf-tp-font-size-sm);
|
||
}
|
||
|
||
/* 深色表面上的描边按钮 */
|
||
.section--dark .sf-tp-btn--ghost,
|
||
.sf-tp-cta .sf-tp-btn--ghost {
|
||
background: var(--sf-tp-color-surface-default);
|
||
color: var(--sf-tp-color-text-brand);
|
||
}
|
||
|
||
/* ── Skip link(无障碍跳转,z 最高)── */
|
||
|
||
.skip-link {
|
||
position: absolute;
|
||
inset-block-start: var(--sf-tp-space-2);
|
||
inset-inline-start: var(--sf-tp-space-2);
|
||
z-index: var(--sf-tp-z-skip-link);
|
||
background: var(--sf-tp-color-surface-default);
|
||
color: var(--sf-tp-color-text-brand);
|
||
padding: var(--sf-tp-space-3) var(--sf-tp-space-4);
|
||
border-radius: var(--sf-tp-radius-sm);
|
||
box-shadow: var(--sf-tp-shadow-md);
|
||
transform: translateY(calc(-100 * var(--sf-tp-space-4)));
|
||
}
|
||
|
||
.skip-link:focus-visible {
|
||
transform: none;
|
||
}
|
||
|
||
/* ── 视觉隐藏(屏幕阅读器可用)── */
|
||
|
||
.visually-hidden {
|
||
position: absolute;
|
||
width: var(--sf-tp-space-1);
|
||
height: var(--sf-tp-space-1);
|
||
overflow: hidden;
|
||
clip-path: inset(50%);
|
||
white-space: nowrap;
|
||
}
|
||
|
||
/* ── 药丸选项卡 ── */
|
||
|
||
.tabs {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: calc(var(--sf-tp-space-4) - var(--sf-tp-space-1));
|
||
margin-block-end: var(--sf-tp-space-8);
|
||
}
|
||
|
||
.tab {
|
||
border: 0;
|
||
min-width: 130px;
|
||
padding: calc(var(--sf-tp-space-3)) var(--sf-tp-space-5);
|
||
border-radius: var(--sf-tp-radius-full);
|
||
background: var(--sf-tp-color-surface-muted);
|
||
color: var(--sf-tp-color-text-secondary);
|
||
font-weight: var(--sf-tp-font-weight-semibold);
|
||
font-size: var(--sf-tp-font-size-sm);
|
||
cursor: pointer;
|
||
transition:
|
||
background-color var(--sf-tp-duration-fast) var(--sf-tp-easing-standard),
|
||
color var(--sf-tp-duration-fast) var(--sf-tp-easing-standard);
|
||
}
|
||
|
||
.tab.active {
|
||
background: var(--sf-tp-color-surface-brand);
|
||
color: var(--sf-tp-color-text-on-brand);
|
||
}
|
||
|
||
/* ── 表单(label 永远可见)── */
|
||
|
||
.sf-theme-trade-pro label {
|
||
display: block;
|
||
font-weight: var(--sf-tp-font-weight-semibold);
|
||
font-size: var(--sf-tp-font-size-sm);
|
||
margin-block-end: var(--sf-tp-space-2);
|
||
}
|
||
|
||
.sf-theme-trade-pro input,
|
||
.sf-theme-trade-pro select,
|
||
.sf-theme-trade-pro textarea {
|
||
width: 100%;
|
||
border: var(--sf-tp-input-border-width) solid var(--sf-tp-color-border-default);
|
||
border-radius: var(--sf-tp-input-border-radius);
|
||
padding: var(--sf-tp-space-3) var(--sf-tp-space-4);
|
||
background: var(--sf-tp-color-surface-default);
|
||
font: inherit;
|
||
color: inherit;
|
||
}
|
||
|
||
.sf-theme-trade-pro input:focus-visible,
|
||
.sf-theme-trade-pro select:focus-visible,
|
||
.sf-theme-trade-pro textarea:focus-visible {
|
||
border-color: var(--sf-tp-color-border-brand);
|
||
}
|
||
|
||
.sf-theme-trade-pro textarea {
|
||
min-height: 120px;
|
||
resize: vertical;
|
||
}
|
||
|
||
/* ── FAQ 折叠(原生 details,静态可抓取)── */
|
||
|
||
.sf-theme-trade-pro details {
|
||
border: var(--sf-tp-border-width-hairline) solid var(--sf-tp-color-border-subtle);
|
||
border-radius: var(--sf-tp-radius-sm);
|
||
margin-block-end: calc(var(--sf-tp-space-3) - var(--sf-tp-space-1));
|
||
background: var(--sf-tp-color-surface-default);
|
||
}
|
||
|
||
.sf-theme-trade-pro summary {
|
||
cursor: pointer;
|
||
padding: var(--sf-tp-space-4) calc(var(--sf-tp-space-4) + var(--sf-tp-space-1));
|
||
font-weight: var(--sf-tp-font-weight-semibold);
|
||
}
|
||
|
||
.sf-theme-trade-pro details[open] summary {
|
||
border-block-end: var(--sf-tp-border-width-hairline) solid var(--sf-tp-color-border-subtle);
|
||
}
|
||
|
||
.sf-theme-trade-pro details p {
|
||
padding: var(--sf-tp-space-4) calc(var(--sf-tp-space-4) + var(--sf-tp-space-1));
|
||
color: var(--sf-tp-color-text-muted);
|
||
margin: 0;
|
||
}
|
||
|
||
/* ── 图标(Task 9 SVG 宏库:内联线条图标的对齐与间距)── */
|
||
|
||
/* 基线对齐:inline 上下文垂直居中,flex 上下文不被压缩换行。
|
||
尺寸在 CSS 层固定(Safari 等引擎不支持 width/height 属性中的 var(),
|
||
属性值仅作无 CSS 场景的渐进增强;CSS 覆盖属性保证跨引擎一致) */
|
||
.sf-tp-icon {
|
||
display: inline-block;
|
||
vertical-align: middle;
|
||
flex-shrink: 0;
|
||
width: var(--sf-tp-icon-size-md, 20px);
|
||
height: var(--sf-tp-icon-size-md, 20px);
|
||
}
|
||
|
||
.sf-tp-icon--sm {
|
||
width: var(--sf-tp-icon-size-sm, 16px);
|
||
height: var(--sf-tp-icon-size-sm, 16px);
|
||
}
|
||
|
||
/* 按钮内紧跟文字的图标留出呼吸空间(flex gap 之外的显式间距,
|
||
兼容图标包在 <span> 里或直接暴露两种写法) */
|
||
.sf-tp-btn svg {
|
||
margin-inline-start: var(--sf-tp-space-1);
|
||
}
|
||
|
||
/* 非按钮内联上下文:图标贴着文字时补一点间距 */
|
||
.pro-mega a .sf-tp-icon,
|
||
.pro-contact-email .sf-tp-icon,
|
||
.pro-footer-links a .sf-tp-icon {
|
||
margin-inline-start: var(--sf-tp-space-1);
|
||
}
|
||
|
||
/* filters 宏搜索框:放大镜占位在输入框内左侧(不抢焦点) */
|
||
.sf-theme-trade-pro .pro-filter-search-box {
|
||
position: relative;
|
||
display: block;
|
||
margin: 0; /* 抵消 pro-base 的 label>span 说明文字样式 */
|
||
}
|
||
|
||
.sf-theme-trade-pro .pro-filter-search-box .sf-tp-icon {
|
||
position: absolute;
|
||
inset-inline-start: var(--sf-tp-space-3);
|
||
inset-block-start: 50%;
|
||
transform: translateY(-50%);
|
||
pointer-events: none;
|
||
color: var(--sf-tp-color-text-muted);
|
||
}
|
||
|
||
.sf-theme-trade-pro .pro-filter-search-box input {
|
||
padding-inline-start: calc(var(--sf-tp-icon-size-md, 20px) + var(--sf-tp-space-6));
|
||
}
|
||
|
||
/* ── Phase 2 桥接:骨架期 .pro-* 强调样式改由 cms 令牌驱动(home 布局已由
|
||
pro.css 的 sf-tp-* 组件层接管,Task 10a 起仅保留 utility 条)── */
|
||
|
||
.pro-utility {
|
||
background: var(--sf-tp-color-surface-inverse);
|
||
color: var(--sf-tp-color-text-inverse-muted);
|
||
}
|
||
|
||
/* ── 滚动浮现动效(渐进增强:仅在 JS 打开 html.js 且注册 IntersectionObserver
|
||
后生效——Task 10 随布局引入配套 JS;无 JS/reduced-motion 时默认可见)── */
|
||
|
||
@media (prefers-reduced-motion: no-preference) {
|
||
html.js [data-reveal] {
|
||
opacity: 0;
|
||
transform: translateY(calc(var(--sf-tp-space-3)));
|
||
transition:
|
||
opacity var(--sf-tp-duration-slow) var(--sf-tp-easing-entry),
|
||
transform var(--sf-tp-duration-slow) var(--sf-tp-easing-entry);
|
||
transition-delay: calc(var(--sf-tp-duration-fast) * var(--reveal-i, 0));
|
||
}
|
||
|
||
html.js [data-reveal].is-visible {
|
||
opacity: 1;
|
||
transform: none;
|
||
}
|
||
}
|
||
|
||
/* ── 令牌媒介覆盖(tokens.css)── */
|
||
|
||
/* 移动端栅格沟槽覆盖 */
|
||
@media (max-width: 767px) {
|
||
:root {
|
||
--sf-tp-space-grid-gutter: 14px;
|
||
}
|
||
}
|
||
|
||
/* prefers-reduced-motion:时长归零 */
|
||
@media (prefers-reduced-motion: reduce) {
|
||
:root {
|
||
--sf-tp-duration-instant: 0ms;
|
||
--sf-tp-duration-fast: 0ms;
|
||
--sf-tp-duration-normal: 0ms;
|
||
--sf-tp-duration-slow: 0ms;
|
||
}
|
||
}
|
||
|
||
/* ════════ 移动端适配(base.css,2026-10-14 设计稿 620px 断点)════════ */
|
||
|
||
@media (max-width: 620px) {
|
||
:root {
|
||
--sf-tp-font-size-md: 13px;
|
||
--sf-tp-font-size-lg: 13px;
|
||
--sf-tp-font-size-xl: 15px;
|
||
--sf-tp-font-size-2xl: 18px;
|
||
--sf-tp-font-size-3xl: 22px;
|
||
--sf-tp-font-size-4xl: 26px;
|
||
--sf-tp-space-section-y: 30px;
|
||
--sf-tp-card-border-radius: 7px;
|
||
--sf-tp-button-height-md: 37px;
|
||
--sf-tp-button-height-lg: 42px;
|
||
--sf-tp-button-border-radius: 999px;
|
||
--sf-tp-icon-size-xl: 39px;
|
||
}
|
||
|
||
body {
|
||
font-size: 13px;
|
||
line-height: 1.42;
|
||
}
|
||
|
||
.wrap {
|
||
width: calc(100% - 30px);
|
||
}
|
||
|
||
h1 { font-size: 28px; line-height: 1.05; }
|
||
h2 { font-size: 22px; line-height: 1.1; }
|
||
h3 { margin-block-end: 5px; }
|
||
|
||
.eyebrow,
|
||
.pro-eyebrow {
|
||
font-size: 9px;
|
||
letter-spacing: 0.2em;
|
||
margin-block-end: 7px;
|
||
}
|
||
|
||
.sf-tp-btn {
|
||
min-height: 37px;
|
||
padding-inline: 18px;
|
||
font-size: 11px;
|
||
border-radius: 999px;
|
||
}
|
||
|
||
.section { padding-block: 30px; }
|
||
|
||
/* 卡片/特性等组件的移动端形态已随 Task 10a 移入 pro.css 的
|
||
sf-tp-* 组件层(.sf-tp-card-grid / .sf-tp-feature-grid 等),
|
||
本文件只保留元素基线与共享工具类。 */
|
||
|
||
/* 选项卡 */
|
||
.tabs { gap: 8px; margin-block-end: 16px; }
|
||
.tab { min-width: auto; padding: 9px 14px; font-size: 11px; }
|
||
|
||
/* FAQ(作用域同桌面基线,保持移动端覆写有效) */
|
||
.sf-theme-trade-pro details { margin-block-end: 6px; }
|
||
.sf-theme-trade-pro summary { padding: 10px 12px; font-size: 12px; }
|
||
.sf-theme-trade-pro details p { padding: 0 12px 10px; font-size: 11px; }
|
||
|
||
/* 表单 */
|
||
.sf-theme-trade-pro input, .sf-theme-trade-pro select, .sf-theme-trade-pro textarea { padding: 8px 10px; font-size: 13px; }
|
||
.sf-theme-trade-pro label { font-size: 11px; }
|
||
.sf-theme-trade-pro textarea { min-height: 80px; }
|
||
}
|