diff --git a/docs/sections-inventory.md b/docs/sections-inventory.md index c33d30f0d..894c276f3 100644 --- a/docs/sections-inventory.md +++ b/docs/sections-inventory.md @@ -93,8 +93,27 @@ srcset/medium 变体,个别卡片高度 ±5px。 ### 2. 方案页 -- S1 `/solution/` 列表入口页 -- S2 `/solution/$slug` 落地页:与首页同款 Elementor 直出,版块逐页不同 +- S1 `/solution/` 列表入口页 v0.10.25 ✅ 一比一复刻原站 Elementor archive(widget 2da75291): + hero #eee 120px(h1 40px/900 uppercase 居中)+ 卡片 grid 3/2/1 列 gap 28 + 缩略图 66%/50% 占位、 + ::after 黑 35%→75% 渐变(hover 1→0.5)+ 卡片阴影 0 0 10px(hover 30px)+ 标题 21px #ED6C00 + + 摘录 14px/1.5 #777(24 词截断,  相连算一词)+ 分页(当前页 #FFA11B);新增 + /solution/page/N/ 分页路由与摘录/卡片数据(8 篇 excerpt 按原站回填);桌面/平板/移动三断点 + hero/卡片/分页几何差 ≤2px。 +- S2 `/solution/$slug` 落地页 v0.10.25 ✅ 渲染器补齐: + - Renderer:populated 宽度改标准块级 auto(margin 收缩,6c765c4 卡列 272/272 精确)、 + tabs 标题按 HTML 渲染、_css_classes 落到 section/column/class 上; + - page_css 导入管线(scripts/import-page-css.ts):抓原站 post-.css,把 + .elementor-element- 与 .ele-* 自定类规则翻译为 [data-el] 选择器存 meta.page_css, + ElementorRenderer 注入(补齐 dump 缺失的 widget 级 custom CSS,如 infobox 图 80px); + - reviews 评价区重写为 Elementor 原生 reviews DOM(2 列 slide、79px 圆形头像、 + 星 14px #CCD6DF、职位 16px #697882、评价图 50% 居中); + - Header 全断点对齐原站(topbar 36px/容器 1350/文字 16px、图标 36×36 gap10 顺序 + Linkedin-Youtube-Facebook、无 Login;主导航容器 40/25、logo 后 80px、菜单序 + Resources→Success Stories 修正、菜单项 pad 8/6 距 6、caret 16px、搜索 40×68、 + CONTACT US/邮件/语言 48px;平板汉堡形态、移动 48px 导航+气泡);菜单序为 DB 数据修正。 +- 已知数据差异:smart-home-solution 原站 2026-10-16 改版新增内层版块(2faa053 等不在 + dump 快照),9dc5c01 场景区较原站矮约 1540px,属快照滞后;其余 13 个落地页全部版块 + 齐全,逐节高度差 >15px 的多数为原站 headless lazy/swiper 未初始化假象。 ### 3. 商城/产品/博客(WordPress 模板页) - SH1 商城:`/shop/` 分类+商品网格 diff --git a/package.json b/package.json index 1c08a09e0..46aa719bf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dusuniot-rebuild", - "version": "0.10.24", + "version": "0.10.25", "private": true, "type": "module", "scripts": { diff --git a/scripts/import-page-css.ts b/scripts/import-page-css.ts new file mode 100644 index 000000000..27b3e8522 --- /dev/null +++ b/scripts/import-page-css.ts @@ -0,0 +1,142 @@ +/** + * # 脚本 导入原站页面级生成 CSS(post-.css)到 contents.meta.page_css + * + * 背景:DB dump 的 meta.elementor 缺少 widget 级 custom_css(如 EAEL infobox 的 + * `.elementor-element-7f1dc73 .eael-infobox .infobox-icon img{width:80px}`),这些规则 + * 只存在于原站 Elementor 生成的页面样式表 post-.css 中。 + * + * 做法: + * 1. 抓 https://www.dusuniot.com/wp-content/uploads/elementor/css/post-.css + * 2. 只保留选择器含 .elementor-element-(id 属于本文档)的规则(含 @media 块内), + * 把 `.elementor-element.elementor-element-` / `.elementor-element-` 改写为 + * `[data-el=""]`(与渲染器 DOM 对应),剥掉 `.elementor-` 页面作用域前缀 + * 3. 拼接后写回 meta.page_css,渲染器(ElementorRenderer pageCss prop)注入 +
+
+ {slides.map((it, i) => ( +
+
+
+
+ {it.image?.url ? {it.image.alt : null} +
+ + {s(it.name)} +
+ {[1, 2, 3, 4, 5].map((n) => ( + ★ + ))} +
+ {s(it.title)} +
+
+
+
+
+
-
+ ))}
- ))} +
); } @@ -1944,9 +1983,8 @@ function TabsWidget({ settings }: { settings: Record }) { tabIndex={i === active ? 0 : -1} aria-selected={i === active} onClick={() => setActive(i)} - > - {s(t.tab_title)} - + dangerouslySetInnerHTML={{ __html: s(t.tab_title) }} + /> ))}
@@ -1959,9 +1997,8 @@ function TabsWidget({ settings }: { settings: Record }) { tabIndex={i === active ? 0 : -1} aria-selected={i === active} onClick={() => setActive(i)} - > - {s(t.tab_title)} -
+ dangerouslySetInnerHTML={{ __html: s(t.tab_title) }} + />