@manohub/ui 1.0.3 → 1.0.5
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/dist/components/card/index.d.ts +7 -8
- package/dist/components/dialog/index.d.ts +3 -3
- package/dist/components/dialog/index.js +3 -2
- package/dist/components/form/index.d.ts +54 -106
- package/dist/components/input/index.d.ts +35 -50
- package/dist/components/input/index.js +7 -10
- package/dist/components/page/index.d.ts +21 -28
- package/dist/components/panel/index.d.ts +6 -8
- package/dist/components/radio/index.d.ts +11 -14
- package/dist/components/select/index.d.ts +23 -35
- package/dist/components/table/index.d.ts +9 -9
- package/dist/components/tree/index.d.ts +16 -24
- package/dist/services/dialog.d.ts +3 -1
- package/dist/services/dialog.js +2 -0
- package/dist/styles/components/avatar.css +5 -7
- package/dist/styles/components/avatar.tokens.css +4 -9
- package/dist/styles/components/badge.css +3 -6
- package/dist/styles/components/badge.tokens.css +5 -17
- package/dist/styles/components/button.css +33 -57
- package/dist/styles/components/button.tokens.css +5 -14
- package/dist/styles/components/capsule.css +11 -20
- package/dist/styles/components/capsule.tokens.css +4 -9
- package/dist/styles/components/card.css +13 -24
- package/dist/styles/components/checkbox.css +9 -15
- package/dist/styles/components/checkbox.tokens.css +4 -9
- package/dist/styles/components/code-block.css +30 -40
- package/dist/styles/components/code-block.tokens.css +7 -20
- package/dist/styles/components/collapse.css +6 -10
- package/dist/styles/components/collapse.tokens.css +4 -9
- package/dist/styles/components/dialog.css +19 -27
- package/dist/styles/components/dialog.tokens.css +9 -9
- package/dist/styles/components/divider.css +9 -14
- package/dist/styles/components/divider.tokens.css +4 -9
- package/dist/styles/components/drawer.css +12 -16
- package/dist/styles/components/drawer.tokens.css +7 -9
- package/dist/styles/components/filter.css +13 -24
- package/dist/styles/components/form.css +76 -143
- package/dist/styles/components/form.tokens.css +9 -6
- package/dist/styles/components/input.css +80 -166
- package/dist/styles/components/input.tokens.css +5 -13
- package/dist/styles/components/layout.css +13 -29
- package/dist/styles/components/loading.css +6 -10
- package/dist/styles/components/loading.tokens.css +4 -9
- package/dist/styles/components/notice.css +1 -1
- package/dist/styles/components/notice.tokens.css +8 -6
- package/dist/styles/components/notification.css +9 -12
- package/dist/styles/components/notification.tokens.css +4 -12
- package/dist/styles/components/page.css +12 -22
- package/dist/styles/components/pagination.css +10 -15
- package/dist/styles/components/pagination.tokens.css +4 -9
- package/dist/styles/components/query-state.css +1 -1
- package/dist/styles/components/query-state.tokens.css +6 -0
- package/dist/styles/components/radio.css +10 -25
- package/dist/styles/components/radio.tokens.css +4 -9
- package/dist/styles/components/search.css +10 -18
- package/dist/styles/components/select.css +63 -109
- package/dist/styles/components/select.tokens.css +4 -12
- package/dist/styles/components/skeleton.css +4 -7
- package/dist/styles/components/skeleton.tokens.css +4 -9
- package/dist/styles/components/steps.css +9 -12
- package/dist/styles/components/steps.tokens.css +4 -12
- package/dist/styles/components/switch.css +5 -8
- package/dist/styles/components/switch.tokens.css +4 -9
- package/dist/styles/components/tabbar.css +10 -11
- package/dist/styles/components/tabbar.tokens.css +4 -9
- package/dist/styles/components/table.css +52 -86
- package/dist/styles/components/table.tokens.css +5 -6
- package/dist/styles/components/tag.css +13 -23
- package/dist/styles/components/tag.tokens.css +5 -11
- package/dist/styles/components/text.css +11 -23
- package/dist/styles/components/toast.css +11 -18
- package/dist/styles/components/toast.tokens.css +6 -9
- package/dist/styles/components/tooltip.css +9 -11
- package/dist/styles/components/tooltip.tokens.css +5 -9
- package/dist/styles/components/tree.css +14 -27
- package/dist/styles/components/tree.tokens.css +5 -6
- package/dist/styles/components/upload.css +8 -13
- package/dist/styles/components/upload.tokens.css +4 -9
- package/dist/styles/index.css +27 -50
- package/dist/styles/operations/collapse.css +12 -25
- package/dist/styles/operations/popup.css +41 -79
- package/dist/styles/operations/tabs.css +14 -32
- package/dist/styles/reset.css +0 -61
- package/package.json +2 -2
|
@@ -1,53 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Select —— 选择器(**自绘**,不封装 farris);同目录另出 `SelectTree`(树选择)。
|
|
3
3
|
*
|
|
4
|
-
* 本文件是选择器族的**组装层与出口**:`Select` 与 `SelectTree`
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* select-trigger.tsx 触发器内件(输入框的「触发器形态」)
|
|
12
|
-
* select-panel.tsx 面板壳内件(原生 popover + 搜索行 + 内容槽)
|
|
13
|
-
* select-list.tsx 选项列表体内件(平铺 / 分组 / 创建行 / 空态与加载行)
|
|
14
|
-
* select-tree.tsx 树体内件(SelectTree 的实现)
|
|
15
|
-
* select-tree-filter.ts 纯函数:树过滤与命中切分
|
|
16
|
-
* ```
|
|
17
|
-
*
|
|
18
|
-
* 拆件的收益是**规格只剩一份**:触发器(像输入框 / 清除位 / 箭头 / 键盘开面板)与面板壳
|
|
19
|
-
* (皮肤 / 定位档 / 显式锚 / 搜索行)在「列表形态」与「树形态」之间是同一份代码,改一处两处都跟着走。
|
|
20
|
-
* 面上仍是**一个** `styles/components/select.css`(一件的多种形态共用一份面与一个目录)。
|
|
4
|
+
* 本文件是选择器族的**组装层与出口**:`Select` 与 `SelectTree` 都只是把下面几个内件拼起来,内件一律不对外
|
|
5
|
+
* 导出(`src/index.ts` 只出这两个,成员不平级、也不挂点号):
|
|
6
|
+
* `select-shared.ts`(类型 / 面板 id / popover 开合 / 触发器键盘契约)、`select-trigger.tsx`(触发器内件)、
|
|
7
|
+
* `select-panel.tsx`(面板壳)、`select-list.tsx`(列表体)、`select-tree.tsx`(树体)、
|
|
8
|
+
* `select-tree-filter.ts`(纯函数:树过滤与命中切分)。
|
|
9
|
+
* 拆件的收益是**规格只剩一份**:触发器与面板壳在「列表形态」与「树形态」之间是同一份代码,改一处两处都
|
|
10
|
+
* 跟着走;面上仍是**一个** `styles/components/select.css`。
|
|
21
11
|
*
|
|
22
12
|
* ## 触发器的框不在本件
|
|
23
13
|
*
|
|
24
|
-
* 触发器 = 输入框的「触发器形态」(`<Input as="button">`,见 `select-trigger.tsx`):框 / 内距 /
|
|
25
|
-
*
|
|
26
|
-
*
|
|
14
|
+
* 触发器 = 输入框的「触发器形态」(`<Input as="button">`,见 `select-trigger.tsx`):框 / 内距 / 边 / 圆角 /
|
|
15
|
+
* 底 / 字 / hover / 聚焦 / 禁用 / 校验色与**清除位**、**右侧图标位**全部归输入面与它的表壳;本件只给选择器
|
|
16
|
+
* 自己的排版(值 / 标签 / 面板内容)。
|
|
27
17
|
*
|
|
28
18
|
* ## 浮层边界(与「popup 只给零 JS 面」的取舍一致)
|
|
29
19
|
*
|
|
30
|
-
* 面板走**原生 popover
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* 超出即面板内容区(`.mh-select__body`)滚动、搜索行常驻;列表与 `SelectTree` 两形态共用这一份。
|
|
20
|
+
* 面板走**原生 popover**(`<button popovertarget>` + `<div popover>`):开合 / Esc / 点外部关闭 / 顶层渲染 /
|
|
21
|
+
* 定位档全部由浏览器与 `styles/operations/popup.css` 承担,本件**不实现**第二套浮层行为(不做 JS 定位、
|
|
22
|
+
* 不做 resize 监听),只补原生做不到的:选中值回填、多选数组的增删与收纳、搜索过滤与「创建」项、键盘的
|
|
23
|
+
* 下拉导航(↑↓ 移动高亮行)。
|
|
24
|
+
* **面板有高度上限**:`--ui-select-panel-max-height`(默认 320px,钉在 `select.css` 的面板根上)—— 超出即
|
|
25
|
+
* 面板内容区(`.mh-select__body`)滚动、搜索行常驻;列表与 `SelectTree` 两形态共用这一份。
|
|
37
26
|
*
|
|
38
27
|
* ## 键盘与高亮(焦点**留在触发器上**)
|
|
39
28
|
*
|
|
40
|
-
* 面板里的选项是 `div[role='option']`、**不是 button
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* 「创建 xxx」行,顺序由 `activatableOptions()` 一处给。
|
|
29
|
+
* 面板里的选项是 `div[role='option']`、**不是 button**、也不可聚焦:高亮位由本件持有(可激活项里的格号),
|
|
30
|
+
* 列表体据此下发 `data-active`,触发器上的 `aria-activedescendant` 指到那一行的 id —— 原生 popover 下的
|
|
31
|
+
* 「虚拟焦点」标准表达。两条入口共用同一份模型:触发器(`↑` / `↓` 开面板并平移、`Enter` / `Space` 提交高亮
|
|
32
|
+
* 项)与面板内的搜索行(`↑` / `↓` / `Enter` 冒泡到面板)。可激活项 = 摊平 + 跳过禁用项 +(可创建时)末尾
|
|
33
|
+
* 那一格「创建 xxx」行,顺序由 `activatableOptions()` 一处给。
|
|
46
34
|
*
|
|
47
35
|
* ## 状态三源等价
|
|
48
36
|
*
|
|
49
|
-
* 选中行 = `[data-state='selected']`(组件下发)/ 原生 `input:checked`(静态页零 JS 路径)/
|
|
50
|
-
*
|
|
37
|
+
* 选中行 = `[data-state='selected']`(组件下发)/ 原生 `input:checked`(静态页零 JS 路径)/ `.is-selected`
|
|
38
|
+
* (规格冻结档),样式层只写一份声明(见 `select-list.tsx`)。
|
|
51
39
|
*
|
|
52
40
|
* @example 单选
|
|
53
41
|
* <Select options={opts} modelValue={v} placeholder="请选择" onChange={setV} />
|
|
@@ -98,19 +98,19 @@ export interface TablePagination {
|
|
|
98
98
|
*
|
|
99
99
|
* ## 这个组件负责什么、不负责什么(都是刻意的)
|
|
100
100
|
*
|
|
101
|
-
* **负责**:把 `columns` × `data`
|
|
102
|
-
* 组件 —— 它内部才是真实 `<input type="checkbox">`,故面上的
|
|
103
|
-
* 零 JS 路径仍成立;选择器**限定在勾选列内**,否则功能列的
|
|
104
|
-
*
|
|
101
|
+
* **负责**:把 `columns` × `data` 渲成表格;列对齐 / 宽度 / 省略 / 必填;行选中(勾选列复用本包的
|
|
102
|
+
* `Checkbox` 组件 —— 它内部才是真实 `<input type="checkbox">`,故面上的
|
|
103
|
+
* `tr:has(.mh-table__col-check input:checked)` 零 JS 路径仍成立;选择器**限定在勾选列内**,否则功能列的
|
|
104
|
+
* `Switch` 也会把整行点亮);展开行;排序按钮的**状态与事件**;加载态与空态;分页条的排布与事件透传;
|
|
105
105
|
* `rowClass` / `onRow` 让调用方标分组行、禁用行与挂行级点击。
|
|
106
106
|
*
|
|
107
107
|
* **不负责**:
|
|
108
108
|
*
|
|
109
|
-
* -
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* - **分页切片**:`pagination`
|
|
113
|
-
*
|
|
109
|
+
* - **排序算法归调用方**(列宽拖拽同理):规范只给了 `↕` 字形与拖拽线两处视觉,而 `↕` 是文字符号(本包禁
|
|
110
|
+
* 拿文字符号冒充图标),故朝向改用现成字形 `chevron-up` / `chevron-down` 表达 —— 本件发 `sort` 事件、
|
|
111
|
+
* 画态,真正排序 / 改列宽由调用方决定(它有数据、也知道业务口径);
|
|
112
|
+
* - **分页切片**:`pagination` 只渲染分页条并透传页码事件,**`data` 始终是当前页数据** —— 组件自己切片会
|
|
113
|
+
* 让「服务端分页」与「客户端分页」两套口径藏在同一个 prop 里;
|
|
114
114
|
* - **错误态**:归 `QueryState`(表格只管列数据)。
|
|
115
115
|
*
|
|
116
116
|
* @example 基本列表(表默认满宽;列宽给权重 + `fixed` 才严格按比例)
|
|
@@ -8,32 +8,24 @@ export interface TreeNode {
|
|
|
8
8
|
*
|
|
9
9
|
* ## 视觉与几何规范来源
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* 对齐主题包的 Tree(令牌 + 标记):节点行高 30(紧凑档 28)、圆角 6、字号 13、滑过 Ne11、点击瞬态
|
|
12
|
+
* `#F4F5F9`、选中 Au02 底 + Th03 字、箭头 8px(收起态转 −90°)、缩进 = 基础内距 8 + level × 步进 10
|
|
13
|
+
* (**无上限**)。两处与主题包**有意差异**(不改视觉,只改承载方式):
|
|
14
|
+
* 1. **缩进步进由 CSS 变量承载**:主题包用 typed `attr(data-level type(<number>))` 一步算出;本组件同时
|
|
15
|
+
* 下发 `data-level`(数据、供 CSS / 测试钩子)与 `--mh-tree-level`(公式仍在 CSS 内),不用行内
|
|
16
|
+
* `paddingLeft` —— 那样步进值散落在 JS 里,改了令牌对不上。
|
|
17
|
+
* 2. **交互分工**:主题包的约定是「点行即展开 / 收拢,选中由行内选择件驱动」;本组件没有内嵌选择件,故
|
|
18
|
+
* 沿用「点箭头展开 / 收拢、点行选中」(`onSelect`)。
|
|
14
19
|
*
|
|
15
|
-
*
|
|
16
|
-
* 1. **缩进步进由 CSS 变量承载**:主题包用 typed `attr(data-level type(<number>))` 一步算出;
|
|
17
|
-
* 为兼容尚无该能力的引擎,本组件同时下发 `data-level`(数据、供 CSS/测试钩子)与
|
|
18
|
-
* `--mh-tree-level`(公式仍在 CSS 内,见 components.css)。不用行内 paddingLeft —— 那样
|
|
19
|
-
* 步进值就散落在 JS 里,改了令牌对不上。
|
|
20
|
-
* 2. **交互分工**:主题包的约定是「点行即展开/收拢,选中由行内选择件驱动」;本组件没有内嵌选择件,
|
|
21
|
-
* 故沿用「点箭头展开/收拢、点行选中」(`onSelect`)—— 消费方靠 `onSelect` 拿选中,展开态受控。
|
|
20
|
+
* ## 为什么自建
|
|
22
21
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* farris
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* 与 ② 直接冲突(重挂必然丢展开态);缩进又要按设计稿精确控制(③)。因此按计划
|
|
31
|
-
* 登记的退路改为自建:契约完整(含受控展开态)、零 farris 耦合、可在无浏览器环境测试。
|
|
32
|
-
*
|
|
33
|
-
* ## 与数据变化的关系
|
|
34
|
-
*
|
|
35
|
-
* 自建后**不需要**「nodes 变就重建」这种逃生舱:渲染直接跟随 `nodes`,
|
|
36
|
-
* 展开态由 `expandedKeys`(受控)或内部状态(非受控)持有,数据刷新不会改变展开态。
|
|
22
|
+
* farris `FTreeView` 实测:① 列模板式网格(节点内容可用 `columnTemplate` 承载);② **只在挂载时填充一次
|
|
23
|
+
* 可见行,data 变化不刷新**(唯一兜底是 `key` 强制重挂 —— 那会丢展开态);③ 层级缩进不可控、节点图标走
|
|
24
|
+
* farris 图标字体类。而本组件的硬需求是「数据更新时**不丢**已展开节点 / 滚动位置 / 焦点」,与 ② 直接冲突
|
|
25
|
+
* (重挂必然丢展开态),缩进又要按设计稿精确控制(③)。故自建:契约完整(含受控展开态)、零 farris 耦合、
|
|
26
|
+
* 可在无浏览器环境测试。
|
|
27
|
+
* 与数据变化:**不需要**「nodes 变就重建」这种逃生舱 —— 渲染直接跟随 `nodes`,展开态由 `expandedKeys`
|
|
28
|
+
* (受控)或内部状态(非受控)持有,数据刷新不改变展开态;`treeKey` 仅作极端场景的强制重挂出口。
|
|
37
29
|
* `treeKey` 仅作为极端场景的强制重挂出口保留。
|
|
38
30
|
*
|
|
39
31
|
* ## 行尾操作区(`renderActions`)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DialogTone } from '../components/dialog';
|
|
1
|
+
import { type DialogTone, type DialogWidth } from '../components/dialog';
|
|
2
2
|
export interface ConfirmOptions {
|
|
3
3
|
/** 标题(缺省不渲染页头,只剩内容与底栏) */
|
|
4
4
|
title?: string;
|
|
@@ -11,6 +11,8 @@ export interface ConfirmOptions {
|
|
|
11
11
|
* (除非显式给了 `okDanger`),这样「删除确认」与「保存成功」不再长得一样。
|
|
12
12
|
*/
|
|
13
13
|
tone?: DialogTone;
|
|
14
|
+
/** 面板宽度档:**缺省 `'sm'`(400)**,比 `Dialog` 的 `md` 档窄一档 */
|
|
15
|
+
width?: DialogWidth | number;
|
|
14
16
|
/** 确定按钮文案 */
|
|
15
17
|
okText?: string;
|
|
16
18
|
/** 取消按钮文案(`alert` 不使用) */
|
package/dist/services/dialog.js
CHANGED
|
@@ -40,6 +40,7 @@ function confirm(options = {}) {
|
|
|
40
40
|
open: ctx.isOpen(),
|
|
41
41
|
title: options.title,
|
|
42
42
|
tone: options.tone,
|
|
43
|
+
width: options.width || "sm",
|
|
43
44
|
closable: options.closable ?? true,
|
|
44
45
|
// 组件形态默认已开(跟主流);命令式这一层显式关掉,防误点丢决策
|
|
45
46
|
closeOnBackdrop: false,
|
|
@@ -63,6 +64,7 @@ function alert(options = {}) {
|
|
|
63
64
|
open: ctx.isOpen(),
|
|
64
65
|
title: options.title,
|
|
65
66
|
tone: options.tone,
|
|
67
|
+
width: options.width || "sm",
|
|
66
68
|
closable: options.closable ?? true,
|
|
67
69
|
closeOnBackdrop: false,
|
|
68
70
|
maskClosable: false,
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Avatar —— 头像(四档尺寸 / 文字 / 图标 / 占位 / 方角 / 带框 / 计数 / 头像组 / 角标)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (实测四档 24 / 36 / 60 / 80;字母底色取主色;角标高 20 白描边)。
|
|
4
|
+
* 出处:规范(实测四档 24 / 36 / 60 / 80;字母底色取主色;角标高 20 白描边)。
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 2. **头像组靠负边距堆叠**(`.mh-avatar-group`),每个头像带 2px 的底描边把相邻项隔开。
|
|
6
|
+
* 两条硬结论(改前先读):① **圆形裁切归图片自身,容器不裁** —— 角上的角标(`__badge`)与徽章
|
|
7
|
+
* (`__chip`)是绝对定位件,容器若带 `overflow: hidden` 会沿圆弧把它们各切掉一半(实测反馈),故容器
|
|
8
|
+
* `overflow: visible`、图片用 `border-radius: inherit` 跟着形态自裁;② **头像组靠负边距堆叠**
|
|
9
|
+
* (`.mh-avatar-group`),每项带 2px 底描边把相邻项隔开。
|
|
12
10
|
*/
|
|
13
11
|
.mh-avatar {
|
|
14
12
|
display: inline-flex;
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `avatar.css` 顶部):这些是**基础值**,锚在
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
11
6
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
7
|
+
* 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
|
|
8
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
|
|
9
|
+
* 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
10
|
+
*/
|
|
16
11
|
[data-manohub-ui] {
|
|
17
12
|
/* 单件令牌(只服务本件;跨件令牌才进 theme/) */
|
|
18
13
|
--ui-avatar-size-sm: 24px;
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Badge(徽标 /
|
|
2
|
+
* Badge(徽标 / 标签)。出处:规范 `badge.css`(徽标高 20 / 胶囊)与 `tag.css`(标签片几何)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 按设计稿收敛为 tone × shape × size × dot 的正交组合:每个 tone 先铺一组局部变量(前景 / 底色 /
|
|
5
|
+
* 描边 / 圆点),形态类只决定「用哪几个变量」。
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
|
-
/* ===== Badge(徽标 / 标签)=====
|
|
8
|
-
批次 5 前 4 个应用各自手搓徽标,这里按设计稿收敛为 tone × shape × size × dot 的正交组合。
|
|
9
|
-
每个 tone 先铺一组局部变量(前景 / 底色 / 描边 / 圆点),形态类只决定「用哪几个变量」。 */
|
|
10
|
-
|
|
11
8
|
.mh-badge {
|
|
12
9
|
--mh-badge-fg: var(--ui-base-content);
|
|
13
10
|
--mh-badge-bg: transparent;
|
|
@@ -1,22 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* badge ——
|
|
2
|
+
* badge —— 单件令牌(**基础值**;只服务本件,故不随主题进 `@manohub/theme`)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值、组内间距变 0)。
|
|
11
|
-
*
|
|
12
|
-
* 本件为什么需要本文件:`Badge` 有**两个互不嵌套的根类** —— `.mh-badge`(内容徽标 / 数字角标)
|
|
13
|
-
* 与 `.mh-badge--status`(状态点 + 文字,它不带 `.mh-badge`)。前置点与状态点共用同一枚
|
|
14
|
-
* 光学对齐位移,声明在任何**根类**上都到不了另一个根(自定义属性只向下继承),故按本仓口径
|
|
15
|
-
* 落到容器锚上。
|
|
16
|
-
*
|
|
17
|
-
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
18
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
19
|
-
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
4
|
+
* 本件有两个**互不嵌套的根类**:`.mh-badge`(内容徽标 / 数字角标)与 `.mh-badge--status`(状态点 + 文字,
|
|
5
|
+
* 不带 `.mh-badge`)—— 前置点与状态点共用同一枚光学对齐位移,声明在任何根类上都到不了另一个根,故按本仓
|
|
6
|
+
* 口径落到容器锚 `[data-manohub-ui]` 上(容器是每个分件的祖先,分件都取得到值)。
|
|
7
|
+
* ⚠️ 档位改写留在面文件的修饰符块里(搬来会失效);新增组件登记两处:本文件 + `src/styles/index.css`。
|
|
20
8
|
*/
|
|
21
9
|
[data-manohub-ui] {
|
|
22
10
|
/* 前置点 / 状态点的**光学对齐**位移(数字见面文件 `__dot` 一节:盒居中读起来偏高)。 */
|
|
@@ -1,30 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Button —— 自绘按钮族(六型 + 三档真实尺寸 + 外形 / 危险色 / 整宽修饰 + 加载 + 图标/文本/菜单形态 + 组容器 + 菜单皮肤)。
|
|
3
3
|
*
|
|
4
|
-
* 出处(几何以设计稿《MH后台-0911
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 虚线 = 区域内添加,文本 = 行内操作,图标 = 方形热区;菜单按钮 = 文本区 ‖ 分割线 ‖ 箭头区。
|
|
4
|
+
* 出处(几何以设计稿《MH后台-0911》品牌页为准):控件高 **32** / 内距 **12** / 图文距 **4** /
|
|
5
|
+
* 圆角 **6** / 字号 **14/18 w400** / 组间距 8;主要 = 主色实底**无投影**(`0:3897`);
|
|
6
|
+
* 次要 = 白底 + `#e6e6e6` 描边 + **中性字色**(`0:3892`);禁用 = `#f2f2f2` 底 + `#888888` 字;
|
|
7
|
+
* 小号 24 / 大号 40(设计未覆盖,沿用);图标槽 = 全局图标档;加载环 14 · 0.8s linear;
|
|
8
|
+
* 虚线 = 区域内添加,文本 = 行内操作,图标 = 方形热区;菜单按钮 = 文本区 ‖ 分割线 ‖ 箭头区。
|
|
10
9
|
*
|
|
11
|
-
* **色彩槽位走局部变量**(`--ui-button-accent*`):六型只描述「底 / 边 /
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* **色彩槽位走局部变量**(`--ui-button-accent*`):六型只描述「底 / 边 / 字的取用位置」,具体颜色由
|
|
11
|
+
* 槽位变量给 ⇒ 危险色只是把槽位换成错误色,`danger` 与任意型**天然正交**,hover / active / 加载态
|
|
12
|
+
* 一并跟随(本文件的核心结构)。
|
|
14
13
|
*
|
|
15
|
-
* **高度三档全部吃主题令牌**(`--ui-control-height-sm
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* 自绘件服务「不装 farris」的场景:静态页 / 其他框架 / 微前端里不带 farris 的子应用。
|
|
21
|
-
*
|
|
22
|
-
* **投影**:主要与次要两型**不再带投影**(设计稿的按钮是平的,节点上无 effects)。
|
|
23
|
-
* 图标型的 hover 光晕仍引用 `--ui-shadow-card-hover` —— 那是 hover 反馈,不是静止装饰,
|
|
24
|
-
* 且投影一律走令牌、不新造字面量(与 shadows.css「拟物重投影一律收敛到令牌」的口径一致)。
|
|
25
|
-
*
|
|
26
|
-
* 边界(有意不做):规范的 `.btn-seg`(分段按钮,原生同名 radio 驱动)**不在这里实现** ——
|
|
27
|
-
* 它的用途(一组互斥选项的轻量选择器)由 `capsule` 族承担,重复实现会出现两套分段控件。
|
|
14
|
+
* **高度三档全部吃主题令牌**(`--ui-control-height-sm|-md|-lg`,default 24 / 32 / 40):换主题即换尺寸。
|
|
15
|
+
* md 与 lg **不同高**:同高会让 `size` 沦为无视觉差别的语义标签。
|
|
16
|
+
* **投影**:主要与次要两型**不带投影**(设计稿的按钮是平的);图标型 hover 的光晕仍引用
|
|
17
|
+
* `--ui-shadow-card-hover` —— 那是 hover 反馈,不是静止装饰(投影一律走令牌)。
|
|
18
|
+
* 边界(有意不做):规范的 `.btn-seg`(分段按钮)**不在这里实现** —— 其用途由 `capsule` 族承担。
|
|
28
19
|
*/
|
|
29
20
|
|
|
30
21
|
/* 几何只挂在按钮本体上:令牌在同名 `.tokens.css`(锚 `[data-manohub-ui]`),几何若跟着挂会把容器也画成按钮 */
|
|
@@ -50,8 +41,7 @@
|
|
|
50
41
|
transition-timing-function: ease;
|
|
51
42
|
}
|
|
52
43
|
|
|
53
|
-
/* 危险色修饰:换槽位即可,六型与各自 hover / active 一并跟随
|
|
54
|
-
(`--ui-button-accent-soft` 随无消费者的孤令牌一并撤除,2026-09-30) */
|
|
44
|
+
/* 危险色修饰:换槽位即可,六型与各自 hover / active 一并跟随 */
|
|
55
45
|
.mh-button--danger {
|
|
56
46
|
--ui-button-accent: var(--ui-error);
|
|
57
47
|
--ui-button-accent-hover: color-mix(in srgb, var(--ui-error) 88%, black);
|
|
@@ -130,8 +120,7 @@
|
|
|
130
120
|
}
|
|
131
121
|
|
|
132
122
|
/* ===== 主要:主色实底(**无投影**) =====
|
|
133
|
-
设计实证:`0:3897` 是纯 `#2660ff` 实底 + r6,节点上没有任何 effects。
|
|
134
|
-
改前挂的 `--ui-shadow-card-hover` 会让按钮在设计里「浮起来」,属多余装饰。 */
|
|
123
|
+
设计实证:`0:3897` 是纯 `#2660ff` 实底 + r6,节点上没有任何 effects。 */
|
|
135
124
|
.mh-button--primary {
|
|
136
125
|
background: var(--ui-button-accent);
|
|
137
126
|
color: var(--ui-button-accent-content);
|
|
@@ -147,8 +136,7 @@
|
|
|
147
136
|
|
|
148
137
|
/* ===== 次要:白底描边 + **中性字色**(无投影) =====
|
|
149
138
|
设计实证:`0:3892` = 白底 + `#e6e6e6` 描边 + r6 + 文本 `#1a1a1a`(**中性**,不是主色蓝)。
|
|
150
|
-
|
|
151
|
-
与设计的「黑字平贴」观感不同。白底按钮在浅色页面上本就靠描边成形,**不需要投影**。 */
|
|
139
|
+
白底按钮在浅色页面上本就靠描边成形,**不需要投影**。 */
|
|
152
140
|
.mh-button--secondary {
|
|
153
141
|
background: var(--ui-base-100);
|
|
154
142
|
border: 1px solid var(--ui-base-300);
|
|
@@ -167,9 +155,7 @@
|
|
|
167
155
|
|
|
168
156
|
/* ===== 虚线:区域内添加内容 =====
|
|
169
157
|
* 虚线取 `--ui-line-dashed`(= `base-400`,比实线深一档):同样粗细下虚线的墨迹只有实线的一半,
|
|
170
|
-
* 取实线色(`base-300
|
|
171
|
-
* 这条口径 2026-09-30 一天内翻过一次:早些时候按「线框色只留一套」把虚线也收敛到 `base-300`,
|
|
172
|
-
* 当日晚按实机观感反转 —— 定稿见 `@manohub/theme` 的 `default/colors.css` 头「三条口径」第 2 条。 */
|
|
158
|
+
* 取实线色(`base-300`)会明显偏浅、整条框看着发虚(口径见 theme 的 `default/colors.css` 第 2 条)。 */
|
|
173
159
|
.mh-button--dashed {
|
|
174
160
|
background: var(--ui-base-100);
|
|
175
161
|
border: 1px dashed var(--ui-line-dashed);
|
|
@@ -256,15 +242,12 @@
|
|
|
256
242
|
color: color-mix(in srgb, var(--ui-error) 88%, black);
|
|
257
243
|
}
|
|
258
244
|
|
|
259
|
-
/* ===== 禁用(各类通用;用专用令牌而非 opacity,避免禁用态被底色影响)
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
* —— 点击前后只有「文字 → 环」这一处变化,不换底 / 不换边 / 不换字。不排除的话,禁用档
|
|
266
|
-
* (2 个类)会压过 `.mh-button--loading`(1 个类),全屏最显眼的主操作会在点下去的一瞬间
|
|
267
|
-
* 整块变成禁用灰,观感突兀(浏览器实测过:底 `rgb(241,242,245)` + 灰字 + 灰边)。 */
|
|
245
|
+
/* ===== 禁用(各类通用;用专用令牌而非 opacity,避免禁用态被底色影响) =====
|
|
246
|
+
* 描边走 **inset 阴影而不是 `border`**:`border: 1px` 会把「无边框」的常态按钮撑宽 2px,按钮一进禁用就在
|
|
247
|
+
* 底栏里抖一下 —— inset 阴影画的还是同一圈 1px、位置也一致,但元素尺寸不变。
|
|
248
|
+
* **加载态排除在外**(`:not()`):`loading` 虽也置原生 disabled(吞点击),但**外观保持本型** —— 点击前后
|
|
249
|
+
* 只有「文字 → 环」这一处变化。不排除的话禁用档(2 个类)会压过 `.mh-button--loading`(1 个类),最显眼的
|
|
250
|
+
* 主操作会在点下去的一瞬间整块变成禁用灰(实测灰底 + 灰字 + 灰边)。 */
|
|
268
251
|
.mh-button:disabled:not(.mh-button--loading),
|
|
269
252
|
.mh-button.is-disabled:not(.mh-button--loading),
|
|
270
253
|
.mh-button[aria-disabled='true']:not(.mh-button--loading) {
|
|
@@ -292,18 +275,13 @@
|
|
|
292
275
|
|
|
293
276
|
/* ===== 加载(**本型外观 + 主色降透明 + 环**) =====
|
|
294
277
|
*
|
|
295
|
-
*
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
*
|
|
299
|
-
*
|
|
300
|
-
*
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
* 其余五型(`secondary` / `dashed` / `text` / `link` / `icon`)的「主色」在描边或字上,
|
|
304
|
-
* 底本来就是白的或透明的 —— 再降一档只会把边与字读淡,故它们加载时**外观完全不变**,只多一个环。
|
|
305
|
-
* 环取 **`currentColor`**:一条规则自动跟上六型与 `danger`(实底型白环、浅底与图标型本型字色环、
|
|
306
|
-
* 透明底型主色环),既不必逐型特判,也不额外引令牌。 */
|
|
278
|
+
* 加载态不改色彩角色(`primary` 还是主色、`danger` 还是错误色、`secondary` 还是白底黑字)—— 只是实底型的
|
|
279
|
+
* **主色底**按 `--ui-button-loading-mix` 与面板色显式合成一档更淡的同色:忙碌时的按钮该是「同一个按钮淡了
|
|
280
|
+
* 一点点、在转圈」,而不是换一副面孔。
|
|
281
|
+
* **为什么显式合成而不是 `opacity`**:`opacity` 压的是整块,连文案与加载环一起淡,而忙碌时的文案恰恰要读得
|
|
282
|
+
* 清;写成 `color-mix(主色 × mix, 面板色)` 只让**底**淡一档(也别用覆盖层:主色实底上再盖一层同色半透明
|
|
283
|
+
* 等于什么都没做)。其余五型的「主色」在描边或字上、底本就是白或透明 ⇒ 加载时**外观完全不变**,只多一个环。
|
|
284
|
+
* 环取 **`currentColor`**:一条规则自动跟上六型与 `danger`,不必逐型特判、也不额外引令牌。 */
|
|
307
285
|
.mh-button--loading {
|
|
308
286
|
cursor: not-allowed; /* 禁用档被排除了,`:disabled` 那条已不匹配它 */
|
|
309
287
|
}
|
|
@@ -332,9 +310,8 @@
|
|
|
332
310
|
}
|
|
333
311
|
|
|
334
312
|
/* ===== 下拉箭头槽 =====
|
|
335
|
-
* **只给槽位尺寸,不给字形**:字形由 `@manohub/icon` 的 `<Icon name="chevron-down">`
|
|
336
|
-
*
|
|
337
|
-
* 故组件把两个类同时挂在图标上:`class="mh-button__caret mh-popup-caret"`。 */
|
|
313
|
+
* **只给槽位尺寸,不给字形**:字形由 `@manohub/icon` 的 `<Icon name="chevron-down">` 画,展开时的转向
|
|
314
|
+
* 由操作层 `popup.css` 的 `.mh-popup-caret` 承担(本件不定义第二份 mask / 第二处转向)。 */
|
|
338
315
|
.mh-button__caret {
|
|
339
316
|
flex: none;
|
|
340
317
|
width: var(--ui-button-icon-size);
|
|
@@ -439,8 +416,7 @@
|
|
|
439
416
|
.mh-button__menu {
|
|
440
417
|
width: 130px;
|
|
441
418
|
padding: var(--ui-space-1) 6px;
|
|
442
|
-
/*
|
|
443
|
-
投影取锚定浮层档(`--ui-shadow-popover`),不是居中浮层档。 */
|
|
419
|
+
/* 圆角取容器档(不写硬编码 px,改版时才会跟随);投影取锚定浮层档,不是居中浮层档 */
|
|
444
420
|
border-radius: var(--ui-radius-md);
|
|
445
421
|
background: var(--ui-base-100);
|
|
446
422
|
box-shadow: var(--ui-shadow-popover);
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 单件令牌(只服务本件,故不进 `@manohub/theme`)。
|
|
3
3
|
*
|
|
4
|
-
* **本件有一批令牌是「跨分件消费」的**:`--ui-button-group-gap` 归组容器 `.mh-button__group
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* 改前靠「把令牌同时声明在 4 个外层类上」的 workaround 兜(历史症状:组内间距变 0、
|
|
10
|
-
* 组内分割线高度 0、连体切换与菜单项圆角 0);锚到容器后,**容器是每个分件的祖先**,
|
|
11
|
-
* 这类 workaround 整块撤掉 —— 这正是本文件从面文件里抽出来的直接原因。
|
|
12
|
-
*
|
|
13
|
-
* ## 抽出说明
|
|
14
|
-
* 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
|
|
15
|
-
* 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
|
|
16
|
-
* 「声明在某个组件根类上」这条脆弱假设。
|
|
4
|
+
* **本件有一批令牌是「跨分件消费」的**:`--ui-button-group-gap` 归组容器 `.mh-button__group`、组内分割线
|
|
5
|
+
* 高度与菜单项圆角归 `.mh-button__menu`(popover 面板,与按钮**兄弟**、不在它的子树里)—— 自定义属性只
|
|
6
|
+
* 向下继承,声明在 `.mh-button` 上这类分件取不到值(声明作废且不报错)。锚到容器后**容器是每个分件的
|
|
7
|
+
* 祖先**,「把令牌同时声明在 4 个外层类上」那类 workaround 整块撤掉 —— 这正是本文件抽出来的原因。
|
|
17
8
|
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
|
|
18
9
|
*/
|
|
19
10
|
[data-manohub-ui] {
|
|
@@ -1,30 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Capsule —— 胶囊选择器(一组互斥选项,选中项白底胶囊浮在轨道上)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 1px 4px 主色投影;未选字 Te05、滑过转主色、禁用 Te07;轨道底 Au04)。
|
|
4
|
+
* 出处:规范(轨道 32 高 / 内距 2 / 项 28 高 / 项内距 14 / 字号 14 / 圆角全;选中 = 白底 + 主色字 +
|
|
5
|
+
* medium + `1px 4px` 主色投影;未选字 Te05、滑过转主色、禁用 Te07;轨道底 Au04)。
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* 两档只差圆角令牌一处,其余几何与颜色一律不变。
|
|
7
|
+
* **外形档**:规范只有「圆角全」;`.mh-capsule--square` 是本仓新增的圆角矩形档(与方角控件并排排版时用),
|
|
8
|
+
* 圆角取**复选框档**令牌 `--ui-radius-sm`(比控件档更方,值随主题变)。两档只差圆角令牌一处。
|
|
11
9
|
*
|
|
12
10
|
* **操作是原生的**:一组同名 radio —— 开关与项**平级相邻、开关在前**,开关由本族隐身但保持可聚焦
|
|
13
|
-
* (Tab
|
|
11
|
+
* (Tab 进组、方向键换项、空格选中),焦点环画在可见项上。
|
|
12
|
+
* 状态三源等价:原生 `input:checked` / `[data-state='active']` / 静态档 `.is-selected`。
|
|
13
|
+
* **与面板组合**:要「选中即切面板」就把它塞进 `Tabs` 的 `selector` 插槽 —— 面板显隐由 `Tabs` 按受控值
|
|
14
|
+
* 下发 `hidden`,两层零互指。(`Tabs` 是操作层骨架、不带面;本件是带自己轨道与选中胶囊的选择控件。)
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* 面板显隐由 `Tabs` 按受控值下发 `hidden`,本族不认识它、它也不认识本族(两层零互指)。
|
|
19
|
-
*
|
|
20
|
-
* **与 `Tabs` 的判据**:`Tabs` 是操作层的**骨架**(只给根、面板组与收起态,不带面),
|
|
21
|
-
* 面可由本件或按钮族的分段形态担任;本件是**带自己轨道与选中胶囊的轻量选择控件**。
|
|
22
|
-
*
|
|
23
|
-
* **轨道按内容宽收缩,不被父级拉宽**(缺省档口径的第二半)—— `align-self: flex-start` 就是为这条而写:
|
|
24
|
-
* 父级若是**列向弹性**(典型是 `Tabs` 的根 `.mh-tabs`),交叉轴缺省 `stretch` 会把唯一的子项拉成通栏,
|
|
25
|
-
* 轨道底随之变成一条长胶囊(实测:内容 112px 的轨道被拉到 638px);`TabBar` 同样被拉满,但它规范里
|
|
26
|
-
* 第 1 条就是「不画轨线」,没有底色,肉眼看不出来。要**主动**撑满仍然走 `block` 档 —— 那条
|
|
27
|
-
* `width: 100%` 是显式宽度,`align-self` 管不着它(撑满与否只由 `block` 决定)。
|
|
16
|
+
* **轨道按内容宽收缩,不被父级拉宽** —— `align-self: flex-start` 就是为这条而写:父级若是列向弹性
|
|
17
|
+
* (典型是 `.mh-tabs` 根),交叉轴缺省 `stretch` 会把唯一的子项拉成通栏,轨道底随之变成一条长胶囊
|
|
18
|
+
* (实测:内容 112px 被拉到 638px)。要**主动**撑满仍走 `block` 档(`width: 100%` 是显式宽度)。
|
|
28
19
|
*/
|
|
29
20
|
.mh-capsule {
|
|
30
21
|
display: inline-flex;
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `capsule.css` 顶部):这些是**基础值**,锚在
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
11
6
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
|
|
7
|
+
* 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
|
|
8
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
|
|
9
|
+
* 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
10
|
+
*/
|
|
16
11
|
[data-manohub-ui] {
|
|
17
12
|
/* 单件令牌(项高 28 + 内距 2×2 = 轨道 32,与规范实测一致) */
|
|
18
13
|
--ui-capsule-height: 32px;
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)—— **卡片外观的唯一实现**。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* 出处:规范 `components/card.css`(圆角 8 · 内距 20 · 弱描边)+ portal 技能市场卡片实测,逐项落令牌:
|
|
5
|
+
* 圆角 8 / 内距 20(原型 p-5)/ 底 `base-100` / 弱描边 `base-300` / 悬浮主色描边 + 主色 12% 阴影。
|
|
6
|
+
* 卡片外观在本仓**只有这一处定义**:消费方(含 `ListView.CardItem`)不得自绘这四类属性。
|
|
5
7
|
*/
|
|
6
8
|
|
|
7
|
-
/* ===== Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)=====
|
|
8
|
-
几何来源:portal 技能市场卡片实测(apps/portal/src/views/skills/index.tsx 的 SkillCard),
|
|
9
|
-
逐项落令牌:圆角 8(原型 rounded-lg)、内距 20(原型 p-5)、
|
|
10
|
-
底 Ne12/base-100、弱描边 base-300(原型 border-border)、
|
|
11
|
-
悬浮主色描边 + 主色 12% 阴影(原型 hover:border-primary + hover:shadow-[0_4px_10px_…])。
|
|
12
|
-
卡片外观在本仓**只有这一处定义**:消费方(含 ListView.CardItem)不得自绘这四类属性。 */
|
|
13
|
-
|
|
14
9
|
.mh-card {
|
|
15
10
|
/* 组件变量先铺一层,形态类只决定用哪几个(同 .mh-badge 手法) */
|
|
16
11
|
--mh-card-bg: var(--ui-base-100);
|
|
@@ -29,23 +24,17 @@
|
|
|
29
24
|
}
|
|
30
25
|
|
|
31
26
|
/* ===== 内距归属(改这几条规则前务必先读)=====
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* 3. **卡片下沿由最后一段补**(下方那条 `:last-child` 规则):段不吃下边,底边得有人兜。
|
|
39
|
-
* 段的位置由组件保证(裸内容自动成段、封面不吃内距也不是段),故 `:last-child` 必定落在段上。
|
|
27
|
+
* 1. **根件不出内距**:根件只出面(底 / 描边 / 圆角),也不出段间距 —— 否则与段的内距叠成两层留白
|
|
28
|
+
* (故面无「根件让出内距」的修饰类)。
|
|
29
|
+
* 2. **段的纵向只吃上边**(`padding-block-start`):一段只负责**与自己上方之间的距离**,下一段的上内距就是
|
|
30
|
+
* 「段间距」。于是头部 + body、body + footer 相邻时**不会**叠成两份(各吃四边就成了 20 + 20 = 40)。
|
|
31
|
+
* 3. **卡片下沿由最后一段补**(下方那条 `:last-child` 规则):段不吃下边,底边得有人兜;段的位置由组件保证
|
|
32
|
+
* (裸内容自动成段、封面不吃内距也不是段),故 `:last-child` 必定落在段上。
|
|
40
33
|
* 4. 横向每段恒吃 `--mh-card-padding`(`padding-inline`)。
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* 要保留兜底就不要给那一段传 `padding`。
|
|
46
|
-
*
|
|
47
|
-
* 直接写的内容(没包 `Card.Body` 的裸子节点)由组件自动补一层 Body,所以
|
|
48
|
-
* 「不给分件」(`<Card>正文</Card>`)与显式分段得到的是同一套几何。 */
|
|
34
|
+
* ⚠️ 2 / 3 / 4 是**不给 `padding` 时的缺省口径**:分件一旦显式传了 `padding`,组件就落行内样式
|
|
35
|
+
* (`{ y, x }` 两维都给时是 `padding: y x` 简写),**整段四边由消费方定价** —— 行内样式盖过这里的类规则,
|
|
36
|
+
* `:last-child` 的下沿兜底也随之失效(有意:显式给了就说得清)。要保留兜底就不要给那一段传 `padding`。
|
|
37
|
+
* 直接写的内容(没包 `Card.Body` 的裸子节点)由组件自动补一层 Body,故「不给分件」与显式分段得到同一套几何。 */
|
|
49
38
|
|
|
50
39
|
/* 头部:**分件 `Card.Header` 与 `Card` 上的内建头共用这一类**(四件:图标 / 标题 / 副标题 + 右端 extra)。
|
|
51
40
|
行 + 两端对齐:左「左侧区域」、右「extra」;四个位一个都不给时退化为纯自排容器。 */
|