@manohub/ui 1.0.4 → 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,18 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Page
|
|
3
|
-
* -
|
|
4
|
-
*
|
|
5
|
-
* - Body mode="scroll":自身 overflow-y auto(详情页长内容)
|
|
6
|
-
* - Body mode="plain":不滚(默认;滚动归区域内容区 / 内容件自持的定高容器)
|
|
7
|
-
* - Split:自身不滚,栏内滚动由内容承担(双栏内用 Panel 的 Body 滚)
|
|
2
|
+
* Page 页面骨架(滚动归属写死,调用方无法违反):`.mh-page` height 100% / 纵向 flex / 自身不滚,Header /
|
|
3
|
+
* Filter / Footer 一律 `flex-shrink: 0`;Body `mode="scroll"` 自身 `overflow-y: auto`(详情页长内容)、
|
|
4
|
+
* `mode="plain"`(默认)不滚;Split 自身不滚,栏内滚动由内容承担(双栏内用 Panel 的 Body 滚)。
|
|
8
5
|
*
|
|
9
|
-
* 页面级行只有 Filter / Header / Body / Footer
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 100vh 取 window 视口高度,宿主有顶栏即溢出。
|
|
14
|
-
*
|
|
15
|
-
* 与 panel.css 的分工:本文件是**页面级**(唯一),panel.css 是**区域级**(可多个)。
|
|
6
|
+
* 页面级行只有 Filter / Header / Body / Footer 四条:页头右侧的 `extra` **不是页面级行**,它的容器
|
|
7
|
+
* `.mh-page__header-extra` 就在 Header 内部。
|
|
8
|
+
* 统一 `height: 100%` 语义(**不用 100vh**):子应用被注入宿主容器,100vh 取 window 视口高度、宿主有顶栏即溢出。
|
|
9
|
+
* 与 `panel.css` 的分工:本文件是**页面级**(唯一),`panel.css` 是**区域级**(可多个)。
|
|
16
10
|
*/
|
|
17
11
|
|
|
18
12
|
.mh-page {
|
|
@@ -60,15 +54,11 @@
|
|
|
60
54
|
height: 26px;
|
|
61
55
|
}
|
|
62
56
|
|
|
63
|
-
/* 页头右侧自由位(Header 唯一可自定义位,对应 `extra` 属性 / 插槽):搜索框 / 按钮 /
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
本盒子的高度就等于内容高度(内容比标题行矮时会短一截),自己画背景 / 分隔线就会露出白边。
|
|
69
|
-
拉满后盒子高 = 内容行高(有副标题时同样跟着变高),内部仍按 `align-items: center` 垂直居中。
|
|
70
|
-
注意:这里只到「内容行」的上下边,页头条上下的 14 / 13px 留白是 .mh-page__header 的 padding,
|
|
71
|
-
在 inner 之外,子项不覆盖它(贴满整条要改版式,不是加一条能解决的)。 */
|
|
57
|
+
/* 页头右侧自由位(Header 唯一可自定义位,对应 `extra` 属性 / 插槽):搜索框 / 按钮 / 下拉等水平排列。
|
|
58
|
+
`align-self: stretch` 是关键的一条:父级 `__header-inner` 是 `align-items: flex-end`(右侧位与文本块
|
|
59
|
+
**底边对齐**的既有口径),而 flex-end **只定位、不拉伸** —— 少了这条,本盒高度就等于内容高度
|
|
60
|
+
(内容比标题行矮时会短一截),自己画背景 / 分隔线就会露白边。拉满后盒高 = 内容行高,内部仍垂直居中。
|
|
61
|
+
注意这里只到「内容行」的上下边:页头条上下的 14 / 13px 留白是 `.mh-page__header` 的 padding。 */
|
|
72
62
|
.mh-page__header-extra {
|
|
73
63
|
flex-shrink: 0;
|
|
74
64
|
align-self: stretch;
|
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pagination —— 分页条(总数文案 + 每页条数 + 页码窗口 + 翻页箭头 + 空态 + 简单档)。
|
|
3
3
|
*
|
|
4
|
-
* 出处:设计稿《MH后台-0911》的分页器(`0:4047`
|
|
5
|
-
* 选中页码底 `#eff5ff`、条数选择器 `0:4092
|
|
6
|
-
*
|
|
7
|
-
* ⚠️ 设计给 **28**、规范给 **26**、改前本件取 32 —— 三者都不同;本轮按设计取 28(规范值登记为偏差)。
|
|
4
|
+
* 出处:设计稿《MH后台-0911》的分页器(`0:4047` 页码项 **28×28 / r6 / 白底 / 边 `#e6e6e6`**、
|
|
5
|
+
* 选中页码底 `#eff5ff`、条数选择器 `0:4092`)与规范(圆角控件档 / 字号 13 / 组间 12 / 页码间 4)。
|
|
6
|
+
* ⚠️ 设计给 28、规范给 26、改前本件取 32 —— 三者都不同;本轮按设计取 28(规范值登记为偏差)。
|
|
8
7
|
*
|
|
9
|
-
* **顺序是一维右对齐流**:`共 N 条,` → `每页 N 条 ▾` → `‹ 1 … 10 11 12 … 50
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* 翻页箭头用**两个字形**(上一页 `chevron-left` / 下一页 `chevron-right`),本层不转向:方位由字形自表达
|
|
18
|
-
* (包内硬约束:不得靠 `transform: rotate()` 把别的图标转成方位,`back` 只作"返回"语义)。条数选择器的
|
|
19
|
-
* 折叠指示走操作层 `.mh-popup-caret`(展开时翻向),与本层同样零自画折线。
|
|
8
|
+
* **顺序是一维右对齐流**:`共 N 条,` → `每页 N 条 ▾` → `‹ 1 … 10 11 12 … 50 ›`;别把总数搬到左侧。
|
|
9
|
+
* **不做跳页输入框**:规范没有「跳至第 N 页」的样张,本仓按「不做规范没演示的」处理。
|
|
10
|
+
* **页码项三源等价**(本仓通例):原生 `:has(> input:checked)` / `[data-state='selected']` /
|
|
11
|
+
* 静态档 `.is-selected` —— 原生态给零 JS 用法,组件态给 v-model。
|
|
12
|
+
* 翻页箭头用**两个字形**(`chevron-left` / `chevron-right`),本层不转向:方位由字形自表达
|
|
13
|
+
* (包内硬约束:不得靠 `transform: rotate()` 把别的图标转成方位)。条数选择器的折叠指示走操作层
|
|
14
|
+
* `.mh-popup-caret`,与本层同样零自画折线。
|
|
20
15
|
*/
|
|
21
16
|
|
|
22
17
|
/* 几何只挂在页码条上:令牌在同名 `.tokens.css`(锚 `[data-manohub-ui]`),几何若跟着挂会把空态也排成右对齐的行 */
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `pagination.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
|
/* 空态是**独立根节点**(无数据时不渲染页码区)—— 令牌锚在容器上,它照样取得到 */
|
|
18
13
|
/* 单件令牌 */
|
|
@@ -1,33 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Radio —— 单选族的面:普通单选组(`Radio.Group
|
|
2
|
+
* Radio —— 单选族的面:普通单选组(`Radio.Group`,类根 `.mh-radio*`)+ 卡片式单选组
|
|
3
|
+
* (`Radio.Card`,类根 `.mh-radio-card*`),两形态共用一个文件。
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* **为什么同面**:两者是**同一个件的两种组形态**,共用同一套状态协议(选中 / 禁用 / 键盘焦点)
|
|
8
|
-
* 与同一套「框体 + 圆点」几何,差别只在承载形态;拆成两份必然让同一族的选中 / 禁用语义各自漂。
|
|
9
|
-
* 合一后圆点配方只有一处(面二自绘,与面一的框体同色同档),且 `radio.css` 与
|
|
10
|
-
* `components/radio/` 仍是标准的「一组件一面」(护栏 `contract-class-surface.spec.ts`)。
|
|
11
|
-
*
|
|
12
|
-
* ===== 面一:`Radio`(普通单选组)=====
|
|
13
|
-
*
|
|
14
|
-
* 出处:`@aihub/theme` 的 `playground/components/radio.css` 与其令牌 `src/components/checkbox.css`
|
|
15
|
-
* (框体实测、单选为胶囊、未选边框 Ne04、滑过 Th05、选中主色圆点、禁用 Ne05 + Te07、选项间距 16 / 10)。
|
|
16
|
-
*
|
|
17
|
-
* **与 `Radio.Card` 的判据**:选项只有一行文字(或极短说明)→ 面一;
|
|
18
|
-
* 选项需要标题 + 描述 + 整卡可点(卡片式选择)→ 面二。
|
|
19
|
-
* **与 `Capsule` 的判据**:要「按钮形态的分组」→ `Capsule`(本面不实现按钮档,避免两套平铺控件)。
|
|
20
|
-
*
|
|
21
|
-
* **与复选框同族**:圆点由 `border` 从 1px 补间到圆点档画成(盒定尺,无布局位移),
|
|
22
|
-
* 不走字形 mask —— 这是规范的做法(勾/横杠才需要 mask)。
|
|
5
|
+
* **为什么同面**:两者是**同一个件的两种组形态**,共用同一套状态协议(选中 / 禁用 / 键盘焦点)与同一套
|
|
6
|
+
* 「框体 + 圆点」几何,拆成两份必然让同一族的语义各自漂;且 `radio.css` 与 `components/radio/` 仍是
|
|
7
|
+
* 标准的「一组件一面」(护栏 `contract-class-surface.spec.ts`)。
|
|
23
8
|
*
|
|
9
|
+
* 圆点由 `border` 从 1px 补间到圆点档画成(盒定尺,无布局位移),不走字形 mask —— 勾 / 横杠才需要 mask。
|
|
24
10
|
* **尺寸三档只覆盖令牌**(`--ui-radio-size*` / `--ui-radio-dot*`),几何规则只有一份。
|
|
11
|
+
* **状态三源等价**(本仓通例):原生 `input:checked` / `[data-state]` / 静态档 `.is-*` 同一份声明。
|
|
25
12
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* 边界(有意不做):规范 `radio.css` 里的 `.cell-check`(表格选择列)**不在这里实现** ——
|
|
30
|
-
* 表格选择列归表格族,本面不重复实现(否则会出现两套表格选择列外观)。
|
|
13
|
+
* 判据:选项只有一行文字(或极短说明)→ `.Group`;要标题 + 描述 + 整卡可点 → `.Card`;
|
|
14
|
+
* 要「按钮形态的分组」→ `Capsule`(本面不实现按钮档,避免两套平铺控件)。
|
|
15
|
+
* 边界:规范里的 `.cell-check`(表格选择列)**不在这里实现** —— 那是表格族的活,不重复实现两套外观。
|
|
31
16
|
*/
|
|
32
17
|
.mh-radio {
|
|
33
18
|
display: inline-flex;
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `radio.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
|
/* 单件令牌 */
|
|
18
13
|
--ui-radio-size: 16px;
|
|
@@ -1,26 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Search —— 搜索框(输入框 + 可选搜索按钮的**组合件面**)。
|
|
3
3
|
*
|
|
4
|
-
* 本面**只声明「一行里怎么摆」**:输入框那一段的面归 `input.css`(框 / 内距 / 清除位 /
|
|
5
|
-
*
|
|
6
|
-
* 也不重画任何控件的框 —— 两份输入框几何必然在改令牌时漂开。
|
|
4
|
+
* 本面**只声明「一行里怎么摆」**:输入框那一段的面归 `input.css`(框 / 内距 / 清除位 / 聚焦 / 禁用全套
|
|
5
|
+
* 复用),搜索按钮的面归 `button.css`。本件没有自己的几何令牌,也不重画任何控件的框。
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* 两条摆法:输入框 `flex: 1 1 auto` + `min-width: 0`(必须允许收缩,否则会把同行的搜索按钮挤出容器,
|
|
8
|
+
* 窄栏里尤其明显);搜索按钮 `flex: none`(永远「那么大」,宽度让给输入框)。
|
|
9
|
+
* **按钮是可选的**:不传 `searchText` 时只渲染输入框(框内的放大镜已占住「搜索」语义,再出一个同字形
|
|
10
|
+
* 的图标按钮就是同一个意思画两遍);此时 `__btn` 那条摆法无对象,输入框自然占满整行。
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* **宽度口径**:整行吃控件的同一对令牌(`--ui-control-width` / `--ui-control-min-width`,见主题
|
|
18
|
-
* 的 spacing.css)—— 消费方在容器上定宽即整行定宽;行内那个输入框是 `Input` 的表壳
|
|
19
|
-
* (`class` 落在壳上,是 input 面的既有契约),它在 `input.css` 里同样吃了这两枚令牌,
|
|
20
|
-
* 故这里按导入顺序(本文件在 `input.css` 之后,见 `styles/index.css`)把它**收回**:
|
|
21
|
-
* 输入框的宽度归这一行,重复吃控件的宽度口径会让「240 的输入框 + 右侧按钮」溢出行宽。
|
|
22
|
-
*
|
|
23
|
-
* **类名与面文件名同根**:`.mh-search*`,一律 `mh-` 前缀。
|
|
12
|
+
* **宽度口径**:整行吃控件那对令牌(`--ui-control-width` / `--ui-control-min-width`,见 theme 的
|
|
13
|
+
* spacing.css)。行内那个输入框是 `Input` 的表壳,它在 `input.css` 里同样吃了这两枚,故这里按导入顺序
|
|
14
|
+
* (本文件在 `input.css` 之后)把它**收回**:宽度归这一行,重复吃会让「240 的输入框 + 右侧按钮」溢出。
|
|
15
|
+
* 类名与面文件名同根(`.mh-search*`)。
|
|
24
16
|
*/
|
|
25
17
|
.mh-search {
|
|
26
18
|
display: flex;
|
|
@@ -1,37 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Select —— 选择器族(单选触发器 + 多选标签 + 选项面板 + 搜索行 + 日期格)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* **触发器的框不在本件**:触发器 = 输入框的「触发器形态」(`<Input as="button">`),框 / 内距 / 边 / 圆角 /
|
|
5
|
+
* 底 / 字 / 三态 / 清除位 / 右侧图标位全部归输入面与它的表壳。本件只给选择器自己的排版(`display` / `gap` /
|
|
6
|
+
* `width` / `overflow` 与值 / 标签),另通过挂在**表壳**上的 `.mh-select-host` 微调两处壳内节奏。
|
|
7
|
+
* **禁写:本件不得再画框**(画了就又开一份会与输入面漂移的规格)。
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* (`display` / `gap` / `width` / `text-align` / `overflow` 与值 / 标签),另通过挂在**表壳**上的
|
|
12
|
-
* `.mh-select-host` 微调两处壳内节奏(间距回到 4px、箭头收敛回 12px)。
|
|
13
|
-
* **禁写:本件不得再画框**(画了就又开一份会与输入面漂移的规格 —— 这正是本次收敛掉的东西)。
|
|
9
|
+
* **面板开合与定位不在本件**:面板是操作层的组合 —— 面板根并列挂
|
|
10
|
+
* `class="mh-popup mh-select__panel mh-popup--anchored"`(`data-side` / `data-align` 定位档、Esc、点外部
|
|
11
|
+
* 关闭、顶层渲染全在 `styles/operations/popup.css`);本件只给**面**。
|
|
14
12
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
13
|
+
* **面板宽度跟触发器走**:触发器是**流式宽度**(与 input 同一结论),故面板用 `anchor-size(width)` 取锚点宽。
|
|
14
|
+
* 触发器进表壳后 `popovertarget` 的**隐式锚**只有壳内那个控件那么宽,故走**显式锚档**:表壳挂
|
|
15
|
+
* `.mh-popup-anchor`、面板挂 `.mh-popup--anchored`,锚点即整件;非锚定场景回落 240px。
|
|
16
|
+
* **面板有高度上限**(`--ui-select-panel-max-height`,默认 320px):超出即内容区滚动、搜索行常驻 —— 列表与树
|
|
17
|
+
* 两形态共用这一份,形态里不许各写限高。
|
|
19
18
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* `
|
|
23
|
-
*
|
|
24
|
-
* 锚点即整件;非锚定场景回落到 240px 兜底值。
|
|
25
|
-
*
|
|
26
|
-
* **面板有高度上限**:`--ui-select-panel-max-height`(默认 320px)钉在面板根上,超出即内容区
|
|
27
|
-
* (`.mh-select__body`)滚动、搜索行常驻 —— 列表与树两形态共用这一份,形态里不许各写限高。
|
|
28
|
-
*
|
|
29
|
-
* **一处有色差异**:规范的选中行是灰底(Ne10),本仓的「选中」统一走**主色浅底**
|
|
30
|
-
* `--ui-primary-subtle`(与列表 / 树的选中态同一语义槽位),否则悬停(Ne11)与选中(Ne10)两档灰
|
|
31
|
-
* 在本仓有限的灰阶里挤成同色、看不出选中。
|
|
32
|
-
*
|
|
33
|
-
* 选项选中态**三源等价**:原生 `:has(input:checked)`(零 JS 单选路径)/ 组件下发
|
|
34
|
-
* `[data-state='selected']` / 静态档 `.is-selected`。
|
|
19
|
+
* **一处有色差异**:规范的选中行是灰底(Ne10),本仓「选中」统一走**主色浅底** `--ui-primary-subtle`
|
|
20
|
+
* (与列表 / 树同一语义槽位),否则悬停(Ne11)与选中(Ne10)两档灰在本仓有限灰阶里挤成同色。
|
|
21
|
+
* 选项选中态**三源等价**:原生 `:has(input:checked)`(零 JS 路径)/ `[data-state='selected']` /
|
|
22
|
+
* 静态档 `.is-selected`。
|
|
35
23
|
*/
|
|
36
24
|
|
|
37
25
|
/* ===== 触发器:只留选择器自己的排版(框与状态全归输入面) ===== */
|
|
@@ -45,33 +33,29 @@
|
|
|
45
33
|
overflow: hidden;
|
|
46
34
|
}
|
|
47
35
|
|
|
48
|
-
/* 表壳上的本件修饰(TSX 把 `mh-select-host` 挂在**表壳**上:`class` 落壳是输入面的既有契约)。
|
|
49
|
-
|
|
36
|
+
/* 表壳上的本件修饰(TSX 把 `mh-select-host` 挂在**表壳**上:`class` 落壳是输入面的既有契约)。
|
|
37
|
+
① 壳内间距:输入面的附加位节奏是 8px,选择器自己的是 4px;② 箭头尺寸:输入面把槽内图标统一成
|
|
38
|
+
16px,本件箭头是 12px —— 以 0-2-0 收敛回来。不能在 select.css 里直写 `.mh-input__suffix`:
|
|
39
|
+
面文件的类名必须与文件词根同根(机械护栏),故走自己的壳修饰类。 */
|
|
50
40
|
.mh-select-host {
|
|
51
41
|
gap: var(--ui-space-1);
|
|
52
42
|
}
|
|
53
|
-
/* ② 箭头尺寸:`.mh-input__suffix > svg`(0-1-1)会把槽内图标统一成 16px,而本件箭头是 12px
|
|
54
|
-
—— 这里以 0-2-0 收敛回来。注意不能在 select.css 里直写 `.mh-input__suffix`:
|
|
55
|
-
面文件的类名必须与文件词根同根(机械护栏),故走自己的壳修饰类。 */
|
|
56
43
|
.mh-select-host .mh-select__caret {
|
|
57
44
|
width: var(--ui-select-icon-size);
|
|
58
45
|
height: var(--ui-select-icon-size);
|
|
59
46
|
}
|
|
60
47
|
|
|
61
|
-
/* ===== 尺寸档:框的尺寸归输入面,本类只承载选择器自有部位的对档微调 =====
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
② `mh-select--*` 只跟「选择器自己的东西」有关 —— 当前只有标签:小号控件 24px 高,
|
|
67
|
-
24px 的标签会顶满整件、失去呼吸位,故收 4px。 */
|
|
48
|
+
/* ===== 尺寸档:框的尺寸归输入面,本类只承载选择器自有部位的对档微调 =====
|
|
49
|
+
框高 / 字号由 `<Input size>` 下发的 `mh-input--sm` / `--lg` 承担。两处口径都是输入面的既有事实:
|
|
50
|
+
① **左右内距不随档位变**(带壳时内距归表壳,`--ui-input-padding-x-sm/-lg` 只对裸控件生效);
|
|
51
|
+
② `mh-select--*` 只跟「选择器自己的东西」有关 —— 当前只有标签(小号控件 24px 高,24px 的标签会
|
|
52
|
+
顶满整件、失去呼吸位,故收 4px)。 */
|
|
68
53
|
.mh-select--sm .mh-select__chip {
|
|
69
54
|
height: calc(var(--ui-select-chip-height) - 4px);
|
|
70
55
|
}
|
|
71
56
|
|
|
72
|
-
/*
|
|
73
|
-
|
|
74
|
-
2026-09-29 收敛,此前本文件还有一个 `--placeholder` 修饰类专门给占位上灰字。 */
|
|
57
|
+
/* 值区:有值时的单选那一行(占满剩余宽、超出省略)。⚠️ **无值态不在这里** —— 占位由输入面渲染
|
|
58
|
+
(`.mh-input__placeholder`,色与截断同档)。 */
|
|
75
59
|
.mh-select__value {
|
|
76
60
|
flex: 1;
|
|
77
61
|
min-width: 0;
|
|
@@ -79,18 +63,16 @@
|
|
|
79
63
|
text-overflow: ellipsis;
|
|
80
64
|
white-space: nowrap;
|
|
81
65
|
}
|
|
82
|
-
/*
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
尺寸的 12px 在下面 `mh-select-host` 一节按特异性收敛(槽内 svg 会被输入面统一成 16px)。 */
|
|
66
|
+
/* 下拉箭头:渲染在输入面的**右侧图标位**里,位置由表壳的 flex 排布给(控件 `flex: 1 1 auto` 自然把
|
|
67
|
+
附加位挤到右端),故不需要 `margin-left: auto`。字形由 @manohub/icon 给;展开转向由 popup.css 的
|
|
68
|
+
`.mh-popup-caret` 承担(含触发器进表壳后的兄弟档);尺寸的 12px 在上面 `mh-select-host` 一节收敛。 */
|
|
86
69
|
.mh-select__caret {
|
|
87
70
|
flex: none;
|
|
88
71
|
color: var(--ui-base-content-muted); /* Te07 */
|
|
89
72
|
}
|
|
90
73
|
|
|
91
|
-
/* ===== 多选:标签 + 收纳(单行不换行,超出由组件算「其他 n 项」)
|
|
92
|
-
清除位不在本件:它是输入面的内建件(`.mh-input__clear
|
|
93
|
-
由 `<Input clearable>` 渲染在**表壳**里 —— 与值 / 标签同一行的右端。 */
|
|
74
|
+
/* ===== 多选:标签 + 收纳(单行不换行,超出由组件算「其他 n 项」)
|
|
75
|
+
清除位不在本件:它是输入面的内建件(`.mh-input__clear`),由 `<Input clearable>` 渲染在表壳里。 ===== */
|
|
94
76
|
.mh-select--multiple {
|
|
95
77
|
flex-wrap: nowrap;
|
|
96
78
|
}
|
|
@@ -110,58 +92,46 @@
|
|
|
110
92
|
color: var(--ui-base-content-muted);
|
|
111
93
|
}
|
|
112
94
|
/* ===== 面板皮肤(与操作层并列组合:`class="mh-popup mh-select__panel mh-popup--anchored"`) =====
|
|
113
|
-
**面板是列容器 + 限高**:搜索行常驻(不滚),下一条的 `.mh-select__body` 承担滚动 ——
|
|
114
|
-
|
|
115
|
-
(历史症状:限高原先只写在树体 `.mh-select__tree` 上,而列表形态的选项是面板的**直接子节点**,
|
|
116
|
-
面板会被一路撑高;实测 60 条选项的面板高 2212px、视口只有 925px。) */
|
|
95
|
+
**面板是列容器 + 限高**:搜索行常驻(不滚),下一条的 `.mh-select__body` 承担滚动 —— 列表与树两形态
|
|
96
|
+
因此共用同一份「长内容不撑破面板」的规格。 */
|
|
117
97
|
.mh-select__panel {
|
|
118
98
|
/* 锚 = `.mh-popup-anchor`(挂在表壳上)→ 面板与**整件**同宽;非锚定场景回落 240 */
|
|
119
99
|
width: anchor-size(width, 240px);
|
|
120
100
|
/* 列容器:搜索行 `flex: none` + 内容区 `flex: 1 / min-height: 0`。
|
|
121
101
|
⚠️ 加 `display: flex` 会以作者源压过 UA 给**收起态**定的 `display: none`,收起态靠操作层
|
|
122
|
-
`operations/popup.css` 里那条 `:is()`
|
|
123
|
-
特异性 0-3-0、高于本行)—— **那条兜底不能删**(与 `dialog.css` 同一处坑)。 */
|
|
102
|
+
`operations/popup.css` 里那条 `:is()` 兜底 —— **那条兜底不能删**(与 `dialog.css` 同一处坑)。 */
|
|
124
103
|
display: flex;
|
|
125
104
|
flex-direction: column;
|
|
126
105
|
/* 限高(**含搜索行**):超出即内容区滚动。面板仍贴锚点,只是不再无限长 */
|
|
127
106
|
max-height: var(--ui-select-panel-max-height);
|
|
128
|
-
/* UA 给 `[popover]` 的是 `overflow: auto
|
|
129
|
-
留一层就会与它叠成两条滚动条(同一个面板上实测会同时出现)。 */
|
|
107
|
+
/* UA 给 `[popover]` 的是 `overflow: auto`,必须归零:内容区已是滚动容器,留一层就叠成两条滚动条 */
|
|
130
108
|
overflow: hidden;
|
|
131
109
|
padding: var(--ui-space-1) 0;
|
|
132
110
|
border-radius: var(--ui-select-radius);
|
|
133
111
|
background: var(--ui-base-100);
|
|
134
112
|
/* 锚定浮层的投影走 `--ui-shadow-popover`(**不是** elevated):两枚令牌按「锚定浮层 vs 居中浮层」
|
|
135
|
-
分工,default 主题给前者填的是设计实测值(`0:4025` 的 `0 4px 20px rgba(0,14,51,.10)
|
|
136
|
-
farris 主题给的是规范的 `--mh-shadow-lg:14dp 下拉/弹出层` —— 语义与两套来源都对得上。 */
|
|
113
|
+
分工,default 主题给前者填的是设计实测值(`0:4025` 的 `0 4px 20px rgba(0,14,51,.10)`)。 */
|
|
137
114
|
box-shadow: var(--ui-shadow-popover);
|
|
138
115
|
}
|
|
139
116
|
|
|
140
|
-
/*
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
`min-height: 0` 是这一档生效的前提:列容器里弹性项的可收缩下限默认取内容高,
|
|
145
|
-
不给它,内容就永远压不下去、上面的限高形同虚设(与 `panel.css` 的 `.mh-panel__body` 同款)。 */
|
|
117
|
+
/* 内容区:**面板里唯一的滚动容器**(列表的选项行 / 树体的树都装在它里面),同时是**两形态共用的
|
|
118
|
+
一处内距**(内容贴面板左右边各留一个最小呼吸位;行仍是满宽,选项行的内距与树行的缩进各由自己承担)。
|
|
119
|
+
`min-height: 0` 是这一档生效的前提:列容器里弹性项的可收缩下限默认取内容高,不给它,内容就永远
|
|
120
|
+
压不下去、上面的限高形同虚设(与 `panel.css` 的 `.mh-panel__body` 同款)。 */
|
|
146
121
|
.mh-select__body {
|
|
147
122
|
flex: 1;
|
|
148
123
|
min-height: 0;
|
|
149
124
|
overflow-y: auto;
|
|
150
|
-
/* 左右与下各一个最小呼吸位(上不写:面板根已有 4px
|
|
151
|
-
|
|
152
|
-
(实测 60 条选项 scrollHeight = 2160 + 4),故滚到底时最后一行不会贴着面板下边。 */
|
|
125
|
+
/* 左右与下各一个最小呼吸位(上不写:面板根已有 4px 上内距)。底部这一档落在**滚动容器**上:
|
|
126
|
+
现代引擎已把滚动器的 padding-bottom 计入可滚动区(实测 60 条选项 scrollHeight = 2160 + 4)。 */
|
|
153
127
|
padding: 0 var(--ui-space-1) var(--ui-space-1);
|
|
154
128
|
}
|
|
155
129
|
|
|
156
|
-
/* 选项行:滑过 / 键盘高亮 / 选中 / 禁用 / 提示 /
|
|
157
|
-
**行的几何与行态与树行同源**(`mh-tree__row
|
|
158
|
-
|
|
159
|
-
行元素是 `div[role='option']`、**不是 button
|
|
160
|
-
|
|
161
|
-
随之退场的两条补丁(都是为 `<button>` 而写的):
|
|
162
|
-
① 按钮 UA 四件套重置(`border` / `background` / `font-family` / `text-align`)—— div 本就没有 UA 外观;
|
|
163
|
-
② `width: 100%` —— 那是按钮的 `width: auto` 解析成「包裹内容宽」才要补的,div 是块级、本就满宽
|
|
164
|
-
(hint / empty 两个 span 靠下面的 display 拿满宽)。 */
|
|
130
|
+
/* 选项行:滑过 / 键盘高亮 / 选中 / 禁用 / 提示 / 空态。
|
|
131
|
+
**行的几何与行态与树行同源**(`mh-tree__row`):行高 / 圆角 / 基础内距 / 字号 / 滑过与选中底色
|
|
132
|
+
逐项同值 —— 同一个面板里列表与树两形态不再各是一套行。
|
|
133
|
+
行元素是 `div[role='option']`、**不是 button**:listbox 的选项不是交互控件,键盘改由「触发器持焦 +
|
|
134
|
+
`aria-activedescendant` 指向高亮行」表达(故不需要按钮 UA 重置与 `width: 100%` 那两条补丁)。 */
|
|
165
135
|
.mh-select__option {
|
|
166
136
|
position: relative;
|
|
167
137
|
display: flex;
|
|
@@ -187,10 +157,8 @@
|
|
|
187
157
|
appearance: none;
|
|
188
158
|
pointer-events: none;
|
|
189
159
|
}
|
|
190
|
-
/*
|
|
191
|
-
|
|
192
|
-
② 按下 = 选中底(与树行的 `:active` 同款);
|
|
193
|
-
③ 选中 = 选中底 + 主色字。 */
|
|
160
|
+
/* 行态三档与树行逐条对应:① 滑过 = 键盘高亮(`data-active`)= 主色浅底;② 按下 = 选中底;③ 选中 =
|
|
161
|
+
选中底 + 主色字。 */
|
|
194
162
|
.mh-select__option:hover,
|
|
195
163
|
.mh-select__option.is-hover,
|
|
196
164
|
.mh-select__option[data-active='true'] {
|
|
@@ -212,15 +180,13 @@
|
|
|
212
180
|
background: var(--ui-select-option-selected);
|
|
213
181
|
color: var(--ui-primary);
|
|
214
182
|
}
|
|
215
|
-
/*
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
**不是** `+ .mh-select__option:has(input:checked)`:`:has()` **不许嵌套**,写了整条规则会被
|
|
223
|
-
解析器丢掉(浏览器里静默失效 —— 实测踩过,`contract-class-surface` 有机械护栏)。 */
|
|
183
|
+
/* 相连的选中行:缝上的圆角**融合抵消**(多选连续勾选时两个 6px 圆角各自让出的凹口拼成「蝴蝶结」)。做法:
|
|
184
|
+
给自己选中、**下一行也选中**的那一行补一条同色补片,向上下各延伸一个圆角位 —— 它同时盖住上行让出的下半
|
|
185
|
+
凹口与下行让出的上半凹口,两块底因此连成一片。只认「下一行」这一个方向(CSS 只有向后的兄弟组合子),单向
|
|
186
|
+
就够(补片本来横跨两行)。补片不吃事件:它压在下一行顶上 6px,若可点会把点击算到上一行头上。
|
|
187
|
+
⚠️ 零 JS 那一路的下家条件写成 `+ .mh-select__option input:checked`,**不是** `…:has(input:checked)`:
|
|
188
|
+
`:has()` **不许嵌套**,写了整条规则会被解析器丢掉(浏览器里静默失效 —— 实测踩过,
|
|
189
|
+
`contract-class-surface` 有机械护栏)。 */
|
|
224
190
|
.mh-select__option.is-selected:has(+ .mh-select__option.is-selected)::after,
|
|
225
191
|
.mh-select__option[data-state='selected']:has(+ .mh-select__option[data-state='selected'])::after,
|
|
226
192
|
.mh-select__option:has(input:checked):has(+ .mh-select__option input:checked)::after {
|
|
@@ -246,9 +212,8 @@
|
|
|
246
212
|
.mh-select__option--empty {
|
|
247
213
|
color: var(--ui-base-content-muted);
|
|
248
214
|
}
|
|
249
|
-
/* 「创建 xxx」行:搜索词无命中时出现 —— 它是 `.mh-select__option`
|
|
250
|
-
|
|
251
|
-
这里只改字色为「可创建」的主色。 */
|
|
215
|
+
/* 「创建 xxx」行:搜索词无命中时出现 —— 它是 `.mh-select__option` 上的**修饰类**(行几何与三态全沿用
|
|
216
|
+
基类),这里只把字色改成「可创建」的主色。 */
|
|
252
217
|
.mh-select__add {
|
|
253
218
|
color: var(--ui-primary);
|
|
254
219
|
}
|
|
@@ -266,26 +231,15 @@
|
|
|
266
231
|
cursor: default;
|
|
267
232
|
}
|
|
268
233
|
|
|
269
|
-
/* 搜索行(**消费方显式 `searchable`
|
|
270
|
-
`flex: none`:它是面板的**常驻**行 ——
|
|
271
|
-
少了它,搜索行会被一起压扁(列容器里它默认是可收缩的)。 */
|
|
234
|
+
/* 搜索行(**消费方显式 `searchable` 时才渲染**,件不按选项条数自动决断)。
|
|
235
|
+
`flex: none`:它是面板的**常驻**行 —— 面板限高时收缩与滚动都归内容区,少了它搜索行会被一起压扁。 */
|
|
272
236
|
.mh-select__search {
|
|
273
237
|
flex: none;
|
|
274
238
|
padding: var(--ui-space-2) var(--ui-space-2) var(--ui-space-1);
|
|
275
239
|
}
|
|
276
240
|
|
|
277
|
-
/*
|
|
278
|
-
|
|
279
|
-
而列表形态的选项是面板的**直接子节点**、一路贴到面板边缘 —— 同一个面板里两形态的内距不一样
|
|
280
|
-
(浏览器实测:面板 240 时树行 232、选项行 240)。
|
|
281
|
-
内距现归**共用的内容区**(上一节 `.mh-select__body`):一处规格、两形态同数;
|
|
282
|
-
树体壳的唯一职责既然已经上移,壳本身一并退场 —— 留一层不承载任何规则的包裹只是噪音。
|
|
283
|
-
边界不变:**面板皮肤归本文件**,**树的行态归 tree 面**(`.mh-tree__*` 那一族,本文件一行都不碰
|
|
284
|
-
—— 跨族类名须先登记跨面豁免,这里不走那条路),行高 / 缩进 / 滑过与选中底色全沿用 tree 面。 */
|
|
285
|
-
|
|
286
|
-
/* 命中高亮(搜索命中的那段文字,由组件的 `renderLabel` 落进 `.mh-tree__label` 槽)。
|
|
287
|
-
底色取主色浅底档(与选中 / 滑过同一套语义槽位);字色 `inherit` —— 高亮只负责「标出位置」,
|
|
288
|
-
不引入第二套强调色,否则同一行里会同时出现三种主色深浅。 */
|
|
241
|
+
/* 命中高亮(搜索命中的那段文字,由组件的 `renderLabel` 落进 `.mh-tree__label` 槽):底色取主色浅底档
|
|
242
|
+
(与选中 / 滑过同一套语义槽位);字色 `inherit` —— 高亮只负责「标出位置」,不引入第二套强调色。 */
|
|
289
243
|
.mh-select__hit {
|
|
290
244
|
border-radius: var(--ui-radius-xs);
|
|
291
245
|
background: var(--ui-primary-weak);
|
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* select ——
|
|
2
|
+
* select —— 单件令牌(**基础值**;只服务本件,故不随主题进 `@manohub/theme`)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `select.css` 顶部):这些是**基础值**,锚在
|
|
8
|
-
* `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
|
|
9
|
-
* 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
|
|
10
|
-
* (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
11
|
-
*
|
|
12
|
-
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
13
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
14
|
-
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
4
|
+
* 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
|
|
5
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
|
|
6
|
+
* 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
15
7
|
*/
|
|
16
8
|
[data-manohub-ui] {
|
|
17
9
|
/* 本件有三处「跨分件消费」的令牌,改前靠把它们同时声明在下面几个类上兜 —— 现在都靠容器锚取到值:
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Skeleton —— 骨架屏(骨架行 / 列表骨架 / 块状骨架)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* (行高 30 与表格行高一致、圆角 6、行间距 10、shimmer 微光 1.6s ease-in-out)。
|
|
4
|
+
* 出处:规范(行高 30 与表格行高一致、圆角 6、行间距 10、shimmer 微光 1.6s ease-in-out)。
|
|
6
5
|
*
|
|
7
6
|
* **微光动画与色值在本包只有这一处定义**(`--ui-skeleton-*` + `@keyframes mh-skeleton-shimmer`):
|
|
8
|
-
* `query-state.css`
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* 动画降级:`prefers-reduced-motion` 下应压平(本件只声明动画,压平由消费方或后续统一的降级策略负责,
|
|
12
|
-
* 与 theme 包 `base/motion.css` 的分工一致)。
|
|
7
|
+
* `query-state.css` 的加载态骨架复用这里的令牌与动画名 —— 两处各写一份必然漂(时长 / 色值改一处漏一处,
|
|
8
|
+
* 同一屏出现两种呼吸节奏)。
|
|
9
|
+
* `prefers-reduced-motion` 下应压平:本件只声明动画,压平由消费方或后续统一的降级策略负责。
|
|
13
10
|
*/
|
|
14
11
|
.mh-skeleton {
|
|
15
12
|
height: var(--ui-skeleton-height);
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `skeleton.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
|
/* 单件令牌(只服务本件) */
|
|
18
13
|
--ui-skeleton-bg: var(--ui-base-200); /* Ne10 底 */
|