Files
cms-SiteForge/themes/trade-pro/theme.css
T
浅念 c318829ff3 feat: port cms home layout into trade-pro (hero/features/cards/cta + reveal JS)
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>
2026-10-23 09:23:30 +08:00

750 lines
24 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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; }
}