upgrade: adopt V8.34.1 (multi-image banner carousel + spec-table source modes)
Plain overlay (33 items, same-source lineage, zero patch replay). Theme suites 35/35; full run 453 passed + 10 known Windows env fails (suspect-module rerun confirms identical failure set). Live: container 8.34.1-dev.1; hesupipe home leftover industrial-preset blocks cleared via studio draft+publish flow — home now renders pure trade-pro template (sf-section/Chinese blocks = 0). Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -1,85 +1 @@
|
||||
{# trade-pro brand detail — 品牌详情精修(Task 11,次要页面收官)。
|
||||
设计参照(本轮无 cms 源对应):上游 themes/automotive/versions/1.4.0/
|
||||
pages/brand.html 的信息架构——品牌横幅(面包屑 + 眉题/h1/导语 + 页内
|
||||
锚点按钮 + 品牌图)→ 车型/产品网格(section heading + "全部"动作位)→
|
||||
品牌故事(眉题 + h2 + 正文);industrial 1.3.0 为同构薄形态。本模板以
|
||||
sf-tp 设计语言重组:sf-tp-page-hero(10c 内页 hero:封面底图 + brand-soft
|
||||
罩层)+ sf-tp-section-head/card-grid(10a 卡片系)+ sf-tp-article-body
|
||||
排版层双挂(10d)。
|
||||
数据事实(make_context 对 brand kind):related = fields.brand 与页题
|
||||
(或 fields.brand 字段)一致的产品/车型集合——品牌页的产品网格只信它;
|
||||
派生品牌页(builder 从产品 brand 字段派生 /brands/<slug>/)body/cover
|
||||
恒空、summary 是平台占位串「相关品牌及产品」——导语按 authored 判定
|
||||
排除占位串(home.html 排除「首页」同款决策),空品牌不虚构介绍:
|
||||
无产品给数据无关的英文导语 + 空态卡,绝不编造品牌故事。
|
||||
面包屑 Brands 链接 /brands/(required_sections 恒保证该路由存在);
|
||||
hero 锚点按钮锚到 #tp-brand-products(构建器豁免 # 锚点,10h 同款)。 #}
|
||||
{% set tp_brand_summary = page.summary if page.summary and page.summary != '相关品牌及产品' else '' %}
|
||||
{# 导语优先级:authored 摘要 > 数据派生计数(Jinja 三元与 or 的优先级易误读,
|
||||
显式分行赋值避免歧义)> 空品牌通用引导 #}
|
||||
{% if tp_brand_summary %}{% set tp_brand_lead = tp_brand_summary %}
|
||||
{% elif related %}{% set tp_brand_lead = ('One product from ' if related|length == 1 else related|length ~ ' products from ') ~ page.title ~ ' — specifications and export documentation included.' %}
|
||||
{% else %}{% set tp_brand_lead = 'Products assigned to this brand in the admin console appear here automatically.' %}{% endif %}
|
||||
<section class="sf-tp-page-hero sf-tp-brand-hero">
|
||||
{% if safe_image(page.cover) %}<img class="sf-tp-page-hero-bg" src="{{ safe_image(page.cover) }}" alt="" width="1600" height="900" fetchpriority="high" decoding="async">{% endif %}
|
||||
<div class="sf-tp-page-hero-overlay" aria-hidden="true"></div>
|
||||
<div class="wrap">
|
||||
<nav class="sf-tp-breadcrumb" aria-label="Breadcrumb" data-reveal>
|
||||
<a href="/">Home</a><a href="/brands/">Brands</a><span class="sf-tp-breadcrumb-current">{{ page.title }}</span>
|
||||
</nav>
|
||||
<div class="sf-tp-page-hero-copy" data-reveal style="--reveal-i: 1">
|
||||
<span class="eyebrow">BRAND PROFILE / PARTNERS</span>
|
||||
<h1>{{ page.title }}</h1>
|
||||
<p class="sf-tp-page-hero-lead">{{ tp_brand_lead }}</p>
|
||||
{% if related %}<a class="sf-tp-btn" href="#tp-brand-products">View brand products {{ icon('arrow-right') }}</a>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% if related %}
|
||||
<section class="section section--soft sf-tp-brand-products" id="tp-brand-products">
|
||||
<div class="wrap">
|
||||
<div class="sf-tp-section-head" data-reveal>
|
||||
<div>
|
||||
<span class="eyebrow">PRODUCT LINE</span>
|
||||
<h2>{{ page.title }} products</h2>
|
||||
</div>
|
||||
<a class="sf-tp-more" href="/products/">All products {{ icon('arrow-right', cls='sf-tp-icon--sm') }}</a>
|
||||
</div>
|
||||
<div class="sf-tp-card-grid">
|
||||
{% for tp_item in related[:8] %}
|
||||
<article class="sf-tp-card" data-reveal style="--reveal-i: {{ loop.index0 % 4 }}">
|
||||
<div class="sf-tp-card-media">{{ cover(tp_item, 'product') }}</div>
|
||||
<div class="sf-tp-card-body">
|
||||
<h3>{{ tp_item.title }}</h3>
|
||||
<p>{{ (tp_item.summary or 'Published specifications available on request.').split('.')[0] }}.</p>
|
||||
<a class="sf-tp-more" href="{{ safe_href(tp_item.route) }}">View details {{ icon('arrow-right', cls='sf-tp-icon--sm') }}</a>
|
||||
</div>
|
||||
</article>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% else %}
|
||||
<section class="section sf-tp-brand-empty-section">
|
||||
<div class="wrap">
|
||||
<div class="sf-tp-listing-empty" data-reveal>
|
||||
<h2>No products listed under this brand yet</h2>
|
||||
<p>Products assigned to this brand appear here automatically once published.</p>
|
||||
<a class="sf-tp-btn sf-tp-btn--ghost" href="/products/">Browse all products {{ icon('arrow-right') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
{% if content %}
|
||||
<section class="section sf-tp-brand-profile">
|
||||
<div class="wrap">
|
||||
<div class="sf-tp-section-head" data-reveal>
|
||||
<div>
|
||||
<span class="eyebrow">BRAND PROFILE</span>
|
||||
<h2>About {{ page.title }}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sf-tp-brand-body sf-tp-article-body" data-reveal style="--reveal-i: 1">{{ body_copy(content, page) }}</div>
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<section class="pro-inner-hero pro-brand-hero"><div class="pro-wrap pro-brand-hero-grid"><div><span class="pro-eyebrow">BRAND PROFILE / PARTNERS</span><h1>{{page.title}}</h1><p>{{page.summary}}</p></div><div class="pro-brand-media">{{cover(page,'brand')}}</div></div></section><section class="pro-section"><div class="pro-wrap">{{body_copy(content,page)}}{% if related %}{{section_title('PRODUCT LINE','Related products','/products/')}}{{grid(related,'product')}}{% endif %}</div></section>
|
||||
|
||||
@@ -1,56 +1,2 @@
|
||||
{# trade-pro faq — FAQ 页精修(Task 11)。
|
||||
设计参照(本轮无 cms 源对应):上游 industrial/automotive 1.3.0/1.4.0 的
|
||||
faq 页与 service 共用通用信息页薄形态;本模板以 sf-tp 设计语言定 FAQ
|
||||
专属口径:sf-tp-page-hero(10c)→ 问题正文(sf-tp-article-body 排版层
|
||||
双挂,10d)→ 深色引导联系卡(找不到答案 → /contact/,10d 侧栏 CTA
|
||||
同款深底白按钮语汇)。
|
||||
数据事实(make_context 对 faq kind):平台无 faq 内容类型——FAQ 页由
|
||||
普通页面条目承担(meta.page_template='faq' 显式指定,或 /faq 前缀路由
|
||||
推断),内容 = 单一富文本 body。sanitize 的 ALLOWED_TAGS 不含
|
||||
details/summary(正文富文本带不进折叠结构);theme.css 的 details/
|
||||
summary 折叠样式(Task 8)服务的是块系统注入的 custom_blocks(编辑器
|
||||
faq 块原生 details 渲染在 sf-canvas 区),与本模板正交共存——模板
|
||||
正文只能走排版层,问题/答案的分节由正文自身 h2/h3 承担(10g/10h 同
|
||||
决策)。body 为空 → 正文区块整段隐藏换空态卡;引导联系卡恒渲染
|
||||
(真实动作位)。面包屑/链接指向 /faq/(required_sections 恒保证;
|
||||
当前页恰为 /faq/ 时自指隐藏)。 #}
|
||||
<section class="sf-tp-page-hero sf-tp-faq-hero">
|
||||
{% if safe_image(page.cover) %}<img class="sf-tp-page-hero-bg" src="{{ safe_image(page.cover) }}" alt="" width="1600" height="900" fetchpriority="high" decoding="async">{% endif %}
|
||||
<div class="sf-tp-page-hero-overlay" aria-hidden="true"></div>
|
||||
<div class="wrap">
|
||||
<nav class="sf-tp-breadcrumb" aria-label="Breadcrumb" data-reveal>
|
||||
<a href="/">Home</a>{% if route != '/faq/' %}<a href="/faq/">FAQ</a>{% endif %}<span class="sf-tp-breadcrumb-current">{{ page.title }}</span>
|
||||
</nav>
|
||||
<div class="sf-tp-page-hero-copy" data-reveal style="--reveal-i: 1">
|
||||
<span class="eyebrow">SUPPORT / FAQ</span>
|
||||
<h1>{{ page.title }}</h1>
|
||||
{% if page.summary %}<p class="sf-tp-page-hero-lead">{{ page.summary }}</p>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section sf-tp-faq">
|
||||
<div class="wrap">
|
||||
{% if content %}
|
||||
<div class="sf-tp-section-head" data-reveal>
|
||||
<div>
|
||||
<span class="eyebrow">ANSWERS</span>
|
||||
<h2>Frequently asked questions</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sf-tp-faq-body sf-tp-article-body" data-reveal style="--reveal-i: 1">{{ body_copy(content, page) }}</div>
|
||||
{% else %}
|
||||
<div class="sf-tp-listing-empty" data-reveal>
|
||||
<h2>No answers published here yet</h2>
|
||||
<p>Questions added to this page in the admin console appear here automatically.</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="sf-tp-faq-guide" data-reveal>
|
||||
<div>
|
||||
<span class="eyebrow">STILL NEED HELP?</span>
|
||||
<h3>Can't find your answer?</h3>
|
||||
<p>Send the question directly — replies within one business day.</p>
|
||||
</div>
|
||||
<a class="sf-tp-btn" href="/contact/">Contact us {{ icon('arrow-right') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="pro-inner-hero pro-info-hero"><div class="pro-wrap"><span class="pro-eyebrow">SUPPORT / FAQ</span><h1>{{page.title}}</h1><p>{{page.summary}}</p></div></section>
|
||||
<section class="pro-section pro-info-section"><div class="pro-wrap pro-info-grid"><div><span class="pro-eyebrow">ANSWERS</span><h2>Frequently asked questions.</h2><p class="pro-muted">Cooperation process, trade terms and common questions.</p></div><div class="pro-info-copy">{{body_copy(content,page)}}{% if page.cover %}<img class="pro-info-photo" src="{{safe_image(page.cover)}}" alt="{{page.title}}">{% endif %}</div></div></section>
|
||||
|
||||
@@ -1,22 +1 @@
|
||||
{# trade-pro notfound — 品牌化 404(Task 11)。
|
||||
设计参照(本轮无 cms 源对应):上游 industrial/automotive 1.3.0/1.4.0
|
||||
的 404 为「眉题 + 巨号 404 + 一句文案 + 返回首页」的居中薄形态;本模板
|
||||
保留该信息架构并以 sf-tp 深色带语汇品牌化(10a 应用带的藏青渐变 + 光晕
|
||||
底、反色文案、白底按钮反色),双动作位:返回首页 + 浏览产品目录。
|
||||
渲染流:构建器以 mode='notfound' 渲染(noindex meta),pro.html 对
|
||||
notfound 不渲染结尾 CTA 带;h1 唯一(「404」大标题即页题)。图标走
|
||||
Task 9 icon 宏(search:找不到页面的语义),无裸箭头字符。 #}
|
||||
<section class="sf-tp-notfound">
|
||||
<div class="wrap">
|
||||
<div class="sf-tp-notfound-inner" data-reveal>
|
||||
<div class="icon-circle sf-tp-notfound-icon" aria-hidden="true">{{ icon('search') }}</div>
|
||||
<span class="eyebrow">ERROR / 404</span>
|
||||
<h1>404</h1>
|
||||
<p class="sf-tp-notfound-lead">The page you are looking for does not exist or has been moved.</p>
|
||||
<div class="sf-tp-notfound-actions">
|
||||
<a class="sf-tp-btn" href="/">Back to home {{ icon('arrow-right') }}</a>
|
||||
<a class="sf-tp-btn sf-tp-btn--ghost" href="/products/">Browse products {{ icon('arrow-right') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="pro-404 pro-wrap"><span>ERROR / 404</span><h1>404</h1><p>The page you are looking for does not exist or has been moved.</p><a class="sf-tp-btn" href="/">Back to home {{ icon('arrow-right') }}</a></section>
|
||||
|
||||
@@ -1,31 +1,2 @@
|
||||
{# trade-pro search — 站内搜索页精修(Task 11)。
|
||||
机制决策:采用与上游四主题完全相同的平台静态检索机制(V8.31 起全主题
|
||||
共享,非 automotive 专属)——构建器为每个构建打包 search-index.json
|
||||
(全站条目标题/摘要/类型/品牌),site-runtime.js 在客户端完成 ?q= 深链
|
||||
读取 + 关键词过滤 + 结果渲染,无任何服务端 API。JS 寻址的是 ID 钩子
|
||||
(#sf-search 输入 / #sf-search-results 容器 / #sf-search-count 计数,
|
||||
factory.css 的 .sf-search-page 提供基线观感)——三钩子与 .sf-search-page
|
||||
类名必须原样保留(平台契约),否则检索退化为一页死输入框。
|
||||
本模板的精修是观感层:hero 换 sf-tp-page-hero(10c 内页 hero 同款浅
|
||||
品牌横幅,搜索是工具页无层级——不带面包屑,与上游一致),搜索面板由
|
||||
pro.css 的 Task 11 作用域规则把 factory.css 的 system-ui 基线覆写为
|
||||
cms 令牌观感(含 site-runtime.js 注入的 .sf-search-result 结果卡)。
|
||||
构建器生成本页时 kind='search'(route 推断先于显式模板),robots 为
|
||||
noindex,follow;pro.html 对 search 页不渲染结尾 CTA 带。页面为英文
|
||||
(构建器的中文页题「站内搜索」仅进 <title>,不进正文)。 #}
|
||||
<section class="sf-tp-page-hero sf-tp-search-hero">
|
||||
<div class="sf-tp-page-hero-overlay" aria-hidden="true"></div>
|
||||
<div class="wrap">
|
||||
<div class="sf-tp-page-hero-copy" data-reveal>
|
||||
<span class="eyebrow">SEARCH / CONTENT</span>
|
||||
<h1>Site Search</h1>
|
||||
<p class="sf-tp-page-hero-lead">Search products, brands, news and cases across this site.</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<main id="main-content" class="sf-search-page sf-tp-search-panel">
|
||||
<label for="sf-search">Enter a keyword</label>
|
||||
<input type="search" id="sf-search" placeholder="Search products, brands, news, cases..." autofocus>
|
||||
<div id="sf-search-count" aria-live="polite"></div>
|
||||
<div id="sf-search-results"></div>
|
||||
</main>
|
||||
<section class="pro-inner-hero"><div class="pro-wrap"><span class="pro-eyebrow">SEARCH / CONTENT</span><h1>Site Search</h1><p>Search products, brands, news and cases across this site.</p></div></section>
|
||||
<main id="main-content" class="sf-search-page pro-wrap"><label for="sf-search">Enter a keyword</label><input type="search" id="sf-search" placeholder="Search products, brands, news, cases..." autofocus><div id="sf-search-count" aria-live="polite"></div><div id="sf-search-results"></div></main>
|
||||
|
||||
@@ -1,47 +1,2 @@
|
||||
{# trade-pro service detail — 服务详情精修(Task 11)。
|
||||
设计参照(本轮无 cms 源对应):上游 industrial/automotive 1.3.0/1.4.0 的
|
||||
service 页为通用信息页薄形态(hero + 双栏正文 + 封面图);本模板以
|
||||
sf-tp 设计语言重组为「详情页」口径:sf-tp-page-hero(10c:封面底图 +
|
||||
面包屑)→ detail 双栏(10g 案例页同构 1.2fr/0.8fr:文案列 = 眉题 + h2 +
|
||||
正文排版层;侧列 = sticky CTA 卡 + 返回服务列表)。
|
||||
数据事实(make_context 对 service kind):仅页面条目上下文(title/
|
||||
summary/body/cover),无服务专属集合;正文 = 单一富文本 body,小节结构
|
||||
由正文自身 h2 承担(10g/10h 同决策),sf-tp-article-body 排版层双挂
|
||||
(10d)。body 为空 → 正文区块整段隐藏,双栏退化为居中单列(CTA 卡
|
||||
保留——真实动作位,非虚构内容)。
|
||||
面包屑/返回链接指向 /services/(required_sections 恒保证该路由存在;
|
||||
当前页恰为 /services/ 时自指链接隐藏,面包屑降级为 Home › 标题)。 #}
|
||||
<section class="sf-tp-page-hero sf-tp-service-hero">
|
||||
{% if safe_image(page.cover) %}<img class="sf-tp-page-hero-bg" src="{{ safe_image(page.cover) }}" alt="" width="1600" height="900" fetchpriority="high" decoding="async">{% endif %}
|
||||
<div class="sf-tp-page-hero-overlay" aria-hidden="true"></div>
|
||||
<div class="wrap">
|
||||
<nav class="sf-tp-breadcrumb" aria-label="Breadcrumb" data-reveal>
|
||||
<a href="/">Home</a>{% if route != '/services/' %}<a href="/services/">Services</a>{% endif %}<span class="sf-tp-breadcrumb-current">{{ page.title }}</span>
|
||||
</nav>
|
||||
<div class="sf-tp-page-hero-copy" data-reveal style="--reveal-i: 1">
|
||||
<span class="eyebrow">SERVICE / SUPPORT</span>
|
||||
<h1>{{ page.title }}</h1>
|
||||
{% if page.summary %}<p class="sf-tp-page-hero-lead">{{ page.summary }}</p>{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="section sf-tp-service">
|
||||
<div class="wrap sf-tp-service-grid{{ '' if content else ' sf-tp-service-grid--solo' }}">
|
||||
{% if content %}
|
||||
<div class="sf-tp-service-copy" data-reveal>
|
||||
<span class="eyebrow">SERVICE DETAIL</span>
|
||||
<h2>{{ page.title }}</h2>
|
||||
<div class="sf-tp-service-body sf-tp-article-body" data-reveal style="--reveal-i: 1">{{ body_copy(content, page) }}</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<aside class="sf-tp-service-aside" data-reveal style="--reveal-i: 1">
|
||||
<div class="sf-tp-service-cta">
|
||||
<span class="eyebrow">NEXT STEP</span>
|
||||
<h3>Request this service</h3>
|
||||
<p>Send your requirements and the team replies within one business day.</p>
|
||||
<a class="sf-tp-btn" href="/contact/">Contact us {{ icon('arrow-right') }}</a>
|
||||
</div>
|
||||
{% if route != '/services/' %}<a class="sf-tp-service-back" href="/services/">{{ icon('arrow-left', cls='sf-tp-icon--sm') }} All services</a>{% endif %}
|
||||
</aside>
|
||||
</div>
|
||||
</section>
|
||||
<section class="pro-inner-hero pro-info-hero"><div class="pro-wrap"><span class="pro-eyebrow">OUR SERVICES</span><h1>{{page.title}}</h1><p>{{page.summary}}</p></div></section>
|
||||
<section class="pro-section pro-info-section"><div class="pro-wrap pro-info-grid"><div><span class="pro-eyebrow">SERVICE / SUPPORT</span><h2>{{page.title}}</h2><p class="pro-muted">Working process, service scope and support commitments.</p></div><div class="pro-info-copy">{{body_copy(content,page)}}{% if page.cover %}<img class="pro-info-photo" src="{{safe_image(page.cover)}}" alt="{{page.title}}">{% endif %}</div></div></section>
|
||||
|
||||
Reference in New Issue
Block a user