{{ overline }}
-
diff --git a/www/app/components/section/layouts/LayoutFullBanner.vue b/www/app/components/section/layouts/LayoutFullBanner.vue
index edda7e2..34b4fa0 100644
--- a/www/app/components/section/layouts/LayoutFullBanner.vue
+++ b/www/app/components/section/layouts/LayoutFullBanner.vue
@@ -7,17 +7,17 @@ const { overline, title, subtitle, content, overlineStyle, titleStyle, bodyStyle
-
{{ overline }}
{{ subtitle }}
{{ overline }}
diff --git a/www/app/components/section/layouts/LayoutHeroSplit.vue b/www/app/components/section/layouts/LayoutHeroSplit.vue
index e0de116..02e64c0 100644
--- a/www/app/components/section/layouts/LayoutHeroSplit.vue
+++ b/www/app/components/section/layouts/LayoutHeroSplit.vue
@@ -28,32 +28,61 @@ const hPad = computed(() => ({
center: 'md:px-64px',
right: 'md:pl-96px md:pr-128px'
} as Record
{{ overline }}
{{ subtitle }}
+ {{ overline }}
+
+ {{ subtitle }}
+
{{ overline }}
diff --git a/www/app/components/section/layouts/LayoutSpecTable.vue b/www/app/components/section/layouts/LayoutSpecTable.vue
index dce30d2..0e2e8e2 100644
--- a/www/app/components/section/layouts/LayoutSpecTable.vue
+++ b/www/app/components/section/layouts/LayoutSpecTable.vue
@@ -32,13 +32,13 @@ function needToggle(group: SpecGroup): boolean {
-
{{ overline }}
diff --git a/www/app/components/section/layouts/LayoutSplitContent.vue b/www/app/components/section/layouts/LayoutSplitContent.vue
index 06f04c7..4c85edd 100644
--- a/www/app/components/section/layouts/LayoutSplitContent.vue
+++ b/www/app/components/section/layouts/LayoutSplitContent.vue
@@ -12,10 +12,11 @@ const videoUrl = computed(() => resolveAssetUrl(props.section.video_url));
// 媒体位置(config.media_position):left 图/视频在左(默认)/ right 在右;移动端始终文案在上
const mediaPosition = computed(() => (props.section.config as Record
{{ overline }}
{{ subtitle }}
{{ overline }}
diff --git a/www/app/components/section/layouts/LayoutTitleMedia.vue b/www/app/components/section/layouts/LayoutTitleMedia.vue
new file mode 100644
index 0000000..16859ac
--- /dev/null
+++ b/www/app/components/section/layouts/LayoutTitleMedia.vue
@@ -0,0 +1,53 @@
+
+
+
+
+ {{ overline }}
+
+ {{ subtitle }}
+
{{ overline }}
diff --git a/www/app/composables/useSectionContent.ts b/www/app/composables/useSectionContent.ts
index 74430bd..425bf6c 100644
--- a/www/app/composables/useSectionContent.ts
+++ b/www/app/composables/useSectionContent.ts
@@ -30,6 +30,8 @@ export function useSectionContent(section: SectionBlock) {
// 前景文案自定义颜色(空 = 跟随 theme 默认配色,由布局组件的 class 控制)
// 内联 style 优先级高于 class,非空时直接覆盖默认色
const overlineStyle = computed(() => (section.overline_color ? { color: section.overline_color } : undefined));
+ // 标题字号由 main.css 的 section h2 规则统一控制(config.title_font_size 经 SectionRenderer
+ // 注入 --sec-title-fs/--sec-title-fs-m 变量,留空兜底 36px,移动端 22.5px)
const titleStyle = computed(() => (section.title_color ? { color: section.title_color } : undefined));
const bodyStyle = computed(() => (section.body_color ? { color: section.body_color } : undefined));
diff --git a/www/app/types/site.ts b/www/app/types/site.ts
index a2b807c..e2ba619 100644
--- a/www/app/types/site.ts
+++ b/www/app/types/site.ts
@@ -82,6 +82,8 @@ export type SectionLayout =
| 'gallery'
| 'stats'
| 'video_showcase'
+ | 'title_media'
+ | 'mosaic'
| 'scroll_narrative'
| 'quote'
| 'spec_table';
@@ -136,11 +138,19 @@ export interface GalleryImage {
caption_en: string;
}
+// 马赛克拼贴布局槽位素材(config.mosaic_items)
+export interface MosaicItem {
+ type: 'image' | 'video';
+ media_zh: string;
+ media_en: string;
+}
+
export interface SectionConfig {
features?: FeatureItem[];
stats?: StatItem[];
steps?: NarrativeStep[];
images?: GalleryImage[];
+ mosaic_items?: MosaicItem[];
[key: string]: unknown;
}
diff --git a/www/uno.config.ts b/www/uno.config.ts
index fae6886..44204a4 100644
--- a/www/uno.config.ts
+++ b/www/uno.config.ts
@@ -21,7 +21,8 @@ export default defineConfig({
shortcuts: {
'flex-center': 'flex justify-center items-center',
'flex-col-center': 'flex flex-col justify-center items-center',
- 'section-container': 'mx-auto max-w-1200px px-16px'
+ // 内容容器最大宽度由区块 config.container_width 通过 --sec-cw 覆盖,未设置时回退 1200px
+ 'section-container': 'mx-auto max-w-[var(--sec-cw,1200px)] px-16px'
},
transformers: [transformerDirectives(), transformerVariantGroup()],
presets: [presetWind3({ dark: 'class' })]
+
{{ title }}
+
{{ title }}
+
{{ title }}
+ {{ title }}
+
+
+
config.value.steps ?? []);
-
+
{{ title }}
+
{{ title }}
+
+
{{ title }}
+
{{ title }}
+ {{ title }}
+
+
+
+
{{ title }}