@icen.ai/ui 0.9.0 → 0.10.0
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.
- package/AGENTS.md +138 -80
- package/README.md +66 -91
- package/dist/base.css +208 -179
- package/dist/behaviors/accordion.mjs +8 -8
- package/dist/behaviors/ai-branch.d.mts +1 -1
- package/dist/behaviors/ai-branch.mjs +1010 -94
- package/dist/behaviors/ai-chat.d.mts +7 -7
- package/dist/behaviors/ai-chat.mjs +1071 -161
- package/dist/behaviors/ai-composer.d.mts +44 -12
- package/dist/behaviors/ai-composer.mjs +1997 -524
- package/dist/behaviors/ai-core.d.mts +1 -1
- package/dist/behaviors/ai-core.mjs +1016 -107
- package/dist/behaviors/ai-diff.mjs +1019 -127
- package/dist/behaviors/ai-feedback.d.mts +1 -1
- package/dist/behaviors/ai-feedback.mjs +1035 -126
- package/dist/behaviors/ai-panel.d.mts +8 -8
- package/dist/behaviors/ai-panel.mjs +1284 -266
- package/dist/behaviors/ai-provider.mjs +1003 -101
- package/dist/behaviors/ai-threads.d.mts +1 -1
- package/dist/behaviors/ai-threads.mjs +1068 -154
- package/dist/behaviors/ai-tool.d.mts +2 -2
- package/dist/behaviors/ai-tool.mjs +2037 -396
- package/dist/behaviors/ai-tools.d.mts +89 -16
- package/dist/behaviors/ai-tools.mjs +4448 -372
- package/dist/behaviors/autocomplete.d.mts +53 -0
- package/dist/behaviors/autocomplete.mjs +1600 -0
- package/dist/behaviors/back-top.d.mts +1 -1
- package/dist/behaviors/back-top.mjs +951 -14
- package/dist/behaviors/carousel.d.mts +1 -1
- package/dist/behaviors/carousel.mjs +906 -11
- package/dist/behaviors/cascader.d.mts +48 -0
- package/dist/behaviors/cascader.mjs +1853 -0
- package/dist/behaviors/charts.d.mts +72 -8
- package/dist/behaviors/charts.mjs +1901 -256
- package/dist/behaviors/code-block.d.mts +36 -0
- package/dist/behaviors/code-block.mjs +1611 -0
- package/dist/behaviors/command-palette.d.mts +9 -6
- package/dist/behaviors/command-palette.mjs +161 -59
- package/dist/behaviors/context-menu.d.mts +9 -8
- package/dist/behaviors/context-menu.mjs +1112 -44
- package/dist/behaviors/controls.d.mts +13 -13
- package/dist/behaviors/controls.mjs +989 -130
- package/dist/behaviors/copy.d.mts +21 -2
- package/dist/behaviors/copy.mjs +1206 -42
- package/dist/behaviors/datatable.d.mts +53 -3
- package/dist/behaviors/datatable.mjs +1963 -207
- package/dist/behaviors/date-picker.d.mts +0 -1
- package/dist/behaviors/date-picker.mjs +1340 -293
- package/dist/behaviors/design.d.mts +54 -0
- package/dist/behaviors/design.mjs +109 -0
- package/dist/behaviors/dropdown.d.mts +5 -6
- package/dist/behaviors/dropdown.mjs +262 -110
- package/dist/behaviors/events.d.mts +120 -3
- package/dist/behaviors/events.mjs +47 -2
- package/dist/behaviors/feedback.d.mts +30 -0
- package/dist/behaviors/feedback.mjs +296 -0
- package/dist/behaviors/focus.d.mts +8 -0
- package/dist/behaviors/focus.mjs +24 -0
- package/dist/behaviors/form-validate.d.mts +102 -0
- package/dist/behaviors/form-validate.mjs +6091 -0
- package/dist/behaviors/i18n.d.mts +789 -0
- package/dist/behaviors/i18n.mjs +1711 -0
- package/dist/behaviors/icons.d.mts +93 -0
- package/dist/behaviors/icons.mjs +113 -0
- package/dist/behaviors/input.d.mts +9 -1
- package/dist/behaviors/input.mjs +1056 -60
- package/dist/behaviors/kb-access.d.mts +1 -1
- package/dist/behaviors/kb-access.mjs +2129 -239
- package/dist/behaviors/kb-acl.d.mts +6 -6
- package/dist/behaviors/kb-acl.mjs +1119 -179
- package/dist/behaviors/kb-answer.mjs +2070 -418
- package/dist/behaviors/kb-audit.d.mts +1 -1
- package/dist/behaviors/kb-audit.mjs +1076 -154
- package/dist/behaviors/kb-canvas.mjs +1100 -177
- package/dist/behaviors/kb-chain.mjs +1022 -100
- package/dist/behaviors/kb-checkpoint.d.mts +1 -1
- package/dist/behaviors/kb-checkpoint.mjs +1319 -169
- package/dist/behaviors/kb-chunks.mjs +1152 -213
- package/dist/behaviors/kb-citation.d.mts +1 -1
- package/dist/behaviors/kb-citation.mjs +1201 -179
- package/dist/behaviors/kb-clarify.mjs +1058 -130
- package/dist/behaviors/kb-conflict.mjs +1041 -119
- package/dist/behaviors/kb-connector.mjs +1104 -176
- package/dist/behaviors/kb-core.d.mts +6 -1
- package/dist/behaviors/kb-core.mjs +1077 -162
- package/dist/behaviors/kb-eval.mjs +1971 -144
- package/dist/behaviors/kb-explain.d.mts +1 -1
- package/dist/behaviors/kb-explain.mjs +1024 -102
- package/dist/behaviors/kb-filter.mjs +2008 -178
- package/dist/behaviors/kb-gap.d.mts +1 -1
- package/dist/behaviors/kb-gap.mjs +1043 -121
- package/dist/behaviors/kb-hittest.d.mts +1 -1
- package/dist/behaviors/kb-hittest.mjs +1093 -150
- package/dist/behaviors/kb-metadata.mjs +1052 -130
- package/dist/behaviors/kb-passage.d.mts +2 -2
- package/dist/behaviors/kb-passage.mjs +1101 -161
- package/dist/behaviors/kb-pipeline.d.mts +2 -2
- package/dist/behaviors/kb-pipeline.mjs +1082 -162
- package/dist/behaviors/kb-qa.mjs +1088 -160
- package/dist/behaviors/kb-rerank.mjs +1047 -114
- package/dist/behaviors/kb-retrieval.mjs +2063 -224
- package/dist/behaviors/kb-review.mjs +1990 -159
- package/dist/behaviors/kb-sandbox.d.mts +1 -1
- package/dist/behaviors/kb-sandbox.mjs +1026 -104
- package/dist/behaviors/kb-segment.mjs +1111 -179
- package/dist/behaviors/kb-select.d.mts +24 -0
- package/dist/behaviors/kb-select.mjs +1989 -0
- package/dist/behaviors/kb-sources.d.mts +1 -1
- package/dist/behaviors/kb-sources.mjs +1084 -170
- package/dist/behaviors/kb-sql.d.mts +1 -1
- package/dist/behaviors/kb-sql.mjs +1143 -226
- package/dist/behaviors/kb-trace.d.mts +1 -1
- package/dist/behaviors/kb-trace.mjs +1042 -128
- package/dist/behaviors/kb-visibility.mjs +1086 -158
- package/dist/behaviors/kb-who-can.mjs +1974 -137
- package/dist/behaviors/mentions.d.mts +93 -0
- package/dist/behaviors/mentions.mjs +2152 -0
- package/dist/behaviors/modal.d.mts +4 -3
- package/dist/behaviors/modal.mjs +1055 -33
- package/dist/behaviors/nav.d.mts +1 -1
- package/dist/behaviors/nav.mjs +6 -6
- package/dist/behaviors/notification.d.mts +16 -8
- package/dist/behaviors/notification.mjs +1615 -265
- package/dist/behaviors/panel.d.mts +4 -0
- package/dist/behaviors/panel.mjs +994 -0
- package/dist/behaviors/popover.d.mts +28 -5
- package/dist/behaviors/popover.mjs +225 -24
- package/dist/behaviors/select.d.mts +5 -2
- package/dist/behaviors/select.mjs +1410 -117
- package/dist/behaviors/sidebar.d.mts +1 -1
- package/dist/behaviors/sidebar.mjs +13 -13
- package/dist/behaviors/slider.d.mts +1 -1
- package/dist/behaviors/slider.mjs +9 -9
- package/dist/behaviors/split-pane.d.mts +1 -1
- package/dist/behaviors/split-pane.mjs +7 -7
- package/dist/behaviors/suggestions.d.mts +27 -0
- package/dist/behaviors/suggestions.mjs +1089 -0
- package/dist/behaviors/svg-parse.d.mts +14 -0
- package/dist/behaviors/svg-parse.mjs +37 -0
- package/dist/behaviors/tabs.d.mts +2 -2
- package/dist/behaviors/tabs.mjs +25 -25
- package/dist/behaviors/tag-input.d.mts +23 -5
- package/dist/behaviors/tag-input.mjs +1359 -104
- package/dist/behaviors/theme-switcher.d.mts +24 -0
- package/dist/behaviors/theme-switcher.mjs +1981 -0
- package/dist/behaviors/theme.d.mts +15 -8
- package/dist/behaviors/theme.mjs +390 -28
- package/dist/behaviors/toast.d.mts +24 -25
- package/dist/behaviors/toast.mjs +1266 -88
- package/dist/behaviors/tooltip.d.mts +4 -0
- package/dist/behaviors/tooltip.mjs +378 -0
- package/dist/behaviors/tree-select.d.mts +69 -0
- package/dist/behaviors/tree-select.mjs +1907 -0
- package/dist/behaviors/tree.d.mts +1 -1
- package/dist/behaviors/tree.mjs +15 -15
- package/dist/behaviors/upload.d.mts +3 -2
- package/dist/behaviors/upload.mjs +1076 -66
- package/dist/cli.mjs +5 -6
- package/dist/components/ai-chat.css +666 -573
- package/dist/components/ai-diff.css +153 -132
- package/dist/components/ai-panel.css +351 -343
- package/dist/components/ai-tool.css +393 -238
- package/dist/components/autocomplete.css +61 -0
- package/dist/components/autocomplete.mjs +3 -0
- package/dist/components/back-top.css +34 -31
- package/dist/components/badge.css +44 -41
- package/dist/components/breadcrumb.css +67 -46
- package/dist/components/btn.css +80 -74
- package/dist/components/card.css +117 -106
- package/dist/components/cascader.css +311 -0
- package/dist/components/cascader.mjs +3 -0
- package/dist/components/chart-area.css +8 -2
- package/dist/components/chart-bar.css +95 -33
- package/dist/components/chart-gauge.css +14 -11
- package/dist/components/chart-graph.css +20 -17
- package/dist/components/chart-heatmap.css +96 -90
- package/dist/components/chart-line.css +8 -3
- package/dist/components/chart-pie.css +9 -6
- package/dist/components/chart-radar.css +8 -5
- package/dist/components/chart-scatter.css +9 -6
- package/dist/components/chart-sparkline.css +5 -2
- package/dist/components/chart-stack.css +14 -11
- package/dist/components/charts.css +164 -73
- package/dist/components/code-block.css +418 -0
- package/dist/components/code-block.mjs +4 -0
- package/dist/components/command-palette.css +138 -117
- package/dist/components/content.css +257 -251
- package/dist/components/copy.css +72 -44
- package/dist/components/datatable.css +423 -181
- package/dist/components/date-picker.css +135 -104
- package/dist/components/empty.css +68 -65
- package/dist/components/feedback.css +201 -183
- package/dist/components/form-validate.css +120 -0
- package/dist/components/form-validate.mjs +3 -0
- package/dist/components/form.css +150 -127
- package/dist/components/icon.css +102 -0
- package/dist/components/icon.mjs +3 -0
- package/dist/components/input.css +159 -104
- package/dist/components/kb-agent.css +188 -173
- package/dist/components/kb-data.css +257 -253
- package/dist/components/kb-ground.css +197 -185
- package/dist/components/kb-ingest.css +334 -350
- package/dist/components/kb-ops.css +265 -259
- package/dist/components/kb-perm.css +260 -271
- package/dist/components/kb-search.css +317 -360
- package/dist/components/kb.css +120 -109
- package/dist/components/layout.css +85 -82
- package/dist/components/material-chinese.css +73 -0
- package/dist/components/material-soviet.css +76 -0
- package/dist/components/material.css +275 -0
- package/dist/components/media.css +220 -166
- package/dist/components/mentions.css +189 -0
- package/dist/components/mentions.mjs +3 -0
- package/dist/components/menu.css +113 -105
- package/dist/components/modal.css +107 -112
- package/dist/components/nav.css +118 -115
- package/dist/components/notification.css +238 -174
- package/dist/components/pagination.css +56 -53
- package/dist/components/panel.css +66 -63
- package/dist/components/panel.mjs +1 -0
- package/dist/components/pill.css +81 -71
- package/dist/components/popover.css +67 -53
- package/dist/components/scroll-area.css +113 -110
- package/dist/components/segmented.css +146 -143
- package/dist/components/select.css +206 -186
- package/dist/components/sidebar.css +137 -127
- package/dist/components/slider.css +117 -114
- package/dist/components/split-pane.css +112 -109
- package/dist/components/stat.css +112 -106
- package/dist/components/steps.css +109 -103
- package/dist/components/switch.css +138 -134
- package/dist/components/table.css +131 -107
- package/dist/components/tabs.css +114 -108
- package/dist/components/tag-input.css +48 -133
- package/dist/components/tag.css +81 -71
- package/dist/components/theme-switcher.css +105 -0
- package/dist/components/theme-switcher.mjs +3 -0
- package/dist/components/toast.css +100 -86
- package/dist/components/toolbar.css +45 -42
- package/dist/components/tooltip.css +102 -43
- package/dist/components/tooltip.mjs +1 -0
- package/dist/components/tree-select.css +416 -0
- package/dist/components/tree-select.mjs +3 -0
- package/dist/components/upload.css +135 -92
- package/dist/fonts/LICENSES/ark-pixel/OFL.txt +96 -0
- package/dist/fonts/LICENSES/cubic-11/OFL.txt +108 -0
- package/dist/fonts/LICENSES/galmuri/LICENSE.txt +93 -0
- package/dist/fonts/OFL.txt +96 -0
- package/dist/fonts/README.md +14 -0
- package/dist/fonts/fusion-pixel-12px-zh-hans.woff2 +0 -0
- package/dist/index.d.mts +28 -14
- package/dist/index.mjs +20705 -9601
- package/dist/react.d.mts +91 -0
- package/dist/react.mjs +8208 -0
- package/dist/registry.json +130 -13
- package/dist/tokens/chinese.css +44 -0
- package/dist/tokens/colors.css +365 -1222
- package/dist/tokens/design.css +109 -0
- package/dist/tokens/dtcg.json +11198 -0
- package/dist/tokens/figma.variables.json +7017 -0
- package/dist/tokens/icon-masks.css +78 -0
- package/dist/tokens/pixel.css +50 -0
- package/dist/tokens/soviet.css +44 -0
- package/dist/tokens/style-profiles.css +36 -547
- package/dist/tokens/themes.json +308 -0
- package/dist/tokens/tokens-studio.json +6728 -0
- package/dist/tokens/typography.css +21 -18
- package/dist/tokens.css +1555 -1801
- package/dist/ui.css +11975 -9831
- package/dist/vue.d.mts +344 -0
- package/dist/vue.mjs +7781 -0
- package/docs/spec/ai-input-experience.md +75 -0
- package/docs/spec/ai-native.md +238 -147
- package/docs/spec/design-philosophy.md +189 -0
- package/docs/spec/design-primitives.md +196 -0
- package/docs/spec/kb-family.md +147 -115
- package/package.json +43 -8
- package/dist/retro-effects.css +0 -255
- package/dist/tokens/retro-effects.css +0 -255
- package/docs/research/2026-10-03-ai-kb-components.md +0 -392
- package/docs/research/2026-10-03-kb-permissions.md +0 -992
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Icen 设计哲学(Design Philosophy)
|
|
2
|
+
|
|
3
|
+
> 本文件是 icen 设计系统的**美学宪法**:不只规定"值是多少",更规定"为什么"。
|
|
4
|
+
> 工程契约(类名/事件/守卫)在 `AGENTS.md`;本文件回答的是设计判断题——当两个实现都合法时,选哪个。
|
|
5
|
+
> 读者:组件作者、消费方设计师、以及要写第七套预设的人。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 0. 元原则(八条,按优先级排序)
|
|
10
|
+
|
|
11
|
+
1. **诚实呈现**:不装饰不确定,不隐藏不确定。加载有骨架、截断有省略号、权限缺失打码并给申请口——UI 永远如实反映数据与系统状态。
|
|
12
|
+
2. **单一事实源**:任何设计决策只有一个权威出处。颜色/圆角/间距/时长/字体全部 token 化;组件不写死任何设计值。
|
|
13
|
+
3. **语义先于字面**:组件消费语义 token(`--icen-token-accent`),不消费原始色值。语义层的存在让"换肤"成为改语义映射,而不是改组件。
|
|
14
|
+
4. **几何同心**:嵌套圆角共圆心(内圆角 = 外圆角 − 间距)。视觉上的"不对齐"比"没设计"更廉价。
|
|
15
|
+
5. **克制动效**:动效是语义(抬升=可及、脉冲=活动、渐隐=去权),不是装饰。所有动画 ≤320ms,`prefers-reduced-motion` 归零,触屏无 hover 漂浮。
|
|
16
|
+
6. **密度弹性**:同一组件在紧凑管理台与宽松营销页都成立。密度是连续标尺(`--icen-density-*`),不是两套断点。
|
|
17
|
+
7. **无障碍底线是设计的一部分**:AA 对比度是硬约束(accent 明度三档由此而来)、焦点环永可见、状态不只靠颜色传达(图标/文字/形状冗余编码)。
|
|
18
|
+
8. **明暗同构**:dark 不是反色,是同一空间换了灯光。同一组件在两态下结构、节奏、层级完全一致,只有"光照"变化。
|
|
19
|
+
|
|
20
|
+
正交轴:**主题配色 × 原语 × 明暗 × 密度** 四个轴自由组合,任何一轴的切换不应破坏其它轴的决策。现代同时是默认原语与默认主题的名字;另有中式、苏式、像素三套原语。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 1. 色彩
|
|
25
|
+
|
|
26
|
+
### 1.1 语义纪律
|
|
27
|
+
- 语义色只有五个:success 绿 / warning 黄 / error 红 / info 蓝 / accent 品牌色。语义色不表达装饰,只表达含义;装饰用中性层(fill-1/2、line-soft)。
|
|
28
|
+
- 中性阶梯是界面骨架:`bg → bg-soft → surface → surface-strong`(明度递进),`text → text-muted → text-faint`(注意力递减),`line-soft → line → line-strong`(分隔强度递进)。三级皆有意图:soft 是"分区"、line 是"边界"、strong 是"结构"。
|
|
29
|
+
- 派生色一律 `color-mix()` 从 token 现场推导(`accent-subtle = accent 14%`),不写死第二个色值——单一事实源在色彩上的体现。
|
|
30
|
+
|
|
31
|
+
### 1.2 accent 明度三档
|
|
32
|
+
| 档 | 角色 | 用于 |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `accent` 亮档 | 品牌色 | 图标、边框、数据可视化等纯图形面 |
|
|
35
|
+
| `accent-strong` | 承文本填充 | 实心按钮/选中态等「accent 底 + on-accent 字」的面(AA 硬达标) |
|
|
36
|
+
| `accent-text` | 浅底文字 | 链接、弱强调文本 |
|
|
37
|
+
|
|
38
|
+
`--icen-token-on-accent` 是填充上的文字色:浅色模式多为白字深底;深色模式翻转为亮底深字(Material You 夜间惯例)。**承文本填充面禁止消费 accent 亮档**(守卫红线的设计理由:2.96:1 的品牌脸事故)。
|
|
39
|
+
|
|
40
|
+
### 1.3 业界参照
|
|
41
|
+
GitHub Primer 的语义色纪律、Radix Colors 的阶梯尺、Stripe 的"深档承文本"按钮。六套主题共享同一语义骨架;主题改变配色,原语决定几何、材质、排版与动效。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 2. 几何(圆角与线)
|
|
46
|
+
|
|
47
|
+
### 2.1 圆角六档职责
|
|
48
|
+
| 档 | 现代默认值(随 design-radius 联动) | 职责 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `xs` | 4px | 微型件内角:芯片、徽标、小标签 |
|
|
51
|
+
| `sm` | 8px | 控件内嵌:按钮、输入框、小卡 |
|
|
52
|
+
| `md` | 10px | 默认容器:卡片、面板、浮层 |
|
|
53
|
+
| `lg` | 16px | 大容器:modal、工作台卡 |
|
|
54
|
+
| `xl` | 24px | 页面级容器/展示面 |
|
|
55
|
+
| `full` | 999px | **胶囊语义专用**(跑道形) |
|
|
56
|
+
|
|
57
|
+
### 2.2 同心圆法则(Concentric Corners,取法 Apple HIG)
|
|
58
|
+
嵌套圆角必须共圆心:**`R_inner = R_outer − gap`**(gap = 两层间距/padding)。
|
|
59
|
+
|
|
60
|
+
```css
|
|
61
|
+
.card { border-radius: var(--icen-radius-lg); padding: 12px; }
|
|
62
|
+
.card .thumb { border-radius: calc(var(--icen-radius-lg) - 12px); } /* 同心 */
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- 同心结果小于 0 时内层**直角**(0),不要出现 1–3px 的"近似圆角差"——那是视觉噪声。
|
|
66
|
+
- `calc()` 不保档位时允许,但外层必须 token。
|
|
67
|
+
- 守卫强制:禁裸 999px、禁撞档裸值(6/8/10/12/16)、微构件裸值须登记。
|
|
68
|
+
|
|
69
|
+
### 2.3 胶囊与正圆的区分
|
|
70
|
+
- `full`(999px 跑道形)只给**胶囊语义件**:pill / badge / chip / switch 轨道与拇指 / 进度与 slider 轨道 / 分段控件。胶囊的水平拉伸语义是"可延展的容器"。
|
|
71
|
+
- `50%` 只给**几何正圆**:avatar、状态点、图标底。正圆的语义是"点",不是"容器"。
|
|
72
|
+
- **容器永不用 full**:跑道形卡片是业余信号。modal/popover/panel/card 走 xs–xl 档。
|
|
73
|
+
|
|
74
|
+
### 2.4 线的角色
|
|
75
|
+
线(hairline)优先于阴影:能用 1px `line-soft` 分区就不用投影分隔。阴影只表达"海拔"(浮起),不表达"边界"。`dashed` 线表达"待定/可投放"(拖放区、占位)。
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 3. 深度与海拔
|
|
80
|
+
|
|
81
|
+
四层模型(从低到高):`canvas(页面底)→ panel/sidebar(分区)→ card/control(内容件)→ overlay(浮层)`。
|
|
82
|
+
|
|
83
|
+
- 每个海拔有对应的 surface 色 + 阴影档(`shadow-card → shadow-elevated → shadow-overlay`)+ 可选 glow。
|
|
84
|
+
- **dark 模式减影加光**:深色下阴影不可见,海拔靠 surface 明度阶梯 + glow(accent-glow 微光)表达。直接复用浅色阴影是 dark 模式最常见的败笔。
|
|
85
|
+
- 浮层才投影。页面内静态件只用线与 surface 差分层。
|
|
86
|
+
- 参照:Fluent 的 elevation 分层、Material 3 的 tonal elevation(我们不用 tint 叠层,用明度阶梯+glow)、Linear 的克制。
|
|
87
|
+
|
|
88
|
+
## 4. 动效
|
|
89
|
+
|
|
90
|
+
- 三档时长:`tx-fast`(≈120–160ms,微反馈:hover/按压)、`tx-normal`(≈200–240ms,状态切换:展开/切换)、`tx-slow`(≤320ms,入场/大位移)。UI 反馈永不超 320ms——超过即动画,不是反馈。
|
|
91
|
+
- 缓动选型:进场 `ease-out`(快入慢停,回应感)、退场略快于进场、循环脉冲用 `ease-in-out`。
|
|
92
|
+
- 语义映射:`translateY(-N)` 抬升 = 可交互/可及;`pulse` 脉冲 = 进行中活动;`fade` = 出现/消失;`pop-in` = 新内容到达。
|
|
93
|
+
- 红线:`prefers-reduced-motion` 下全部压 0ms;`pointer: coarse` 下关 hover 抬升;`forced-colors` 保留焦点环。
|
|
94
|
+
- 参照:Material 的 emphasized easing、Apple 的弹簧哲学(CSS 里以 ease-out 近拟)、业界动效疲劳的教训(Stripe/Linear 的动效时长都极短)。
|
|
95
|
+
|
|
96
|
+
## 5. 字体排印
|
|
97
|
+
|
|
98
|
+
- 三族分工:`--icen-font-body`(界面与 prose)/ `--icen-font-mono`(代码、标识、需要等宽的数字)/ `--icen-font-heading`(标题)。现代的 body 与 heading 默认使用系统无衬线;像素原语决定自己的排版。数值对齐优先使用 tabular-nums,无需把所有界面文字改为等宽。
|
|
99
|
+
- **CJK 纪律**:小字号中文不走宋体/通用 monospace 回退(糊);中文正文 ≥12px;数据用 tabular-nums。
|
|
100
|
+
- 字号/行高由 density token 出(`--icen-density-font-size-*`),组件不写死字号。
|
|
101
|
+
- 行长纪律:prose 60–75 字符;表单标签与控件同行(水平表单)或顶置(纵向表单)二选一不混用。
|
|
102
|
+
- 参照:IBM Plex 的"工程感人文"、Apple SF 的中性、iA 的行长研究。
|
|
103
|
+
|
|
104
|
+
## 6. 密度
|
|
105
|
+
|
|
106
|
+
- 密度是连续标尺不是断点:`--icen-density-space-*` / `--icen-density-font-size-*` / `--icen-density-input-height-*` 三族联动。
|
|
107
|
+
- 档位语义:`compact`(管理台/数据密集型)/ `normal`(默认)/ AI 族另有 `summary`(压淡次要信息,纯 CSS 实现)。
|
|
108
|
+
- compact 是"信息密度",不是"缩小"——触控底线 40px 在任何档都不破(触屏守卫)。
|
|
109
|
+
- 参照:Carbon 的 density 系统、Salesforce 的 compact 变体。
|
|
110
|
+
|
|
111
|
+
## 7. 图标
|
|
112
|
+
|
|
113
|
+
- 线性图标族:`viewBox="0 0 24 24"`、stroke currentColor、stroke-width 2(通用)/ 1.5(kb 族细线)、圆头线帽。
|
|
114
|
+
- **尺寸契约**:图标 svg 必须自带 `width/height` 属性或有 CSS 类尺寸约束——无尺寸 svg 在 CSS 失效时会失控(默认 300×150)。这是血泪条款。
|
|
115
|
+
- `xmlns` 必备(DOMParser XML 严格解析的空命名空间陷阱——svg-parse 单点已兜底,作者仍应写全)。
|
|
116
|
+
- 图标不携带文字意义(旁边必有文本或 aria-label);状态图标用语义色。
|
|
117
|
+
|
|
118
|
+
## 8. 材质与预设哲学(六套预设的人格)
|
|
119
|
+
|
|
120
|
+
| 预设 | 材质隐喻 | 气质 | 关键决策 |
|
|
121
|
+
|---|---|---|---|
|
|
122
|
+
| **modern** 现代 | 瓷面 × 柔光 | 清透、精确、安静 | 中性瓷白、冷蓝动作、冷调石墨夜间;独立校准 |
|
|
123
|
+
| **dongyun** 东韵 | 绢本 × 青瓷 × 沉墨 | 温润、疏朗、克制 | 宣纸暖白与低饱和青瓷,细边界和轻微纸面层次 |
|
|
124
|
+
| **jugou** 巨构 | 混凝土 × 搪瓷 × 氧化铁 | 坚实、纪念性、结构感 | 石灰白与炭黑承重,深朱红只标记关键动作 |
|
|
125
|
+
| **piano** 钢琴 | 象牙琴键 × 乌木 × 大漆 | 精致、对比、仪式感 | 高对比黑白骨架、金棕点缀(金底乌木字是 AA 设计)、漆面冷反光 glow |
|
|
126
|
+
| **monet** 莫奈 | 睡莲 × 水面柔光 | 静谧、通透、含蓄 | 蓝绿水面的柔光层叠,紫调只作含蓄点缀;取自莫奈《睡莲》 |
|
|
127
|
+
| **vangogh** 梵高 | 麦田 × 星空 × 杏花 | 浓烈、厚涂、浪漫 | 高饱和黄蓝对撞;粉底深字(杏花气质)——亮色承深字而非白字 |
|
|
128
|
+
|
|
129
|
+
每套预设都必须是**完整 token 面**(12 base + glow + derived + semantic + fill + shadow + outline + depth + scrollbar),不是改六个色——换预设 = 换材质,不是换滤镜。新增预设的完整清单见 `colors.css` 头注释与本文件 §11。
|
|
130
|
+
|
|
131
|
+
## 9. 原语(与配色主题独立)
|
|
132
|
+
|
|
133
|
+
- **现代 modern**(默认):连续几何、系统排版、轻盈材料、双层柔影。
|
|
134
|
+
- **中式 chinese**:低曲率轮廓、宋体展示字、舒展行距、纤细边线与浅淡纸面投影;小字号和密集信息仍用无衬线。
|
|
135
|
+
- **苏式 soviet**:方正体块、凝练展示字、清楚结构线、定向投影与短促反馈;力量来自比例而非装饰符号。
|
|
136
|
+
- **像素 pixel**:整数网格、中英文点阵、实色材料、直角与阶梯投影、机械按压。
|
|
137
|
+
- 现代同时是一套独立的瓷白+冷蓝主题。六个主题均可与四套原语组合。
|
|
138
|
+
- 最新架构、种子与配方以 `design-primitives.md` 为准。
|
|
139
|
+
|
|
140
|
+
## 10. 业界对标矩阵(我们取法谁,以及不抄什么)
|
|
141
|
+
|
|
142
|
+
| 维度 | 取法 | 不抄 |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| 圆角同心 | Apple HIG concentric corners | iOS 超大圆角泛滥(圆角过敏) |
|
|
145
|
+
| 语义色 | GitHub Primer | Material 的 60+ 语义角色(学习成本爆炸) |
|
|
146
|
+
| 明度阶梯 | Radix Colors 12 步 | 不强制 12 步——三级有意图的阶梯够用 |
|
|
147
|
+
| 海拔分层 | Fluent / Material tonal | Material 3 的 tonal overlay tint(污染品牌色) |
|
|
148
|
+
| 动效 | Material emphasized + Linear 克制 | 弹簧物理库的过度弹性(UI 不是玩具) |
|
|
149
|
+
| 密度 | Carbon / Salesforce | Salesforce 的三档断点跳跃(我们要连续标尺) |
|
|
150
|
+
| 暗色 | Apple Dark Mode 重打光 | 简单反相/降亮度 |
|
|
151
|
+
| 主题架构 | Radix Themes / shadcn token 面 | CSS-in-JS 运行时主题(性能与闪烁) |
|
|
152
|
+
| 无障碍 | Shopify Polaris 的"内建而非选配" | 事后补钉式 a11y |
|
|
153
|
+
|
|
154
|
+
## 11. 统一覆盖架构(消费方怎么改我们)
|
|
155
|
+
|
|
156
|
+
三层覆盖面,从轻到重:
|
|
157
|
+
|
|
158
|
+
**① 旋钮面(改几个变量)**——90% 定制只需动少数旋钮:
|
|
159
|
+
|
|
160
|
+
```css
|
|
161
|
+
/* 你的样式表(无层,恒赢库的三层 @layer) */
|
|
162
|
+
:root {
|
|
163
|
+
--icen-token-accent: #5b6ee1; /* 品牌色换档(strong/text 建议同步) */
|
|
164
|
+
--icen-token-accent-strong: #4353c8;
|
|
165
|
+
--icen-token-accent-text: #3a49b8;
|
|
166
|
+
--icen-radius-md: 6px; /* 全局圆角基准降一档 */
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
高频旋钮清单:`accent 三档` / `radius 六档` / `--icen-density-*` 三族 / 字体三族 / `tx-*` 动效三档 / `--icen-token-text-muted|faint`。文档站「定制」页的主题工作台可在线调这些旋钮并生成这段 CSS。
|
|
171
|
+
|
|
172
|
+
**② 预设作者面(写新一套)**:在 `themes.json` 新增完整明暗色板与材料参数,运行 `bun run colors`;运行时、站点与导出自动同步。要求:明暗双面完整、accent 三档实测 AA、语义五色齐备、depth 阶梯完整。
|
|
173
|
+
|
|
174
|
+
**③ 正交组合面**:`<html data-icen-preset="dongyun" data-icen-theme="dark" data-icen-style="chinese">` + 容器级 `data-icen-density="compact"`——四轴自由组合。
|
|
175
|
+
|
|
176
|
+
兜底纪律:`@layer icen.tokens/base/components` 保证消费方无层样式恒赢;Tokens Studio / Figma Variables 导出(`bun run design-tokens`)让设计稿与代码同值。
|
|
177
|
+
|
|
178
|
+
## 12. 红线(违反 = 守卫/评审必打回)
|
|
179
|
+
|
|
180
|
+
1. 组件写死颜色/圆角/间距/字号/时长(绕过 token)。
|
|
181
|
+
2. 承文本填充面消费 `accent` 亮档(必须 `accent-strong`)。
|
|
182
|
+
3. 容器用 `full` 跑道形圆角;正圆用 999px(应 50%)或反之。
|
|
183
|
+
4. 嵌套圆角不共圆心且无豁免注释。
|
|
184
|
+
5. 动效超 320ms / 无 reduced-motion 归零 / 触屏 hover 漂浮。
|
|
185
|
+
6. 图标 svg 无尺寸契约、缺 xmlns。
|
|
186
|
+
7. dark 模式直接复用浅色阴影(不打光改明度阶梯)。
|
|
187
|
+
8. 语义五色之外发明第六种"语义色"。
|
|
188
|
+
9. 状态只靠颜色传达(无图标/文字/形状冗余)。
|
|
189
|
+
10. 截断不声明(裸 nowrap 无省略号是文本 bleed 事故的同义词)。
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# 设计原语与「现代」
|
|
2
|
+
|
|
3
|
+
现代(modern)是 ICEN UI 的第一套完整设计方案。它把材料、字体、几何、密度、光影与反馈组织成同一套规则:内容安静,操作轻盈。它不宣称在主观审美上胜过某个平台;验收对象是可读性、层次、定制成本与真实交互品质。
|
|
4
|
+
|
|
5
|
+
## 启用
|
|
6
|
+
|
|
7
|
+
```css
|
|
8
|
+
@import '@icen.ai/ui/tokens.css';
|
|
9
|
+
@import '@icen.ai/ui/base.css';
|
|
10
|
+
@import '@icen.ai/ui/components/btn.css';
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<html lang="zh-CN" data-icen-preset="modern">
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
明暗继续使用 `data-icen-theme="dark"`;去掉这个属性就是亮色。支持 SSR,把属性在首屏直接写入 HTML 即可,无需客户端初始化。若产品跟随系统,在自己的首屏主题脚本中解析系统偏好。`data-icen-preset` 必须挂在 html,body portal 的菜单与弹窗才能继承同样的原语。
|
|
18
|
+
|
|
19
|
+
主题与原语是独立轴:`data-icen-preset` 选择配色主题,`data-icen-style` 选择原语。现代同时是默认主题和默认原语;另有中式、苏式、像素三套原语。共六套主题:现代、东韵、巨构、钢琴、莫奈、梵高;modern 为默认原语。
|
|
20
|
+
|
|
21
|
+
## 四层结构
|
|
22
|
+
|
|
23
|
+
1. **作者种子** `--icen-design-*`:品牌色、表面、文字、几何、节奏、字体、材料参数。
|
|
24
|
+
2. **语义映射**:推导已有 `--icen-token-* / --icen-radius-* / --icen-density-*`,让现有组件受益。
|
|
25
|
+
3. **材料角色**:content / chrome / floating,共享边缘、模糊和阴影配方。
|
|
26
|
+
4. **组件适配**:按钮、输入、分段选择、菜单、弹窗等,处理仅靠变量无法表达的细节。
|
|
27
|
+
|
|
28
|
+
现代主题为中性瓷白+冷蓝,独立校准,不继承其它主题的配色。
|
|
29
|
+
|
|
30
|
+
代码真相:`src/tokens/themes.json` 是全部主题的明暗配色与材料参数,`colors.css` 是生成的语义映射;`src/tokens/design.css` 是原语的几何与光影配方;`src/components/material.css` 是材料与组件规则;`src/behaviors/design.ts` 是可选的品牌编译 API。材料规则随 tokens.css 进入 icen.components layer,单组件按需引入同样成立,不要求导入全量 ui.css。不写属性时也默认使用现代。
|
|
31
|
+
|
|
32
|
+
## 材料
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<article data-icen-material="content">正文、表格、表单</article>
|
|
36
|
+
<nav data-icen-material="chrome">导航和工具栏</nav>
|
|
37
|
+
<aside data-icen-material="floating">临时操作</aside>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| 角色 | 背景 | 光与影 | 用途 |
|
|
41
|
+
| --- | --- | --- | --- |
|
|
42
|
+
| content | 不透明 | 轻边界,不投影 | 阅读与编辑 |
|
|
43
|
+
| chrome | 条件启用透光 | 顶部微光 | 导航与操作 |
|
|
44
|
+
| floating | 条件启用透光 | 接触影+环境影+顶部微光 | 临时面板 |
|
|
45
|
+
|
|
46
|
+
布局、定位和内边距归业务页面。材料不携带固定宽高,不强行让所有内容成为卡片。`data-icen-material` 的通用外轮廓使用 lg 圆角;需要贴边的站栏可由布局覆盖。
|
|
47
|
+
|
|
48
|
+
透明度只在支持 backdrop-filter 的浏览器中启用,否则自动使用不透明表面。`prefers-reduced-transparency: reduce` 与 `<html data-icen-transparency="reduced">` 都强制不透明。透明表面的实际对比度依赖背后内容,仍需实屏验证。
|
|
49
|
+
|
|
50
|
+
## 修改与新增品牌
|
|
51
|
+
|
|
52
|
+
简单微调只写 CSS,消费方无 layer 的样式优先于库:
|
|
53
|
+
|
|
54
|
+
```css
|
|
55
|
+
:root[data-icen-preset="modern"] {
|
|
56
|
+
--icen-design-radius: 12px;
|
|
57
|
+
--icen-design-glass-blur: 16px;
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
任何合法的新名字都可以复用配方。它默认继承现代种子;独立品牌建议提供完整明暗文字与表面色,并按需求替换语义色。
|
|
62
|
+
|
|
63
|
+
```css
|
|
64
|
+
:root[data-icen-preset="my-brand"] {
|
|
65
|
+
--icen-design-accent: #244f87;
|
|
66
|
+
--icen-design-accent-strong: #244f87;
|
|
67
|
+
--icen-design-accent-text: #244f87;
|
|
68
|
+
--icen-design-on-accent: #ffffff;
|
|
69
|
+
--icen-design-radius: 12px;
|
|
70
|
+
}
|
|
71
|
+
:root[data-icen-preset="my-brand"][data-icen-theme="dark"] {
|
|
72
|
+
--icen-design-accent: #aac9f1;
|
|
73
|
+
--icen-design-accent-strong: #aac9f1;
|
|
74
|
+
--icen-design-accent-text: #aac9f1;
|
|
75
|
+
--icen-design-on-accent: #18283f;
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
更完整的品牌可以用可选 API 编译 CSS,适用于构建时、SSR 或浏览器。它要求两套明暗基础色,验证正文/辅助文字/链接在 canvas 与 surface 上、按钮标签在 accent 上都至少达到 4.5:1。颜色接受不透明的六位 hex,避免无法确定合成背景的对比度估计。
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { createDesign, mountDesign, setDesign } from '@icen.ai/ui/behaviors/design';
|
|
83
|
+
|
|
84
|
+
const brand = createDesign({
|
|
85
|
+
name: 'my-brand', radius: 12, space: 4, controlHeight: 40,
|
|
86
|
+
fontSize: 14, glassOpacity: 86, glassBlur: 18,
|
|
87
|
+
light: {
|
|
88
|
+
canvas: '#f5f6f8', surface: '#ffffff',
|
|
89
|
+
ink: '#202124', muted: '#616671',
|
|
90
|
+
accent: '#244f87', onAccent: '#ffffff',
|
|
91
|
+
},
|
|
92
|
+
dark: {
|
|
93
|
+
canvas: '#15171b', surface: '#25282e',
|
|
94
|
+
ink: '#f2f4f7', muted: '#aeb5c2',
|
|
95
|
+
accent: '#aac9f1', onAccent: '#18283f',
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
// 构建时:把 brand.cssText 写入自己的品牌样式表。
|
|
100
|
+
// 浏览器:也可动态挂载,支持可选 CSP nonce;卸载函数只移除这份样式。
|
|
101
|
+
const unmount = mountDesign(brand);
|
|
102
|
+
setDesign(brand.name);
|
|
103
|
+
// 恢复现代主题:setDesign(null); unmount();
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`createDesign` 不自动改写作者颜色;对比度不够时抛错。工作室里的颜色选择器会演示按明暗分别调节色调的做法,导出的是处理后的真实配方。`mountDesign` 的参数应来自可信作者代码;它不是用于渲染任意终端用户 CSS 的安全沙箱。CSP 不允许内联样式时使用静态 CSS;需要内联时可传 `mountDesign(brand, nonce)`。
|
|
107
|
+
|
|
108
|
+
## 作者旋钮
|
|
109
|
+
|
|
110
|
+
| 名称(均以 --icen-design- 开头) | 现代亮 / 暗默认 | 意义 |
|
|
111
|
+
| --- | --- | --- |
|
|
112
|
+
| canvas / surface | #f5f6f8 / #fff;#15171b / #25282e | 页面与内容面 |
|
|
113
|
+
| ink / muted | #202124 / #616671;#f2f4f7 / #aeb5c2 | 正文与辅助字 |
|
|
114
|
+
| accent / on-accent | #0062cc / #fff;#89b9ff / #10223c | 动作与按钮文字 |
|
|
115
|
+
| success / warning / error / info | 明暗各有独立值,见源码 | 语义色 |
|
|
116
|
+
| radius | 10px | 六档轮廓的共同起点 |
|
|
117
|
+
| space | 4px | 布局节奏单位 |
|
|
118
|
+
| control-height | 40px | 标准操作高度 |
|
|
119
|
+
| font-size / font | 14px / 系统无衬线 | 界面阅读基准 |
|
|
120
|
+
| glass-opacity / glass-blur | 82% / 20px;88% / 20px | 操作层材料 |
|
|
121
|
+
| shadow-color / shadow-strength | 中性灰 11%;黑 28% | 接触影与环境影 |
|
|
122
|
+
| light / highlight-strength | 白 70%;白 9% | 表面边缘光 |
|
|
123
|
+
| edge-strength | 12% / 14% | 材料边界 |
|
|
124
|
+
| motion | 1 | 动效比例,0 为静止 |
|
|
125
|
+
|
|
126
|
+
CSS 作者可以直接覆盖全部种子;类型 API 暴露常用旋钮,并对数值范围进行检查。需要新材料配方时,用自有 data 属性消费既有语义 token,或扩展材料文件中的角色;无需复制每个组件。
|
|
127
|
+
|
|
128
|
+
## 现代的具体判断
|
|
129
|
+
|
|
130
|
+
- **文字**:界面系统无衬线;代码单独等宽;数据才使用 tabular-nums。取消全局 Numeric Math 混排。正文阅读可在业务排版中提高到 16px。
|
|
131
|
+
- **几何**:xs/sm/md/lg/xl 从共同控件半径推导;贴合内外轮廓同心,独立控件保留自身半径。分段选择内角扣掉外壳 padding 与边框。
|
|
132
|
+
- **密度**:normal / compact / comfortable 改变间距和控件高度,不缩小文字;嵌套密度可恢复 normal。触摸环境控件至少 44px。
|
|
133
|
+
- **反馈**:hover 以中性变化为主,主要动作用品牌色;键盘焦点始终明确。按压轻缩放,减少位置漂移。
|
|
134
|
+
- **选择**:分段选择使用中性表面和接触影,不把每次选择都变成品牌强调。
|
|
135
|
+
- **光照**:暗色保留遮挡阴影,降低高光并重新设置边缘,避免照搬亮色投影。
|
|
136
|
+
- **降级**:不支持 backdrop-filter、减少透明、减少动效、高对比度模式都有明确路径。
|
|
137
|
+
|
|
138
|
+
## 验收与边界
|
|
139
|
+
|
|
140
|
+
工作室 `/modern/` 使用库的真实 CSS 与行为,不是图片。三个场景覆盖资料保存、开关、资料搜索、新建笔记、菜单 portal、弹窗和本地对话反馈;不连接真实账户或 AI 服务。配方编译 API、DOM 生命周期与浏览器用例见 `tests/{unit,dom}/design.test.ts` 和 `tests/e2e/design.pw.ts`。
|
|
141
|
+
|
|
142
|
+
框架、用户字体和背后内容可能改变最终阅读效果;品牌作者仍应在目标系统与复杂背景中检查。任何“极其优雅”或“胜过 Apple”的判断都需要人的实际使用评审,本实现不以测试通过冒充审美结论。
|
|
143
|
+
|
|
144
|
+
## 像素原语
|
|
145
|
+
|
|
146
|
+
`<html data-icen-preset="modern" data-icen-style="pixel">`。顶部原语菜单可独立切换现代/中式/苏式/像素。
|
|
147
|
+
|
|
148
|
+
像素采用 4px 网格、12px 原生中英文点阵、24/36/48px 标题、直角、2px 轮廓、2/4/8px 阶梯投影、机械按压和局部排线。内容与浮层都不透明,所有颜色继承当前主题;不附加 CRT 扫描线或闪烁。代码见 `src/tokens/pixel.css`,适配见 material.css。Fusion Pixel Font 按 OFL 1.1 本地分发,版本、校验和与上游许可证见 `src/fonts/README.md`。
|
|
149
|
+
|
|
150
|
+
运行时使用 `setPrimitive("pixel")`;自建原语先 `registerPrimitive("brand-shape")`,再用 `[data-icen-style="brand-shape"]` 覆盖几何、字体、光影参数。主题仍单独由 setTheme({preset:...}) 选择。
|
|
151
|
+
|
|
152
|
+
Apple 研究参考:[Materials](https://developer.apple.com/design/human-interface-guidelines/materials)、[Meet Liquid Glass](https://developer.apple.com/videos/play/wwdc2025/219/)。现代实现以内容/操作分层、同心几何、文字可读性为准则;Web 材料不是系统 Liquid Glass 的光学模拟。
|
|
153
|
+
|
|
154
|
+
## 中式与苏式原语
|
|
155
|
+
|
|
156
|
+
**中式 chinese** 从宋式器物的比例与书卷的疏朗出发:纤细边界、低曲率轮廓、宋体标题、舒展行距和浅淡投影。表单正文保留清楚的界面字体;标题负责书写气息,操作保持安静而明确。推荐与宣纸、青瓷、朱砂组成的「东韵 dongyun」主题搭配。
|
|
157
|
+
|
|
158
|
+
**苏式 soviet** 从构成主义与纪念建筑的结构出发:方正轮廓、有分量的字重、清楚的分区和定向投影;主次通过比例与结构线建立。推荐与石灰岩、炭黑、氧化红组成的「巨构 jugou」主题搭配。
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
setTheme({ preset: 'dongyun' });
|
|
162
|
+
setPrimitive('chinese');
|
|
163
|
+
// 两轴分别控制;保留东韵配色也可以切换苏式几何。
|
|
164
|
+
setPrimitive('soviet');
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
两套原语的几何与排版分别位于 `src/tokens/chinese.css`、`src/tokens/soviet.css`,组件适配位于 `src/components/material-chinese.css`、`src/components/material-soviet.css`。与现代、像素相同,随 tokens.css 分发;切换不会强制修改当前配色与明暗,首屏恢复、跨页面与跨标签页使用同一持久化状态。
|
|
168
|
+
|
|
169
|
+
## 六套主题的校准
|
|
170
|
+
|
|
171
|
+
| 主题 | 日间 | 夜间 | 材料取向 |
|
|
172
|
+
| --- | --- | --- | --- |
|
|
173
|
+
| 现代 | 瓷白、清晰冷蓝 | 冷调石墨、浅蓝动作 | 清透、柔光,弱化边框 |
|
|
174
|
+
| 东韵 | 宣纸、青瓷与朱砂 | 深墨、温润玉色 | 纸与瓷的细腻层次,疏朗而克制 |
|
|
175
|
+
| 巨构 | 石灰岩、炭黑与氧化红 | 深炭、暖石与朱红 | 厚重实色,清楚的结构层次 |
|
|
176
|
+
| 钢琴 | 象牙白、乌木字、克制金棕 | 黑漆、香槟金 | 清晰边缘与细薄反光 |
|
|
177
|
+
| 莫奈 | 青灰水面、睡莲绿 | 深潭蓝绿、微光紫意 | 低反光、柔光,紫调含蓄 |
|
|
178
|
+
| 梵高 | 麦色画布、钴蓝动作 | 深蓝、星光金 | 保留暖冷对照,控制大面积饱和度 |
|
|
179
|
+
|
|
180
|
+
每套显式配置 bg / surface / raised 三层,正文/辅助/次要文字、文字强调和四类语义色在三层均验证 4.5:1;按钮另验 accentStrong × onAccent。图形强调、按钮填充、文字强调分别配置,使用原语或更换主题不会混淆其职责。
|
|
181
|
+
|
|
182
|
+
原始目录可通过 `@icen.ai/ui/tokens/themes.json` 读取。编辑本仓库主题先改目录,再运行 `bun run colors`;CSS 构建和 DTCG 导出也会确保生成文件新鲜。自定义品牌 API 会自动补齐强调色三个角色,手写 CSS 时应明确同时配置这三档。
|
|
183
|
+
|
|
184
|
+
## 操作符号与显隐节奏
|
|
185
|
+
|
|
186
|
+
界面图标采用同一套原创 SVG 光学网格。DOM、SSR 和 CSS mask 读取同一份路径,避免图标字体受平台字形、基线和字重影响。共享入口:
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
import { createIcon, iconHTML } from '@icen.ai/ui/kit/icon';
|
|
190
|
+
button.append(createIcon('close')); // button 自己提供 aria-label
|
|
191
|
+
const html = iconHTML('check', { size: 16, label: '已完成' });
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
次要操作占用稳定的命中槽位,通过 opacity 和轻微缩放出现;不会推开内容。键盘 focus-within 与 hover 等价,触屏没有 hover 时持续可见。主要入口与关键状态持续可见。多动作控件分别保留展开和清除槽位,不能通过重复末端 padding 把图标挤入文字区。级联面板按列扩展并限制在视口内,内部滚动不得带动文档。
|
|
195
|
+
|
|
196
|
+
图形保持克制、可辨认和对齐;参考 [Apple 的按钮设计指引](https://developer.apple.com/design/human-interface-guidelines/buttons) 中关于跨尺寸一致性的原则。具体 SVG 路径是本库自己的绘制,不依赖平台字体。
|