From 9a5199486076f558eb0c3d1b8c928f05c37a2d57 Mon Sep 17 00:00:00 2001 From: bigcode Date: Tue, 3 Nov 2026 03:59:04 +0800 Subject: [PATCH] =?UTF-8?q?v0.10.25:=20/solution/=20=E5=BD=92=E6=A1=A3+?= =?UTF-8?q?=E8=90=BD=E5=9C=B0=E9=A1=B5=E5=A4=8D=E5=88=BB=EF=BC=88archive?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6/=E5=88=86=E9=A1=B5/=E6=91=98=E5=BD=9524?= =?UTF-8?q?=E8=AF=8D=EF=BC=89=E3=80=81Header=20=E5=85=A8=E6=96=AD=E7=82=B9?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=E3=80=81page=5Fcss=20=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E7=AE=A1=E7=BA=BF=E3=80=81reviews/populated=20=E5=AE=BD?= =?UTF-8?q?=E5=BA=A6/=5Fcss=5Fclasses/tabs=20HTML/=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=8F=98=E4=BD=93=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/sections-inventory.md | 23 ++- package.json | 2 +- scripts/import-page-css.ts | 142 +++++++++++++++++ src/components/elementor/Renderer.tsx | 95 +++++++---- src/components/elementor/slim.ts | 6 + src/components/ui/navigation-menu.tsx | 4 +- src/components/website/Header.tsx | 86 +++++----- src/components/website/LangSwitcher.tsx | 4 +- src/components/website/SolutionArchive.tsx | 174 +++++++++++++++++++++ src/i18n/locales/en.ts | 2 +- src/routeTree.gen.ts | 44 +++++- src/routes/solution.$slug.tsx | 7 +- src/routes/solution.index.tsx | 24 +++ src/routes/solution.page.$page.tsx | 28 ++++ src/routes/solution.tsx | 61 +------- src/server/data.ts | 37 +++-- src/utils/image-variant.ts | 88 +++++++++++ 17 files changed, 681 insertions(+), 146 deletions(-) create mode 100644 scripts/import-page-css.ts create mode 100644 src/components/website/SolutionArchive.tsx create mode 100644 src/routes/solution.index.tsx create mode 100644 src/routes/solution.page.$page.tsx create mode 100644 src/utils/image-variant.ts 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) }} + />