Commit Graph

77 Commits

Author SHA1 Message Date
浅念 8b438a2d56 feat: unified form block + Contact page matches CMS (info+form+map+FAQ) 2026-10-29 15:55:09 +08:00
浅念 f49b3f7742 feat: map block supports Google Maps iframe embed + Contact page map added 2026-10-29 15:40:34 +08:00
浅念 e169a815ea feat: Projects page + workspace logo upload + CTA customization UI 2026-10-29 15:11:02 +08:00
浅念 f5dc2f7624 Task 15: product detail anchor tabs + per-product custom sections
User report: product detail page was wrong — section titles are
per-product custom data (CMS wppop_sections migration: Packing &
Delivery / Our Exhibition / Our Certifications / Our Company / FAQ),
not fixed headings; they must drive an anchor tab system like the
CMS [locale]/products/[slug].astro detailTabs.

Data side (both layers, task option 1 + 2):

- theme_pro.product_detail_sections: fields.sections
  [{title, content}] JSON is the structured source; legacy sync
  output that appended sections as trailing body H2 blocks is
  recognized by known/data titles and split out (overview keeps the
  rest; same-title blocks dedupe to the structured version; Features
  body block drops when fields.features renders it)
- sync_cms_data.build_product: store sections/features as structured
  fields JSON, stop appending H2 blocks to the body; stats now count
  entries with a sections field
- Specifications table no longer leaks structural JSON field keys
  (sections/features/specs/gallery/categories) — scalar spec keys
  only

Template side (trade-pro product.html, replaces 12a panel
switching):

- tab sequence is fully data-driven and matches the CMS: Product
  Details (always) -> custom sections (data titles) ->
  Specifications / Features (shown only when data exists)
- tabs are #anchor links, not panel toggles: all sections render
  flat with visible titles (readable and crawlable without JS; native
  anchor jump), JS adds smooth scrolling + scrollspy highlight +
  tab centering in the horizontal scroll row
- section ids are slug-derived (sec-packing-delivery), duplicate
  titles get an index suffix; features grid ports the CMS
  detail-feature-row

Tests: test_trade_pro_product_layout_structure rewritten for the
anchor-tab contract — sections via fields, legacy body-H2 fallback,
spec/features conditional tabs, no-sections product showing only
Product Details + Specifications, spec table free of JSON key leaks,
updated pro.css needles. 30 passed; the 1 failure
(test_trade_pro_blocks_visual_bridge) fails identically on the
previous commit (pre-existing, unrelated).

Co-Authored-By: Claude Code <noreply@example.com>
2026-10-29 13:49:08 +08:00
浅念 3ce4292794 Task 14: add CMS refined-data sync script (sync_cms_data.py)
Pull hesupipe published products/news/cases from the CMS control-api
public endpoints (the same refined data src/content/{products,news,cases}.ts
fetch at build time; those TS files are fetchers, not literal arrays) and
sync them into SiteForge entries via login + PATCH/POST:

- match by route slug (product /product/<slug>/, post keeps legacy WP
  route on update, slug-col truncation fallback), create when unmatched,
  never delete SiteForge-only entries
- port wp-text.ts cleaning (Gutenberg comments, [caption] -> figure,
  trailing form blocks, H1 -> H2, wrapInlineInP, excerpt) so bodies land
  sanitized (bleach on the API side strips aligncenter classes/styles)
- upload CMS media (/v1/media/... and local /images/ design fallbacks)
  through the SiteForge media API, rewriting body refs to media/<file>;
  per-target temp-dir cache dedupes uploads across runs
- product fields: color/standard/category + specs dict flattened into
  scalar keys (trade-pro Specifications table renders scalars only) +
  gallery as semicolon list; post fields: publish_date/category/tags;
  case fields: results/location/industry/gallery
- sync site name/tagline from site.ts SITE literal and set locale=en
  via PUT /api/i18n/sites/{id}/locale

Verified against a local uvicorn on a temp snapshot of the container DB:
52 products (47 updated + 5 created), 129 posts updated, 0 failures,
181 media covers, idempotent re-run, theme registry tests unchanged
(30 pass, 1 pre-existing failure).

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-29 12:05:57 +08:00
浅念 c12f0e28b2 fix: style preview real-time — CSS vars in theme blocks.css + clearStyleField deletes key
Root causes:
1. Font/color CSS consumption rules were added to platform blocks.css
   but editor preview uses the THEME's blocks.css (which lacked them)
2. Reset buttons sent empty string which failed validation → 400 →
   preview died silently

Fix: Added --sf-title-size/--sf-text-size/--sf-accent-c/--sf-btn-c
consumption rules to themes/trade-pro/blocks.css; reset now uses
clearStyleField() which deletes the key instead of setting ''.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-29 11:40:03 +08:00
浅念 f7a938145f feat: per-block font size/color controls — title_size, text_size, text_color, accent_color, button_color
- blueprints.py: validate + render 5 new style properties as CSS vars
- editor.js: slider controls for title/text size, color pickers for
  text/accent/button colors with reset buttons
- blocks.css: CSS variable consumption rules (--sf-title-size, etc.)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-29 11:16:22 +08:00
浅念 e0a8828a9a style: hero banner v3 — complete rewrite as full-viewport carousel background 2026-10-29 10:43:12 +08:00
浅念 1fe4f2c6ac style: hero true fullbleed — image breaks container, fills entire viewport width 2026-10-29 10:30:51 +08:00
浅念 7179ad4e6b fix: hero image URL + button white-on-blue !important 2026-10-29 10:24:22 +08:00
浅念 706d4d0743 style: hero fullbleed — background image + left text overlay (not split) 2026-10-29 10:03:55 +08:00
浅念 45c39b1695 feat: trust_bar + applications_band blocks; homepage now block-driven
- blueprints: register trust_bar (icon/title/text items) and applications_band
  (2x2 dark-band tiles) block types; render with escaped items, ordinal icon
  fallback, 8-item cap; auto-exposed in editor via /api/editor/blocks and
  grouped under business in the studio palette
- blocks.css: platform base layer for both blocks (app/static + trade-pro
  Layer A kept verbatim in sync) + trade-pro bridge vocabulary (icon-circle,
  hairline dividers, navy->brand gradient band, glass tiles, 900/620
  breakpoints, reduced-motion) without touching canvas hooks
- tests: test_trade_pro_home_block_driven covers the full studio-draft
  PUT -> publish -> build chain; 8 block types on the homepage, template
  markers absent under layout_mode=replace, clean build report
- scripts/setup_home_blocks.py: production write path for site 483295c29ea0
  (login -> draft -> publish -> build -> verify); real catalogue counts feed
  the stats block; run after the Docker image picks up the new block types

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 18:11:32 +08:00
浅念 c4d9b1075c feat: full block visual bridge — platform blocks get trade-pro template-grade styling
Task 13a. Rewrite themes/trade-pro/blocks.css as two layers:
- Layer A: current app/static/blocks.css verbatim (old theme copy was stale,
  missing V8.34+ hero slider / layout-variant / card-style rules); keeps all
  platform contracts (site-runtime.js hero track, responsive.py 820/540 device
  semantics, card-style/fit variants, V8.33.1 section-vs-inner class fix).
- Layer B: .sf-theme-trade-pro scoped bridge to the sf-tp-* template language:
  hero (dark gradient + scrim + inverse button), features (soft band + white
  cards + icon-circle index), collection (hairline cards, hover lift, 4:3
  media, pill tag), image_text (1fr/1.22fr + photo frame), stats (white stat
  bar with hairline dividers), cta (gradient band + ghost button), richtext
  (article-body typography incl. tables), plus gallery/faq/tabs/carousel/
  video/pricing/attributes in the same tokens. 68 distinct --sf-tp-* token
  references; breakpoints 900/620 follow the template.
  Section backgrounds use a .sf-canvas chain (0,4,0) so they beat pro-base's
  later-loading .pro-custom-content rules in both static and editor cascades;
  user inline --sf-bg/--sf-fg still win via var() fallbacks; canvas hooks
  (block-id attrs, selection outlines, site-design padding/h1 controls)
  untouched.

Tests: test_trade_pro_blocks_visual_bridge covers distribution (theme file
served verbatim, not platform), full multi-block DOM structure with pro.js
filter hooks, scoped rule/token/breakpoint contracts and editor-safety
red lines. 36/36 in test_theme_registry + test_theme_pro_v3; full suite
453 passed / 11 failed (identical to pre-change baseline).

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 16:07:39 +08:00
浅念 d9749044e1 fix: editor preview auto-scrolls to blocks area on load 2026-10-28 15:00:01 +08:00
浅念 7fcd95cf9c fix: revert editor preview to stored layout_mode (replace showed blank canvas) 2026-10-28 14:46:32 +08:00
浅念 41b02da998 fix: replace 82 smart quotes with straight quotes in workspace.js 2026-10-28 14:39:24 +08:00
浅念 3786717490 fix: CSS syntax errors — missing colons before hex color values
color#3b556e → color:#3b556e (etc.) — bash heredoc stripped colons,
causing entire CSS rules to fail silently. All button/badge/table
styles were broken.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 14:24:52 +08:00
浅念 8fbe638b15 fix: cache-bust workspace assets (?v=4) + guard empty entry IDs in editor links
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 14:18:30 +08:00
浅念 adcb1cc157 style: content list v4 — card-style rows with spacing, hover lift, rounded borders
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 14:12:33 +08:00
浅念 5cfa62611c style: content list v3 — colored type badges, mono routes, status dots, gradient design button
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 14:07:52 +08:00
浅念 779a682806 fix: editor preview uses replace mode so blocks fill the entire clickable area
Template content was rendering above the block canvas, pushing editable
blocks below the fold. Replace mode shows only blocks in preview,
making the full preview area clickable. Saved layout_mode unchanged.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 13:52:12 +08:00
浅念 f138bd5b6e test: page 2 now has next link (not last page at 20/page)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 13:38:21 +08:00
浅念 eee0edf021 test: update listing pagination assertions for 20/page (was 100)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 13:35:46 +08:00
浅念 4163e19f52 feat: product list pagination 20/page (was 100, all 48 fit on one page)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 13:33:52 +08:00
浅念 9af1be224d fix: hide catalog mega-menu toggle + search from trade-pro header nav
User feedback: only show configurable nav items, remove template-injected
Products dropdown and Search link.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 12:12:37 +08:00
浅念 8526231f38 fix: nav editor API calls use workspace api() signature (url, method, data)
The api() helper takes positional args, not fetch-style options object.
This caused 'not a valid HTTP method' error on save/publish.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 12:01:31 +08:00
浅念 fbda69035c style: polish workspace UI — tab/pagination/table/nav-editor refinements
- Type tabs: gradient active state, pill counts, inset shadow container
- Pagination: bordered buttons with primary next, page info with accent
- Data table: hover highlight, uppercase headers, softer shadow
- Nav editor: proper 6-col grid alignment (handle/name/route/up/down/del),
  column headers row, focused input glow, red delete hover

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 11:59:10 +08:00
浅念 0225c270ea feat: inline nav editor in workspace + styled type tabs
- 外观与设计: nav edit button opens modal directly in workspace,
  no page editor redirect needed; add/remove/reorder/edit nav items
  with save-draft + publish buttons
- 内容与页面: type tabs now use segmented-control design (active
  blue pill group with counts) instead of scattered buttons

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 11:45:16 +08:00
浅念 5e8ae60dfe feat: rebuild product detail page to match cms design (tabs/attrs/spec-table)
Task 12a: rebuild product detail to precisely match cms [slug].astro - sticky tab nav (muted bar, brand underline, single-row h-scroll) with .sf-tp-panel/.active switching via inline script (no-JS renders all panels flat); Product Details panel renders body HTML as rich-body with cms table rules (full-width, hairline borders, zebra, inline width/height override, cell div scrub); Specifications panel shows clean spec-table with two key/value pairs per row when specs exist; panel titles get the cms 3px brand underline. Breakpoints mapped cms 900/960 -> platform 900, cms 620 -> 620; product responsive rules consolidated in the 12a block and removed from the shared responsive block. Product title keeps h1 tag at cms h2 scale (2xl) per platform single-h1 contract. Note: most product.html and test edits were swept into concurrent commit 85e6d4a; this commit carries the pro.css 12a block and the h1 refinements.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 11:42:51 +08:00
浅念 85e6d4aeca feat: workspace UX — nav quick-access, content type tabs, list pagination
- 外观与设计: prominent 导航菜单 card linking to editor's siteDesign
- 内容与页面: type tab pills (全部/产品/文章/页面/...) with counts,
  replaces dropdown; content list paginated 20/page with prev/next
- Search resets page; tab click resets page

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-28 11:30:19 +08:00
浅念 df2a183dbf 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>
2026-10-26 18:03:07 +08:00
浅念 391d22f1a8 feat: refine trade-pro variant pages (brand/service/faq/search/notfound)
Task 11 (layout port finale): rebuild the five thin variant pages in the
sf-tp design language, informed by upstream industrial/automotive
1.3.0/1.4.0 information architecture.

- brand: page-hero (breadcrumb Home > Brands > name, cover bg, anchor
  button) + related-product card grid (fields.brand == page title) +
  brand profile body only when authored; derived placeholder summary
  excluded, empty brands get an empty state, never fabricated intros.
- service: page-hero + 1.2/0.8 detail grid (article-body typography +
  sticky CTA card with contact/back links); empty body collapses to a
  centered solo column with the CTA card kept.
- faq: page-hero + article-body for the rich-text body (platform has no
  faq content type; sanitize strips details/summary so the typography
  layer carries it, block-driven details coexist via sf-canvas) +
  dark contact-guidance card; empty body swaps to an empty state.
- search: adopts the same platform mechanism as all four upstream
  themes (site-runtime.js ?q= client search over dist-root
  search-index.json); #sf-search/#sf-search-results/#sf-search-count
  hooks and .sf-search-page kept as JS contract, panel and injected
  result cards restyled via scoped cms-token overrides.
- notfound: branded dark-band 404 (icon macro, giant 404 h1, English
  copy, back-home + browse-products buttons); no end-cta.

CSS: Task 11 block appended to pro.css (new sf-tp-* classes only, own
900/620 media queries; shared hero/grid/typography responsive rules
come from existing 10a/10c/10d blocks; search overrides beat
factory.css by specificity without touching hooks).

Tests: test_trade_pro_variant_pages_structure covers brand fixture
(related filtering, empty forms), service/faq body-vs-empty, search
mechanism contract + noindex + index asset, 404 structure, v3 spot
checks (single h1, chrome, SVG arrows) and clean build report.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 16:32:15 +08:00
浅念 e21dbb6518 upgrade: adopt V8.33.1 — final merge, our patches upstreamed natively
V8.33.0 absorbed our entire platform patch set as native features
(discovery/env_for macro override/blocks.css priority/type-mapping fix/
frontend entries/locale override) and synced trade-pro from our remote;
V8.33.1 adds HESU PIPE industrial-theme home fixes (1.3.1).

Zero patch re-application this round — all verified native. Theme
suites 35/35; full run 428 passed + same 10 known Windows env fails
(FAILED set unchanged). Live: container 8.33.1-dev.1 healthy, hesupipe
192 entries intact, trade-pro build 203 pages 0 errors.

Patch registry retired to archive — future upgrades are plain overlay.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 14:27:17 +08:00
浅念 b5996bf2b1 docs: correct iron rule scope — process-artifact cleanup; launch checks kept separate
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 11:32:37 +08:00
浅念 1cc669ce5a docs: pre-launch cleanup iron rule — no fake/placeholder assets in production
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 11:26:02 +08:00
浅念 95982fad23 upgrade: adopt V8.32.0-dev.1 (theme preview iframe fix, editor simple mode)
Overlay 46 upstream items; full patch set re-applied (all patched files
reset by overlay regardless of upstream change status — lesson recorded).
Verified: theme suites 35/35; dual-baseline 418 passed vs pristine
389+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails).
Live: container 8.32.0-dev.1 healthy, hesupipe 192 entries intact,
trade-pro build 203 pages 0 errors.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 11:18:45 +08:00
浅念 8884e100f9 upgrade: adopt V8.31.1 (theme 1.3/1.4 redesigns, editor deep-canvas, guided launch, component library)
Overlay 190 upstream items (V8.22→8.31) preserving trade-pro theme,
registry tests, and design docs. Re-applied full patch set on identical
anchors (discovery/env_for/blocks.css/type-mapping/locale-override/
theme_color/frontend entries/test_theme_pro_v3 mods) plus compose pins.

Verified: theme suites 35/35; dual-baseline full run 415 passed vs
pristine 386+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails).
Live: container 8.31.1-dev.1 healthy, hesupipe 192 entries intact,
trade-pro build 203 pages 0 errors.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-26 09:43:17 +08:00
浅念 a63548c645 feat: port cms header/footer chrome visuals + mobile drawer into trade-pro
Task 10j: reshape the platform chrome DOM (sf-site-head/pro-header/
pro-navigation/pro-mega/pro-footer) into the cms Header.astro/Footer.astro
design via a pure CSS layer in trade-pro pro.css (--pro-* token bridge +
scoped 0,2,0 overrides): sticky glass header, right-aligned semibold nav
with brand underline hover, white dropdown cards with desktop hover/focus
reveal (>=1025px only; drawer semantics below), cms button CTA, dark
four-column-style footer with hairline copyright bar, cms wrap geometry.

Mobile drawer reuses the upstream V8.21.3 four-theme mechanism verbatim
(commercial.css locked styles + pro.js generic [data-pro-menu]/
#pro-navigation hooks trade-pro already emits); mobile_tabs is
template-driven so trade-pro gains the render block (English labels,
data-mobile-open-menu opens the shared drawer).

pro.html: +footer_nav-gated <h3>Quick Links</h3> (cms column heading),
+mobile tabs block. No DOM restructuring elsewhere; site_design data flow
(announcement/CTA/search/footer/mobile_tabs) and pro.js hooks intact.

Tests: +test_trade_pro_chrome_layout (structure/hooks/EN fallback nav/
css evidence/drawer assets + safe-area/mobile_tabs publish cycle).
35 passed in theme suite; full run 364 passed + same 10 known infra fails.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 17:53:14 +08:00
浅念 87ce104d7e feat: port cms standard layout into trade-pro
Task 10h (last regular layout). Design sources: cms applications.astro +
support.astro (generic content pages). Common form = PageHero (eyebrow/h1/
lead + in-page anchor button + cover bg) then content area.

- The structured sections in both sources (application card grid,
  FeatureGrid bands, anchor nav strip, doc cards, FAQ) are HESU dictionary
  content, not layout - not ported (fake data across sites). The platform
  standard page content is the rich-text body: section structure is carried
  by the body's own h2/img/tables (10g decision), typeset via the 10d
  sf-tp-article-body layer double-attached with sf-tp-standard-body.
- Empty body hides the body section and the hero anchor button (cms
  isRichAbout ternary); empty cover/summary hide bg/lead independently.
- Breadcrumb Home > title per platform page-level convention (10e/10f);
  support's trailing Cta stays covered by pro.html pro-end-cta.
- Zero new CSS rules: applications.astro itself ships no scoped styles and
  the template is pure composition (10c hero / 10b breadcrumb / 10a
  section-head / theme.css baselines); decision documented in pro.css.
- Test test_trade_pro_standard_layout_structure: build-flow page entry
  asserts hero/body containers; bootstrap /services/ page (meta.
  page_template='standard') verifies the template is not route-bound
  (explicit meta beats route-prefix inference) and the empty-data hiding.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 17:25:21 +08:00
浅念 0ec826bd4b feat: port cms case layout into trade-pro
Task 10g: rewrite pages/case.html from the thin 1-line variant to the cms
projects/[slug].astro design (pixel baseline dist/hesupipe/en/projects/):
PageHero (breadcrumb Home > Cases > title, cover bg) + 1.2fr/0.8fr detail
grid (overview block with location/industry rows + rich body via the 10d
typography layer; sticky side column with main photo, 3-col gallery tiles
and Results card) + Recommended Products + Other Projects (groups['case']
minus self), all empty-data sections hidden. Results points come from the
open fields.results convention (semicolon/newline separated); cms
dictionary fallback copy is never ported (fake data across sites).

Listing case branch (10c evaluation): core form (hero + cols-3 cards +
pagination) already matches cms projects list; only the hero copy voice
differed, so listing.html gains a case-aware eyebrow/lead fallback
(OUR PROJECTS). cms-specific tabs (no data source) and the FEATURED CASE
STUDY band (HESU-static dictionary content) stay unported, documented in
the template header.

Adds test_trade_pro_case_layout_structure (build-flow: gallery/results
structure, related-case dedup, empty-data hiding, /cases/ hero voice).

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 16:59:52 +08:00
浅念 882b8cb1ec feat: port cms contact layout into trade-pro (info/form/no-fake-submit)
Task 10f. contact.html rebuilt from contact.astro + LeadForm.astro:
PageHero (breadcrumb/cover bg) -> 0.85/1.25 info+form-card grid ->
rich body section (body only). No-fake-submit dual form: configured
HTTPS form_endpoint renders external form (name/email/message +
pro-honeypot, 10b contract); unconfigured renders no <form> at all,
guidance card with real mailto when footer_email exists. Contact
items render only with real fields (email mailto; no fabricated
phone/address), cms map band dropped (no address data source).
CSS appended to pro.css with own 900/620 media blocks; new test
test_trade_pro_contact_layout_structure covers both shapes.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 16:34:28 +08:00
浅念 7d7e98adfa feat: port cms about layout into trade-pro
Task 10e: rewrite pages/about.html from the 2-row thin variant to the
full cms about page design (about.astro, pixel baseline
dist/hesupipe/en/about/): page hero with breadcrumb + cover backdrop +
in-page anchor button, company intro two-col with derived stats bar,
rich body (gated on body), advantages grid, dark mission band with
gallery backdrop and glass feature cards, gallery-driven facility card
grid (hidden when empty), certifications grid.

Data mapping: about page = ordinary page entry; cms dict-only stats and
factory copy have no platform fields, so stats reuse the 10a home
derivation (products/categories/brands/cases counts, hidden when all
empty) and facility cards are driven by page.cover + fields.gallery
(make_context gallery, deduped, cover first); markFloatImages is not
ported (sanitize strips class attributes, same conclusion as 10d) and
the body renders through body_copy + the 10d sf-tp-article-body
typography layer via dual classing.

CSS lands in pro.css under sf-tp-about-* reusing the 10a/10b/10c
components (two-col, stats, feature/card grids, section head, page
hero, breadcrumb); responsive collapse comes from the existing 10a/10c
media blocks, with about-specific 900/620 rules in a dedicated block
(767 intentionally empty, covered by 10c page-hero).

Tests: test_trade_pro_about_layout_structure drives a data-rich /about/
(PATCHed bootstrap entry with cover/summary/rich body/gallery + product
and post entries) and an empty custom-route about page
(meta.page_template), asserting structure, data mapping, and empty-data
section hiding.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 15:58:30 +08:00
浅念 f15ea85db4 docs: fix specificity notation in 10d css comment (review minor 1)
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 15:38:23 +08:00
浅念 598f4695dd feat: port cms article detail layout into trade-pro + review minors
- article hero/meta/rich-body/author card/next-story/related sidebar
  per cms news/[slug] design; .pro-article-hero contract preserved
- review minors: back-link & CTA render even with 1-2 posts only;
  specificity comment notation corrected to (0,3,1)/(0,2,1)

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 15:37:04 +08:00
浅念 1eddcf9136 feat: port cms article detail layout into trade-pro (hero/body/related)
Task 10d: rewrite trade-pro article.html from the thin pro-article
skeleton to the cms news/[slug].astro design (pixel baseline
dist/hesupipe/en/news/<slug>/):

- hero reuses the 10c sf-tp-page-hero component (cover as bg image +
  brand-soft overlay) with the breadcrumb inside; the platform contract
  class .pro-article-hero stays on the hero section and the pro-base
  centered/giant-h1 skeleton is flattened by specificity in pro.css
- meta row (category pill - publish_date - author), rich-text body via
  body_copy with a cms rich-body typographic layer, divider, author
  card, next-story navigation
- related band below the content: More News side box (120px thumb rows,
  3 items, self and next-story excluded) + dark side CTA + back link,
  1fr+300px grid collapsing at 900/620
- date field is meta.fields.publish_date (blueprints post definition),
  rendered raw as YYYY-MM-DD
- new responsive rules live in the 10d media blocks appended at the end
  of pro.css to avoid the 10c source-order cascade trap; the 620 hero
  h1 compact size is re-declared at the same specificity because the
  10d no-media h1 reset (0,4,0) outranks the 10c 620 rule (0,3,0)
- tests: test_trade_pro_article_layout_structure builds a site with a
  cover/date/rich-body post plus 4 other posts and asserts hero/meta/
  body/author/next/related structure, .pro-article-hero presence, no
  bare arrow characters

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 15:04:07 +08:00
浅念 ea2ac339e0 fix: listing review round + compose web build-timeout passthrough
- listing grid collapses at 900/620 (source-order fix), route-substring
  kind fallback gated to empty non-category listings, section-head shows
  item/page counts, Popular reads linked, category h1 assertions
- compose: SITEFORGE_BUILD_TIMEOUT_SECONDS now passed to web service
  (enqueue side reads it — upstream gap found during mirror builds)
- chore: ignore runtime state files

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 14:32:10 +08:00
浅念 8f8dfd19e5 fix: listing review round — responsive grid collapse, branch fallback, test assertions
Quality review fixes for Task 10c (2 Important + 5 Minor):
- [I1] sf-tp-card-grid--listing now collapses to 2 cols at 900px and
  compact gap at 620px: the 3-col declaration sits after the 10a media
  blocks in source order, so the fold rules must live in the new 10c
  media blocks to win at equal specificity
- [I2] tp_post_like trusts the first listing item's content type when
  the list is non-empty; the route-substring fallback now only applies
  to empty listings of kind=='listing' — /categories/post-sales-service/
  style slugs can no longer flip a product category page into the news
  branch
- [M3] empty-state negative assertions check the rendered attribute
  string, not the selector literal (previously always true)
- [M4] catalogue section-head intro is now an item/page count instead
  of duplicating the hero lead
- [M5] Popular reads entries link to the posts (same data as Latest,
  no analytics source on the platform)
- [M6] both /categories/pumps/ pagination pages assert exactly one h1
- [M7] side-panel sticky top uses --sf-tp-space-24

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 14:26:34 +08:00
浅念 9ea8369e2b feat: port cms listing layout into trade-pro (kind-branched cards/filters/pagination)
Task 10c. listing.html (category.html now includes it) replaces the thin
pro-inner-hero variant with the cms list designs:
- product-like listings (product/vehicle/brand/case/service) get the
  products/[...page].astro form: ported PageHero, 260px sticky category
  side panel, 3-col sf-tp-card grid reusing the 10a card components
- post-like listings (/news/, /post/) get the news/[...page].astro form:
  1fr+310px two-col layout, horizontal news rows (290px media + tag/
  title/summary/Read more), three aside boxes (Latest/Popular/count)
- pagination is the cms Pagination window (first/last + current-2..+2,
  ellipsis collapse) with arrow-left/arrow-right SVG icons and
  builder-consistent URLs (page 1 = section root)
- platform filter contract kept: .pro-filter-panel stays the immediate
  previous sibling of .pro-filter-scope (pro.js previousElementSibling
  lookup); cards/rows carry .pro-card + data-brand/data-category
- empty sections hide filters/grid/pagination behind a friendly empty
  state (noindex scaffold pages)

Test: test_trade_pro_listing_layout_structure drives a real build with
105 imported products + 3 posts, asserting both branches, static
pagination on /categories/pumps/ pages 1-2, contract adjacency, and
no bare arrow glyphs.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 14:06:15 +08:00
浅念 1f2e7529a2 docs: patch registry for V8_21_3 base
Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 12:32:12 +08:00
浅念 601451f22b upgrade: adopt V8.21.3 (V8.13→8.21.3: P5 SFTP/S3, P6 multilingual, editor overhaul, enterprise hardening)
Overlay ~150 upstream items onto our V8.12 base, preserving trade-pro
theme, registry tests, and design docs. Re-applied our patch set
(discovery/env_for/blocks.css/type-mapping/theme_color/frontend entries,
test_theme_pro_v3 mods) — all anchors survived upstream evolution.

New platform enhancement (fixes upgrade-introduced regression):
multilingual.site_locale now honors settings_json.locale, plus
PUT /api/i18n/sites/{id}/locale — standalone English sites get
<html lang='en'> under the V8.15 locale-rewrite pipeline.

compose: adopt V8.21.3 (image 8.21.3-dev.1, /api/ready probes, MySQL/S3
env) with project name pinned to siteforge-v8-10 (data volumes).

Tests: 356 passed / 11 failed — all 11 confirmed pre-existing in
pristine V8.21.3 on this host (10 upstream Windows env + our build test
now green after locale fix). Patch registry updated in plan doc.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-23 12:31:03 +08:00