@manohub/ui 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +141 -0
  2. package/dist/components/avatar/index.d.ts +283 -0
  3. package/dist/components/avatar/index.js +167 -0
  4. package/dist/components/badge/index.d.ts +132 -0
  5. package/dist/components/badge/index.js +99 -0
  6. package/dist/components/button/index.d.ts +578 -0
  7. package/dist/components/button/index.js +191 -0
  8. package/dist/components/capsule/index.d.ts +161 -0
  9. package/dist/components/capsule/index.js +101 -0
  10. package/dist/components/card/index.d.ts +456 -0
  11. package/dist/components/card/index.js +231 -0
  12. package/dist/components/checkbox/index.d.ts +331 -0
  13. package/dist/components/checkbox/index.js +165 -0
  14. package/dist/components/code/index.d.ts +134 -0
  15. package/dist/components/code/index.js +117 -0
  16. package/dist/components/code-editor/index.d.ts +163 -0
  17. package/dist/components/code-editor/index.js +98 -0
  18. package/dist/components/collapse/index.d.ts +125 -0
  19. package/dist/components/collapse/index.js +95 -0
  20. package/dist/components/control-size.d.ts +8 -0
  21. package/dist/components/dialog/index.d.ts +224 -0
  22. package/dist/components/dialog/index.js +194 -0
  23. package/dist/components/divider/index.d.ts +64 -0
  24. package/dist/components/divider/index.js +62 -0
  25. package/dist/components/drawer/index.d.ts +226 -0
  26. package/dist/components/drawer/index.js +190 -0
  27. package/dist/components/filter/index.d.ts +391 -0
  28. package/dist/components/filter/index.js +203 -0
  29. package/dist/components/form/index.d.ts +704 -0
  30. package/dist/components/form/index.js +329 -0
  31. package/dist/components/input/index.d.ts +980 -0
  32. package/dist/components/input/index.js +334 -0
  33. package/dist/components/layout/index.d.ts +162 -0
  34. package/dist/components/layout/index.js +100 -0
  35. package/dist/components/list-view/index.d.ts +563 -0
  36. package/dist/components/list-view/index.js +221 -0
  37. package/dist/components/loading/index.d.ts +77 -0
  38. package/dist/components/loading/index.js +40 -0
  39. package/dist/components/nav/index.d.ts +293 -0
  40. package/dist/components/nav/index.js +164 -0
  41. package/dist/components/notice/index.d.ts +137 -0
  42. package/dist/components/notice/index.js +101 -0
  43. package/dist/components/notification/index.d.ts +118 -0
  44. package/dist/components/notification/index.js +99 -0
  45. package/dist/components/page/index.d.ts +276 -0
  46. package/dist/components/page/index.js +351 -0
  47. package/dist/components/page/split-resize.d.ts +42 -0
  48. package/dist/components/page/split-resize.js +36 -0
  49. package/dist/components/pagination/index.d.ts +171 -0
  50. package/dist/components/pagination/index.js +226 -0
  51. package/dist/components/panel/index.d.ts +401 -0
  52. package/dist/components/panel/index.js +193 -0
  53. package/dist/components/part-padding.d.ts +27 -0
  54. package/dist/components/part-padding.js +23 -0
  55. package/dist/components/query-state/index.d.ts +207 -0
  56. package/dist/components/query-state/index.js +181 -0
  57. package/dist/components/radio/index.d.ts +473 -0
  58. package/dist/components/radio/index.js +250 -0
  59. package/dist/components/search/index.d.ts +167 -0
  60. package/dist/components/search/index.js +105 -0
  61. package/dist/components/select/index.d.ts +252 -0
  62. package/dist/components/select/index.js +281 -0
  63. package/dist/components/skeleton/index.d.ts +88 -0
  64. package/dist/components/skeleton/index.js +56 -0
  65. package/dist/components/steps/index.d.ts +199 -0
  66. package/dist/components/steps/index.js +117 -0
  67. package/dist/components/switch/index.d.ts +150 -0
  68. package/dist/components/switch/index.js +103 -0
  69. package/dist/components/table/index.d.ts +351 -0
  70. package/dist/components/table/index.js +286 -0
  71. package/dist/components/tabs/index.d.ts +179 -0
  72. package/dist/components/tabs/index.js +153 -0
  73. package/dist/components/tabset/index.d.ts +105 -0
  74. package/dist/components/tabset/index.js +68 -0
  75. package/dist/components/tag/index.d.ts +203 -0
  76. package/dist/components/tag/index.js +144 -0
  77. package/dist/components/toast/index.d.ts +271 -0
  78. package/dist/components/toast/index.js +116 -0
  79. package/dist/components/tooltip/index.d.ts +126 -0
  80. package/dist/components/tooltip/index.js +97 -0
  81. package/dist/components/tree/index.d.ts +317 -0
  82. package/dist/components/tree/index.js +251 -0
  83. package/dist/components/upload/index.d.ts +384 -0
  84. package/dist/components/upload/index.js +172 -0
  85. package/dist/index.d.ts +63 -0
  86. package/dist/index.js +102 -0
  87. package/dist/services/base.d.ts +21 -0
  88. package/dist/services/base.js +42 -0
  89. package/dist/services/dialog.d.ts +41 -0
  90. package/dist/services/dialog.js +83 -0
  91. package/dist/services/index.d.ts +12 -0
  92. package/dist/services/loading.d.ts +21 -0
  93. package/dist/services/loading.js +41 -0
  94. package/dist/services/toast.d.ts +40 -0
  95. package/dist/services/toast.js +74 -0
  96. package/dist/styles/components/avatar.css +128 -0
  97. package/dist/styles/components/avatar.tokens.css +24 -0
  98. package/dist/styles/components/badge.css +237 -0
  99. package/dist/styles/components/button.css +454 -0
  100. package/dist/styles/components/button.tokens.css +56 -0
  101. package/dist/styles/components/capsule.css +120 -0
  102. package/dist/styles/components/capsule.tokens.css +27 -0
  103. package/dist/styles/components/card.css +192 -0
  104. package/dist/styles/components/checkbox.css +145 -0
  105. package/dist/styles/components/checkbox.tokens.css +26 -0
  106. package/dist/styles/components/code-editor.css +91 -0
  107. package/dist/styles/components/code-editor.tokens.css +24 -0
  108. package/dist/styles/components/code.css +153 -0
  109. package/dist/styles/components/code.tokens.css +29 -0
  110. package/dist/styles/components/collapse.css +62 -0
  111. package/dist/styles/components/collapse.tokens.css +20 -0
  112. package/dist/styles/components/dialog.css +106 -0
  113. package/dist/styles/components/dialog.tokens.css +24 -0
  114. package/dist/styles/components/divider.css +71 -0
  115. package/dist/styles/components/divider.tokens.css +21 -0
  116. package/dist/styles/components/drawer.css +143 -0
  117. package/dist/styles/components/drawer.tokens.css +22 -0
  118. package/dist/styles/components/filter.css +41 -0
  119. package/dist/styles/components/filter.tokens.css +14 -0
  120. package/dist/styles/components/form.css +220 -0
  121. package/dist/styles/components/form.tokens.css +15 -0
  122. package/dist/styles/components/input.css +445 -0
  123. package/dist/styles/components/input.tokens.css +41 -0
  124. package/dist/styles/components/layout.css +198 -0
  125. package/dist/styles/components/list-view.css +244 -0
  126. package/dist/styles/components/loading.css +76 -0
  127. package/dist/styles/components/loading.tokens.css +23 -0
  128. package/dist/styles/components/nav.css +48 -0
  129. package/dist/styles/components/notice.css +153 -0
  130. package/dist/styles/components/notice.tokens.css +17 -0
  131. package/dist/styles/components/notification.css +159 -0
  132. package/dist/styles/components/notification.tokens.css +37 -0
  133. package/dist/styles/components/page.css +473 -0
  134. package/dist/styles/components/pagination.css +297 -0
  135. package/dist/styles/components/pagination.tokens.css +32 -0
  136. package/dist/styles/components/panel.css +77 -0
  137. package/dist/styles/components/query-state.css +88 -0
  138. package/dist/styles/components/radio.css +271 -0
  139. package/dist/styles/components/radio.tokens.css +26 -0
  140. package/dist/styles/components/search.css +30 -0
  141. package/dist/styles/components/select.css +242 -0
  142. package/dist/styles/components/select.tokens.css +33 -0
  143. package/dist/styles/components/skeleton.css +60 -0
  144. package/dist/styles/components/skeleton.tokens.css +27 -0
  145. package/dist/styles/components/steps.css +157 -0
  146. package/dist/styles/components/steps.tokens.css +42 -0
  147. package/dist/styles/components/switch.css +165 -0
  148. package/dist/styles/components/switch.tokens.css +26 -0
  149. package/dist/styles/components/table.css +439 -0
  150. package/dist/styles/components/table.tokens.css +41 -0
  151. package/dist/styles/components/tabs.css +234 -0
  152. package/dist/styles/components/tabs.tokens.css +30 -0
  153. package/dist/styles/components/tag.css +200 -0
  154. package/dist/styles/components/tag.tokens.css +30 -0
  155. package/dist/styles/components/toast.css +150 -0
  156. package/dist/styles/components/toast.tokens.css +26 -0
  157. package/dist/styles/components/tooltip.css +89 -0
  158. package/dist/styles/components/tooltip.tokens.css +25 -0
  159. package/dist/styles/components/tree.css +139 -0
  160. package/dist/styles/components/tree.tokens.css +20 -0
  161. package/dist/styles/components/upload.css +150 -0
  162. package/dist/styles/components/upload.tokens.css +27 -0
  163. package/dist/styles/index.css +149 -0
  164. package/dist/styles/operations/collapse.css +84 -0
  165. package/dist/styles/operations/popup.css +189 -0
  166. package/dist/styles/operations/tabset.css +57 -0
  167. package/dist/utils/state-illustration.d.ts +31 -0
  168. package/dist/utils/state-illustration.js +156 -0
  169. package/package.json +62 -0
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Tooltip —— 提示气泡皮肤(与操作层并列组合)。
3
+ *
4
+ * 出处:`@aihub/theme` 的 `playground/components/tooltip.css` 与 `src/components/tooltip.css`
5
+ * (内距 8 / 14、圆角 10、深底反白字、`0 2 8` 黑 15% 投影;引导档另有一套面:蓝渐变底 + 12/14 内距 +
6
+ * `0 2 14` 投影;标题 medium;动作是白色文本按钮;显隐纯淡入、不位移不缩放)。
7
+ *
8
+ * **类名与面文件名同根**:族名 `tooltip` → 类名 `.mh-tooltip*`(与令牌 `--ui-tooltip-*` 同根),
9
+ * 一律 `mh-` 前缀 —— 本包独立发布,不迁就任何下游的既有类名(有用例盯着这条口径)。
10
+ *
11
+ * 显隐与定位全归操作层:宿主态(`.mh-popup-host:hover` / `:focus-within`)切 display、`data-side` / `data-align`
12
+ * 给定位、`.mh-popup-anchor` / `--anchored` 给锚。本件只给面 + 淡入(进出对称)。
13
+ */
14
+ .mh-tooltip {
15
+ display: inline-block;
16
+ padding: var(--ui-space-2) var(--ui-tooltip-padding-x);
17
+ border-radius: var(--ui-tooltip-radius);
18
+ background: var(--ui-tooltip-bg);
19
+ color: var(--ui-tooltip-text);
20
+ font-size: var(--ui-font-caption);
21
+ line-height: var(--ui-line-body);
22
+ box-shadow: var(--ui-tooltip-shadow);
23
+ }
24
+
25
+ /* 引导档(自己的面:更亮的内距 + 蓝渐变 + 更大投影) */
26
+ .mh-tooltip--guide {
27
+ padding: var(--ui-space-3) var(--ui-tooltip-padding-x);
28
+ background: var(--ui-tooltip-guide-bg);
29
+ box-shadow: var(--ui-tooltip-guide-shadow);
30
+ }
31
+
32
+ /* 标题位(medium)与动作位(白色文本按钮,面不另开按钮族之外的类) */
33
+ .mh-tooltip__title {
34
+ font-weight: var(--ui-weight-medium);
35
+ }
36
+ .mh-tooltip__action {
37
+ padding: 0;
38
+ border: none;
39
+ background: transparent;
40
+ font-family: inherit;
41
+ font-size: inherit;
42
+ color: var(--ui-tooltip-text);
43
+ cursor: pointer;
44
+ }
45
+ .mh-tooltip__action:focus-visible {
46
+ outline: 2px solid var(--ui-tooltip-text);
47
+ outline-offset: 2px;
48
+ }
49
+
50
+ /* ===== 淡入(hover 档:display 由操作层切,本层只管透明度补间,进出对称) =====
51
+ * 规范:提示不位移不缩放,纯淡入淡出 —— `opacity` 与触发态同源绑定。
52
+ * 域定在 `.mh-popup--hover`:静态摆样(不带该档)恒可见,不落收起末帧。 */
53
+ .mh-tooltip.mh-popup--hover {
54
+ opacity: 0;
55
+ transition: opacity 0.2s ease-out;
56
+ }
57
+ .mh-popup-host:hover .mh-tooltip.mh-popup--hover,
58
+ .mh-popup-host:focus-within .mh-tooltip.mh-popup--hover {
59
+ opacity: 1;
60
+ }
61
+ @starting-style {
62
+ .mh-popup-host:hover .mh-tooltip.mh-popup--hover {
63
+ opacity: 0;
64
+ }
65
+ }
66
+
67
+ /* ===== 点击档(原生 popover)=====
68
+ * 触发器按钮化:清掉 UA 的按钮外观,让它看起来仍是页面里原来那个元素。 */
69
+ .mh-tooltip__trigger {
70
+ display: inline-flex;
71
+ align-items: center;
72
+ gap: var(--ui-space-1);
73
+ padding: 0;
74
+ border: none;
75
+ background: transparent;
76
+ font-family: inherit;
77
+ font-size: inherit;
78
+ line-height: inherit;
79
+ color: inherit;
80
+ cursor: pointer;
81
+ }
82
+ .mh-tooltip__trigger:focus-visible {
83
+ outline: 2px solid var(--ui-primary);
84
+ outline-offset: 2px;
85
+ }
86
+ /* 点击档的气泡要限宽:进了 top layer 就不再受容器约束,长文案会被拉成一整行 */
87
+ .mh-tooltip--click {
88
+ max-width: 280px;
89
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * tooltip —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `tooltip.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件令牌 */
18
+ --ui-tooltip-radius: 10px; /* 规范 r10(本仓圆角刻度最大 8) */
19
+ --ui-tooltip-padding-x: 14px; /* 规范间距档 5 = 14 */
20
+ --ui-tooltip-bg: var(--ui-base-content); /* 深底:规范用深色蒙层色,本仓无深色面令牌,取正文档(与输入说明气泡同一映射) */
21
+ --ui-tooltip-text: var(--ui-base-100); /* 反白字 */
22
+ --ui-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); /* 规范实测值(本仓阴影令牌几何不同族,故按出处给) */
23
+ --ui-tooltip-guide-bg: linear-gradient(180deg, #2e77ff, #2a87ff); /* 规范引导档蓝渐变 */
24
+ --ui-tooltip-guide-shadow: 0 2px 14px rgba(45, 47, 51, 0.2);
25
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)。
3
+ *
4
+ * 几何取自 `@aihub/theme` 的 `components/tree.css` 与设计稿《MH后台-0911》的 `0:3921` 组织树,
5
+ * 见下方令牌块与形态注释。
6
+ */
7
+
8
+ /* ===== Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)=====
9
+ 几何与各态对齐 `@aihub/theme` 的 `components/tree.css` 与设计稿 `0:3921` 组织树实测:
10
+ - 行高 34(紧凑档 28)、**行间距 6(节距 40)**、圆角 6、字号 13、
11
+ 行内 padding 承载缩进(**行底满宽、只有内容缩进**)
12
+ - 缩进 = 基础内距 8 + level × 步进 10,**无上限**;level 由组件在行上下发
13
+ - 三态:滑过 `--ui-primary-weak`、点击瞬态 `--ui-primary-subtle`、
14
+ 选中 `--ui-primary-subtle` 底 + 主色字(设计:选中行 = `#2660ff` 底 10% + 蓝字)
15
+ - 箭头 = 常规图标档(`--ui-font-icon`,收起态转 −90°);叶子节点用占位保持层级对齐
16
+
17
+ **行态的取色口径与 Table / ListView 统一**:行类表面的「滑过」用 `--ui-primary-weak`(浅主色)、
18
+ 「选中」用 `--ui-primary-subtle`(深一档主色)—— 三者同一套规则,不再出现「树用中性底、
19
+ 表格用主色底」的分叉。
20
+ 点击瞬态(`:active`)改吃 `--ui-primary-subtle`:改前是本件硬编码的 `#f4f5f9`,
21
+ 既是色值字面量(违反「组件 CSS 不得新增色值字面量」),换主题时也不跟随。
22
+
23
+ 缩进为什么走 CSS 变量而不是行内 paddingLeft:主题包用 typed `attr(data-level type(<number>))`
24
+ 一步算出(`padding-left: calc(8px + attr(...) * 10px)`);为兼容尚无该能力的引擎,这里由组件
25
+ 同时下发 `--mh-tree-level`,公式仍在 CSS 内(数值只取令牌,不散落字面量)。 */
26
+
27
+ .mh-tree {
28
+ display: flex;
29
+ flex-direction: column;
30
+ row-gap: var(--ui-tree-row-gap);
31
+ width: 100%;
32
+ }
33
+
34
+ .mh-tree__row {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: var(--ui-space-1);
38
+ height: var(--ui-tree-row-height);
39
+ padding: 0 var(--ui-space-2);
40
+ /* 缩进:基础内距 + level × 步进(level 由组件下发) */
41
+ padding-left: calc(var(--ui-tree-indent-base) + var(--mh-tree-level, 0) * var(--ui-tree-indent-step));
42
+ border-radius: var(--ui-radius-control);
43
+ font-size: var(--ui-font-caption);
44
+ color: var(--ui-base-content);
45
+ cursor: pointer;
46
+ white-space: nowrap;
47
+ }
48
+
49
+ /* 紧凑档(S):节点行 28px */
50
+
51
+ .mh-tree--compact .mh-tree__row {
52
+ height: var(--ui-tree-row-height-compact);
53
+ }
54
+
55
+ .mh-tree__row:hover {
56
+ background: var(--ui-primary-weak);
57
+ }
58
+
59
+ .mh-tree__row:active {
60
+ background: var(--ui-primary-subtle);
61
+ }
62
+
63
+ .mh-tree__row[data-selected='true'] {
64
+ background: var(--ui-primary-subtle);
65
+ color: var(--ui-primary);
66
+ }
67
+
68
+ /* 展开箭头:字形由 `@manohub/icon` 的 `<Icon name="chevron-down" />` 提供(本面不画字形);
69
+ 展开态即字形的本向(朝下),**收起态由本层转 −90°(指向右)** —— 与 `operations/collapse.css`
70
+ 的 `.mh-collapse-caret` 同款配方(参考实现 `@aihub/theme` 的树也是「base 字形 + 收起态转竖向」)。 */
71
+
72
+ .mh-tree__caret {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ flex-shrink: 0;
77
+ /* 槽位与字形同档:常规图标一律 `--ui-font-icon`,本件不再自定箭头尺寸 */
78
+ width: var(--ui-font-icon);
79
+ height: var(--ui-font-icon);
80
+ color: var(--ui-base-content-subtle);
81
+ cursor: pointer;
82
+ }
83
+
84
+ /* 常规图标尺寸统一取全局图标档(`<Icon>` 的 width/height 是属性,优先级低于本规则) */
85
+ .mh-tree__caret-icon {
86
+ width: var(--ui-font-icon);
87
+ height: var(--ui-font-icon);
88
+ transition: transform 0.15s ease;
89
+ }
90
+
91
+ .mh-tree__caret[data-expanded='false'] .mh-tree__caret-icon {
92
+ transform: rotate(-90deg);
93
+ }
94
+
95
+ /* 叶子节点:占位不显示图形,但保留槽位让同层文字对齐(槽位由 `.mh-tree__caret` 的宽高承担) */
96
+
97
+ .mh-tree__caret--empty {
98
+ cursor: default;
99
+ }
100
+
101
+ .mh-tree__label {
102
+ flex: 1;
103
+ min-width: 0;
104
+ overflow: hidden;
105
+ text-overflow: ellipsis;
106
+ white-space: nowrap;
107
+ }
108
+
109
+ .mh-tree__extra {
110
+ display: inline-flex;
111
+ align-items: center;
112
+ flex-shrink: 0;
113
+ }
114
+
115
+ /* 行尾操作区:默认隐藏,行悬浮(或行内获得焦点)时显形 —— 键盘 Tab 进来同样可见。
116
+ 触屏没有 hover 能力,故 hover 缺失时恒显形,避免操作不可达。口径同 .mh-list-view__card-actions。 */
117
+
118
+ .mh-tree__actions {
119
+ display: inline-flex;
120
+ align-items: center;
121
+ gap: var(--ui-space-1);
122
+ flex-shrink: 0;
123
+ opacity: 0;
124
+ transition: opacity 0.15s ease;
125
+ }
126
+
127
+ .mh-tree__row:hover .mh-tree__actions {
128
+ opacity: 1;
129
+ }
130
+
131
+ .mh-tree__row:focus-within .mh-tree__actions {
132
+ opacity: 1;
133
+ }
134
+
135
+ @media (hover: none) {
136
+ .mh-tree__actions {
137
+ opacity: 1;
138
+ }
139
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 组件几何令牌(只服务本件,故不随主题进 `@manohub/theme`)。
3
+ * 行高与节距取自设计稿《MH后台-0911》的组织树(`0:3921`):行高 **34**(`0:3923` 的
4
+ * 高亮块 200×34)、**节距 40**(行文本 y = 3 / 43 / 83 / 123 / 163 ⇒ 40),故行间距 6。
5
+ * ⚠️ 改前是「行高 30 + 间距 2」(节距 32)——两套来源(规范与设计)给的节距都更松。
6
+ *
7
+ * ## 抽出说明
8
+ * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
9
+ * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
10
+ * 「声明在某个组件根类上」这条脆弱假设。
11
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
12
+ */
13
+ [data-manohub-ui] {
14
+ --ui-tree-row-height: 34px;
15
+ --ui-tree-row-height-compact: 28px;
16
+ --ui-tree-row-gap: 6px; /* 节距 40 = 行高 34 + 间距 6 */
17
+ --ui-tree-indent-base: 8px;
18
+ --ui-tree-indent-step: 10px;
19
+ /* 箭头不再是本件自定的尺寸:**常规图标一律取全局图标档 `--ui-font-icon`**(见下方箭头规则) */
20
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Upload —— 上传(拖拽 / 点击上传区 + 已传文件列表 + 图片缩略图 + 上传链接)。
3
+ *
4
+ * 出处:`@aihub/theme` 的 `playground/components/upload.css` 与 `src/components/upload.css`
5
+ * (拖拽区 500 宽 / 内距 32 / 1px 虚线 Ne05 / 圆角 6;列表行 = 名称 13px + 大小 12px + 删除文本钮,
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` 供读图。
17
+ *
18
+ * **本件不自行发起请求**:文件列表由消费方受控(`files`),选择 / 删除 / 拖拽都只回调。
19
+ */
20
+ .mh-upload {
21
+ /* 组件根:上传区与文件列表纵向排(间距 12) */
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--ui-space-3);
25
+ }
26
+
27
+ /* ===== 拖拽 / 点击上传区(整块即触发器) ===== */
28
+ .mh-upload__zone {
29
+ position: relative;
30
+ display: flex;
31
+ flex-direction: column;
32
+ align-items: center;
33
+ justify-content: center;
34
+ gap: var(--ui-space-1);
35
+ width: 100%;
36
+ max-width: var(--ui-upload-zone-max-width);
37
+ padding: var(--ui-upload-padding);
38
+ border: 1px dashed var(--ui-upload-line);
39
+ border-radius: var(--ui-upload-radius);
40
+ background: var(--ui-base-100);
41
+ text-align: center;
42
+ cursor: pointer;
43
+ }
44
+ /* 隐身开关:1px 盒 + clip-path,Tab 仍可达(与 checkbox / radio / capsule 同配方) */
45
+ .mh-upload__input {
46
+ position: absolute;
47
+ width: 1px;
48
+ height: 1px;
49
+ margin: -1px;
50
+ padding: 0;
51
+ border: 0;
52
+ overflow: hidden;
53
+ white-space: nowrap;
54
+ clip-path: inset(50%);
55
+ appearance: none;
56
+ pointer-events: none;
57
+ }
58
+ /* 焦点环画在可见的区上(隐身开关没有可见焦点) */
59
+ .mh-upload__zone:has(> .mh-upload__input:focus-visible) {
60
+ outline: 2px solid var(--ui-primary);
61
+ outline-offset: -2px;
62
+ }
63
+ /* 拖拽态(组件下发;原生无此态) */
64
+ .mh-upload__zone[data-state='dragover'],
65
+ .mh-upload__zone.is-dragover {
66
+ border-color: var(--ui-primary);
67
+ background: var(--ui-primary-weak);
68
+ }
69
+ /* 禁用:不可点(原生 disabled 与静态档同款) */
70
+ .mh-upload__zone.is-disabled,
71
+ .mh-upload__zone:has(> .mh-upload__input:disabled) {
72
+ border-color: var(--ui-base-300);
73
+ background: var(--ui-base-200);
74
+ cursor: not-allowed;
75
+ }
76
+ .mh-upload__zone-main {
77
+ font-size: var(--ui-font-caption);
78
+ color: var(--ui-upload-text);
79
+ }
80
+ .mh-upload__link {
81
+ color: var(--ui-primary);
82
+ }
83
+ .mh-upload__zone-hint {
84
+ font-size: var(--ui-upload-meta-size);
85
+ color: var(--ui-upload-hint);
86
+ }
87
+
88
+ /* ===== 已传文件列表(名称 + 大小 + 删除;末行不画线) ===== */
89
+ .mh-upload__list {
90
+ width: 100%;
91
+ max-width: var(--ui-upload-zone-max-width);
92
+ border: 1px solid var(--ui-base-300);
93
+ border-radius: var(--ui-upload-radius);
94
+ overflow: hidden;
95
+ }
96
+ .mh-upload__item {
97
+ display: flex;
98
+ align-items: center;
99
+ gap: var(--ui-space-3);
100
+ padding: var(--ui-space-2) var(--ui-space-3);
101
+ border-bottom: 1px solid var(--ui-base-300);
102
+ }
103
+ .mh-upload__item:last-child {
104
+ border-bottom: none;
105
+ }
106
+ .mh-upload__item-name {
107
+ font-size: var(--ui-font-caption);
108
+ color: var(--ui-base-content);
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ white-space: nowrap;
112
+ }
113
+ .mh-upload__item-size {
114
+ flex: none;
115
+ font-size: var(--ui-upload-meta-size);
116
+ color: var(--ui-base-content-subtle);
117
+ }
118
+ /* 删除位推到最右(面归按钮族的文本档,这里只给定位) */
119
+ .mh-upload__item-remove {
120
+ margin-left: auto;
121
+ flex: none;
122
+ }
123
+
124
+ /* ===== 图片缩略图(单张 / 列表) ===== */
125
+ .mh-upload__thumb {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ flex: none;
130
+ width: var(--ui-upload-thumb-size);
131
+ height: var(--ui-upload-thumb-size);
132
+ padding: var(--ui-space-2);
133
+ border: 1px solid var(--ui-base-300);
134
+ border-radius: var(--ui-upload-radius);
135
+ background: var(--ui-base-200);
136
+ font-size: var(--ui-upload-meta-size);
137
+ color: var(--ui-base-content-subtle);
138
+ overflow: hidden;
139
+ }
140
+ .mh-upload__thumb-img {
141
+ width: var(--ui-upload-thumb-inner);
142
+ height: var(--ui-upload-thumb-inner);
143
+ object-fit: cover;
144
+ border-radius: var(--ui-radius-sm);
145
+ }
146
+ .mh-upload__thumbs {
147
+ display: flex;
148
+ flex-wrap: wrap;
149
+ gap: var(--ui-space-4);
150
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * upload —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `upload.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件令牌 */
18
+ --ui-upload-padding: 32px; /* 规范间距档 8(本仓间距刻度最大 24,故按实测值给) */
19
+ --ui-upload-zone-max-width: 500px; /* 规范拖拽区帧宽 */
20
+ --ui-upload-radius: var(--ui-radius-control);
21
+ --ui-upload-line: var(--ui-base-400); /* 虚线边 Ne05 邻档 */
22
+ --ui-upload-text: var(--ui-base-content-muted); /* 主提示 Te05 */
23
+ --ui-upload-hint: var(--ui-base-content-subtle); /* 副提示 Te07 */
24
+ --ui-upload-meta-size: var(--ui-font-caption); /* 大小/缩略图文字:规范 12,本仓字阶最小 13 */
25
+ --ui-upload-thumb-size: 100px; /* 规范缩略图外框 */
26
+ --ui-upload-thumb-inner: 84px; /* 规范内图 */
27
+ }
@@ -0,0 +1,149 @@
1
+ /**
2
+ * @manohub/ui 组件面入口(对外公开为 `@manohub/ui/styles.css`)。
3
+ *
4
+ * 本层是**无 JS 组件面**:只声明类与状态协议(原生伪类 / `[data-state]` / `attr()`),
5
+ * **零令牌定义** —— 令牌一律消费主题。故加载顺序固定:
6
+ *
7
+ * @manohub/theme/default.css(全局值) → styles.css(组件令牌基础值 → 面)
8
+ *
9
+ * 换主题只换前一行;静态页(不装 Vue)同样只需这两行。
10
+ *
11
+ * ## 令牌三段(0.6.0 起)
12
+ *
13
+ * | 段 | 命名 | 落点 | 锚 |
14
+ * |---|---|---|---|
15
+ * | 全局令牌(跨件共用的值) | `--ui-{primary,base-*,space-*,radius-*,shadow-*,font-*}` | `@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
+ * 层序:**值在前、面在后**;面内部**操作层在前**(零 JS 原语、规则走 `:where()` 零特异性,
46
+ * 永远给皮肤让位),组件面在后。
47
+ */
48
+
49
+ /* ===== 值:组件令牌基础值(锚 `[data-manohub-ui]`,与主题令牌同层序) ===== */
50
+ /* 容器与分区 */
51
+ @import './components/collapse.tokens.css';
52
+ @import './components/divider.tokens.css';
53
+
54
+ /* 数据展示 */
55
+ @import './components/tree.tokens.css';
56
+ @import './components/tag.tokens.css';
57
+ @import './components/avatar.tokens.css';
58
+ @import './components/skeleton.tokens.css';
59
+ @import './components/code.tokens.css';
60
+ @import './components/code-editor.tokens.css';
61
+
62
+ /* 表单与选择控件 */
63
+ @import './components/button.tokens.css';
64
+ @import './components/input.tokens.css';
65
+ @import './components/select.tokens.css';
66
+ @import './components/switch.tokens.css';
67
+ @import './components/form.tokens.css';
68
+ @import './components/checkbox.tokens.css';
69
+ @import './components/radio.tokens.css';
70
+ @import './components/capsule.tokens.css';
71
+ @import './components/filter.tokens.css';
72
+
73
+ /* 反馈与三态 */
74
+ @import './components/notice.tokens.css';
75
+ @import './components/notification.tokens.css';
76
+ @import './components/loading.tokens.css';
77
+
78
+ /* 浮层皮肤 */
79
+ @import './components/dialog.tokens.css';
80
+ @import './components/drawer.tokens.css';
81
+ @import './components/tooltip.tokens.css';
82
+
83
+ /* 数据与反馈 */
84
+ @import './components/table.tokens.css';
85
+ @import './components/pagination.tokens.css';
86
+ @import './components/tabs.tokens.css';
87
+ @import './components/steps.tokens.css';
88
+ @import './components/toast.tokens.css';
89
+
90
+ /* 内容与文件 */
91
+ @import './components/upload.tokens.css';
92
+
93
+ /* ===== 面:零令牌定义,只声明类与状态协议 ===== */
94
+ /* 操作层(零 JS 原语,自身不带面;面由下面的皮肤族并列组合提供) */
95
+ @import './operations/collapse.css';
96
+ @import './operations/popup.css';
97
+ @import './operations/tabset.css';
98
+
99
+ /* 容器与分区 */
100
+ @import './components/page.css'; /* 页面级骨架(唯一;区域级是 Panel) */
101
+ @import './components/panel.css';
102
+ @import './components/collapse.css'; /* Collapse 的头行皮肤(行为在 operations/collapse.css) */
103
+ @import './components/card.css';
104
+ @import './components/divider.css'; /* 内容之间的分隔线(设计稿内容区 44 处在用;不是各件自己的框线) */
105
+ @import './components/nav.css';
106
+ @import './components/layout.css'; /* 布局原子件族(Layout.Row 排「行」/ Layout.Column 排「列」);与任何件都无层序耦合 */
107
+
108
+ /* 数据展示 */
109
+ @import './components/tree.css';
110
+ @import './components/list-view.css';
111
+ @import './components/badge.css';
112
+ @import './components/tag.css';
113
+ @import './components/avatar.css';
114
+ @import './components/skeleton.css';
115
+ @import './components/code.css'; /* 行内 chip / 代码块(复制按钮的面归按钮族,故在其后);面里靠升一档特异性压过按钮族,见其文件头 */
116
+ @import './components/code-editor.css'; /* 可编辑代码区(与只读块视觉同源;无按钮,与按钮族无层序关系) */
117
+
118
+ /* 表单与选择控件(按钮 → 输入 → 选择 → 开关 → 勾选 → 单选(两形态同面)→ 胶囊) */
119
+ @import './components/button.css';
120
+ @import './components/input.css';
121
+ @import './components/search.css'; /* 搜索框:只有「一行里怎么摆」,输入框与按钮的面各自归族(故必须排在 input.css 之后) */
122
+ @import './components/select.css';
123
+ @import './components/switch.css';
124
+ @import './components/form.css';
125
+ @import './components/checkbox.css';
126
+ @import './components/radio.css'; /* 单选一件两形态(`.Group` / `.Card`)同一个面文件 */
127
+ @import './components/capsule.css';
128
+ @import './components/filter.css'; /* 筛选条:条件字段区 + 查询/重置(控件由消费方自放) */
129
+
130
+ /* 反馈与三态 */
131
+ @import './components/notice.css';
132
+ @import './components/notification.css'; /* 通知卡(与 notice 条状提示是两族,前缀刻意不同) */
133
+ @import './components/query-state.css';
134
+ @import './components/loading.css'; /* 加载态(转圈 + 遮罩):三态容器看 QueryState,块级占位看 Skeleton */
135
+
136
+ /* 浮层皮肤(与操作层并列组合:对话框走原生 <dialog>,提示走 hover 档) */
137
+ @import './components/dialog.css';
138
+ @import './components/drawer.css'; /* 抽屉:与 dialog 同一套行为只换落位(模态 / 遮罩 / Esc 都由原生 <dialog> 承担) */
139
+ @import './components/tooltip.css'; /* 浮层皮肤:类名 .mh-tooltip*(与族名 / 令牌同根) */
140
+
141
+ /* 数据与反馈(表格 / 分页条 / 页签条 / 步骤条 / 消息提示) */
142
+ @import './components/table.css';
143
+ @import './components/pagination.css';
144
+ @import './components/tabs.css';
145
+ @import './components/steps.css';
146
+ @import './components/toast.css';
147
+
148
+ /* 内容与文件 */
149
+ @import './components/upload.css';