openyida 2026.7.7 → 2026.7.8
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/README.md +4 -2
- package/bin/yida.js +4 -4
- package/lib/app/canvas-compile.js +303 -0
- package/lib/app/publish.js +190 -39
- package/lib/auth/auth.js +11 -3
- package/lib/auth/login.js +34 -15
- package/lib/core/command-manifest.js +1 -1
- package/lib/core/env.js +19 -4
- package/lib/core/locales/ar.js +6 -2
- package/lib/core/locales/de.js +6 -2
- package/lib/core/locales/en.js +7 -3
- package/lib/core/locales/es.js +6 -2
- package/lib/core/locales/fr.js +6 -2
- package/lib/core/locales/hi.js +6 -2
- package/lib/core/locales/ja.js +7 -3
- package/lib/core/locales/ko.js +6 -2
- package/lib/core/locales/pt.js +6 -2
- package/lib/core/locales/vi.js +6 -2
- package/lib/core/locales/zh-HK.js +7 -3
- package/lib/core/locales/zh.js +7 -3
- package/lib/core/utils.js +195 -15
- package/lib/samples/yida-custom-page/custom-page-template.js +6 -6
- package/lib/samples/yida-custom-page/design-tokens.js +14 -12
- package/package.json +1 -1
- package/scripts/e2e-real/skill-coverage.js +4 -0
- package/scripts/validate-ci.sh +6 -0
- package/scripts/validate-package-size.js +12 -1
- package/yida-skills/SKILL.md +19 -5
- package/yida-skills/references/development-rules.md +2 -2
- package/yida-skills/references/field-and-url-reference.md +14 -1
- package/yida-skills/skills/yida-app/SKILL.md +3 -2
- package/yida-skills/skills/yida-canvas-custom-page/SKILL.md +113 -0
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-authoring-examples.md +163 -0
- package/yida-skills/skills/yida-canvas-custom-page/references/canvas-design-system.md +148 -0
- package/yida-skills/skills/yida-canvas-custom-page/references/data-bridge-guide.md +115 -0
- package/yida-skills/skills/yida-canvas-custom-page/references/dependencies-and-cdn.md +45 -0
- package/yida-skills/skills/yida-canvas-custom-page/references/employeefield-verification.md +68 -0
- package/yida-skills/skills/yida-canvas-upgrade/SKILL.md +99 -0
- package/yida-skills/skills/yida-canvas-upgrade/references/migration-examples.md +69 -0
- package/yida-skills/skills/yida-custom-page/SKILL.md +7 -2
- package/yida-skills/skills/yida-custom-page/examples/attachment-upload.js +1 -1
- package/yida-skills/skills/yida-custom-page/references/coding-guide.md +3 -3
- package/yida-skills/skills/yida-custom-page/references/component-jsx-guide.md +3 -2
- package/yida-skills/skills/yida-custom-page/references/design-system.md +30 -13
- package/yida-skills/skills/yida-nav-shell/SKILL.md +119 -0
- package/yida-skills/skills/yida-nav-shell/references/nav-shell-patterns.md +302 -0
- package/yida-skills/skills/yida-page-config/SKILL.md +1 -0
- package/yida-skills/skills/yida-page-uiux/SKILL.md +68 -0
- package/yida-skills/skills/yida-page-uiux/references/scenes/dashboard.md +128 -0
- package/yida-skills/skills/yida-page-uiux/references/scenes/detail.md +79 -0
- package/yida-skills/skills/yida-page-uiux/references/scenes/landing.md +101 -0
- package/yida-skills/skills/yida-page-uiux/references/scenes/list.md +78 -0
- package/yida-skills/skills/yida-page-uiux/references/scenes/workbench.md +74 -0
- package/yida-skills/skills/yida-page-uiux/references/visual-decision-engine.md +151 -0
- package/yida-skills/skills/yida-page-uiux/workflow/output-decision-block.md +36 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-0-nav-shape.md +39 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-1-page-type.md +25 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-2-intent-decode.md +25 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-3-scene-routing.md +29 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-4-visual-decision.md +32 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-5-icon-and-assets.md +36 -0
- package/yida-skills/skills/yida-page-uiux/workflow/step-6-deai-selfcheck.md +37 -0
- package/yida-skills/skills/yida-publish-page/SKILL.md +7 -3
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# B 端导航壳形态目录
|
|
2
|
+
|
|
3
|
+
当页面隐藏了应用导航(`isRenderNav=false`,见 [yida-page-uiux Step 0 导航形态判定](../../yida-page-uiux/workflow/step-0-nav-shape.md)),页面要**自带导航壳**接管应用级导航。本文件是 B 端常见导航形态的选型 + 骨架 + 代码示例目录。挑一种主形态,可与标签页叠加做二级导航。
|
|
4
|
+
|
|
5
|
+
> 这里给**方向 + 骨架 + 可直接改的代码示例**。示例以 native(`_customState` + inline style)为主,因为最自包含、两条链路都能读;每种形态附一句 **Canvas(antd)等价件**。落地时:native 交 `yida-custom-page`,Canvas 交 `yida-canvas-custom-page`。
|
|
6
|
+
|
|
7
|
+
## 选型速查
|
|
8
|
+
|
|
9
|
+
| 形态 | 何时用 | 顶级项数量 | 移动端收敛 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| **左侧边栏** | 模块多、需常驻导航的后台/门户(最通用 B 端形态) | 5–12,支持分组/二级 | 抽屉(汉堡唤出) |
|
|
12
|
+
| **顶部导航** | 模块少、内容要占满宽度的看板/门户 | 2–6 | 汉堡菜单 |
|
|
13
|
+
| **顶部 + 侧边混合** | 两级结构复杂应用(顶部分域,侧边分子模块) | 顶 2–5 × 侧 3–10 | 顶部汉堡 + 侧边抽屉 |
|
|
14
|
+
| **浮动导航(悬浮胶囊/Dock)** | 沉浸/大屏/展示页,chrome 要极简,导航不常驻 | 3–6 | 底部胶囊/收起 |
|
|
15
|
+
| **标签页** | 一个模块内切同级视图(常叠加在上面几种之上) | 2–8 | 横向滚动标签 |
|
|
16
|
+
|
|
17
|
+
## 通用纪律(B 端 + 去 AI 味)
|
|
18
|
+
|
|
19
|
+
- **选中态要一眼可辨**:左侧边用「左侧 3px 主色条 + 浅色底 + 字重加粗」;顶部用「底部 2px 主色下划线 + 主色文字」。别只靠淡淡变色。
|
|
20
|
+
- **图标只作功能用途**:导航项用「功能性内联 SVG + 文字」,同页一套图标风格;**禁 emoji**、禁每项前配装饰图标(见 [yida-page-uiux 图标纪律](../../yida-page-uiux/workflow/step-5-icon-and-assets.md))。
|
|
21
|
+
- **不做营销脸**:没有巨 Logo Hero、没有渐变横幅。顶部条左侧放「应用名/模块名 + 面包屑」,右侧放「用户/操作」,克制。
|
|
22
|
+
- **密度可偏高**:B 端导航允许信息密集,但要有主次;分组用小标题或分隔线,不要一长串平铺。
|
|
23
|
+
- **主色策略**:导航隐藏时主色相可自立(见 yida-page-uiux Step 0);仍要么走品牌 `var(--color-brand1-*)`、要么用自定主色一以贯之,语义色固定。
|
|
24
|
+
- **先关原导航**:使用本导航壳时,宿主页发布后必须配置 `isRenderNav=false`,不要让宜搭原导航和自绘导航同时出现。
|
|
25
|
+
- **URL 参数不丢失**:跨页导航项要保存 `params` 并统一构造 URL;自定义页目标至少带 `isRenderNav=false`,需要跨组织或深链时合并 `corpid`、`tab`、`view` 等白名单参数。
|
|
26
|
+
|
|
27
|
+
## 多视图切换机制(导航壳的核心)
|
|
28
|
+
|
|
29
|
+
导航壳 = 一个自定义页内切多个视图。两条链路的做法:
|
|
30
|
+
|
|
31
|
+
- **native**:状态存 `_customState.activeView`,点击 `this.setCustomState({ activeView: key })`,`renderJsx` 里按 `activeView` 分支渲染内容区。
|
|
32
|
+
- **Canvas**:`var v = React.useState('home')`,或用 URL hash(`window.location.hash` + `hashchange` 监听,`useEffect` 注册并 cleanup)做可分享/可后退的视图切换。
|
|
33
|
+
- **跨页跳转**(跳到别的自定义页/表单):用 [field-and-url-reference.md](../../../references/field-and-url-reference.md) 的模板拼 URL,目标自定义页必须带 `?isRenderNav=false` 保持沉浸;不要假设应用导航还在。不要只调用 `router.push(formUuid, {}, false)`,它无法表达完整的隐藏导航 URL 和业务参数。
|
|
34
|
+
|
|
35
|
+
### 跨页导航 URL 模板
|
|
36
|
+
|
|
37
|
+
```jsx
|
|
38
|
+
var BASE_URL = 'https://www.aliwork.com';
|
|
39
|
+
var APP_TYPE = 'APP_XXX';
|
|
40
|
+
var COMMON_NAV_PARAMS = { isRenderNav: 'false' };
|
|
41
|
+
|
|
42
|
+
var NAV = [
|
|
43
|
+
{ key: 'overview', label: '概览', type: 'custom', formUuid: 'FORM-OVERVIEW', params: { tab: 'overview' } },
|
|
44
|
+
{ key: 'orders', label: '订单', type: 'workbench', formUuid: 'FORM-ORDERS', params: { iframe: 'true' } }
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
export function buildQuery(params) {
|
|
48
|
+
var pairs = [];
|
|
49
|
+
Object.keys(params || {}).forEach(function(key) {
|
|
50
|
+
if (params[key] !== undefined && params[key] !== null && params[key] !== '') {
|
|
51
|
+
pairs.push(encodeURIComponent(key) + '=' + encodeURIComponent(String(params[key])));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return pairs.length ? '?' + pairs.join('&') : '';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function buildNavUrl(item) {
|
|
58
|
+
var path = item.type === 'workbench'
|
|
59
|
+
? '/' + APP_TYPE + '/workbench/' + item.formUuid
|
|
60
|
+
: '/' + APP_TYPE + '/custom/' + item.formUuid;
|
|
61
|
+
var params = item.type === 'workbench'
|
|
62
|
+
? Object.assign({}, item.params || {})
|
|
63
|
+
: Object.assign({}, COMMON_NAV_PARAMS, item.params || {});
|
|
64
|
+
return BASE_URL + path + this.buildQuery(params);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function openNavItem(item) {
|
|
68
|
+
window.open(this.buildNavUrl(item), '_top');
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 形态 1:左侧边栏(最通用)
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
┌──────┬─────────────────────────────┐
|
|
78
|
+
│ 应用名 │ 顶部条:面包屑 用户 │
|
|
79
|
+
│ ─────│─────────────────────────────│
|
|
80
|
+
│▎概览 │ │ ▎ = 选中项左侧主色条
|
|
81
|
+
│ 订单 │ 内容区(activeView) │
|
|
82
|
+
│ 客户 │ │
|
|
83
|
+
│ 报表 │ │
|
|
84
|
+
│ ─────│ │
|
|
85
|
+
│ ‹收起 │ │
|
|
86
|
+
└──────┴─────────────────────────────┘
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**何时用**:顶级模块 5–12,需要常驻导航。**Canvas 等价**:antd `Layout` + `Layout.Sider` + `Menu`(`mode="inline"`)。
|
|
90
|
+
|
|
91
|
+
```jsx
|
|
92
|
+
// native:_customState.activeView / collapsed;styles 见下,主色可用品牌变量或自定主色
|
|
93
|
+
var NAV = [
|
|
94
|
+
{ key: 'overview', label: '概览', icon: ICONS.dashboard },
|
|
95
|
+
{ key: 'orders', label: '订单', icon: ICONS.list },
|
|
96
|
+
{ key: 'customers',label: '客户', icon: ICONS.user },
|
|
97
|
+
{ key: 'reports', label: '报表', icon: ICONS.chart },
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
export function renderSidebar() {
|
|
101
|
+
var self = this;
|
|
102
|
+
var state = this.getCustomState();
|
|
103
|
+
var collapsed = state.collapsed;
|
|
104
|
+
var isMobile = this.utils.isMobile();
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<nav style={{
|
|
108
|
+
width: collapsed ? 56 : 216,
|
|
109
|
+
flexShrink: 0,
|
|
110
|
+
height: '100%',
|
|
111
|
+
background: '#fff',
|
|
112
|
+
borderRight: '1px solid #e5e6eb',
|
|
113
|
+
display: 'flex',
|
|
114
|
+
flexDirection: 'column',
|
|
115
|
+
transition: 'width .2s',
|
|
116
|
+
}}>
|
|
117
|
+
<div style={{ height: 52, display: 'flex', alignItems: 'center', padding: '0 16px', fontWeight: 700 }}>
|
|
118
|
+
{collapsed ? '' : '进销存中台'}
|
|
119
|
+
</div>
|
|
120
|
+
<div style={{ flex: 1, overflowY: 'auto' }}>
|
|
121
|
+
{NAV.map(function (item) {
|
|
122
|
+
var active = state.activeView === item.key;
|
|
123
|
+
return (
|
|
124
|
+
<div key={item.key}
|
|
125
|
+
onClick={function () { self.setCustomState({ activeView: item.key }); }}
|
|
126
|
+
style={{
|
|
127
|
+
display: 'flex', alignItems: 'center', gap: 10,
|
|
128
|
+
height: 40, padding: '0 16px', cursor: 'pointer',
|
|
129
|
+
borderLeft: active ? '3px solid var(--color-brand1-6)' : '3px solid transparent',
|
|
130
|
+
background: active ? 'var(--color-brand1-1)' : 'transparent',
|
|
131
|
+
color: active ? 'var(--color-brand1-6)' : '#4e5969',
|
|
132
|
+
fontWeight: active ? 600 : 400,
|
|
133
|
+
}}>
|
|
134
|
+
{self.renderIcon(item.icon, 18, active ? 'var(--color-brand1-6)' : '#86909c')}
|
|
135
|
+
{collapsed ? null : <span>{item.label}</span>}
|
|
136
|
+
</div>
|
|
137
|
+
);
|
|
138
|
+
})}
|
|
139
|
+
</div>
|
|
140
|
+
<div onClick={function () { self.setCustomState({ collapsed: !collapsed }); }}
|
|
141
|
+
style={{ height: 44, display: 'flex', alignItems: 'center', padding: '0 16px', cursor: 'pointer', color: '#86909c', borderTop: '1px solid #f2f3f5' }}>
|
|
142
|
+
{collapsed ? '›' : '‹ 收起'}
|
|
143
|
+
</div>
|
|
144
|
+
</nav>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
移动端:窄屏时侧边栏改为默认隐藏,顶部条放汉堡按钮,点开滑出为覆盖层抽屉(`position: fixed` + 半透明遮罩),选完自动收起。
|
|
150
|
+
|
|
151
|
+
## 形态 2:顶部导航(水平)
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
┌─────────────────────────────────────┐
|
|
155
|
+
│ 应用名 概览 订单 客户 报表 用户 │ 选中项底部 2px 主色下划线
|
|
156
|
+
├─────────────────────────────────────┤
|
|
157
|
+
│ 内容区(activeView) │
|
|
158
|
+
└─────────────────────────────────────┘
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**何时用**:顶级模块 2–6、内容要占满宽度(看板/门户)。**Canvas 等价**:antd `Menu mode="horizontal"` 或 `Tabs`。
|
|
162
|
+
|
|
163
|
+
```jsx
|
|
164
|
+
export function renderTopnav() {
|
|
165
|
+
var self = this;
|
|
166
|
+
var state = this.getCustomState();
|
|
167
|
+
return (
|
|
168
|
+
<header style={{
|
|
169
|
+
height: 52, display: 'flex', alignItems: 'center',
|
|
170
|
+
padding: '0 20px', gap: 4,
|
|
171
|
+
background: '#fff', borderBottom: '1px solid #e5e6eb',
|
|
172
|
+
}}>
|
|
173
|
+
<span style={{ fontWeight: 700, marginRight: 24 }}>营销中台</span>
|
|
174
|
+
{NAV.map(function (item) {
|
|
175
|
+
var active = state.activeView === item.key;
|
|
176
|
+
return (
|
|
177
|
+
<div key={item.key}
|
|
178
|
+
onClick={function () { self.setCustomState({ activeView: item.key }); }}
|
|
179
|
+
style={{
|
|
180
|
+
height: 52, display: 'flex', alignItems: 'center', padding: '0 14px', cursor: 'pointer',
|
|
181
|
+
color: active ? 'var(--color-brand1-6)' : '#4e5969',
|
|
182
|
+
fontWeight: active ? 600 : 400,
|
|
183
|
+
borderBottom: active ? '2px solid var(--color-brand1-6)' : '2px solid transparent',
|
|
184
|
+
}}>
|
|
185
|
+
{item.label}
|
|
186
|
+
</div>
|
|
187
|
+
);
|
|
188
|
+
})}
|
|
189
|
+
<div style={{ marginLeft: 'auto', color: '#86909c' }}>管理员</div>
|
|
190
|
+
</header>
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
移动端:把中间菜单收进右侧汉堡下拉,只留应用名 + 汉堡。
|
|
196
|
+
|
|
197
|
+
## 形态 3:顶部 + 侧边混合
|
|
198
|
+
|
|
199
|
+
```
|
|
200
|
+
┌─────────────────────────────────────┐
|
|
201
|
+
│ 应用名 销售域 │ 采购域 │ 财务域 用户 │ 顶部=一级域
|
|
202
|
+
├──────┬──────────────────────────────┤
|
|
203
|
+
│▎订单 │ │ 侧边=当前域的子模块
|
|
204
|
+
│ 客户 │ 内容区 │
|
|
205
|
+
│ 合同 │ │
|
|
206
|
+
└──────┴──────────────────────────────┘
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**何时用**:两级结构、模块多的复杂应用(顶部切「域」,侧边切该域「子模块」)。顶部选中切换时,侧边 `NAV` 换成该域的子项,`activeView` 重置到该域第一项。**Canvas 等价**:antd `Layout`(Header + Sider + Content)。
|
|
210
|
+
|
|
211
|
+
## 形态 4:浮动导航(悬浮胶囊 / Dock)
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
┌───────────────────────┐
|
|
215
|
+
│ 内容/大屏区 │
|
|
216
|
+
│ │
|
|
217
|
+
│ ╭─────────────────╮ │ 悬浮胶囊:固定底部居中,
|
|
218
|
+
│ │ 概览 订单 客户 报表│ │ 半透明底 + 模糊,不占布局
|
|
219
|
+
│ ╰─────────────────╯ │
|
|
220
|
+
└───────────────────────┘
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**何时用**:沉浸/大屏/展示页,chrome 要极简、导航不常驻。**Canvas 等价**:自定义悬浮容器或 antd `FloatButton.Group`。
|
|
224
|
+
|
|
225
|
+
```jsx
|
|
226
|
+
export function renderFloatDock() {
|
|
227
|
+
var self = this;
|
|
228
|
+
var state = this.getCustomState();
|
|
229
|
+
return (
|
|
230
|
+
<div style={{
|
|
231
|
+
position: 'fixed', left: '50%', bottom: 24, transform: 'translateX(-50%)',
|
|
232
|
+
display: 'flex', gap: 4, padding: 6, zIndex: 50,
|
|
233
|
+
background: 'rgba(255,255,255,.82)', backdropFilter: 'blur(12px)',
|
|
234
|
+
border: '1px solid #e5e6eb', borderRadius: 999,
|
|
235
|
+
boxShadow: '0 6px 24px rgba(0,0,0,.12)',
|
|
236
|
+
}}>
|
|
237
|
+
{NAV.map(function (item) {
|
|
238
|
+
var active = state.activeView === item.key;
|
|
239
|
+
return (
|
|
240
|
+
<div key={item.key}
|
|
241
|
+
onClick={function () { self.setCustomState({ activeView: item.key }); }}
|
|
242
|
+
style={{
|
|
243
|
+
display: 'flex', alignItems: 'center', gap: 6,
|
|
244
|
+
height: 36, padding: '0 14px', cursor: 'pointer', borderRadius: 999,
|
|
245
|
+
background: active ? 'var(--color-brand1-6)' : 'transparent',
|
|
246
|
+
color: active ? '#fff' : '#4e5969',
|
|
247
|
+
fontWeight: active ? 600 : 400,
|
|
248
|
+
}}>
|
|
249
|
+
{item.label}
|
|
250
|
+
</div>
|
|
251
|
+
);
|
|
252
|
+
})}
|
|
253
|
+
</div>
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
注意:浮动导航**叠在内容之上**(`position: fixed` + `zIndex`),内容区底部留出安全间距别被遮住。移动端收窄胶囊或改底部标签栏。
|
|
259
|
+
|
|
260
|
+
## 形态 5:标签页(叠加二级导航)
|
|
261
|
+
|
|
262
|
+
一个模块内切同级视图,通常叠在侧边/顶部之下。**Canvas 等价**:antd `Tabs`。
|
|
263
|
+
|
|
264
|
+
```jsx
|
|
265
|
+
export function renderTabs() {
|
|
266
|
+
var self = this;
|
|
267
|
+
var state = this.getCustomState();
|
|
268
|
+
var TABS = [{ key: 'pending', label: '待处理' }, { key: 'done', label: '已完成' }];
|
|
269
|
+
return (
|
|
270
|
+
<div style={{ display: 'flex', gap: 24, borderBottom: '1px solid #e5e6eb', padding: '0 4px' }}>
|
|
271
|
+
{TABS.map(function (t) {
|
|
272
|
+
var active = state.tab === t.key;
|
|
273
|
+
return (
|
|
274
|
+
<div key={t.key}
|
|
275
|
+
onClick={function () { self.setCustomState({ tab: t.key }); }}
|
|
276
|
+
style={{
|
|
277
|
+
height: 40, display: 'flex', alignItems: 'center', cursor: 'pointer',
|
|
278
|
+
color: active ? 'var(--color-brand1-6)' : '#4e5969',
|
|
279
|
+
fontWeight: active ? 600 : 400,
|
|
280
|
+
borderBottom: active ? '2px solid var(--color-brand1-6)' : '2px solid transparent',
|
|
281
|
+
}}>
|
|
282
|
+
{t.label}
|
|
283
|
+
</div>
|
|
284
|
+
);
|
|
285
|
+
})}
|
|
286
|
+
</div>
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 自查清单(导航壳)
|
|
294
|
+
|
|
295
|
+
- 选中态一眼可辨(主色条/下划线 + 字重),不是只靠淡变色。
|
|
296
|
+
- 导航项 = 功能性 SVG + 文字,同页一套图标风格,无 emoji、无每项装饰图标。
|
|
297
|
+
- 顶部/侧边有应用名或面包屑,用户知道「在哪、能去哪」,不是孤零零一个返回按钮。
|
|
298
|
+
- 内容区按 `activeView` 切换(native `_customState` / Canvas `useState`/hash),切换有状态、可回来。
|
|
299
|
+
- 宿主页已执行 `openyida update-form-config <appType> <formUuid> false "<标题>"`,宜搭原导航不再出现。
|
|
300
|
+
- 跨页跳转用 URL 模板拼;目标自定义页带 `?isRenderNav=false`,导航项的 `params` 没丢。
|
|
301
|
+
- 移动端:侧边→抽屉、顶部→汉堡、浮动→底部胶囊,走 `isMobile` 响应式。
|
|
302
|
+
- 浮动导航留出内容安全间距,不遮关键信息。
|
|
@@ -79,6 +79,7 @@ openyida update-form-config <appType> <formUuid> false "<页面标题>"
|
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
> 看板/驾驶舱新建页面优先使用 `openyida create-page <appType> "<页面名>" --mode dashboard`,会一步完成导航隐藏并输出无左侧工作台栏的沉浸式 URL。
|
|
82
|
+
> 若页面内使用 `yida-nav-shell` 自绘导航壳,本命令是发布后的必做配置;同时导航壳里的自定义页目标 URL 必须追加 `?isRenderNav=false`,否则切到目标页时会重新出现宜搭原导航。
|
|
82
83
|
|
|
83
84
|
## URL 格式
|
|
84
85
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yida-page-uiux
|
|
3
|
+
description: >
|
|
4
|
+
宜搭自定义页面「视觉方向决策」技能。在动手写 JSX 之前,先按页面类型(工作台/看板/列表/详情/官网落地页)锁定一套差异化、去 AI 味的视觉方向,避免首次生成就套用「统一灰白底 + 8px 圆角卡片 + 蓝色强调」的 AI 模板脸。
|
|
5
|
+
本技能只产出「视觉方向决策块」,不写代码;具体 token/组件数值由 yida-custom-page 的 design-system.md 落地。
|
|
6
|
+
当用户要求「做个自定义页面/工作台/看板/门户/首页/官网/落地页/展示页」并在意好看,或明确说「美化/好看一点/UI/视觉/太丑/有 AI 味/去 AI 味/重新设计风格」时触发。
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# yida-page-uiux — 自定义页面视觉方向决策
|
|
10
|
+
|
|
11
|
+
## 定位(先读这段)
|
|
12
|
+
|
|
13
|
+
本技能是**视觉方向决策层**,不是编码层:
|
|
14
|
+
|
|
15
|
+
- **产出**:一个「视觉方向决策块」(纯文字方向 + 差异化说明),交给 `yida-custom-page` / `yida-canvas-custom-page` 按各自 `design-system.md` 的 token/组件落地。
|
|
16
|
+
- **不产出**:JSX 代码、具体像素数值表(那是 `design-system.md` 的职责)。
|
|
17
|
+
- **为什么存在**:`design-system.md` 是「安全平庸」的 token 层——直接套用会得到千篇一律的 AI 模板脸。本技能在写码前先强制做**差异化视觉决策**,让每个页面有自己的性格。
|
|
18
|
+
|
|
19
|
+
> **一句话分工**:`yida-page-uiux` 定**方向与差异** → `design-system.md` 提供**数值与组件** → `yida-custom-page` / `yida-canvas-custom-page` 写 **JSX**。
|
|
20
|
+
|
|
21
|
+
## 重要边界:自定义页面不做表单/录入 UI
|
|
22
|
+
|
|
23
|
+
- 自定义页面**只做展示、工具、看板、详情**,**不手写表单控件**(输入框群、字段校验、提交表单)。
|
|
24
|
+
- 需要录入/提交 → 一律走宜搭**原生表单**(`yida-create-form-page` 建普通表单 / `yida-create-process` 建带审批表单)。
|
|
25
|
+
- 详情页 / 列表页需要「新建 / 编辑」入口时,用既有 iframe 方式嵌入原生表单:`workbench/{formUuid}?iframe=true`(禁用 `formDetail`),不要在自定义页里重写表单。
|
|
26
|
+
- 因此本技能**不含「表单页」场景**。页面类型只覆盖展示/工具/看板/详情/落地页这类自定义页。
|
|
27
|
+
|
|
28
|
+
## 核心工作流(严格按顺序,不跳步)
|
|
29
|
+
|
|
30
|
+
每一步的判定法、checklist、代码/模板都在 `workflow/` 对应文件里,**按需只读命中的那一个**。
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
Step 0 导航形态判定 → Step 1 页面类型 → Step 2 意图解码 → Step 3 路由 scene
|
|
34
|
+
→ Step 4 视觉方向决策 → Step 5 图标与素材 → Step 6 去 AI 味自检 → 输出决策块
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| 步骤 | 做什么 | 详细文件 | 产出 |
|
|
38
|
+
|---|---|---|---|
|
|
39
|
+
| **Step 0** 导航形态判定 | 应用导航是否隐藏(`isRenderNav`)?决定要不要跟应用框架融合、要不要自带导航壳 | [workflow/step-0-nav-shape.md](workflow/step-0-nav-shape.md) | 导航形态(可见/隐藏 + 壳型) |
|
|
40
|
+
| **Step 1** 页面类型判定 | 锁定属于哪一类(workbench/dashboard/list/detail/landing),决定后续所有决策 | [workflow/step-1-page-type.md](workflow/step-1-page-type.md) | 页面类型 + 判定依据 |
|
|
41
|
+
| **Step 2** 意图解码 | 提取 2-3 个气质关键词 + 3-5 条项目特定设计原则 | [workflow/step-2-intent-decode.md](workflow/step-2-intent-decode.md) | 气质关键词 + 设计原则 |
|
|
42
|
+
| **Step 3** 路由到 scene | 只读命中的那一个 `references/scenes/*.md`,拿骨架/密度/焦点/组件套餐 | [workflow/step-3-scene-routing.md](workflow/step-3-scene-routing.md) | 布局骨架 + 密度 + 焦点 |
|
|
43
|
+
| **Step 4** 视觉方向决策 | 调用 `visual-decision-engine.md`,做 5 个差异化维度 + 反默认自检 | [workflow/step-4-visual-decision.md](workflow/step-4-visual-decision.md) | 差异化 5 维 + 反默认说明 |
|
|
44
|
+
| **Step 5** 图标与素材 | 默认内联 SVG 语义集;iconfont 仅用户提供项目 URL 时 opt-in | [workflow/step-5-icon-and-assets.md](workflow/step-5-icon-and-assets.md) | 图标策略 |
|
|
45
|
+
| **Step 6** 去 AI 味自检 | 逐条扫黑名单 + 8 问自检,任一命中即回对应 Step 修正 | [workflow/step-6-deai-selfcheck.md](workflow/step-6-deai-selfcheck.md) | 自检通过 |
|
|
46
|
+
| **输出** | 汇总成「视觉方向决策块」,提示交码落地 | [workflow/output-decision-block.md](workflow/output-decision-block.md) | 视觉方向决策块 |
|
|
47
|
+
|
|
48
|
+
## 核心规则(红线,任何步骤都适用)
|
|
49
|
+
|
|
50
|
+
- 🚫 **严禁 emoji(FATAL)**:页面渲染的任何位置一律禁止 emoji,需要图标走功能性内联 SVG。详见 [Step 6](workflow/step-6-deai-selfcheck.md)。
|
|
51
|
+
- **主色策略**:导航可见时主色跟随平台品牌 `var(--color-brand1-*)`,不自由换主色相;导航隐藏(`isRenderNav=false`)时主色相可自立。**语义色(成功/警告/错误)永远固定**。详见 [Step 0](workflow/step-0-nav-shape.md) / [Step 4](workflow/step-4-visual-decision.md)。
|
|
52
|
+
- **不做表单**:见上「重要边界」。
|
|
53
|
+
- **只讲方向不写码**:本技能只产出决策块,JSX 与像素数值归 `design-system.md` + `yida-custom-page`。
|
|
54
|
+
|
|
55
|
+
## 参考文档
|
|
56
|
+
|
|
57
|
+
| 文档 | 覆盖范围 | 何时阅读 |
|
|
58
|
+
|------|---------|---------|
|
|
59
|
+
| [视觉决策引擎](references/visual-decision-engine.md) | 5 个风格意图 + 反默认组合表 + 5 个差异化维度 + 强制第二选择 + 差异化自检 | Step 4 做视觉决策时(所有场景共用) |
|
|
60
|
+
| [页面内自绘导航壳(独立 skill)](../yida-nav-shell/SKILL.md) | 页面隐藏应用导航后用 JSX 自建侧边/顶部/混合/浮动/标签导航壳:选型表 + 骨架 + native/Canvas 代码 + 多视图切换 | Step 0 判定导航隐藏、需自建导航壳时 |
|
|
61
|
+
| [scene-workbench](references/scenes/workbench.md) | 工作台/门户首页的骨架/密度/焦点/组件套餐/去 AI 味要点 | 页面类型 = 工作台时 |
|
|
62
|
+
| [scene-dashboard](references/scenes/dashboard.md) | 数据看板/驾驶舱 | 页面类型 = 看板时 |
|
|
63
|
+
| [scene-list](references/scenes/list.md) | 列表/管理页 | 页面类型 = 列表时 |
|
|
64
|
+
| [scene-detail](references/scenes/detail.md) | 详情/展示页(叠加详情页叙事纪律) | 页面类型 = 详情时 |
|
|
65
|
+
| [scene-landing](references/scenes/landing.md) | 官网/落地页/品牌展示/产品介绍页:Section 构图、素材锚点、页面节奏 | 页面类型 = 官网落地页时 |
|
|
66
|
+
| [设计规范](../yida-custom-page/references/design-system.md) | token/组件实现层:色彩/圆角/字体/间距/组件样式的具体数值 | 方向定完、交码落地时 |
|
|
67
|
+
| [素材资源](../yida-custom-page/references/assets-guide.md) | 图片/图标/音效素材库、renderIcon 骨架、CDN 安全规范 | 需要图标/图片/音效时 |
|
|
68
|
+
| [字段与 URL 参考](../../references/field-and-url-reference.md) | 隐藏导航 `isRenderNav=false`、各页面类型 URL 拼接模板、跨页跳转 | Step 0 判定导航形态、自带导航壳拼跳转 URL 时 |
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# 场景:数据看板 / 驾驶舱
|
|
2
|
+
|
|
3
|
+
> 面向决策者的「一屏看懂业务状态」。密度高、以数据为主角,图表服务于结论而非炫技。
|
|
4
|
+
|
|
5
|
+
## 场景定位
|
|
6
|
+
|
|
7
|
+
- **用户目标**:快速判断「业务健康吗 / 哪里有异常 / 趋势往哪走」。
|
|
8
|
+
- **不是**:门户首页(那是 workbench,偏入口)、明细管理(那是 list)。
|
|
9
|
+
- **典型业务**:销售驾驶舱、进销存看板、运营大屏、财务总览。
|
|
10
|
+
|
|
11
|
+
## 布局骨架 / 信息架构
|
|
12
|
+
|
|
13
|
+
先回答两个独立问题:
|
|
14
|
+
|
|
15
|
+
- **Shell(壳形态)**:页面导航骨架长什么样?单页嵌入 / 顶部导航 / 侧边导航 / L 型导航 / 隐藏导航后的自绘导航壳。
|
|
16
|
+
- **Archetype(页面原型)**:内容叙事怎么组织?总览 / 分析 / 监控 / 报告 / 对比 / 运营。
|
|
17
|
+
|
|
18
|
+
两者正交:单页也可以做分析型,L 型壳也可以承载总览型。不要把“看板”自动理解成一屏 KPI 平铺。
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
┌─────────────────────────────────────┐
|
|
22
|
+
│ 顶部:标题 + 时间范围/筛选(克制一行) │
|
|
23
|
+
├─────────────────────────────────────┤
|
|
24
|
+
│ KPI 卡组(4-6 个,有主次不平铺) │ ← 最重要结论,一眼可见
|
|
25
|
+
├──────────────────┬──────────────────┤
|
|
26
|
+
│ 主图表(趋势/占比)│ 次图表 / 排行榜 │ ← 主大次小,非对称
|
|
27
|
+
├──────────────────┴──────────────────┤
|
|
28
|
+
│ 明细 / 排行 / 告警列表 │
|
|
29
|
+
└─────────────────────────────────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
移动端:KPI 改为 2 列或横向滚动,图表纵向堆叠,保证竖屏可读。
|
|
33
|
+
|
|
34
|
+
## Shell 选型
|
|
35
|
+
|
|
36
|
+
| Shell | 业务信号 | 宜搭落地 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `single_page` | 单一主题 / 嵌入应用导航内 / 一屏或一页讲完 | 不自建导航,内容区直接渲染 |
|
|
39
|
+
| `top_nav` | 2-6 个同级专题页,层级扁平 | 导航可见时用宜搭左侧导航;导航隐藏时用 `yida-nav-shell` 顶部导航 |
|
|
40
|
+
| `side_nav` | 多页面后台 / 二级菜单 / 高频切换 | 优先平台导航分组;隐藏导航时用自绘侧边栏 |
|
|
41
|
+
| `l_shaped` | 功能模块 >=3 个,每模块 2-6 个页面,数据看板主流复杂形态 | 隐藏导航时用 `yida-nav-shell` 顶部+侧边混合;导航可见时拆成平台导航分组 |
|
|
42
|
+
| `no_shell` | 投屏大屏 / 分享页 / 单主题沉浸展示 | `isRenderNav=false`,只保留轻量筛选和全屏信息 |
|
|
43
|
+
|
|
44
|
+
选型优先级:PRD 明确 > 页面数量 > 功能模块层级 > 是否隐藏应用导航。拿不准时用 `single_page`,保持与宜搭应用框架融合。
|
|
45
|
+
|
|
46
|
+
## Archetype 选型
|
|
47
|
+
|
|
48
|
+
| Archetype | 适用场景 | 典型结构 |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **总览型** | 管理层快速看全局 | KPI 行 → 趋势/构成图 → 明细/排行 |
|
|
51
|
+
| **分析型** | 多维下钻分析 | 全局筛选 → 分组图表 → 下钻路径 → 明细表 |
|
|
52
|
+
| **监控型** | 实时状态/告警 | 状态概览 → 告警列表 + 指标网格 → 小趋势 |
|
|
53
|
+
| **报告型** | 周报/月报/经营复盘 | 摘要结论 → 分节图表 → 行动建议 |
|
|
54
|
+
| **对比型** | 跨区域/渠道/时间对比 | 维度切换 → 并排图表 → 差异表 |
|
|
55
|
+
| **运营型** | 工作台式运营看板 | 待办/活动 Feed → 快速统计 → 重点列表 |
|
|
56
|
+
|
|
57
|
+
决策块里要写明 Shell + Archetype,例如「single_page + 总览型」或「l_shaped + 分析型」。
|
|
58
|
+
|
|
59
|
+
## 信息密度
|
|
60
|
+
|
|
61
|
+
**高**。看板要在有限空间塞下多维信息,但「高密度 ≠ 拥挤」——靠对齐、分组、留白建立秩序,别糊成一片。
|
|
62
|
+
|
|
63
|
+
## 焦点(hero)元素
|
|
64
|
+
|
|
65
|
+
**关键 KPI**。整个看板应有 1-2 个「最该先看」的核心指标,视觉上最突出(最大字号 / 置于左上视觉起点 / 点缀色强调)。
|
|
66
|
+
|
|
67
|
+
## 组件套餐(映射 design-system.md / yida-chart)
|
|
68
|
+
|
|
69
|
+
- KPI 卡:大数字(`tabular-nums`)+ 同比/环比小标 + 趋势箭头(升降用语义色)
|
|
70
|
+
- 图表:ECharts,走 `yida-chart` 技能;色板**克制**,对齐平台品牌变量 + 有限辅助色
|
|
71
|
+
- 排行/明细:`design-system.md` 列表行 / 紧凑表格
|
|
72
|
+
- 告警:`design-system.md` 标签(tag)+ 告警红(稀缺,只给真异常)
|
|
73
|
+
|
|
74
|
+
## Section 分组与数据叙事
|
|
75
|
+
|
|
76
|
+
- 每个页面至少 2-4 个语义分组:核心指标 / 趋势分析 / 结构分布 / 异常告警 / 明细排行。禁止 6 张以上卡片直接铺平。
|
|
77
|
+
- 每个图表要有一句能读懂的业务结论,落在卡片 footer、图表下方、页头 Callout 或页尾总结。
|
|
78
|
+
- 洞察必须包含「具体数字 + 业务含义」,例如「华东区贡献 43%,环比 +5.2pp,是本月增长主因」。禁止「数据表现良好」「趋势明显」这类空话。
|
|
79
|
+
- 下钻入口统一放在卡片右上角 actions 区(图标按钮),不要在卡片底部写「点击查看详情」。
|
|
80
|
+
|
|
81
|
+
## 数值格式化纪律
|
|
82
|
+
|
|
83
|
+
任何面向用户的数值都不能裸奔:
|
|
84
|
+
|
|
85
|
+
| 位置 | 要求 |
|
|
86
|
+
|---|---|
|
|
87
|
+
| KPI 主值 | 紧凑量级 + 单位,例如 `¥1,234.6万`、`12.3%` |
|
|
88
|
+
| 涨跌幅 | 带正负号和周期,例如 `+5.2% 环比` |
|
|
89
|
+
| 图表轴 | 紧凑格式,避免轴标签溢出 |
|
|
90
|
+
| 图表 tooltip | 完整精确格式,便于细看 |
|
|
91
|
+
| 表格数值列 | 右对齐 + `tabular-nums` |
|
|
92
|
+
| 洞察文案 | 数字 + 业务解释,不只报数 |
|
|
93
|
+
|
|
94
|
+
## 本场景专属去 AI 味要点
|
|
95
|
+
|
|
96
|
+
- ❌ **禁每张 KPI 卡配彩色渐变背景 + 一枚图标**:这是最典型的 AI 看板脸。卡片用中性底 + 数字主角,图标克制或不用。
|
|
97
|
+
- ❌ **禁图表色板高饱和乱撞**:每个系列都亮色 = 廉价感。用同色系深浅 + 1 个强调色区分主次。
|
|
98
|
+
- ❌ **禁 KPI 等大平铺**:4-6 个指标一样大 = 没有重点。核心 KPI 要更大/更突出。
|
|
99
|
+
- ❌ **禁裸数字**:`12345678` 直接出现在 KPI、坐标轴、tooltip、表格或洞察里都算视觉 bug。
|
|
100
|
+
- ❌ **禁无分组卡片瀑布**:卡片必须归入语义 section,让用户 5 秒内看懂页面有几大块。
|
|
101
|
+
- ✅ **图表服务于结论**:每个图表要能回答一个业务问题;纯装饰的图别放。
|
|
102
|
+
- ✅ **升降有语义**:增长/下降用语义色 + 方向箭头,不要只给个数字。
|
|
103
|
+
|
|
104
|
+
## 视觉方向决策块示例
|
|
105
|
+
|
|
106
|
+
```markdown
|
|
107
|
+
### 【视觉方向决策】
|
|
108
|
+
- 页面类型:dashboard(用户诉求是"进销存看板,老板一眼看库存和销售")
|
|
109
|
+
- 气质关键词:专业、冷静、数据驱动
|
|
110
|
+
- 项目特定原则:① 库存告警(低于安全库存)必须最醒目;② 告警红只留给库存/逾期,趋势升降用绿/灰;③ 金额统一 tabular-nums 对齐
|
|
111
|
+
- 布局骨架:标题+时间范围 → 4 KPI(库存周转为核心,最大) → 主趋势图 + 右侧 TOP 商品 → 低库存告警表
|
|
112
|
+
- 信息密度:高(多维一屏,靠对齐分组建立秩序)
|
|
113
|
+
- 视觉焦点:库存周转 KPI + 低库存告警
|
|
114
|
+
- 场景专项策略:single_page + 总览型;分组为核心指标/销售趋势/商品排行/低库存告警;每张图表 footer 写一句数据洞察,金额和库存全部格式化
|
|
115
|
+
|
|
116
|
+
### 【差异化 5 维】
|
|
117
|
+
1. 辅助/强调色:趋势用墨绿/灰,告警用红(仅库存/逾期);图表同色系深浅
|
|
118
|
+
2. 中性冷暖偏色:冷灰基底(数据专业感)
|
|
119
|
+
3. 圆角性格:微圆(克制,不喧宾夺主)
|
|
120
|
+
4. 排版性格:KPI 超大字 tabular-nums,核心 KPI 再大一号;标签用弱化文字
|
|
121
|
+
5. 装饰母题:KPI 左侧细色条标类别 + 非对称主次图表布局
|
|
122
|
+
|
|
123
|
+
### 【反默认说明】
|
|
124
|
+
KPI 用中性底 + 数字主角(非彩色渐变卡+图标),图表单色系深浅(非高饱和撞色),KPI 有主次不平铺——3 维偏离默认看板脸。
|
|
125
|
+
|
|
126
|
+
### 【图标策略】
|
|
127
|
+
内联 SVG,仅趋势箭头/告警用图标,KPI 卡标题不配装饰图标。
|
|
128
|
+
```
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# 场景:详情 / 展示页
|
|
2
|
+
|
|
3
|
+
> 围绕**单个对象**做深度呈现的页面。信息不多但要「讲清楚、有质感」,最容易被做成 AI 味模板脸——本场景**叠加详情页专属纪律**。
|
|
4
|
+
|
|
5
|
+
## 场景定位
|
|
6
|
+
|
|
7
|
+
- **用户目标**:深入了解某一个对象的全貌(一个订单、一个商品、一个客户、一份报告)。
|
|
8
|
+
- **不是**:一堆对象的列表(那是 list)、聚合指标(那是 dashboard)。
|
|
9
|
+
- **典型业务**:订单详情、商品详情、客户档案、项目详情、报告展示页。
|
|
10
|
+
|
|
11
|
+
## 布局骨架 / 信息架构
|
|
12
|
+
|
|
13
|
+
单对象的**叙事编排**——不是字段的机械罗列,而是「先看什么、再看什么」的顺序设计:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
┌─────────────────────────────────────┐
|
|
17
|
+
│ 主区(hero):对象核心身份 + 主图/主数据 │ ← 完整展示,不裁切、不发光
|
|
18
|
+
├─────────────────────────────────────┤
|
|
19
|
+
│ 关键信息组(分章节,非平铺字段墙) │ ← 按业务逻辑分组,有主次
|
|
20
|
+
├──────────────────┬──────────────────┤
|
|
21
|
+
│ 主要内容(叙事) │ 侧栏(元信息/操作) │ ← 非对称,主 70% 次 30%
|
|
22
|
+
├──────────────────┴──────────────────┤
|
|
23
|
+
│ 关联对象 / 时间线 / 附件 │
|
|
24
|
+
└─────────────────────────────────────┘
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
移动端:全部纵向堆叠,主区在最前,侧栏元信息下沉。
|
|
28
|
+
|
|
29
|
+
## 信息密度
|
|
30
|
+
|
|
31
|
+
**低—中**。详情页是「少而精」——单对象信息本就不多,靠**留白、字号跨度、分组**造质感,别硬塞满或堆装饰凑版面。
|
|
32
|
+
|
|
33
|
+
## 焦点(hero)元素
|
|
34
|
+
|
|
35
|
+
**对象的核心身份 + 主图/主数据**。用户进来第一眼要确认「这就是我要找的那个对象」,主区必须完整、突出、无干扰。
|
|
36
|
+
|
|
37
|
+
## 组件套餐(映射 design-system.md / component-jsx-guide.md)
|
|
38
|
+
|
|
39
|
+
- 主区:大字号对象名(标题与正文字号差 **≥2.5×**)+ 主图完整展示 / 核心数据大字
|
|
40
|
+
- 章节:`design-system.md` 卡片分组,章节标题**具体到该对象**(不是「基本信息」这种万能词)
|
|
41
|
+
- 字段:标签-值成对,弱化标签、加重值;金额/数量 `tabular-nums`
|
|
42
|
+
- 时间线/关联:`design-system.md` 列表行 / 时间线
|
|
43
|
+
- 操作:主操作按钮突出,次要操作弱化;需录入走 `iframe workbench/{formUuid}?iframe=true`
|
|
44
|
+
|
|
45
|
+
## 本场景专属去 AI 味要点(叠加详情页纪律)
|
|
46
|
+
|
|
47
|
+
- ✅ **主图/主数据完整展示**:hero 对象不裁切、不加彩色发光、不套渐变遮罩;用留白和对齐凸显,不用特效。
|
|
48
|
+
- ✅ **≥2 种非发光装饰手法**:如左侧主色竖条、章节起始细线、超大字号视觉锤、单色分区、非对称双栏——**禁彩色发光/半透明彩色 blob/渐变文字**。
|
|
49
|
+
- ✅ **反模板叙事顺序**:不要「标题→基本信息→详细信息→附件」这套万能模板顺序;按**这个对象**最该先讲的逻辑排(如商品先讲卖点/主图,订单先讲状态/金额)。
|
|
50
|
+
- ✅ **字号跨度拉开**:主标题与正文 **≥2.5×**,制造视觉层级,别全页一个字号靠加粗硬撑。
|
|
51
|
+
- ✅ **章节标题具体化**:用「本单发货记录」而非「物流信息」,用「客户履约情况」而非「其他信息」——标题带对象语境。
|
|
52
|
+
- ❌ **禁字段墙**:一屏平铺 20 个 label:value = 没消化过的数据库导出。按业务分组、有主次、隐藏低频字段。
|
|
53
|
+
- ❌ **禁每章节标题配一枚装饰图标**:这是最典型详情页 AI 味。图标只在功能处(操作/状态),标题纯文字。
|
|
54
|
+
- ❌ **禁 AI 万能文案 / emoji**:不写「让我们一起了解…」「✨核心亮点」这类填充话术。
|
|
55
|
+
|
|
56
|
+
## 视觉方向决策块示例
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
### 【视觉方向决策】
|
|
60
|
+
- 页面类型:detail(用户诉求是"商品详情页,展示单个商品的全貌")
|
|
61
|
+
- 气质关键词:精致、有质感、克制
|
|
62
|
+
- 项目特定原则:① 主图必须完整展示不裁切;② 卖点/规格先于流水信息;③ 价格用大字 tabular-nums 当视觉锤
|
|
63
|
+
- 布局骨架(反模板叙事):主图+品名+价格(hero) → 核心卖点(3点) → 规格参数(分组) → 主内容左70%(详情描述) + 右30%(库存/操作) → 关联商品
|
|
64
|
+
- 信息密度:低-中(留白 + 字号跨度造质感)
|
|
65
|
+
- 视觉焦点:主图 + 品名 + 价格
|
|
66
|
+
|
|
67
|
+
### 【差异化 5 维】
|
|
68
|
+
1. 辅助/强调色:价格用点缀色强调(暖金=品质感),规格标签用中性;不满屏上色
|
|
69
|
+
2. 中性冷暖偏色:暖灰基底(商品展示的人文/质感气质)
|
|
70
|
+
3. 圆角性格:标准圆(现代、精致,主图卡片微圆不喧宾夺主)
|
|
71
|
+
4. 排版性格:品名大字 vs 参数小字跨度 ≥2.5×;价格 tabular-nums;大标题微收 letter-spacing
|
|
72
|
+
5. 装饰母题:章节起始细线 + 主图完整留白展示 + 非对称双栏(左详情右操作)
|
|
73
|
+
|
|
74
|
+
### 【反默认说明】
|
|
75
|
+
用暖灰 + 字号跨度 + 非对称叙事替代「灰白底 + 均匀字号 + 字段墙 + 每章配图标」,主图完整展示无发光——4 维偏离默认详情脸。
|
|
76
|
+
|
|
77
|
+
### 【图标策略】
|
|
78
|
+
内联 SVG,仅操作按钮(加购/收藏/分享)用图标;章节标题(卖点/规格/详情)纯文字不配装饰图标。
|
|
79
|
+
```
|