@manohub/ui 1.0.4 → 1.0.6
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 +8 -2
- package/dist/components/badge/index.d.ts +24 -46
- package/dist/components/badge/index.js +7 -11
- package/dist/components/button/index.d.ts +11 -31
- package/dist/components/capsule/index.d.ts +13 -27
- package/dist/components/card/index.d.ts +28 -62
- package/dist/components/checkbox/index.d.ts +1 -9
- package/dist/components/code-block/index.d.ts +28 -55
- package/dist/components/collapse/index.d.ts +2 -0
- package/dist/components/dialog/index.d.ts +9 -18
- package/dist/components/dialog/index.js +3 -2
- package/dist/components/divider/index.d.ts +1 -12
- package/dist/components/drawer/index.d.ts +7 -15
- package/dist/components/filter/index.d.ts +27 -69
- package/dist/components/filter/index.js +3 -8
- package/dist/components/form/index.d.ts +86 -218
- package/dist/components/form/index.js +5 -12
- package/dist/components/input/bordered.d.ts +4 -6
- package/dist/components/input/index.d.ts +36 -83
- package/dist/components/input/index.js +6 -11
- package/dist/components/input/number-input.d.ts +11 -23
- package/dist/components/layout/index.d.ts +21 -28
- package/dist/components/layout/index.js +5 -8
- package/dist/components/list-view/index.d.ts +10 -43
- package/dist/components/loading/index.d.ts +8 -19
- package/dist/components/nav/index.d.ts +14 -35
- package/dist/components/nav/index.js +1 -3
- package/dist/components/notice/index.d.ts +13 -33
- package/dist/components/notice/index.js +3 -5
- package/dist/components/notification/index.d.ts +0 -9
- package/dist/components/page/index.d.ts +29 -71
- package/dist/components/page/split-resize.d.ts +9 -18
- package/dist/components/pagination/index.d.ts +1 -5
- package/dist/components/panel/index.d.ts +33 -70
- package/dist/components/panel/index.js +1 -4
- package/dist/components/part-padding.d.ts +5 -13
- package/dist/components/query-state/index.d.ts +8 -32
- package/dist/components/radio/index.d.ts +13 -17
- package/dist/components/search/index.d.ts +12 -32
- package/dist/components/select/index.d.ts +30 -49
- package/dist/components/select/index.js +3 -3
- package/dist/components/select/select-panel.d.ts +23 -35
- package/dist/components/select/select-panel.js +5 -10
- package/dist/components/select/select-shared.d.ts +18 -44
- package/dist/components/select/select-tree.d.ts +11 -16
- package/dist/components/select/select-trigger.d.ts +6 -16
- package/dist/components/select/select-trigger.js +5 -11
- package/dist/components/skeleton/index.d.ts +1 -5
- package/dist/components/steps/index.d.ts +55 -111
- package/dist/components/steps/index.js +8 -16
- package/dist/components/switch/index.d.ts +17 -33
- package/dist/components/switch/index.js +2 -4
- package/dist/components/tabbar/index.d.ts +1 -6
- package/dist/components/table/index.d.ts +20 -72
- package/dist/components/table/index.js +4 -8
- package/dist/components/tabs/index.d.ts +22 -44
- package/dist/components/text/index.d.ts +10 -21
- package/dist/components/toast/index.d.ts +4 -13
- package/dist/components/tooltip/index.d.ts +1 -12
- package/dist/components/tree/index.d.ts +51 -101
- package/dist/components/tree/index.js +17 -33
- package/dist/components/upload/index.d.ts +1 -4
- package/dist/index.d.ts +2 -2
- package/dist/services/base.d.ts +32 -8
- package/dist/services/dialog.d.ts +13 -23
- package/dist/services/dialog.js +2 -0
- package/dist/services/index.d.ts +2 -2
- package/dist/services/loading.d.ts +9 -12
- package/dist/services/loading.js +8 -1
- package/dist/services/toast.d.ts +4 -14
- 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 +35 -57
- package/dist/styles/components/button.tokens.css +5 -14
- package/dist/styles/components/capsule.css +13 -20
- package/dist/styles/components/capsule.tokens.css +4 -9
- package/dist/styles/components/card.css +13 -24
- package/dist/styles/components/checkbox.css +11 -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 +77 -149
- package/dist/styles/components/form.tokens.css +9 -6
- package/dist/styles/components/input.css +73 -177
- 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 +3 -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 +32 -48
- package/dist/styles/components/pagination.css +14 -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 +12 -25
- package/dist/styles/components/radio.tokens.css +4 -9
- package/dist/styles/components/search.css +8 -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 +7 -8
- package/dist/styles/components/switch.tokens.css +4 -9
- package/dist/styles/components/tabbar.css +12 -11
- package/dist/styles/components/tabbar.tokens.css +4 -9
- package/dist/styles/components/table.css +52 -93
- 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 +10 -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,20 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Upload —— 上传(拖拽 / 点击上传区 + 已传文件列表 + 图片缩略图 + 上传链接)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 行高 8/12 内距、末行不画分隔线;缩略图 100×100 外框、内图 84×84;主提示 Te05 + 副提示 Te07)。
|
|
7
|
-
*
|
|
8
|
-
* **零 JS 的那一半**:`<label>` 擎着 `<input type="file">`(input 隐形但保持可聚焦),
|
|
9
|
-
* 点整块即唤起系统文件选择 —— 这是原生行为,本族不写一行脚本。
|
|
10
|
-
*
|
|
11
|
-
* **"点击上传"是 span,不是 button**(与规范的一处有意差异):`<label>` 的激活行为在
|
|
12
|
-
* 「事件目标是交互式内容」时会被浏览器跳过,若把链接做成 `<button>`,点它就只会按按钮而**不唤起**
|
|
13
|
-
* 文件选择。做成 span 后整块(含这行字)都能唤起,皮还是链接样。
|
|
14
|
-
*
|
|
15
|
-
* **拖拽态需要 JS**(`dragenter/dragover/drop` 原生给不了 CSS 状态),故走组件下发的
|
|
16
|
-
* `[data-state='dragover']`;静态档 `.is-dragover` 供读图。
|
|
4
|
+
* 出处:规范(拖拽区 500 宽 / 内距 32 / 1px 虚线 / 圆角 6;列表行 = 名称 13px + 大小 12px + 删除文本钮,
|
|
5
|
+
* 行高 8/12 内距、末行不画分隔线;缩略图 100×100 外框、内图 84×84;主提示 + 副提示)。
|
|
17
6
|
*
|
|
7
|
+
* **零 JS 的那一半**:`<label>` 擎着 `<input type="file">`(input 隐形但保持可聚焦),点整块即唤起系统
|
|
8
|
+
* 文件选择 —— 原生行为,本族不写一行脚本。
|
|
9
|
+
* ⚠️ **"点击上传"是 span,不是 button**(与规范的一处有意差异):`<label>` 的激活行为在「事件目标是
|
|
10
|
+
* 交互式内容」时会被浏览器跳过,做成 `<button>` 点它就只会按按钮而**不唤起**文件选择。
|
|
11
|
+
* **拖拽态需要 JS**(原生给不了 CSS 状态):走组件下发的 `[data-state='dragover']`,静态档
|
|
12
|
+
* `.is-dragover` 供读图。
|
|
18
13
|
* **本件不自行发起请求**:文件列表由消费方受控(`files`),选择 / 删除 / 拖拽都只回调。
|
|
19
14
|
*/
|
|
20
15
|
.mh-upload {
|
|
@@ -22,6 +17,8 @@
|
|
|
22
17
|
display: flex;
|
|
23
18
|
flex-direction: column;
|
|
24
19
|
gap: var(--ui-space-3);
|
|
20
|
+
/* 定位上下文:隐身 file input 的包含块必须落在控件内,否则逃出滚动容器裁剪、撑大文档滚动高度 */
|
|
21
|
+
position: relative;
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
/* ===== 拖拽 / 点击上传区(整块即触发器) ===== */
|
|
@@ -3,16 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
|
|
5
5
|
*
|
|
6
|
-
* ## 抽出说明
|
|
7
|
-
* 本文件从面文件里抽出(原先混写在 `upload.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-upload-padding: 32px; /* 规范间距档 8(本仓间距刻度最大 24,故按实测值给) */
|
package/dist/styles/index.css
CHANGED
|
@@ -1,50 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @manohub/ui 组件面入口(对外公开为 `@manohub/ui/styles.css`)。
|
|
3
3
|
*
|
|
4
|
-
* 本层是**无 JS 组件面**:只声明类与状态协议(原生伪类 / `[data-state]` / `attr()
|
|
5
|
-
*
|
|
4
|
+
* 本层是**无 JS 组件面**:只声明类与状态协议(原生伪类 / `[data-state]` / `attr()`),**零令牌定义** ——
|
|
5
|
+
* 令牌一律消费主题。加载顺序固定:`@manohub/theme/default.css`(全局值)→ 本文件(组件令牌基础值 → 面)。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* 令牌四段:① 全局令牌(跨件共用的值)在 `@manohub/theme`;② 组件令牌**基础值**(`--ui-<件>-*`)在各
|
|
8
|
+
* `<件>.tokens.css` —— 两者都锚 `[data-manohub-ui]`(容器是每个组件的祖先 ⇒「跨件消费的令牌取不到值」那一类
|
|
9
|
+
* 静默失效从根上消失);③ 档位改写与 ④ **内部状态变量**(`--mh-<件>-*`)必须留在面文件的**修饰符块**里
|
|
10
|
+
* —— 它们靠「同一元素上两个选择器改写同一个令牌」生效,拆到两个文件里档位就失效。归属判据:只服务单一组件
|
|
11
|
+
* 的几何令牌进该件 `<件>.tokens.css`;跨件共用的值一律进 theme;面上的 `--ui-*` 只允许出现在修饰符块里。
|
|
8
12
|
*
|
|
9
|
-
*
|
|
13
|
+
* ⚠️ 组件 CSS **不得**用 `import './x.css'` 副作用引入(会让 dist 的 .d.ts 留下消费方解析不了的 CSS 导入,
|
|
14
|
+
* 且被 verify-pack 拦);样式只经本文件汇总。
|
|
15
|
+
* ⚠️ **本文件注释里不得出现「星号紧跟斜杠」的写法**:那个序列会被解析成注释结束符,把注释提前闭合、
|
|
16
|
+
* **后面所有 @import 一起失效**(表现为本文件 0 条规则、组件面全丢);`contract-class-surface.spec.ts`
|
|
17
|
+
* 有机械检查。
|
|
18
|
+
* ⚠️ 新增组件**五处齐备**(少一处即静默失效):`components/<件>/index.tsx` + `<件>.css` + `<件>.tokens.css`
|
|
19
|
+
* + 本文件登记两条 `@import` + `src/index.ts` 加导出。
|
|
10
20
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* |---|---|---|---|
|
|
15
|
-
* | 全局令牌(跨件共用的值) | `--ui-{primary,base-*,space-*,radius-*,shadow-*,font-*}`、尺寸档(`--ui-control-height-*` / `--ui-control-width` / `--ui-control-min-width` / `--ui-mark-height-*`)、线型档(`--ui-line-dashed`) | `@manohub/theme` | `[data-manohub-ui]` |
|
|
16
|
-
* | 组件令牌**基础值** | `--ui-<件>-*` | 本目录同名 `<件>.tokens.css` | `[data-manohub-ui]` |
|
|
17
|
-
* | 组件令牌**档位改写** | `--ui-<件>-*` | 面文件 `<件>.css` 的**修饰符块** | `.mh-<件>--<档>` 等 |
|
|
18
|
-
* | 内部状态变量 | `--mh-<件>-*` | 面文件(修饰符机制本身) | 组件根类 / 修饰符类 |
|
|
19
|
-
*
|
|
20
|
-
* 后两段必须留在面里:它们靠「同一元素上两个不同选择器改写同一个令牌」生效
|
|
21
|
-
* (`.mh-capsule { --ui-capsule-height: 32px }` + `.mh-capsule--sm { … 24px }`),
|
|
22
|
-
* 拆到两个文件里档位就会失效。
|
|
23
|
-
*
|
|
24
|
-
* 基础值锚在 `[data-manohub-ui]`(**跨包唯一作用域锚**:一个库品牌属性,由入口层
|
|
25
|
-
* `createSubApp` 无条件写在应用容器上)—— 容器是每个组件的祖先,于是
|
|
26
|
-
* 「跨件消费的令牌取不到值」那一整类静默失效从根上消失
|
|
27
|
-
* (历史症状:组内间距变 0、组内分割线高度 0、面板圆角 0;改前靠「把令牌同时声明在
|
|
28
|
-
* 若干个外层类上」的 workaround 兜)。
|
|
29
|
-
*
|
|
30
|
-
* ⚠️ 组件 CSS **不得**用 `import './x.css'` 副作用引入(会让 dist 的 .d.ts 留下消费方解析不了的
|
|
31
|
-
* CSS 导入,且被 verify-pack 拦);样式只经本文件汇总,由消费方的样式链级联进来。
|
|
32
|
-
*
|
|
33
|
-
* ⚠️ **本文件的注释里不得出现 `**` 紧跟斜杠的 glob 写法**(如写 `dist` 下的产物时)——
|
|
34
|
-
* 那个序列会被解析成注释结束符,把注释提前闭合、**后面所有 @import 一起失效**(浏览器里表现为
|
|
35
|
-
* 本文件 0 条规则,组件面全丢)。护栏 `contract-class-surface.spec.ts` 有机械检查。
|
|
36
|
-
*
|
|
37
|
-
* ⚠️ 新增组件**五处齐备**(少一处即静默失效):
|
|
38
|
-
* `components/<件>/index.tsx` + `styles/components/<件>.css` + `styles/components/<件>.tokens.css`
|
|
39
|
-
* + 在本文件登记两条 `@import`(值区与面区各一条)+ `src/index.ts` 加导出
|
|
40
|
-
*
|
|
41
|
-
* 归属判据:只服务单一组件的几何令牌写在该组件的 `<件>.tokens.css`(锚容器);
|
|
42
|
-
* 跨件共用的值一律进 `@manohub/theme`;面上的 `--ui-*` 只允许出现在**修饰符块**里
|
|
43
|
-
* (护栏会拦「面里出现不含修饰符类的 `--ui-*` 声明」)。
|
|
44
|
-
*
|
|
45
|
-
* 层序:**基线(`./reset.css`,元素级、零特异性)→ 值 → 面**;面内部**操作层在前**(零 JS 原语、规则走 `:where()` 零特异性,
|
|
46
|
-
* 永远给皮肤让位),组件面在后。基线只有两面(`box-sizing` + 容器基座)—— 其余元素级声明一律归各组件面:
|
|
47
|
-
* 本文件**在 Tailwind 的层外**(未分层 > 分层),多留一条就会压住消费方的工具类(理由见 `reset.css` 文件头)。
|
|
21
|
+
* 层序:**基线(`./reset.css`,元素级、零特异性)→ 值 → 面**;面内部**操作层在前**(零 JS 原语,规则走
|
|
22
|
+
* `:where()`、永远给皮肤让位),组件面在后。本文件**在 Tailwind 的层外**(未分层 > 分层),多留一条元素级
|
|
23
|
+
* 声明就会压住消费方的工具类(理由见 `reset.css` 文件头)。
|
|
48
24
|
*/
|
|
49
25
|
|
|
50
26
|
/* ===== 基线:元素级 reset(只有盒模型 + 容器基座;先于值 → 面,消费方写任何元素选择器都能盖过它) ===== */
|
|
@@ -76,6 +52,7 @@
|
|
|
76
52
|
|
|
77
53
|
/* 反馈与三态 */
|
|
78
54
|
@import './components/notice.tokens.css';
|
|
55
|
+
@import './components/query-state.tokens.css';
|
|
79
56
|
@import './components/notification.tokens.css';
|
|
80
57
|
@import './components/loading.tokens.css';
|
|
81
58
|
|
|
@@ -105,10 +82,10 @@
|
|
|
105
82
|
@import './components/panel.css';
|
|
106
83
|
@import './components/collapse.css'; /* Collapse 的头行皮肤(行为在 operations/collapse.css) */
|
|
107
84
|
@import './components/card.css';
|
|
108
|
-
@import './components/divider.css'; /*
|
|
85
|
+
@import './components/divider.css'; /* 内容之间的分隔线,不是各件自己的框线 */
|
|
109
86
|
@import './components/nav.css';
|
|
110
|
-
@import './components/layout.css'; /* 布局原子件族(
|
|
111
|
-
@import './components/text.css'; /*
|
|
87
|
+
@import './components/layout.css'; /* 布局原子件族(Row 排「行」/ Column 排「列」),与任何件无层序耦合 */
|
|
88
|
+
@import './components/text.css'; /* 排版原子件;叶子件,与任何件无层序耦合 */
|
|
112
89
|
|
|
113
90
|
/* 数据展示 */
|
|
114
91
|
@import './components/tree.css';
|
|
@@ -117,19 +94,19 @@
|
|
|
117
94
|
@import './components/tag.css';
|
|
118
95
|
@import './components/avatar.css';
|
|
119
96
|
@import './components/skeleton.css';
|
|
120
|
-
@import './components/code-block.css'; /*
|
|
97
|
+
@import './components/code-block.css'; /* 复制按钮的面归按钮族,故排在其后;面里靠升一档特异性压过按钮族 */
|
|
121
98
|
|
|
122
|
-
/* 表单与选择控件(按钮 → 输入 → 选择 → 开关 → 勾选 →
|
|
99
|
+
/* 表单与选择控件(按钮 → 输入 → 选择 → 开关 → 勾选 → 单选 → 胶囊) */
|
|
123
100
|
@import './components/button.css';
|
|
124
101
|
@import './components/input.css';
|
|
125
|
-
@import './components/search.css'; /*
|
|
102
|
+
@import './components/search.css'; /* 只有「一行里怎么摆」,输入框与按钮的面各自归族(故排在 input.css 之后) */
|
|
126
103
|
@import './components/select.css';
|
|
127
104
|
@import './components/switch.css';
|
|
128
105
|
@import './components/form.css';
|
|
129
106
|
@import './components/checkbox.css';
|
|
130
107
|
@import './components/radio.css'; /* 单选一件两形态(`.Group` / `.Card`)同一个面文件 */
|
|
131
108
|
@import './components/capsule.css';
|
|
132
|
-
@import './components/filter.css'; /* 筛选条:**零规则**(字段排布与几何全部沿用 Form
|
|
109
|
+
@import './components/filter.css'; /* 筛选条:**零规则**(字段排布与几何全部沿用 Form) */
|
|
133
110
|
|
|
134
111
|
/* 反馈与三态 */
|
|
135
112
|
@import './components/notice.css';
|
|
@@ -139,8 +116,8 @@
|
|
|
139
116
|
|
|
140
117
|
/* 浮层皮肤(与操作层并列组合:对话框走原生 <dialog>,提示走 hover 档) */
|
|
141
118
|
@import './components/dialog.css';
|
|
142
|
-
@import './components/drawer.css'; /*
|
|
143
|
-
@import './components/tooltip.css';
|
|
119
|
+
@import './components/drawer.css'; /* 与 dialog 同一套行为只换落位(模态 / 遮罩 / Esc 由原生 <dialog> 承担) */
|
|
120
|
+
@import './components/tooltip.css';
|
|
144
121
|
|
|
145
122
|
/* 数据与反馈(表格 / 分页条 / 页签条 / 步骤条 / 消息提示) */
|
|
146
123
|
@import './components/table.css';
|
|
@@ -1,34 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 操作层 · 折叠(零 JS,**只给操作、不给任何面**)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 的
|
|
4
|
+
* 面与几何一律来自皮肤族类(组合 = 根上并列两个类:卡片版 = `Card + Collapse`,字段分组版 = 表单分组 +
|
|
5
|
+
* `Collapse`)⇒ 本文件**不落任何色值 / 尺寸**,也没有 `--ui-collapse-*` 皮肤令牌 —— 这正是「不顶掉皮肤」
|
|
6
|
+
* 的前提。箭头不再是 CSS 字形,改由 `@manohub/icon` 的 `chevron-down` 渲染(本层只负责「收起时转向」)。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* 结构(原生 disclosure,零 JS 即具备键盘与读屏语义):
|
|
13
|
-
* <details class="mh-collapse [皮肤类]" open>
|
|
14
|
-
* <summary class="[皮肤头类]">标题 <Icon name="chevron-down" class="mh-collapse-caret" /></summary>
|
|
15
|
-
* <div class="[皮肤体类]">…</div>
|
|
16
|
-
* </details>
|
|
17
|
-
*
|
|
18
|
-
* 一、开关与状态根 `.mh-collapse`
|
|
19
|
-
* · 原生 `<details>` 的 `[open]` 与组件下发的 `data-state` 两条状态源等价;无状态属性即展开
|
|
20
|
-
* (收折必须显式声明)。
|
|
21
|
-
* · 触发器钩子 = 根的直接子 `<summary>`(原生形态)或 `.mh-collapse-header`(组件下发 `<button>` 形态)
|
|
22
|
-
* —— 皮肤族的部件类照旧挂在触发器上,本层不认识它们,故皮肤族零改动。
|
|
23
|
-
* · 面板体不设约定类:皮肤族自己命名。
|
|
24
|
-
*
|
|
25
|
-
* 二、收起态派生(全部由面板根状态推出)
|
|
26
|
-
* · 箭头转竖向(收起态指右);字形自身不带态。
|
|
27
|
-
* · 组件根下除触发器外直接子一律不显示;原生根由浏览器收起。
|
|
28
|
-
* · 收起态不留 gap(flex 列皮肤的隐藏内容槽仍占一个 flex 项)。
|
|
8
|
+
* 结构(原生 disclosure,零 JS 即具备键盘与读屏语义):`<details class="mh-collapse [皮肤类]" open>` →
|
|
9
|
+
* `<summary class="[皮肤头类]">标题 <Icon name="chevron-down" class="mh-collapse-caret" />` +
|
|
10
|
+
* `<div class="[皮肤体类]">`。
|
|
29
11
|
*
|
|
12
|
+
* 一、开关与状态根 `.mh-collapse`:原生 `[open]` 与组件下发的 `data-state` 两条状态源等价,**无状态属性即
|
|
13
|
+
* 展开**(收折必须显式声明);触发器钩子 = 根的直接子 `<summary>`(原生)或 `.mh-collapse-header`
|
|
14
|
+
* (组件下发 `<button>` 形态)—— 皮肤族的部件类照旧挂在触发器上、本层不认识它们;面板体不设约定类。
|
|
15
|
+
* 二、收起态派生(全部由面板根状态推出):箭头转竖向(收起态指右,字形自身不带态);组件根下除触发器外
|
|
16
|
+
* 直接子一律不显示(原生根由浏览器收起);收起态不留 gap(flex 列皮肤的隐藏内容槽仍占一个 flex 项)。
|
|
30
17
|
* 三、硬约束:**不写底 / 边 / 圆角 / 内距 / 高 / 字号 / gap** —— 写了就会顶掉皮肤族的属性面
|
|
31
|
-
*
|
|
18
|
+
* (卡片头的内距与底边线、表单分组头的行高),这正是「根上只加两个类就能组合」的前提。
|
|
32
19
|
*/
|
|
33
20
|
.mh-collapse {
|
|
34
21
|
min-width: 0; /* 仅作状态根 + 作 flex 子项时不横向溢出;面由皮肤给 */
|
|
@@ -1,64 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 操作层 · 浮层(零 JS,**只给操作、不给任何面**)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* 的
|
|
4
|
+
* 结构(原生 popover):`<button popovertarget="p1">` + `<div id="p1" popover class="mh-popup [皮肤类]">`。
|
|
5
|
+
* 面与几何一律来自皮肤族类,面板根上并列两个类即组合(气泡确认 = 气泡皮肤,下拉层 = 选择面板皮肤…)。
|
|
6
|
+
* 箭头不由本层画:字形取 `@manohub/icon` 的 `chevron-down`,本层只负责「展开时转向」。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 本层只做六件事:
|
|
9
|
+
* 一、状态根 `.mh-popup` —— 三条状态源等价(原生 `:popover-open` / 原生 `<dialog>[open]` / 组件
|
|
10
|
+
* `data-state="open|closed"`)。收起态本该由 UA 的 `display: none` 承担,但皮肤自带 display 会以作者源
|
|
11
|
+
* 压过 UA(提示皮肤实测踩坑),故收起态要按高特异性重钉一次。
|
|
12
|
+
* 二、触发器钩子 —— `[popovertarget]` 与 `.mh-popup-trigger`,只做「可点 + 可键盘 + 焦点环」;触发器
|
|
13
|
+
* **不做 UA 归零**(它本身就是带皮肤的控件,清了会顶掉按钮皮肤)。
|
|
14
|
+
* 三、UA 装饰归零 —— 原生 `[popover]` 与 `<dialog>` 会发下 `border` / `padding` / `background`,不归零就
|
|
15
|
+
* 在面板外面多出一圈黑框。
|
|
16
|
+
* 四、零 JS 锚定 —— CSS Anchor Positioning:`position-area` 定位档 + `position-try-fallbacks` 自动翻面,
|
|
17
|
+
* 锚点走 `popovertarget` 的**隐式锚**(够不着时才用 `.mh-popup-anchor`)。无 `data-side` 时不落定位档,
|
|
18
|
+
* 模态与无锚点浮层退回件自己声明的视口居中。⚠️ **不能指望 UA**:作者源无条件压过 UA 源,宿主的 reset 把
|
|
19
|
+
* UA 给 `dialog` 的 `margin: auto` 归零 ⇒ 弹窗贴上贴左,居中必须由件写实(见 `components/dialog.css`)。
|
|
20
|
+
* 五、展开态派生 —— 箭头转向(原生路径由宿主 `:has` 反推,组件路径由 `aria-expanded` 反推)。
|
|
21
|
+
* 六、hover 档 `.mh-popup--hover` —— 给「非交互提示」的纯 CSS 显形;原因与代价见该节注释。
|
|
10
22
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* 一、状态根 `.mh-popup` —— 三条状态源等价(与折叠的 `[open]` / `data-state` 同构):
|
|
18
|
-
* · 原生 popover:`popovertarget` 开合,`:popover-open` 即展开(本层无需为它写状态规则);
|
|
19
|
-
* · 原生 `<dialog>`:`[open]`(`showModal()` 那条路同样接得住);
|
|
20
|
-
* · 组件下发:`data-state="open|closed"`(与本仓其它件的 `data-state` 协议同款)。
|
|
21
|
-
* 收起态本该由 UA 的 `display: none` 承担(组件路径则由组件卸载)—— 但皮肤自带 display 的会以作者源
|
|
22
|
-
* 压过 UA(提示皮肤实测踩坑),故收起态仍要按高特异性重新钉一次(见「收起态派生」)。
|
|
23
|
-
*
|
|
24
|
-
* 二、触发器钩子 —— `[popovertarget]`(原生,属性即钩子)/ `.mh-popup-trigger`(组件路径),
|
|
25
|
-
* 只做「可点 + 可键盘 + 焦点环」。**触发器不做 UA 归零**(与折叠清 `<summary>` 三角标相反):
|
|
26
|
-
* 它本身就是带皮肤的控件,那样清会顶掉按钮皮肤。
|
|
27
|
-
*
|
|
28
|
-
* 三、UA 装饰归零 + 收起态派生 —— 原生 `[popover]` 与 `<dialog>` 会发下 `border` / `padding` /
|
|
29
|
-
* `background`,不归零就在面板外面多出一圈黑框;收起态则如上条所述要重新钉住 display。
|
|
30
|
-
* 两条都只落在浮层本体,不碰任何皮肤属性面。
|
|
31
|
-
*
|
|
32
|
-
* 四、零 JS 锚定 —— CSS Anchor Positioning:`position-area` 定位档(`data-side` / `data-align`)
|
|
33
|
-
* + `position-try-fallbacks` 自动翻面;锚点走 `popovertarget` 的**隐式锚**,一个 `anchor-name`
|
|
34
|
-
* 都不用写(隐式锚够不着时才用 `.mh-popup-anchor` / `.mh-popup--anchored` 那一档)。
|
|
35
|
-
* 无 `data-side` 时不落定位档 —— 模态与无锚点浮层退回**件自己声明的**视口居中
|
|
36
|
-
* (`inset: 0` + `margin: auto`)。⚠️ 这里**不能指望 UA**:UA 确有 `dialog { margin: auto }`,
|
|
37
|
-
* 但作者源无条件压过 UA 源,而宿主的 `* { margin: 0 }` reset 会把它归零 ⇒ 弹窗贴上贴左。
|
|
38
|
-
* 故居中必须由**件**写实(见 `components/dialog.css` 的 `.mh-dialog { margin: auto }`,
|
|
39
|
-
* 2026-09-30 在带 Tailwind 的宿主里实测踩到)。
|
|
40
|
-
*
|
|
41
|
-
* 五、展开态派生 —— 箭头转向:原生路径由宿主 `:has` 反推,组件路径由触发器自带的
|
|
42
|
-
* `aria-expanded` 反推。
|
|
43
|
-
*
|
|
44
|
-
* 六、hover 档 `.mh-popup--hover` —— 给「非交互提示」的纯 CSS 显形(移入 / 聚焦即出)。
|
|
45
|
-
* 必须存在的原因:popover 只能由点击或 JS 开合,CSS 开合不了;hover 触发的原生属性尚未落地。
|
|
46
|
-
* 代价见该节注释(不进 top layer:会被裁切、要自带 z-index、无 light dismiss)。
|
|
47
|
-
*
|
|
48
|
-
* **硬约束:本层规则一律走 `:where()`(特异性 0)** —— 这是「不顶掉皮肤」的机械保证:
|
|
49
|
-
* 作者源本来就高于 UA 源,故 `:where()` 压得住 UA 装饰;而对皮肤类(0-1-0 起)永远让位
|
|
50
|
-
* (反例即折叠里 `.mh-collapse > button.mh-collapse-header`:那里清的是 UA 按钮装饰,故须高特异性
|
|
51
|
-
* 且只落在组件形态的触发器上;本层结论是「能不动触发器就不动」)。
|
|
52
|
-
* 例外只有三类,都是「必须压过皮肤」的 display 与「只声明身份」的属性:
|
|
53
|
-
* ① 四条裸类规则(`.mh-popup` / `.mh-popup-anchor` / `.mh-popup-host` / `.mh-popup--anchored`)
|
|
54
|
-
* —— 声明状态根与锚点身份,皮肤族不碰这些属性面;
|
|
55
|
-
* ② 收起态规则走 `:is()`(0-3-0)—— 皮肤自带 display 会压过 UA 的收起 display:none;
|
|
56
|
-
* ③ hover 档两条(`.mh-popup.mh-popup--hover` 0-2-0 / `.mh-popup-host:hover …` 0-3-0)—— 同上。
|
|
57
|
-
* 三条 display 规则都只碰 display(hover 档另加定位与层级),不动任何皮肤属性面。
|
|
58
|
-
*
|
|
59
|
-
* 禁写清单(与折叠同款):底 / 边 / 圆角 / 内距 / 宽高 / 字号 / 阴影 / 遮罩色 / 动画
|
|
60
|
-
* —— 遮罩色归对话框皮肤(真实弹出层遮罩由其 `::backdrop` 画),进出场动画归显示层。
|
|
61
|
-
* 层级:popover 档由 top layer 接管(零 z-index),hover 档不进 top layer 故自带一层 z-index。
|
|
23
|
+
* **硬约束:本层规则一律走 `:where()`(特异性 0)** —— 这是「不顶掉皮肤」的机械保证。例外只有三类:
|
|
24
|
+
* ① 四条裸类规则(`.mh-popup` / `-anchor` / `-host` / `--anchored`)声明状态根与锚点身份;② 收起态走
|
|
25
|
+
* `:is()`(0-3-0)—— 皮肤自带 display 会压过 UA 的收起 `display: none`;③ hover 档两条(同上)。三条
|
|
26
|
+
* display 规则都只碰 display。
|
|
27
|
+
* 禁写清单(与折叠同款):底 / 边 / 圆角 / 内距 / 宽高 / 字号 / 阴影 / 遮罩色 / 动画。
|
|
28
|
+
* 层级:popover 档由 top layer 接管(零 z-index),hover 档不进 top layer 故自带一层 z-index。
|
|
62
29
|
*/
|
|
63
30
|
/* ===== 一、状态根 ===== */
|
|
64
31
|
.mh-popup {
|
|
@@ -87,15 +54,15 @@
|
|
|
87
54
|
/* 收起态派生(本层唯一一条非 `:where()` 的状态规则,理由在特异性):
|
|
88
55
|
原生 popover / dialog 的收起靠 UA 的 `display: none`,而皮肤自带 display 的会以作者源压过 UA
|
|
89
56
|
—— 提示皮肤的 inline-block 就让收起的面板在流内显形(实测踩坑)。
|
|
90
|
-
故按「收起的浮层就是 display: none」重新钉一次:`:is()`
|
|
91
|
-
|
|
57
|
+
故按「收起的浮层就是 display: none」重新钉一次:`:is()` 取最具体分支(0-3-0)足以压过任何皮肤类,
|
|
58
|
+
且只碰 display 一项;组件路径(data-state)由组件卸载,不经此条。 */
|
|
92
59
|
:is(.mh-popup[popover]:not(:popover-open), dialog.mh-popup:not([open])) {
|
|
93
60
|
display: none;
|
|
94
61
|
}
|
|
95
62
|
|
|
96
63
|
/* ===== 四、零 JS 锚定(CSS Anchor Positioning) ===== */
|
|
97
64
|
/* 定位档:声明「面板落在锚点的哪一侧」+ 与锚点的呼吸位(4px)。
|
|
98
|
-
|
|
65
|
+
皮肤或消费方要改间距 / 换侧,用自己的 margin / position-area 覆盖即可 —— 本层恒 0 特异性。
|
|
99
66
|
锚点 = `popovertarget` 的调用者(隐式锚,`position-anchor: auto` 是初始值,无需声明)。 */
|
|
100
67
|
:where(.mh-popup[data-side='bottom']) {
|
|
101
68
|
position-area: bottom;
|
|
@@ -120,10 +87,9 @@
|
|
|
120
87
|
}
|
|
121
88
|
|
|
122
89
|
/* 两侧对齐档(与 reka 同名的 data-align):top / bottom 沿行内轴、left / right 沿块轴;
|
|
123
|
-
不写 data-align
|
|
124
|
-
**钉边必须用 anchor() 而不是 justify-self / align-self
|
|
125
|
-
|
|
126
|
-
于是 `justify-self: start` 会把面板贴到视口左边(实测偏了 409px),而不是锚点左边。 */
|
|
90
|
+
不写 `data-align`(或写 center)= 面板中线对齐锚点(实测中线偏差 0)。
|
|
91
|
+
⚠️ **钉边必须用 `anchor()` 而不是 justify-self / align-self**:单关键词的 position-area 在另一条轴上是
|
|
92
|
+
铺满**包含块**(此处即视口)—— `justify-self: start` 会把面板贴到视口左边(实测偏了 409px)。 */
|
|
127
93
|
:where(.mh-popup[data-side='top'][data-align='start'],
|
|
128
94
|
.mh-popup[data-side='bottom'][data-align='start']) {
|
|
129
95
|
left: anchor(left);
|
|
@@ -146,9 +112,8 @@
|
|
|
146
112
|
}
|
|
147
113
|
|
|
148
114
|
/* 显式锚档(隐式锚够不着时用:浮层由 JS `showPopover()` 打开、触发器不是 `popovertarget` 元素等):
|
|
149
|
-
锚点元素挂 `.mh-popup-anchor` 声明锚点名、浮层加 `.mh-popup--anchored`
|
|
150
|
-
|
|
151
|
-
否则固定锚点名在整页只有最后一个声明者生效。 */
|
|
115
|
+
锚点元素挂 `.mh-popup-anchor` 声明锚点名、浮层加 `.mh-popup--anchored` 接入;同页多实例用
|
|
116
|
+
`.mh-popup-host`(共同祖先)把同名锚收敛到子树,否则固定锚点名在整页只有最后一个声明者生效。 */
|
|
152
117
|
.mh-popup-anchor {
|
|
153
118
|
anchor-name: --mh-popup-anchor;
|
|
154
119
|
}
|
|
@@ -160,10 +125,9 @@
|
|
|
160
125
|
}
|
|
161
126
|
|
|
162
127
|
/* ===== 五、展开态派生(箭头转向:字形由 @manohub/icon 给,本层只转向) =====
|
|
163
|
-
* 前三条是**后代**关系(箭头在触发器子树里);后两条是**兄弟**关系 ——
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* 故补 `~ *` 一档:同宿主内、触发器**之后**的任一兄弟(及其子树)里的箭头跟着转向。 */
|
|
128
|
+
* 前三条是**后代**关系(箭头在触发器子树里);后两条是**兄弟**关系 —— 组合件把箭头挂到触发器的同级
|
|
129
|
+
* 附加位槽里(`Select` 的箭头在表壳的 `.mh-input__suffix` 里,与 `[popovertarget]` 那个控件是兄弟),
|
|
130
|
+
* 后代组合器一条都命不中(实测),故补 `~ *` 一档:同宿主内、触发器**之后**的任一兄弟里的箭头跟着转向。 */
|
|
167
131
|
:where(.mh-popup-host:has(.mh-popup:popover-open)) [popovertarget] .mh-popup-caret,
|
|
168
132
|
:where(.mh-popup-host:has(dialog.mh-popup[open])) [popovertarget] .mh-popup-caret,
|
|
169
133
|
:where(.mh-popup-trigger[aria-expanded='true']) .mh-popup-caret,
|
|
@@ -173,15 +137,13 @@
|
|
|
173
137
|
}
|
|
174
138
|
|
|
175
139
|
/* ===== 六、hover 档(非交互提示:移入 / 聚焦即显形,移开即消失) =====
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
* 故指针从触发器移到面板上不会闪断。延迟与淡入属显示层 / 组件层,本层不管。
|
|
184
|
-
* 特异性说明:`display` 必须压过皮肤(提示皮肤自带 inline-block),故这两条不走 `:where()`。 */
|
|
140
|
+
* 为何单独一档:原生 popover 的开合只有 JS `showPopover()` 与 `popovertarget`(点击)两个入口,**CSS 开合
|
|
141
|
+
* 不了 popover**,原生给 hover 留的口子(interest invoker)尚未落地。故 hover 档退回普通定位元素、
|
|
142
|
+
* **不进 top layer**,代价三条:① 会被祖先 overflow 裁切(popover 档不会);② 层级要自带 z-index;
|
|
143
|
+
* ③ 无 light dismiss / Esc(移开即消失,本就不需要)。换来提示语义正确:不吃点击、不抢焦点。锚点必须显式
|
|
144
|
+
* 声明(hover 没有隐式锚):触发器挂 `.mh-popup-anchor`、面板挂 `.mh-popup--anchored`、共同祖先挂
|
|
145
|
+
* `.mh-popup-host`;`:hover` 按 DOM 祖先传播,故指针从触发器移到面板上不会闪断。
|
|
146
|
+
* 特异性说明:`display` 必须压过皮肤,故这两条不走 `:where()`。 */
|
|
185
147
|
.mh-popup.mh-popup--hover {
|
|
186
148
|
position: fixed;
|
|
187
149
|
z-index: 1;
|
|
@@ -1,43 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 操作层 · 面板切换骨架(把「一组互斥选项 + 按顺序排列的面板」接起来;只给骨架、不给面)。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* 只做三件事:① 操作根(轨道 → 面板组 的呼吸位);② 面板组与面板的**弹性链**(供抽屉 / 区域容器里的
|
|
5
|
+
* 「填满」用法);③ 面板的**收起态**(`hidden`)。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* · **显形态一条规则都不写** —— 面板显形就是它自己的 `display`(块 / 弹性 / 网格归消费方与皮肤)。
|
|
17
|
-
*
|
|
18
|
-
* ⚠️ 历史缺陷一(0.7.0 及以前):当时只有「零 JS 档位表」、没有上面那条收起规则 ⇒ 面板被基线按住,
|
|
19
|
-
* 而档位表在 `TabBar` 下恒不命中 ⇒ 三块面板全不显示(`apps/mcp` 配置抽屉实测踩到)。
|
|
20
|
-
* ⚠️ 历史缺陷二(0.7.1 一度这么修、已改回):组件路径的显形**不能**写成
|
|
21
|
-
* `.mh-tabs-panel:not([hidden]) { display: block }` —— 它把面板的 `display` 钉死成 `block`,
|
|
22
|
-
* 连带顶掉消费方/皮肤给面板的布局(面板里是弹性列时整条高度链当场断掉)。
|
|
23
|
-
* ⚠️ 已退役(2026-09-24 拍板删除):**零 JS 路径(原生 radio ↔ 档位表)整段移除**。原写法
|
|
24
|
-
* `.mh-tabs:has(input:nth-of-type(n):checked) .mh-tabs-panels > :nth-child(n)` 逐档一条写不出通式,
|
|
25
|
-
* 且同时受三条硬限制:① 上限 8 档;② 开关必须与面板**同序**,且按「同一父级里第 n 个 input」计数;
|
|
26
|
-
* ③ 面板必须是 `.mh-tabs-panels` 的**直接子级**。局限远大于它省下的那点 JS —— 取消。
|
|
27
|
-
* (`TabBar` / `Capsule` 各自面向**静态页**的原生 `:checked` 选中态与本文件无关,仍然有效。)
|
|
28
|
-
*
|
|
29
|
-
* **与皮肤零互指**:本层不认任何皮肤类名(退役后也不再认识 `input`)。
|
|
7
|
+
* **显隐只有一条路径:组件路径。** `Tabs` 按受控值给非选中面板下发 `hidden`,与选择控件形态无关:
|
|
8
|
+
* - 收起态写在 `.mh-tabs-panel[hidden]` 上:UA 的 `[hidden]` 是**元素级**规则,作者源里任何自带
|
|
9
|
+
* `display` 的类都能压过它,故这里显式落下一次;
|
|
10
|
+
* - **显形态一条规则都不写** —— 面板显形就是它自己的 `display`。⚠️ 别写成
|
|
11
|
+
* `.mh-tabs-panel:not([hidden]) { display: block }`:那会把面板 `display` 钉死成 `block`,
|
|
12
|
+
* 连带顶掉消费方 / 皮肤给面板的布局(面板里是弹性列时整条高度链当场断掉)。
|
|
13
|
+
* - **零 JS 路径(原生 radio ↔ 档位表)已退役**:逐档一条写不出通式,且受「上限 8 档 / 开关必须与
|
|
14
|
+
* 面板同序 / 面板必须是直接子级」三条硬限制,局限远大于省下的那点 JS。`TabBar` / `Capsule` 各自
|
|
15
|
+
* 面向静态页的原生 `:checked` 与本文件无关。
|
|
30
16
|
*
|
|
31
17
|
* 结构契约(轨道项与面板组顺序**一一对应**;面板壳由 `Tabs` 出,消费方不必手写):
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* <div class="mh-tabs-panels">
|
|
35
|
-
* <section class="mh-tabs-panel [皮肤类]" hidden>…</section>
|
|
36
|
-
* </div>
|
|
37
|
-
* </div>
|
|
18
|
+
* `<div class="mh-tabs">` → `[皮肤:轨道 / 选择控件]` + `<div class="mh-tabs-panels">` →
|
|
19
|
+
* `<section class="mh-tabs-panel [皮肤类]" hidden>`。
|
|
38
20
|
*
|
|
39
21
|
* 禁写(与折叠 / 浮层同款):底 / 边 / 圆角 / 内距 / 宽高 / 字号 / 阴影 —— 写了就顶掉皮肤族属性面。
|
|
40
|
-
*
|
|
22
|
+
* 面板的面与几何由皮肤族给;本层只写「收起态」「弹性链」与根上的呼吸位,且**不认任何皮肤类名**。
|
|
41
23
|
*/
|
|
42
24
|
|
|
43
25
|
/* ===== 一、操作根:选择控件在上、面板在下 =====
|
package/dist/styles/reset.css
CHANGED
|
@@ -9,67 +9,6 @@
|
|
|
9
9
|
* 它是令牌的落点(`@manohub/theme` 的全局令牌与各件的 `<件>.tokens.css` 都锚这个属性),
|
|
10
10
|
* 也是本文件唯一一条**描述容器自身、不涉及后代**、因此不带 `:where()` 的规则。
|
|
11
11
|
*
|
|
12
|
-
* 除这两面之外**一条都不留**(2026-09 瘦身)。理由与去向见下面两节。
|
|
13
|
-
*
|
|
14
|
-
* ## 为什么删:未分层 > 分层(不是特异性问题)
|
|
15
|
-
*
|
|
16
|
-
* 旧版这份文件是按 **Tailwind Preflight** 逐条复刻的(盒模型 / 块级外边距归零 / 标题字阶 /
|
|
17
|
-
* 列表序号 / 链接下划线 / 控件外观 / 媒体元素转块 …)。问题出在**级联层**上:Tailwind 4 的
|
|
18
|
-
* 产物首行是 `@layer theme, base, components, utilities;`,preflight 与全部工具类都在层里,
|
|
19
|
-
* 而本文件**在层外** —— CSS 里未分层的普通声明一律赢过分层里的普通声明,**这条优先于特异性**。
|
|
20
|
-
* 于是那些复刻规则把消费方的工具类整片压住(实测:`border*` 被 `border-width: 0` 打掉、
|
|
21
|
-
* `img` 上的 `h-*` 被 `height: auto` 打掉,同类还有 `h1`–`h6` 的 `text-*`、`p` 的 `mb-*`、
|
|
22
|
-
* `svg`/`img` 上的 `hidden`),而 `:where()` 把特异性降到 0 也救不了 —— 胜负不在特异性上。
|
|
23
|
-
*
|
|
24
|
-
* 两件事要分开:**分层**管优先级(本文件现在不再依赖消费方分层,因为可抢的声明已经没有了),
|
|
25
|
-
* **瘦身**管重复 —— 与 preflight 重合的规则对 Tailwind 消费方本就是零增量,剩下的都归了具体组件。
|
|
26
|
-
*
|
|
27
|
-
* ## 删掉的那些去了哪
|
|
28
|
-
*
|
|
29
|
-
* | 旧规则 | 现在的落点 |
|
|
30
|
-
* |---|---|
|
|
31
|
-
* | `img` / `svg` / `video` / `canvas` / `audio` / `iframe` / `embed` / `object` 转块级、`img`+`video` 不溢出 | 用图的件各自写:Card / ListView / QueryState 本来就有,Avatar / Upload 已补 `display: block` |
|
|
32
|
-
* | `a { color: inherit; text-decoration: inherit }` | `.mh-button` 基块补 `text-decoration: none`(链接形态的按钮就是 `<a>`);正文链接的颜色与下划线交给消费方 |
|
|
33
|
-
* | `textarea { resize: vertical }` | `.mh-input--textarea` |
|
|
34
|
-
* | `button` 的 `cursor: pointer` / 透明底 / 无渐变 / 无缩改 | 各按钮形态的面(本来都自带 `border` / `background` / `padding` / `cursor`) |
|
|
35
|
-
* | `code` / `kbd` / `samp` / `pre` 等宽族 | CodeBlock 面,以及 `.mh-text--mono`(消费方写裸 `<code>` 时用后者) |
|
|
36
|
-
* | `:disabled { cursor: default }` | 各件禁用态(Button / Input / Select / Checkbox / Capsule / Card / Collapse 等都已自带) |
|
|
37
|
-
* | `[type='search'] { outline-offset: -2px }` | 搜索框的面自画焦点环 |
|
|
38
|
-
* | 标题字阶归位 / 块级元素外边距归零 / 列表序号与缩进 / 控件字体与颜色继承 / `b`+`strong` / `small` / `summary` / `label` | **直接删**:全库零组件依赖,且 Tailwind Preflight 全都有 |
|
|
39
|
-
*
|
|
40
|
-
* `border-width: 0; border-style: solid` 也一并删了:库内每个面都写全简写
|
|
41
|
-
* (`border: 1px solid …` / `border: none` / `border-bottom: 1px solid …`),没有一处依赖默认值,
|
|
42
|
-
* 留着只会继续压消费方的 `border*` 工具类。
|
|
43
|
-
*
|
|
44
|
-
* ## 特异性的老纪律(往这里加东西前必读)
|
|
45
|
-
*
|
|
46
|
-
* **作用域一律用 `:where([data-manohub-ui])` 包裹**:`:where()` 特异性为 0,等价于纯元素选择器。
|
|
47
|
-
* 写成 `.container button` 这类高特异性选择器(0,1,1)会**反压本包组件面**(普遍是单类 0,1,0)——
|
|
48
|
-
* 本仓踩过:主按钮文字变成 `color: inherit` 的黑色。
|
|
49
|
-
*
|
|
50
|
-
* 唯一例外是**容器基座**(下面的 `[data-manohub-ui]`):它描述容器自身而非其后代,
|
|
51
|
-
* 且要能在消费方「同名选择器后写即胜」的规则里被覆盖,故保持 (0,1,0)。
|
|
52
|
-
*
|
|
53
|
-
* **加声明之前先自问**:这条会不会压住消费方的 Tailwind 工具类?会压就落进**具体组件的面**
|
|
54
|
-
* (谁渲染这个元素谁负责),不要放这里。`__tests__/contract-reset.spec.ts` 按这条锁着:
|
|
55
|
-
* 除容器基座外,整份文件只允许 `box-sizing` 一条声明。
|
|
56
|
-
*
|
|
57
|
-
* ## 三条不做
|
|
58
|
-
*
|
|
59
|
-
* 1. **不碰 `html` / `body` / `#app`**:micro-app 的 scopecss **不作用域化**它们,
|
|
60
|
-
* 写进去会泄漏到宿主应用的全局样式。整链高度由消费方承担
|
|
61
|
-
* (`@manohub/kit/CONTRACT.md` §1.2「入口基线」,是 L1-6「不得用裸元素选择器」的唯一例外);
|
|
62
|
-
* 容器自身在这里给 `height: 100%`,`Page` 的 `height: 100%` 依赖上面那条链存在。
|
|
63
|
-
* 2. **不定义任何 `--ui-*` 令牌**:值一律归 `@manohub/theme`,本文件只**消费**(两处定义必然漂)。
|
|
64
|
-
* 3. **不出现任何类选择器**:本层是元素基线,类归各组件面(`styles/components/`)。
|
|
65
|
-
*
|
|
66
|
-
* ## 富文本须知(相对旧版是反转)
|
|
67
|
-
*
|
|
68
|
-
* 本文件现在**不归零列表序号、不归零链接下划线、不归位标题字阶**,所以富文本(markdown)与正文
|
|
69
|
-
* 可以直接吃浏览器默认排版 —— 旧版那条「消费方须为自己的富文本容器复权」的告示随之作废
|
|
70
|
-
* (见 `@manohub/kit/CONTRACT.md` §10)。反之,消费方想要一套自己的正文排版,按自己的容器类写即可。
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
12
|
/* ===== 盒模型:容器、其后代与伪元素一律 border-box(本库全部面的几何前提) ===== */
|
|
74
13
|
:where([data-manohub-ui]),
|
|
75
14
|
:where([data-manohub-ui]) *,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manohub/ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "AIHub 自绘组件层:不依赖 farris 的手写 Vue TSX 组件 + 自带令牌层(Farris 规范视觉 · daisyUI 式语义令牌 · shadcn 式 API 词汇)。",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"vue": "^3.5.0"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@manohub/icon": "^1.0.
|
|
38
|
+
"@manohub/icon": "^1.0.6"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@types/node": "^24.0.0",
|