@rxdrag/website-lib 0.0.112 → 0.0.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,7 @@ interface Props {
10
10
  videoRef?: string;
11
11
  posterRef?: string;
12
12
  endTitle?: string;
13
+ eagerLoad?: boolean;
13
14
  classNames?: {
14
15
  container?: string;
15
16
  video?: string;
@@ -27,6 +28,7 @@ interface Props {
27
28
  const {
28
29
  videoRef,
29
30
  posterRef,
31
+ eagerLoad,
30
32
  endTitle = "Contact Us Now",
31
33
  classNames = {},
32
34
  } = Astro.props;
@@ -45,6 +47,7 @@ const poster = rx ? await rx.getMedia(posterRef) : undefined;
45
47
  media={media}
46
48
  endTitle={endTitle}
47
49
  posterUrl={poster?.file?.original}
50
+ eagerLoad={eagerLoad}
48
51
  classNames={classNames}
49
52
  />
50
53
  )
@@ -0,0 +1,5 @@
1
+ | 层级 | 是否冻结 | 负责什么 | AI 能不能改 |
2
+ | ----------------------- | --------- | -------------------------- | ------- |
3
+ | **结构层(Structure)** | ✅ 冻结 | Grid / Flex / DOM 层级 | ❌ 不允许 |
4
+ | **语义层(Semantic)** | ✅ 冻结 | Hero / Feature / CTA 含义 | ❌ 不允许 |
5
+ | **装饰层(Decoration)** | ❌ 不冻结 | 颜色 / 阴影 / 动画 / 圆角 | ✅ 受控允许 |
@@ -0,0 +1,418 @@
1
+ # 外贸网站必备 Theme Token 设计系统 (ToB 简化版)
2
+
3
+ 基于 **TailwindCSS + ShadcnUI** 的 Token 体系,专为 **ToB 外贸询盘转化** 设计。
4
+
5
+ ---
6
+
7
+ ## 一、核心原则
8
+
9
+ 1. **Trust First**(信任优先):色调稳重,避免过于花哨,强调专业感。
10
+ 2. **Readability**(阅读体验):针对长文本(产品参数、About Us、Blog)优化排版。
11
+ 3. **Inquiry Driven**(询盘导向):所有视觉引导最终指向 "Contact Us" 或 "Get a Quote"。
12
+
13
+ ---
14
+
15
+ ## 二、Color Tokens(色彩系统)
16
+
17
+ > 映射到 CSS Variables,支持 Dark Mode 自动适配
18
+
19
+ ### 1. Brand(品牌色)
20
+
21
+ | Token | Tailwind Class | 说明 | 典型值 |
22
+ | :--------------------- | :---------------------------- | :------------------------------------------------ | :------------------------- |
23
+ | **Primary** | `bg-primary` / `text-primary` | **主品牌色**,用于 CTA 按钮 (Inquiry)、导航高亮。 | Deep Blue / Industrial Red |
24
+ | **Primary Foreground** | `text-primary-foreground` | Primary 背景上的文字颜色。 | White |
25
+ | **Secondary** | `bg-secondary` | **辅助色**,用于次级按钮、标签背景。 | Light Blue / Silver |
26
+ | **Accent** | `bg-accent` | **强调色**,用于 Hover 态、图标点缀。 | Gold / Orange |
27
+
28
+ ### 2. Neutral / Surface(中性色与层级)
29
+
30
+ | Token | Tailwind Class | 说明 |
31
+ | :------------- | :---------------------- | :----------------------------------------------- |
32
+ | **Background** | `bg-background` | 页面背景色(通常是纯白或极淡的灰)。 |
33
+ | **Card** | `bg-card` | 卡片背景色(产品卡片、Form 容器)。 |
34
+ | **Foreground** | `text-foreground` | 正文颜色(slate-900 / zinc-900)。 |
35
+ | **Muted** | `text-muted-foreground` | 辅助文字(参数 Label、日期),通常是 slate-500。 |
36
+ | **Border** | `border-border` | 通用边框颜色。 |
37
+
38
+ ### 3. Semantic / Feedback(语义色)
39
+
40
+ | Token | Tailwind Class | 说明 |
41
+ | :-------------- | :---------------- | :--------------------------- |
42
+ | **Destructive** | `bg-destructive` | **错误**,表单提交失败。 |
43
+ | **Success** | `text-green-600` | **成功**,询盘发送成功反馈。 |
44
+ | **Warning** | `text-yellow-600` | **提示**,表单填写注意项。 |
45
+
46
+ ### 4. Data & Highlights(数据与高亮)
47
+
48
+ ToB 站常见参数表格与卖点强调。
49
+
50
+ | Token | Tailwind Class | 说明 |
51
+ | :----------------- | :---------------- | :----------------------------------------- |
52
+ | **Chart 1** | `bg-chart-1` | 主数据色(参数对比图)。 |
53
+ | **Chart 2** | `bg-chart-2` | 对比数据色。 |
54
+ | **Highlight** | `bg-highlight` | 文本高亮背景(马克笔效果),强调核心卖点。 |
55
+ | **Highlight Text** | `text-highlight` | 高亮文字颜色,用于关键词强调。 |
56
+ | **Highlight Soft** | `bg-highlight/20` | 柔和高亮背景,大面积使用。 |
57
+
58
+ ### 5. CTA Button Tokens(询盘按钮 Token)
59
+
60
+ 外贸站的核心转化入口,需要清晰的视觉层级。
61
+
62
+ | Token | 说明 | 场景 |
63
+ | :------------------ | :--------------------- | :----------------------------------------------- | ----------------- |
64
+ | **btn-primary** | 实心主按钮,品牌色背景 | "Get a Quote"、"Contact Us"、"Inquiry Now" |
65
+ | **btn-secondary** | 描边次按钮,透明背景 | "Learn More"、"View Details"、"Download Catalog" | "Get free sample" |
66
+ | **btn-ghost** | 无边框幽灵按钮 | 导航链接、紧凑操作 |
67
+ | **btn-destructive** | 危险操作按钮 | "Delete"、"Cancel Order" |
68
+
69
+ #### btn-primary 样式定义
70
+
71
+ | 属性 | Token / Value |
72
+ | :------------------- | :---------------------------------------------- |
73
+ | **Background** | `--btn-primary-bg: var(--primary)` |
74
+ | **Background Hover** | `--btn-primary-bg-hover: var(--primary) / 0.9` |
75
+ | **Text** | `--btn-primary-text: var(--primary-foreground)` |
76
+ | **Border** | `--btn-primary-border: transparent` |
77
+ | **Shadow** | `--btn-primary-shadow: var(--shadow-md)` |
78
+ | **Shadow Hover** | `--btn-primary-shadow-hover: var(--shadow-lg)` |
79
+ | **Ring Focus** | `--btn-primary-ring: var(--primary) / 0.5` |
80
+
81
+ #### btn-secondary 样式定义
82
+
83
+ | 属性 | Token / Value |
84
+ | :------------------- | :-------------------------------------------------------- |
85
+ | **Background** | `--btn-secondary-bg: transparent` |
86
+ | **Background Hover** | `--btn-secondary-bg-hover: var(--secondary)` |
87
+ | **Text** | `--btn-secondary-text: var(--foreground)` |
88
+ | **Text Hover** | `--btn-secondary-text-hover: var(--secondary-foreground)` |
89
+ | **Border** | `--btn-secondary-border: var(--border)` |
90
+ | **Border Hover** | `--btn-secondary-border-hover: var(--secondary)` |
91
+ | **Shadow Hover** | `--btn-secondary-shadow-hover: var(--shadow-sm)` |
92
+ | **Ring Focus** | `--btn-secondary-ring: var(--secondary) / 0.5` |
93
+
94
+ #### 按钮尺寸 Token
95
+
96
+ | Token | Padding | Font Size | Min Width | 场景 |
97
+ | :--------- | :------------------------------------------- | :---------- | :-------- | :------------------ |
98
+ | **btn-sm** | `--btn-sm-px: 1rem` `--btn-sm-py: 0.5rem` | `text-sm` | 80px | 表格内、紧凑布局 |
99
+ | **btn-md** | `--btn-md-px: 1.5rem` `--btn-md-py: 0.75rem` | `text-base` | 120px | **标准按钮** |
100
+ | **btn-lg** | `--btn-lg-px: 2rem` `--btn-lg-py: 1rem` | `text-lg` | 160px | Hero 区域、大型 CTA |
101
+
102
+ ### 6. Social Media (Trust Signals)
103
+
104
+ 用于 Footer 或 Contact 区域的品牌图标,增强信任感。
105
+
106
+ | Token | Value | 说明 |
107
+ | :----------- | :-------- | :---------------- |
108
+ | **WhatsApp** | `#25D366` | **即时沟通核心** |
109
+ | **LinkedIn** | `#0A66C2` | **B2B 专业背书** |
110
+ | **Facebook** | `#1877F2` | 社媒引流 |
111
+ | **YouTube** | `#FF0000` | 工厂/产品视频展示 |
112
+
113
+ ### 7. Component Tokens(组件级 Token)
114
+
115
+ 定义常用组件的默认样式,保证全站一致性。组件可通过 props 覆盖。
116
+
117
+ #### card-* (卡片)
118
+
119
+ | Token | Value | 说明 |
120
+ | :----------------- | :-------------------------- | :----------------- |
121
+ | **--card-bg** | `var(--card)` | 卡片背景色 |
122
+ | **--card-border** | `1px solid var(--border)` | 卡片边框 |
123
+ | **--card-radius** | `var(--radius-md)` / 8px | 卡片圆角 |
124
+ | **--card-shadow** | `var(--shadow-md)` | 卡片阴影 |
125
+ | **--card-padding** | `1.5rem` | 卡片内边距 |
126
+ | **--card-gap** | `1rem` | 卡片内元素间距 |
127
+ | **--card-hover-shadow** | `var(--shadow-lg)` | Hover 态阴影 |
128
+ | **--card-hover-translate** | `-2px` | Hover 态上移 |
129
+
130
+ #### input-* (输入框)
131
+
132
+ | Token | Value | 说明 |
133
+ | :----------------------- | :---------------------------- | :----------------- |
134
+ | **--input-bg** | `var(--background)` | 输入框背景 |
135
+ | **--input-border** | `1px solid var(--border)` | 默认边框 |
136
+ | **--input-border-focus** | `1px solid var(--primary)` | Focus 边框 |
137
+ | **--input-radius** | `var(--radius-sm)` / 4px | 圆角 |
138
+ | **--input-ring** | `var(--primary) / 0.2` | Focus 外发光 |
139
+ | **--input-padding** | `0.75rem 1rem` | 内边距 |
140
+ | **--input-height** | `2.5rem` / 40px | 标准高度 |
141
+ | **--input-placeholder** | `var(--muted-foreground)` | Placeholder 颜色 |
142
+
143
+ #### modal-* (弹窗)
144
+
145
+ | Token | Value | 说明 |
146
+ | :------------------ | :-------------------------- | :----------------- |
147
+ | **--modal-bg** | `var(--background)` | 弹窗背景 |
148
+ | **--modal-overlay** | `rgba(0, 0, 0, 0.5)` | 遮罩层 |
149
+ | **--modal-radius** | `var(--radius-lg)` / 12px | 弹窗圆角 |
150
+ | **--modal-shadow** | `var(--shadow-xl)` | 弹窗阴影 |
151
+ | **--modal-padding** | `1.5rem` | 内边距 |
152
+ | **--modal-width-sm** | `400px` | 小弹窗宽度 |
153
+ | **--modal-width-md** | `560px` | 标准弹窗宽度 |
154
+ | **--modal-width-lg** | `720px` | 大弹窗宽度 |
155
+
156
+ #### badge-* (标签/徽章)
157
+
158
+ | Token | Value | 说明 |
159
+ | :----------------- | :-------------------------- | :----------------- |
160
+ | **--badge-bg** | `var(--secondary)` | 标签背景 |
161
+ | **--badge-text** | `var(--secondary-foreground)` | 标签文字 |
162
+ | **--badge-radius** | `var(--radius-full)` / 9999px | 圆角(药丸形) |
163
+ | **--badge-padding**| `0.25rem 0.75rem` | 内边距 |
164
+ | **--badge-font** | `text-xs font-medium` | 字号字重 |
165
+
166
+ #### table-* (表格)
167
+
168
+ | Token | Value | 说明 |
169
+ | :--------------------- | :-------------------------- | :----------------- |
170
+ | **--table-header-bg** | `var(--muted)` | 表头背景 |
171
+ | **--table-border** | `1px solid var(--border)` | 单元格边框 |
172
+ | **--table-row-hover** | `var(--muted) / 0.5` | 行 Hover 背景 |
173
+ | **--table-cell-padding** | `0.75rem 1rem` | 单元格内边距 |
174
+ | **--table-radius** | `var(--radius-md)` | 表格容器圆角 |
175
+
176
+ ---
177
+
178
+ ## 三、Typography Tokens(排版系统)
179
+
180
+ ### 1. Font Family
181
+
182
+ | Token | 说明 | 推荐字体 |
183
+ | :------------------ | :----------------------------------------------------------------- | :--------------------------------------------------------- |
184
+ | **font-sans** | **正文/通用**。清晰易读,现代感。 | Inter, Roboto, Helvetica Neue |
185
+ | **font-serif** | **标题/品牌**。用于 Hero 标题,营造传统、高端感(可选)。 | Playfair Display, Merriweather |
186
+ | **font-decorative** | **高端花字**。用于品牌 Slogan、奢侈品/高端制造展示、大型装饰文字。 | Cinzel, Cormorant Garamond, Bodoni Moda, Libre Baskerville |
187
+ | **font-mono** | **参数/代码**。用于产品型号、规格数据。 | JetBrains Mono, Roboto Mono |
188
+
189
+ ### 2. Font Sizes (Type Scale)
190
+
191
+ | Token | Size | Line Height | 场景 |
192
+ | :------------ | :---- | :---------- | :-------------------------------------- |
193
+ | **text-xs** | 12px | 16px | 辅助标签、版权信息 |
194
+ | **text-sm** | 14px | 20px | 导航、次要文本、表格内容 |
195
+ | **text-base** | 16px | 24px | **正文默认**(外贸站正文不宜小于 16px) |
196
+ | **text-lg** | 18px | 28px | 摘要、大段落首句 |
197
+ | **text-xl** | 20px | 28px | H4 / 卡片标题 |
198
+ | **text-2xl** | 24px | 32px | H3 / 模块标题 |
199
+ | **text-3xl** | 30px | 36px | H2 / 页面主标题 |
200
+ | **text-4xl+** | 36px+ | 1.1 | H1 / Hero 标题 |
201
+
202
+ ### 3. Font Weight
203
+
204
+ | Token | Tailwind | 说明 |
205
+ | :----------- | :-------------- | :------------------------ |
206
+ | **Regular** | `font-normal` | 正文默认。 |
207
+ | **Medium** | `font-medium` | 导航、按钮、表格表头。 |
208
+ | **Semibold** | `font-semibold` | 标题、强调数字。 |
209
+ | **Bold** | `font-bold` | 仅用于 H1/H2 或极强强调。 |
210
+
211
+ ### 4. Semantic & Functional Typography (语义化排版)
212
+
213
+ | Token Style | 推荐组合 | 场景 |
214
+ | :--------------- | :----------------------------------------------------------- | :--------------------------------- |
215
+ | **Lead** | `text-xl text-muted-foreground` | **导语**,文章或模块的副标题。 |
216
+ | **Caption** | `text-xs text-muted-foreground` | **注脚**,图片说明、免责声明。 |
217
+ | **Spec / Code** | `font-mono text-sm bg-muted px-1 rounded` | **参数值**,强调型号或技术指标。 |
218
+ | **Quote** | `font-serif italic text-lg text-foreground/80` | **客户评价**,Testimonial 内容。 |
219
+ | **Eyebrow** | `text-sm font-medium tracking-widest uppercase text-primary` | **眉题**,位于 H2 上方的分类标签。 |
220
+ | **Form Label** | `text-sm font-medium leading-none` | **表单标签**,清晰易读。 |
221
+ | **Input Hint** | `text-[0.8rem] text-muted-foreground` | **输入提示**,帮助用户填写表单。 |
222
+ | **Alert Text** | `text-sm font-medium text-destructive` | **报错提示**,表单验证反馈。 |
223
+ | **Success Text** | `text-sm font-medium text-green-600` | **成功提示**,提交成功反馈。 |
224
+ | **Breadcrumb** | `text-sm text-muted-foreground hover:text-foreground` | **面包屑**,路径导航。 |
225
+ | **Empty State** | `text-center text-muted-foreground` | **空状态**,无搜索结果提示。 |
226
+
227
+ ---
228
+
229
+ ## 四、Spacing & Layout Tokens(空间系统)
230
+
231
+ ### 1. Container (Max Width)
232
+
233
+ | Token | Width | 场景 |
234
+ | :------------------- | :----- | :--------------------------- |
235
+ | **max-w-screen-md** | 768px | 窄版落地页 (Squeeze Page) |
236
+ | **max-w-screen-lg** | 1024px | 博客文章 / 条款页 |
237
+ | **max-w-screen-xl** | 1280px | **标准页面容器** |
238
+ | **max-w-screen-2xl** | 1536px | 宽版展示(图片墙、工厂全景) |
239
+
240
+ ### 2. Spacing Scale
241
+
242
+ | Token | Desktop | Mobile | 场景 |
243
+ | :------------- | :------ | :----- | :---------------------------- |
244
+ | **py-compact** | 48px | 32px | 紧凑模块(LogoCloud、Footer) |
245
+ | **py-normal** | 80px | 48px | **标准模块间距** |
246
+ | **py-relaxed** | 120px | 64px | Hero、大留白展示区 |
247
+
248
+ ---
249
+
250
+ ## 五、Shape & Depth(形态与深度)
251
+
252
+ ### 1. Radius (圆角)
253
+
254
+ 根据品牌调性灵活选择,严谨工业风可用小圆角,现代科技感可用大圆角。
255
+
256
+ | Token | Value | 场景 |
257
+ | :--------------- | :------ | :------------------------------ |
258
+ | **rounded-none** | 0px | 严谨工业风、传统制造业。 |
259
+ | **rounded-sm** | 2px-4px | 按钮、输入框、表格。 |
260
+ | **rounded-md** | 6px-8px | 卡片容器、弹窗。 |
261
+ | **rounded-lg** | 12px | 大卡片、Hero 图片、现代科技感。 |
262
+ | **rounded-xl** | 16px | 特色模块、品牌展示区。 |
263
+ | **rounded-full** | 9999px | 头像、标签 Badge、圆形按钮。 |
264
+
265
+ ### 2. Border Width (边框)
266
+
267
+ | Token | Value | 场景 |
268
+ | :------------- | :---- | :---------------------------- |
269
+ | **border** | 1px | 默认边框。 |
270
+ | **border-l-4** | 4px | 左侧装饰线(引用、Callout)。 |
271
+
272
+ ### 3. Z-Index (层级)
273
+
274
+ | Token | Value | 场景 |
275
+ | :------- | :---- | :---------------- |
276
+ | **z-30** | 30 | Sticky Header。 |
277
+ | **z-40** | 40 | Dropdown / Menu。 |
278
+ | **z-50** | 50 | Modal / Drawer。 |
279
+
280
+ ### 4. Shadow (阴影)
281
+
282
+ | Token | 场景 |
283
+ | :------------ | :-------------------------- |
284
+ | **shadow-sm** | 轻微浮起,输入框 focus 态。 |
285
+ | **shadow-md** | 卡片默认阴影。 |
286
+ | **shadow-lg** | Hover 浮起效果、下拉菜单。 |
287
+ | **shadow-xl** | Modal、重要弹窗。 |
288
+
289
+ ---
290
+
291
+ ## 六、Motion (动效系统)
292
+
293
+ 适度动效可提升体验,ToB 站建议**简洁克制**,避免过度花哨。
294
+
295
+ ### 1. Duration (时长)
296
+
297
+ | Token | Value | 场景 |
298
+ | :--------------- | :---- | :--------------------------- |
299
+ | **duration-150** | 150ms | 微交互(Hover、Focus)。 |
300
+ | **duration-300** | 300ms | **标准过渡**(按钮、卡片)。 |
301
+ | **duration-500** | 500ms | 模块入场、页面转场。 |
302
+ | **duration-700** | 700ms | 大型动画、Hero 区域。 |
303
+
304
+ ### 2. Easing (缓动)
305
+
306
+ | Token | Value | 场景 |
307
+ | :-------------- | :---------------------------------- | :----------------------- |
308
+ | **ease-out** | `cubic-bezier(0, 0, 0.2, 1)` | **推荐默认**,自然减速。 |
309
+ | **ease-in-out** | `cubic-bezier(0.4, 0, 0.2, 1)` | 双向动画、循环动效。 |
310
+ | **ease-spring** | `cubic-bezier(0.34, 1.56, 0.64, 1)` | 弹性效果、按钮点击反馈。 |
311
+
312
+ ### 3. Animation Presets (常用动效)
313
+
314
+ | Token | 效果 | 场景 |
315
+ | :----------------- | :---------- | :--------------------------- |
316
+ | **fade-in** | 淡入 | 模块入场、Toast 提示。 |
317
+ | **fade-up** | 淡入 + 上移 | **标准入场**,卡片、列表。 |
318
+ | **fade-down** | 淡入 + 下移 | 下拉菜单、Tooltip。 |
319
+ | **scale-in** | 缩放淡入 | Modal、弹窗、图片预览。 |
320
+ | **slide-in-right** | 右侧滑入 | Drawer、侧边栏。 |
321
+ | **pulse** | 脉冲闪烁 | 加载状态、等待提示。 |
322
+ | **bounce** | 弹跳 | CTA 按钮吸引注意力(慎用)。 |
323
+
324
+ ### 4. Scroll Animation (滚动动效 - AOS)
325
+
326
+ | Attribute | 效果 | 场景 |
327
+ | :------------------------ | :--------- | :----------------------------- |
328
+ | `data-aos="fade-up"` | 向上淡入 | **通用入场**。 |
329
+ | `data-aos="fade-in"` | 原地淡入 | 图片、背景。 |
330
+ | `data-aos="zoom-in"` | 缩放淡入 | 重点模块、Hero。 |
331
+ | `data-aos-delay="100"` | 延迟 100ms | 列表交错动画。 |
332
+ | `data-aos-duration="600"` | 时长 600ms | 自定义速度。 |
333
+ | `data-aos-once="true"` | 只播放一次 | **推荐**,避免滚动时反复触发。 |
334
+
335
+ ---
336
+
337
+ ## 七、Iconography (图标)
338
+
339
+ 使用 Lucide / Iconify。
340
+
341
+ | Token | Size | 场景 |
342
+ | :---------- | :---- | :------------------------- |
343
+ | **size-4** | 16px | 按钮内图标、面包屑分隔符。 |
344
+ | **size-5** | 20px | 导航菜单图标。 |
345
+ | **size-6** | 24px | 模块标题图标。 |
346
+ | **size-8+** | 32px+ | 特性 (Feature) 装饰图标。 |
347
+
348
+ ---
349
+
350
+ ## 七、Token 映射示例 (Tailwind Config)
351
+
352
+ ```js
353
+ // tailwind.config.js
354
+ module.exports = {
355
+ theme: {
356
+ container: {
357
+ center: true,
358
+ padding: "2rem",
359
+ screens: {
360
+ "2xl": "1400px",
361
+ },
362
+ },
363
+ extend: {
364
+ colors: {
365
+ border: "hsl(var(--border))",
366
+ input: "hsl(var(--input))",
367
+ ring: "hsl(var(--ring))",
368
+ background: "hsl(var(--background))",
369
+ foreground: "hsl(var(--foreground))",
370
+ primary: {
371
+ DEFAULT: "hsl(var(--primary))",
372
+ foreground: "hsl(var(--primary-foreground))",
373
+ },
374
+ secondary: {
375
+ DEFAULT: "hsl(var(--secondary))",
376
+ foreground: "hsl(var(--secondary-foreground))",
377
+ },
378
+ muted: {
379
+ DEFAULT: "hsl(var(--muted))",
380
+ foreground: "hsl(var(--muted-foreground))",
381
+ },
382
+ accent: {
383
+ DEFAULT: "hsl(var(--accent))",
384
+ foreground: "hsl(var(--accent-foreground))",
385
+ },
386
+ destructive: {
387
+ DEFAULT: "hsl(var(--destructive))",
388
+ foreground: "hsl(var(--destructive-foreground))",
389
+ },
390
+ // 数据可视化 (简化版)
391
+ chart: {
392
+ 1: "hsl(var(--chart-1))",
393
+ 2: "hsl(var(--chart-2))",
394
+ },
395
+ // 营销高亮
396
+ highlight: "hsl(var(--highlight))",
397
+ // 社交品牌色
398
+ social: {
399
+ whatsapp: "#25D366",
400
+ linkedin: "#0A66C2",
401
+ facebook: "#1877F2",
402
+ youtube: "#FF0000",
403
+ },
404
+ },
405
+ borderRadius: {
406
+ lg: "var(--radius)",
407
+ md: "calc(var(--radius) - 2px)",
408
+ sm: "calc(var(--radius) - 4px)",
409
+ },
410
+ transitionDuration: {
411
+ fast: "150ms",
412
+ normal: "300ms",
413
+ slow: "500ms",
414
+ },
415
+ },
416
+ },
417
+ };
418
+ ```
@@ -0,0 +1,250 @@
1
+ # 原子冻结清单(Frozen Atomic Layer)
2
+
3
+ Frozen ≠ 不扩展,而是「语义与接口永不破坏」
4
+
5
+ ## 一、冻结的总体规则(先定宪法)
6
+
7
+ 以下 4 条,比具体组件更重要:
8
+
9
+ ### 1️⃣ 冻结的是「语义 + Props 结构」
10
+ 允许内部 Tailwind / DOM 变,不允许 Props 含义变化
11
+
12
+ ### 2️⃣ 冻结的是「层级关系」
13
+ Section > Layout > Content > Action(永远不交叉)
14
+
15
+ ### 3️⃣ 冻结的是「参数空间」
16
+ 枚举值只加不改,默认值永不删除
17
+
18
+ ### 4️⃣ 冻结的是「AI 可操作边界」
19
+ AI 只能改 frozen props,新能力通过新增原子,不改旧原子
20
+
21
+ ---
22
+
23
+ ## 二、🧊 真正“永远不动”的原子(核心冻结层)
24
+
25
+ > 语义和接口永不改变,AI 只能操作内容
26
+
27
+ ### 🧱 1. Structure (结构) - 绝对冻结
28
+
29
+ **Section** ✅
30
+ ```ts
31
+ interface SectionProps {
32
+ id?: string
33
+ tone?: "light" | "dark" | "brand"
34
+ density?: "compact" | "normal" | "relaxed"
35
+ maxWidth?: "sm" | "md" | "lg" | "xl" | "full"
36
+ }
37
+ ```
38
+ *原因:页面骨架,全站升级依赖它*
39
+
40
+ **Container** ✅
41
+ ```ts
42
+ interface ContainerProps {
43
+ size?: "sm" | "md" | "lg" | "xl"
44
+ align?: "left" | "center"
45
+ }
46
+ ```
47
+ *原因:限宽核心*
48
+
49
+ ### 🧱 2. Layout (布局) - 高优先冻结
50
+
51
+ **Grid** ✅
52
+ ```ts
53
+ interface GridProps {
54
+ cols?: Responsive<number>
55
+ gap?: GapToken
56
+ align?: "start" | "center" | "end"
57
+ }
58
+ ```
59
+
60
+ **Stack** ✅
61
+ ```ts
62
+ interface StackProps {
63
+ direction?: "vertical" | "horizontal"
64
+ gap?: GapToken
65
+ align?: "start" | "center" | "end"
66
+ }
67
+ ```
68
+
69
+ **Split** ✅
70
+ ```ts
71
+ interface SplitProps {
72
+ ratio?: "1:1" | "2:1" | "3:2"
73
+ reverse?: boolean
74
+ }
75
+ ```
76
+
77
+ ### 🧱 3. Content (内容) - 语义冻结
78
+
79
+ **Heading** ✅
80
+ ```ts
81
+ interface HeadingProps {
82
+ level?: 1 | 2 | 3 | 4
83
+ emphasis?: "strong" | "normal" | "soft"
84
+ }
85
+ ```
86
+
87
+ **Text** ✅
88
+ ```ts
89
+ interface TextProps {
90
+ size?: "sm" | "md" | "lg"
91
+ tone?: "normal" | "muted"
92
+ }
93
+ ```
94
+
95
+ **Media** ✅
96
+ ```ts
97
+ interface MediaProps {
98
+ src: string
99
+ type?: "image" | "video"
100
+ ratio?: AspectRatio
101
+ }
102
+ ```
103
+
104
+ **Link** ✅
105
+ ```ts
106
+ interface LinkProps {
107
+ href: string
108
+ external?: boolean
109
+ variant?: "default" | "muted" | "nav"
110
+ }
111
+ ```
112
+
113
+ ### 🧱 4. Action (转化) - 转化冻结
114
+
115
+ **Button / CTA** ✅
116
+ ```ts
117
+ interface ButtonProps {
118
+ variant?: "primary" | "secondary" | "ghost"
119
+ size?: "sm" | "md" | "lg"
120
+ }
121
+ ```
122
+
123
+ ### 🧱 5. Semantic & Form (业务冻结)
124
+
125
+ **Feature** (卖点) ✅
126
+ ```ts
127
+ interface FeatureProps {
128
+ title: string
129
+ description: string
130
+ icon?: string
131
+ emphasis?: "normal" | "strong"
132
+ }
133
+ ```
134
+
135
+ **SpecList / Table** (参数) ✅
136
+ ```ts
137
+ interface SpecListProps { items: { label: string; value: string }[]; layout?: "list" | "grid" }
138
+ interface TableProps { columns: any[]; rows: any[]; striped?: boolean }
139
+ ```
140
+
141
+ **FAQ / Breadcrumb** (SEO) ✅
142
+ *语义稳定,对应 Schema 结构*
143
+
144
+ **Input / Select / Textarea** (询盘) ✅
145
+ *HTML 表单标准语义*
146
+
147
+ ---
148
+
149
+ ## 三、❄️ 半冻结原子(规则冻结,形态可扩)
150
+
151
+ > 不允许破坏规则,但允许新增形态 (Variant)
152
+
153
+ **Box** (装饰容器)
154
+ *规则稳定 (padding/radius),但 background 可扩*
155
+
156
+ **Prose** (富文本)
157
+ *Typography 规则稳定*
158
+
159
+ **Spacer / Align / Divider**
160
+ *空间规则稳定*
161
+
162
+ **Badge / Icon**
163
+ *基础元数据稳定,样式可扩*
164
+
165
+ **LogoCloud / Testimonial / Rating / PriceTag**
166
+ *信任组件,核心字段稳定,UI 风格可变*
167
+
168
+ ---
169
+
170
+ ## 四、🔥 明确 “永远不冻结”的原子
171
+
172
+ > 设计趋势变化快,形态多变,AI 需在受控范围操作
173
+
174
+ - **❌ Repeat** (工具组件,render 不稳定)
175
+ - **❌ Pagination** (交互多变)
176
+ - **❌ Countdown** (样式多变)
177
+ - **❌ Carousel / Tabs / Modal** (易滥用)
178
+ - **❌ Animation** (装饰层)
179
+
180
+ ### Animation 治理规则(装饰层,不冻结)
181
+
182
+ **使用方式**:直接在元素上写 `data-aos-*` 属性,无需 wrapper
183
+
184
+ ```html
185
+ <h2 data-aos="fade-up">标题</h2>
186
+ <p data-aos="fade-up" data-aos-delay="80">文案</p>
187
+ <button data-aos="fade-up" data-aos-delay="160">按钮</button>
188
+ ```
189
+
190
+ **可用字段**:
191
+ - `data-aos`:动画类型(fade-up / fade-down / fade-left / fade-right / zoom-in / slide-up 等)
192
+ - `data-aos-delay`:延迟(ms),用于 stagger 效果
193
+ - `data-aos-duration`:持续时间(ms)
194
+ - `data-aos-offset`:触发偏移(px)
195
+ - `data-aos-easing`:缓动函数
196
+ - `data-aos-once`:是否只播放一次
197
+
198
+ **治理红线**(校验器守门):
199
+ - **禁止嵌套**:父子不能同时带 `data-aos`
200
+ - **禁止首屏主 CTA**:hero 区域主按钮不加动画
201
+ - **移动端降级**:≤768px 只允许 fade 系 + duration≤300ms
202
+ - **支持全局关闭**:提供一键禁用开关
203
+
204
+ **AI 约束**:
205
+ - 只能改 `data-aos-*` 值
206
+ - 不能把 Animation 升级为 frozen 原子
207
+
208
+ 原因
209
+
210
+ - **设计趋势变化快**
211
+ - **AI 容易滥用**
212
+ - **对外贸转化非核心**
213
+
214
+ ---
215
+
216
+ ## 五、冻结层的工程落地
217
+
218
+ ### 1️⃣ 在代码里显式标记
219
+
220
+ ```ts
221
+ /**
222
+ * @frozen
223
+ * DO NOT CHANGE PROPS SEMANTICS
224
+ */
225
+ export interface SectionProps { ... }
226
+ ```
227
+
228
+ ### 2️⃣ 校验器规则(AI 守门)
229
+
230
+ - **禁止删除 frozen props**
231
+ - **禁止改 enum 含义**
232
+ - **禁止替换 frozen component**
233
+
234
+ ### 3️⃣ 版本策略
235
+
236
+ ```txt
237
+ frozenAtomsVersion: "1.x"
238
+ ```
239
+
240
+ ---
241
+
242
+ ## 六、一句话总结
243
+
244
+ 你不是在做组件库,你是在做一套“**长期稳定的设计语言内核**”。
245
+
246
+ 这份冻结清单一旦立住:
247
+ - **AI 永远不乱**
248
+ - **模板永远可升级**
249
+ - **客户永远可定制**
250
+ - **系统越用越值钱**
@@ -0,0 +1,353 @@
1
+ # 原子化物料清单
2
+
3
+ 共 25 个原子,按冻结层级分类
4
+
5
+ ---
6
+
7
+ ## 一、🧊 完全冻结(Frozen)
8
+
9
+ > 语义和接口永不改变,AI 只能操作内容,不能改结构
10
+
11
+ ### 1. 结构原子
12
+
13
+ **Section**
14
+ ```ts
15
+ interface SectionProps {
16
+ id: string
17
+ tone?: "light" | "dark" | "brand"
18
+ density?: "compact" | "normal" | "relaxed"
19
+ maxWidth?: "sm" | "md" | "lg" | "xl" | "full"
20
+ }
21
+ ```
22
+ - tone:控制背景、基础文字色
23
+ - density:上下 padding(mobile 自动降级一档)
24
+ - maxWidth:内容最大宽度(mobile 自动 full)
25
+
26
+ **Container**
27
+ ```ts
28
+ interface ContainerProps {
29
+ size?: "sm" | "md" | "lg" | "xl"
30
+ align?: "left" | "center"
31
+ }
32
+ ```
33
+
34
+ ### 2. 布局原子
35
+
36
+ **Grid**
37
+ ```ts
38
+ interface GridProps {
39
+ cols?: number | { base: number; md?: number; lg?: number }
40
+ gap?: "xs" | "sm" | "md" | "lg" | "xl"
41
+ align?: "start" | "center" | "end"
42
+ }
43
+ ```
44
+
45
+ **Stack**
46
+ ```ts
47
+ interface StackProps {
48
+ direction?: "vertical" | "horizontal"
49
+ gap?: "xs" | "sm" | "md" | "lg"
50
+ align?: "start" | "center" | "end"
51
+ }
52
+ ```
53
+ - mobile 强制 vertical
54
+
55
+ **Split**
56
+ ```ts
57
+ interface SplitProps {
58
+ ratio?: "1:1" | "2:1" | "3:2"
59
+ reverse?: boolean
60
+ }
61
+ ```
62
+ - mobile 自动 stack
63
+
64
+ ### 3. 内容原子
65
+
66
+ **Heading**
67
+ ```ts
68
+ interface HeadingProps {
69
+ level?: 1 | 2 | 3 | 4
70
+ emphasis?: "strong" | "normal" | "soft"
71
+ }
72
+ ```
73
+ - 自动响应式字号缩放
74
+ - H1 mobile 自动降级
75
+
76
+ **Text**
77
+ ```ts
78
+ interface TextProps {
79
+ size?: "sm" | "md" | "lg"
80
+ tone?: "muted" | "normal"
81
+ }
82
+ ```
83
+
84
+ **Media**
85
+ ```ts
86
+ interface MediaProps {
87
+ type?: "image" | "video"
88
+ src: string
89
+ ratio?: "1:1" | "4:3" | "16:9"
90
+ }
91
+ ```
92
+ - 自动 lazy + responsive image
93
+
94
+ **Link**
95
+ ```ts
96
+ interface LinkProps {
97
+ href: string
98
+ external?: boolean // 自动加 target="_blank" rel="noopener"
99
+ variant?: "default" | "muted" | "nav"
100
+ }
101
+ ```
102
+
103
+ ### 4. 行为原子
104
+
105
+ **Button / CTA**
106
+ ```ts
107
+ interface ButtonProps {
108
+ variant?: "primary" | "secondary" | "ghost"
109
+ size?: "sm" | "md" | "lg"
110
+ }
111
+ ```
112
+
113
+ ### 5. 语义原子(SEO 核心)
114
+
115
+ **Feature**(卖点)
116
+ ```ts
117
+ interface FeatureProps {
118
+ icon?: string
119
+ title: string
120
+ description: string
121
+ emphasis?: "normal" | "strong"
122
+ }
123
+ ```
124
+
125
+ **SpecList**(参数列表)
126
+ ```ts
127
+ interface SpecListProps {
128
+ items: { label: string; value: string }[]
129
+ layout?: "grid" | "list"
130
+ }
131
+ ```
132
+
133
+ **Table**(多列对比表)
134
+ ```ts
135
+ interface TableProps {
136
+ columns: { key: string; label: string }[]
137
+ rows: Record<string, string>[]
138
+ striped?: boolean
139
+ compact?: boolean
140
+ }
141
+ ```
142
+
143
+ **FAQ**
144
+ ```ts
145
+ interface FAQProps {
146
+ items: { question: string; answer: string }[]
147
+ defaultOpen?: number
148
+ }
149
+ ```
150
+ - SEO Schema:FAQPage
151
+
152
+ **Breadcrumb**
153
+ ```ts
154
+ interface BreadcrumbProps {
155
+ items: { label: string; href?: string }[]
156
+ }
157
+ ```
158
+ - SEO Schema:BreadcrumbList
159
+
160
+ ### 6. 表单原子(询盘核心)
161
+
162
+ **Input**
163
+ ```ts
164
+ interface InputProps {
165
+ type?: "text" | "email" | "tel" | "number"
166
+ label?: string
167
+ placeholder?: string
168
+ required?: boolean
169
+ error?: string
170
+ }
171
+ ```
172
+
173
+ **Textarea**
174
+ ```ts
175
+ interface TextareaProps {
176
+ label?: string
177
+ placeholder?: string
178
+ rows?: number
179
+ required?: boolean
180
+ }
181
+ ```
182
+
183
+ **Select**
184
+ ```ts
185
+ interface SelectProps {
186
+ options: { value: string; label: string }[]
187
+ label?: string
188
+ placeholder?: string
189
+ required?: boolean
190
+ }
191
+ ```
192
+
193
+ ---
194
+
195
+ ## 二、🧊❄️ 半冻结(Semi-Frozen)
196
+
197
+ > 规则冻结,形态可扩展(可加 variant,但不改核心接口)
198
+
199
+ **Box**
200
+ ```ts
201
+ interface BoxProps {
202
+ padding?: "none" | "sm" | "md" | "lg"
203
+ background?: "none" | "muted" | "card"
204
+ border?: boolean
205
+ radius?: "none" | "sm" | "md" | "lg"
206
+ }
207
+ ```
208
+ - 场景:Feature 卡片、Pricing 卡片、侧边栏模块
209
+
210
+ **Prose**
211
+ ```ts
212
+ interface ProseProps {
213
+ size?: "sm" | "md" | "lg"
214
+ }
215
+ ```
216
+ - 自动处理段落/标题间距、列表/引用样式
217
+ - 对应 Tailwind `prose` 类
218
+ - 场景:产品详情、博客正文、About 页面
219
+
220
+ **Spacer**
221
+ ```ts
222
+ interface SpacerProps {
223
+ size?: "xs" | "sm" | "md" | "lg"
224
+ }
225
+ ```
226
+
227
+ **Align**
228
+ ```ts
229
+ interface AlignProps {
230
+ x?: "left" | "center" | "right"
231
+ y?: "top" | "center" | "bottom"
232
+ }
233
+ ```
234
+
235
+ **Badge**
236
+ ```ts
237
+ interface BadgeProps {
238
+ tone?: "info" | "success" | "warning"
239
+ }
240
+ ```
241
+
242
+ **Icon**
243
+ ```ts
244
+ interface IconProps {
245
+ name: string // iconify 格式,如 "mdi:check"
246
+ size?: "sm" | "md" | "lg" | "xl"
247
+ color?: "current" | "muted" | "brand"
248
+ }
249
+ ```
250
+
251
+ **Divider**
252
+ ```ts
253
+ interface DividerProps {
254
+ orientation?: "horizontal" | "vertical"
255
+ spacing?: "sm" | "md" | "lg"
256
+ }
257
+ ```
258
+
259
+ **LogoCloud**
260
+ ```ts
261
+ interface LogoCloudProps {
262
+ logos: string[]
263
+ columns?: Responsive<number>
264
+ tone?: "mono" | "color"
265
+ }
266
+ ```
267
+
268
+ **Testimonial**
269
+ ```ts
270
+ interface TestimonialProps {
271
+ quote: string
272
+ author: string
273
+ role?: string
274
+ avatar?: string
275
+ }
276
+ ```
277
+
278
+ **Rating**
279
+ ```ts
280
+ interface RatingProps {
281
+ value: number // 0-5
282
+ max?: number
283
+ size?: "sm" | "md" | "lg"
284
+ showValue?: boolean
285
+ }
286
+ ```
287
+
288
+ **PriceTag**
289
+ ```ts
290
+ interface PriceTagProps {
291
+ amount: number
292
+ currency?: "USD" | "EUR" | "CNY"
293
+ original?: number // 原价(用于折扣展示)
294
+ size?: "sm" | "md" | "lg"
295
+ }
296
+ ```
297
+
298
+ ---
299
+
300
+ ## 三、🔥 不冻结(Unfrozen)
301
+
302
+ > 设计趋势变化快,形态多变,AI 需在受控范围操作
303
+
304
+ **Repeat**
305
+ ```ts
306
+ interface RepeatProps<T> {
307
+ items: T[]
308
+ columns?: number | Responsive<number>
309
+ render: (item: T) => AstroNode
310
+ }
311
+ ```
312
+ - 工具组件,render 函数形态不稳定
313
+ - 用于批量生成 Features / Logos / Testimonials
314
+
315
+ **Pagination**
316
+ ```ts
317
+ interface PaginationProps {
318
+ current: number
319
+ total: number
320
+ pageSize?: number
321
+ onChange?: (page: number) => void
322
+ }
323
+ ```
324
+ - 交互模式可能变化(无限滚动 vs 分页)
325
+
326
+ **Countdown**
327
+ ```ts
328
+ interface CountdownProps {
329
+ endTime: Date | string
330
+ format?: "d:h:m:s" | "h:m:s"
331
+ onEnd?: () => void
332
+ }
333
+ ```
334
+ - 促销场景,样式/动效多变
335
+
336
+ **Animation**(装饰层)
337
+ - 直接用 `data-aos-*` 属性
338
+ - 详见《原子冻结清单》
339
+
340
+ **Carousel / Tabs / Modal**
341
+ - 形态多变,易滥用
342
+ - 不纳入冻结层
343
+
344
+ ---
345
+
346
+ ## 四、判断公式
347
+
348
+ 新原子是否该加?满足 ≥2 条才值得:
349
+
350
+ - 在 3 个以上站点重复出现?
351
+ - AI 是否能明确理解它的语义?
352
+ - 是否能明显减少模板复杂度?
353
+ - 是否对转化 / SEO 有直接价值?
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rxdrag/website-lib",
3
- "version": "0.0.112",
3
+ "version": "0.0.114",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.ts",
@@ -26,11 +26,11 @@
26
26
  "eslint": "^7.32.0",
27
27
  "gsap": "^3.12.7",
28
28
  "typescript": "^5",
29
- "@rxdrag/eslint-config-custom": "0.2.12",
30
29
  "@rxdrag/rxcms-models": "0.3.96",
31
- "@rxdrag/slate-preview": "1.2.63",
32
30
  "@rxdrag/entify-hooks": "0.2.77",
33
- "@rxdrag/tsconfig": "0.2.0"
31
+ "@rxdrag/slate-preview": "1.2.63",
32
+ "@rxdrag/tsconfig": "0.2.0",
33
+ "@rxdrag/eslint-config-custom": "0.2.12"
34
34
  },
35
35
  "dependencies": {
36
36
  "aos": "3.0.0-beta.6",
@@ -38,7 +38,7 @@
38
38
  "react": "^19.1.0",
39
39
  "react-dom": "^19.1.0",
40
40
  "@rxdrag/rxcms-models": "0.3.96",
41
- "@rxdrag/website-lib-core": "0.0.106"
41
+ "@rxdrag/website-lib-core": "0.0.109"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "astro": "^4.0.0 || ^5.0.0"