@xihan-ui/styles 1.0.0 → 2.0.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 (171) hide show
  1. package/CHANGELOG.md +5146 -6
  2. package/README.md +22 -2
  3. package/component-tokens.d.ts +4212 -0
  4. package/component-tokens.js +2 -0
  5. package/components.tokens.json +80116 -0
  6. package/css/accordion.css +131 -75
  7. package/css/affix.css +16 -1
  8. package/css/alert.css +114 -67
  9. package/css/anchor.css +99 -27
  10. package/css/approval.css +461 -0
  11. package/css/avatar-group.css +14 -6
  12. package/css/avatar.css +33 -9
  13. package/css/back-top.css +103 -48
  14. package/css/badge.css +42 -14
  15. package/css/bar-code.css +62 -0
  16. package/css/breadcrumb.css +40 -21
  17. package/css/button-group.css +146 -24
  18. package/css/button.css +116 -99
  19. package/css/calendar-picker.css +448 -0
  20. package/css/calendar-range-picker.css +517 -0
  21. package/css/card.css +54 -77
  22. package/css/carousel.css +412 -68
  23. package/css/cascader.css +429 -246
  24. package/css/checkbox-group.css +225 -77
  25. package/css/checkbox.css +174 -37
  26. package/css/clipboard.css +266 -47
  27. package/css/code-view.css +279 -0
  28. package/css/collapsible.css +108 -63
  29. package/css/color-field.css +158 -0
  30. package/css/color-picker.css +172 -184
  31. package/css/color-slider.css +274 -0
  32. package/css/color-swatch-picker.css +243 -0
  33. package/css/color-swatch.css +35 -0
  34. package/css/combobox.css +267 -273
  35. package/css/command.css +399 -0
  36. package/css/context-menu.css +183 -108
  37. package/css/date-field.css +94 -121
  38. package/css/date-picker.css +486 -249
  39. package/css/date-range-picker.css +559 -0
  40. package/css/description.css +51 -0
  41. package/css/descriptions.css +133 -87
  42. package/css/dialog.css +247 -68
  43. package/css/diff-view.css +428 -0
  44. package/css/download-trigger.css +155 -46
  45. package/css/drawer.css +194 -111
  46. package/css/editable.css +172 -152
  47. package/css/empty-state.css +80 -11
  48. package/css/field-array.css +190 -0
  49. package/css/field.css +84 -31
  50. package/css/fieldset.css +51 -18
  51. package/css/file-upload.css +134 -36
  52. package/css/flex.css +20 -1
  53. package/css/float-button.css +238 -57
  54. package/css/floating-panel.css +173 -92
  55. package/css/focus.css +46 -0
  56. package/css/forced-colors.css +93 -0
  57. package/css/form.css +254 -77
  58. package/css/gradient-text.css +34 -10
  59. package/css/grid.css +516 -5
  60. package/css/heatmap.css +87 -29
  61. package/css/highlight.css +20 -5
  62. package/css/hover-card.css +97 -47
  63. package/css/icon-wrapper.css +15 -3
  64. package/css/icon.css +74 -8
  65. package/css/image-cropper.css +143 -29
  66. package/css/image-viewer.css +150 -89
  67. package/css/image.css +30 -1
  68. package/css/infinite-scroll.css +51 -1
  69. package/css/input-group.css +277 -0
  70. package/css/json-viewer.css +102 -45
  71. package/css/kbd.css +72 -0
  72. package/css/label.css +78 -0
  73. package/css/layers.css +5 -0
  74. package/css/layout.css +175 -31
  75. package/css/list.css +24 -3
  76. package/css/listbox.css +208 -67
  77. package/css/loading-bar.css +52 -3
  78. package/css/log.css +144 -9
  79. package/css/markdown-stream.css +149 -0
  80. package/css/marquee.css +27 -1
  81. package/css/masonry.css +7 -0
  82. package/css/matrix-code.css +67 -0
  83. package/css/mention.css +234 -152
  84. package/css/menu.css +180 -83
  85. package/css/menubar.css +204 -136
  86. package/css/message-feed.css +197 -0
  87. package/css/navigation-menu.css +144 -90
  88. package/css/notification.css +178 -100
  89. package/css/number-animation.css +7 -0
  90. package/css/number-field.css +120 -277
  91. package/css/overlay-arrow.css +12 -7
  92. package/css/page-header.css +99 -14
  93. package/css/pagination.css +175 -135
  94. package/css/password-input.css +222 -219
  95. package/css/pin-input.css +101 -67
  96. package/css/pointer.css +36 -0
  97. package/css/popconfirm.css +185 -94
  98. package/css/popover.css +121 -77
  99. package/css/progress.css +60 -12
  100. package/css/prompt-input.css +224 -0
  101. package/css/question-flow.css +513 -0
  102. package/css/radio-group.css +147 -30
  103. package/css/rating.css +193 -43
  104. package/css/reasoning.css +336 -0
  105. package/css/reset.css +84 -6
  106. package/css/resizable.css +237 -0
  107. package/css/scroll-area.css +68 -7
  108. package/css/scrollbar.css +47 -13
  109. package/css/segmented.css +94 -29
  110. package/css/select.css +288 -274
  111. package/css/separator.css +101 -1
  112. package/css/side-nav.css +133 -75
  113. package/css/signature-pad.css +74 -54
  114. package/css/skeleton.css +84 -11
  115. package/css/slider.css +132 -39
  116. package/css/sortable.css +198 -0
  117. package/css/spinner.css +126 -12
  118. package/css/splitter.css +29 -8
  119. package/css/statistic.css +55 -0
  120. package/css/steps.css +206 -72
  121. package/css/switch.css +268 -36
  122. package/css/table.css +695 -118
  123. package/css/tabs.css +604 -42
  124. package/css/tag-group.css +219 -0
  125. package/css/tag.css +118 -28
  126. package/css/tags-input.css +156 -274
  127. package/css/text-field.css +101 -249
  128. package/css/time-field.css +100 -128
  129. package/css/time-picker.css +323 -252
  130. package/css/time-range-picker.css +719 -0
  131. package/css/timeline.css +202 -68
  132. package/css/timer.css +56 -52
  133. package/css/timestamp.css +34 -0
  134. package/css/toast.css +373 -144
  135. package/css/toggle-group.css +309 -76
  136. package/css/toggle.css +116 -85
  137. package/css/tone.css +47 -0
  138. package/css/tool-call.css +421 -0
  139. package/css/toolbar.css +181 -33
  140. package/css/tooltip.css +107 -36
  141. package/css/tour.css +183 -152
  142. package/css/transfer.css +351 -138
  143. package/css/tree-select.css +323 -216
  144. package/css/tree.css +294 -62
  145. package/css/truncate.css +65 -0
  146. package/css/typography.css +228 -5
  147. package/css/undefined.css +10 -1
  148. package/css/virtualizer.css +9 -10
  149. package/css/visually-hidden.css +7 -0
  150. package/css/watermark.css +7 -0
  151. package/family/action-control.css +487 -0
  152. package/family/collection-item.css +721 -0
  153. package/family/field-chrome.css +298 -0
  154. package/family/motion.css +166 -0
  155. package/family/swatch.css +59 -0
  156. package/index.css +41705 -126
  157. package/index.unlayered.css +33692 -17339
  158. package/package.json +51 -17
  159. package/css/calendar.css +0 -367
  160. package/css/code-block.css +0 -91
  161. package/css/composer.css +0 -134
  162. package/css/countdown.css +0 -26
  163. package/css/dynamic-input.css +0 -220
  164. package/css/ellipsis.css +0 -52
  165. package/css/hotkeys.css +0 -90
  166. package/css/popselect.css +0 -391
  167. package/css/qr-code.css +0 -55
  168. package/css/result.css +0 -119
  169. package/css/space.css +0 -117
  170. package/css/thread.css +0 -120
  171. package/css/time.css +0 -25
package/css/composer.css DELETED
@@ -1,134 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='composer'] {
4
- --xh-composer-skin: 1;
5
- }
6
-
7
- /* 边框画在 root 上,内部 textarea 无边框;align-items: flex-end 让按钮随输入框长高贴着底边 */
8
- [data-scope='composer'][data-part='root'] {
9
- /* 输入与发送按钮共用的控件高度 */
10
- --xh-_composer-control-h: var(--xh-composer-submit-h, var(--xh-control-h-md));
11
-
12
- display: flex;
13
- align-items: flex-end;
14
- gap: var(--xh-composer-gap, var(--xh-control-gap-md));
15
- /* 整框的内衬走控件内边距尺的小档,密度收紧时随之收窄 */
16
- padding: var(--xh-composer-p, var(--xh-control-px-sm));
17
- border: var(--xh-stroke-thin) solid var(--xh-composer-border, var(--xh-border-control));
18
- border-radius: var(--xh-composer-radius, var(--xh-shape-surface));
19
- background: var(--xh-composer-bg, var(--xh-bg-surface));
20
- }
21
-
22
- /* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
23
- [data-scope='composer'][data-part='root'][hidden] {
24
- display: none;
25
- }
26
-
27
- /* 焦点环画在整个框上;用 focus-within 使焦点落在发送按钮时同样点亮 */
28
- [data-scope='composer'][data-part='root']:focus-within {
29
- border-color: var(--xh-composer-root-border-focus, var(--xh-_tone, var(--xh-border-control-focus)));
30
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
31
- outline-offset: var(--xh-ring-offset);
32
- }
33
-
34
- /* 禁用态只换光标与底色;文字由 textarea 与按钮各自走 fg-disabled,整框不再压 opacity,两者叠起来会压到读不出 */
35
- [data-scope='composer'][data-part='root'][data-disabled] {
36
- cursor: not-allowed;
37
- background: var(--xh-composer-bg-disabled, var(--xh-bg-subtle));
38
- }
39
-
40
- /* 无边框透明底,融进 root 的框里;min-inline-size: 0 防止长内容把弹性子项撑出容器 */
41
- [data-scope='composer'][data-part='input'] {
42
- flex: 1;
43
- min-inline-size: 0;
44
- /* 上下留白把单行文本盒撑到控件高度,文字中线与按钮中线对齐 */
45
- padding-block: calc((var(--xh-_composer-control-h) - 1lh) / 2);
46
- padding-inline: 0;
47
- border: 0;
48
- background: transparent;
49
- color: var(--xh-composer-input-fg, var(--xh-fg-default));
50
- /* 表单控件默认不继承页面字族,显式继承 */
51
- font-family: inherit;
52
- font-size: var(--xh-composer-input-font-size, var(--xh-text-body-size));
53
- line-height: var(--xh-leading-normal);
54
- /* 高度由 field-sizing 随内容变,不支持的引擎退化为 rows 定下的固定行数;
55
- 配套禁用 resize,避免拖拽写死的高度盖掉它。 */
56
- field-sizing: content;
57
- resize: none;
58
- }
59
-
60
- /* 焦点环已画在 root 上,这里去掉自身的环 */
61
- [data-scope='composer'][data-part='input']:focus-visible {
62
- outline: none;
63
- }
64
-
65
- [data-scope='composer'][data-part='input']::placeholder {
66
- color: var(--xh-composer-placeholder-fg, var(--xh-fg-subtle));
67
- }
68
-
69
- /* textarea 是单体表单控件,禁用走原生 disabled */
70
- [data-scope='composer'][data-part='input']:disabled {
71
- color: var(--xh-fg-disabled);
72
- cursor: not-allowed;
73
- }
74
-
75
- /* 私有变量槽位,send 与 stop 两个模式只换这几个配色值 */
76
- [data-scope='composer'][data-part='submit-trigger'] {
77
- --xh-_bg: var(--xh-composer-send-bg, var(--xh-bg-brand));
78
- --xh-_bg-hover: var(--xh-composer-send-bg-hover, var(--xh-bg-brand-hover));
79
- --xh-_bg-active: var(--xh-composer-send-bg-active, var(--xh-bg-brand-active));
80
- --xh-_fg: var(--xh-composer-send-fg, var(--xh-fg-on-brand));
81
-
82
- display: inline-flex;
83
- /* 按钮不参与弹性伸缩 */
84
- flex: none;
85
- align-items: center;
86
- justify-content: center;
87
- min-inline-size: var(--xh-_composer-control-h);
88
- block-size: var(--xh-_composer-control-h);
89
- padding-inline: var(--xh-composer-submit-px, var(--xh-control-px-md));
90
- border: 0;
91
- border-radius: var(--xh-composer-submit-radius, var(--xh-shape-control));
92
- background: var(--xh-_bg);
93
- color: var(--xh-_fg);
94
- font-family: inherit;
95
- font-size: var(--xh-composer-submit-font-size, var(--xh-text-label-size));
96
- font-weight: var(--xh-composer-submit-font-weight, var(--xh-text-label-weight));
97
- line-height: var(--xh-leading-none);
98
- white-space: nowrap;
99
- cursor: pointer;
100
- user-select: none;
101
- transition: background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
102
- }
103
-
104
- [data-scope='composer'][data-part='submit-trigger'][hidden] {
105
- display: none;
106
- }
107
-
108
- [data-scope='composer'][data-part='submit-trigger']:hover:not(:disabled) {
109
- background: var(--xh-_bg-hover);
110
- }
111
-
112
- [data-scope='composer'][data-part='submit-trigger']:active:not(:disabled) {
113
- background: var(--xh-_bg-active);
114
- }
115
-
116
- [data-scope='composer'][data-part='submit-trigger']:focus-visible {
117
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
118
- outline-offset: var(--xh-ring-offset);
119
- }
120
-
121
- /* 停止模式只换配色,从主色降到中性;文案与可访问名由连接层切换 */
122
- [data-scope='composer'][data-part='submit-trigger'][data-mode='stop'] {
123
- --xh-_bg: var(--xh-composer-stop-bg, var(--xh-bg-subtle));
124
- --xh-_bg-hover: var(--xh-composer-stop-bg-hover, var(--xh-bg-subtle-hover));
125
- --xh-_bg-active: var(--xh-composer-stop-bg-active, var(--xh-bg-subtle-active));
126
- --xh-_fg: var(--xh-composer-stop-fg, var(--xh-fg-default));
127
- }
128
-
129
- /* 禁用走原生 disabled,输入为空时按钮转灰但不收起 */
130
- [data-scope='composer'][data-part='submit-trigger']:disabled {
131
- color: var(--xh-fg-disabled);
132
- cursor: not-allowed;
133
- }
134
- }
package/css/countdown.css DELETED
@@ -1,26 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='countdown'] {
4
- --xh-countdown-skin: 1;
5
- }
6
-
7
- [data-scope='countdown'][data-part='root'] {
8
- display: inline-block;
9
- color: var(--xh-countdown-fg, var(--xh-fg-default));
10
- /* 不自带字号:倒计时多半嵌在一句话里或摆在别人的数值槽里,跟着上下文走 */
11
- /* 等宽数字:逐位宽度一致,秒数换位时冒号不会左右挪动 */
12
- font-variant-numeric: tabular-nums;
13
- line-height: var(--xh-leading-tight);
14
- }
15
-
16
- /* 上面声明了 display,会盖掉 UA 的 [hidden] 规则,收起态要在这里接回来 */
17
- [data-scope='countdown'][data-part='root'][hidden] {
18
- display: none;
19
- }
20
-
21
- /* 到点之后这串 00:00:00 不再是活的信息,退一档;它与"暂停在 30 秒上"是两回事,
22
- 后者仍然是要盯着看的数,所以退档只认 data-finished,不认 data-state */
23
- [data-scope='countdown'][data-part='root'][data-finished] {
24
- color: var(--xh-countdown-finished-fg, var(--xh-fg-muted));
25
- }
26
- }
@@ -1,220 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='dynamic-input'] {
4
- --xh-dynamic-input-skin: 1;
5
- }
6
-
7
- /* 一行一条,纵向堆叠;新增把手跟在最后一行下面 */
8
- [data-scope='dynamic-input'][data-part='root'] {
9
- /* 作者塞进指示符槽的图标跟着字号走,与皮肤画的兜底字形同一把尺 */
10
- --xh-icon-size: var(--xh-dynamic-input-icon-size, var(--xh-glyph-size-text));
11
-
12
- display: flex;
13
- flex-direction: column;
14
- gap: var(--xh-dynamic-input-gap, var(--xh-space-2));
15
- }
16
-
17
- /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
18
- [data-scope='dynamic-input'][data-part='root'][hidden] {
19
- display: none;
20
- }
21
-
22
- /* 内容在左、把手在右,把手那一列不随内容伸缩 */
23
- [data-scope='dynamic-input'][data-part='item'] {
24
- display: flex;
25
- align-items: center;
26
- gap: var(--xh-dynamic-input-item-gap, var(--xh-space-2));
27
- padding: var(--xh-dynamic-input-item-padding, var(--xh-space-0));
28
- border-radius: var(--xh-dynamic-input-item-radius, var(--xh-shape-surface));
29
- }
30
-
31
- [data-scope='dynamic-input'][data-part='item'][hidden] {
32
- display: none;
33
- }
34
-
35
- /* 行里放什么控件归作者,这里只给它一条能撑开也能收窄的轨道。
36
- min-inline-size 归零:不写的话里面的输入框按 UA 默认宽度顶住,长内容会把整行撑破 */
37
- [data-scope='dynamic-input'][data-part='item-content'] {
38
- display: flex;
39
- flex: 1 1 auto;
40
- align-items: center;
41
- gap: var(--xh-dynamic-input-content-gap, var(--xh-space-2));
42
- min-inline-size: 0;
43
- }
44
-
45
- [data-scope='dynamic-input'][data-part='item-action'] {
46
- display: inline-flex;
47
- flex: none;
48
- align-items: center;
49
- gap: var(--xh-dynamic-input-action-gap, var(--xh-space-1));
50
- }
51
-
52
- /* —— 行内三个把手 —— */
53
- [data-scope='dynamic-input'][data-part='item-delete-trigger'],
54
- [data-scope='dynamic-input'][data-part='move-up-trigger'],
55
- [data-scope='dynamic-input'][data-part='move-down-trigger'] {
56
- display: inline-flex;
57
- flex: none;
58
- align-items: center;
59
- justify-content: center;
60
- padding: 0;
61
- border: 0;
62
- background: var(--xh-dynamic-input-trigger-bg, transparent);
63
- color: var(--xh-dynamic-input-trigger-fg, var(--xh-fg-muted));
64
- font-family: inherit;
65
- font-size: var(--xh-dynamic-input-trigger-font-size, var(--xh-text-secondary-size));
66
- line-height: var(--xh-leading-none);
67
- cursor: pointer;
68
- transition:
69
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
70
- scale var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
71
- }
72
-
73
- /* 行级删除把手:命中区取行内动作按钮尺寸,圆角取控件圆角 */
74
- [data-scope='dynamic-input'][data-part='item-delete-trigger'] {
75
- inline-size: var(--xh-dynamic-input-trigger-size, var(--xh-control-action-size));
76
- block-size: var(--xh-dynamic-input-trigger-size, var(--xh-control-action-size));
77
- border-radius: var(--xh-dynamic-input-trigger-radius, var(--xh-shape-control));
78
- }
79
-
80
- [data-scope='dynamic-input'][data-part='move-up-trigger'],
81
- [data-scope='dynamic-input'][data-part='move-down-trigger'] {
82
- inline-size: var(--xh-dynamic-input-trigger-size, var(--xh-control-action-size));
83
- block-size: var(--xh-dynamic-input-trigger-size, var(--xh-control-action-size));
84
- border-radius: var(--xh-dynamic-input-trigger-radius, var(--xh-shape-control));
85
- }
86
-
87
- /* 不换序时连接层给换序把手写 hidden;上面那条 display 会把 UA 的 [hidden]{display:none}
88
- 盖掉,少了这条把手还留在原地。删除把手同样声明了 display,作者自己收起它时要的是同一条 */
89
- [data-scope='dynamic-input'][data-part='item-delete-trigger'][hidden],
90
- [data-scope='dynamic-input'][data-part='move-up-trigger'][hidden],
91
- [data-scope='dynamic-input'][data-part='move-down-trigger'][hidden] {
92
- display: none;
93
- }
94
-
95
- /* 按不动的把手不给悬停与按下反馈:它仍然可聚焦、可点,反馈会让人以为点得动 */
96
- [data-scope='dynamic-input'][data-part='item-delete-trigger']:hover:not([aria-disabled='true']),
97
- [data-scope='dynamic-input'][data-part='move-up-trigger']:hover:not([aria-disabled='true']),
98
- [data-scope='dynamic-input'][data-part='move-down-trigger']:hover:not([aria-disabled='true']) {
99
- background: var(--xh-dynamic-input-trigger-bg-hover, var(--xh-bg-subtle-hover));
100
- color: var(--xh-dynamic-input-trigger-fg-hover, var(--xh-fg-default));
101
- }
102
-
103
- [data-scope='dynamic-input'][data-part='item-delete-trigger']:not([aria-disabled='true']):active,
104
- [data-scope='dynamic-input'][data-part='move-up-trigger']:not([aria-disabled='true']):active,
105
- [data-scope='dynamic-input'][data-part='move-down-trigger']:not([aria-disabled='true']):active {
106
- background: var(--xh-dynamic-input-trigger-bg-active, var(--xh-bg-subtle-active));
107
- scale: var(--xh-motion-scale-press);
108
- }
109
-
110
- /* 删除把手悬停转危险色:它是这一行里唯一不可撤销的动作 */
111
- [data-scope='dynamic-input'][data-part='item-delete-trigger']:hover:not([aria-disabled='true']) {
112
- color: var(--xh-dynamic-input-item-delete-fg-hover, var(--xh-fg-danger-hover));
113
- }
114
-
115
- [data-scope='dynamic-input'][data-part='item-delete-trigger']:focus-visible,
116
- [data-scope='dynamic-input'][data-part='move-up-trigger']:focus-visible,
117
- [data-scope='dynamic-input'][data-part='move-down-trigger']:focus-visible {
118
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
119
- outline-offset: var(--xh-ring-offset);
120
- }
121
-
122
- /* 到上下限、或整份禁用时用 aria-disabled 表达(原生 disabled 不派 click,禁用守卫走不到),
123
- 所以样式也得认这个属性,写 :disabled 永远不命中 */
124
- [data-scope='dynamic-input'][data-part='item-delete-trigger'][aria-disabled='true'],
125
- [data-scope='dynamic-input'][data-part='move-up-trigger'][aria-disabled='true'],
126
- [data-scope='dynamic-input'][data-part='move-down-trigger'][aria-disabled='true'] {
127
- background: transparent;
128
- color: var(--xh-fg-disabled);
129
- cursor: not-allowed;
130
- }
131
-
132
- /* —— 新增把手 —— */
133
- /* 虚线描边把它和行里的实心控件区分开:它加的是行,不是行里的值 */
134
- [data-scope='dynamic-input'][data-part='add-trigger'] {
135
- display: inline-flex;
136
- align-self: flex-start;
137
- align-items: center;
138
- justify-content: center;
139
- gap: var(--xh-dynamic-input-action-gap, var(--xh-space-1));
140
- block-size: var(--xh-dynamic-input-add-height, var(--xh-control-h-md));
141
- padding-inline: var(--xh-dynamic-input-add-px, var(--xh-control-px-md));
142
- border: var(--xh-stroke-thin) dashed var(--xh-dynamic-input-add-border, var(--xh-border-control));
143
- border-radius: var(--xh-dynamic-input-add-radius, var(--xh-shape-control));
144
- background: var(--xh-dynamic-input-add-bg, transparent);
145
- color: var(--xh-dynamic-input-add-fg, var(--xh-fg-brand));
146
- font-family: inherit;
147
- font-size: var(--xh-dynamic-input-add-font-size, var(--xh-text-label-size));
148
- line-height: var(--xh-leading-none);
149
- cursor: pointer;
150
- transition:
151
- background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
152
- border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
153
- }
154
-
155
- [data-scope='dynamic-input'][data-part='add-trigger'][hidden] {
156
- display: none;
157
- }
158
-
159
- [data-scope='dynamic-input'][data-part='add-trigger']:hover:not([aria-disabled='true']) {
160
- border-color: var(--xh-dynamic-input-add-border-hover, var(--xh-border-control-hover));
161
- background: var(--xh-dynamic-input-add-bg-hover, var(--xh-bg-subtle-hover));
162
- }
163
-
164
- [data-scope='dynamic-input'][data-part='add-trigger']:not([aria-disabled='true']):active {
165
- background: var(--xh-dynamic-input-add-bg-active, var(--xh-bg-subtle-active));
166
- }
167
-
168
- [data-scope='dynamic-input'][data-part='add-trigger']:focus-visible {
169
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
170
- outline-offset: var(--xh-ring-offset);
171
- }
172
-
173
- [data-scope='dynamic-input'][data-part='add-trigger'][aria-disabled='true'] {
174
- border-color: var(--xh-dynamic-input-add-border-disabled, var(--xh-border-subtle));
175
- background: transparent;
176
- color: var(--xh-fg-disabled);
177
- cursor: not-allowed;
178
- }
179
-
180
- /* 没写内容就由皮肤画兜底字形;作者往部件里塞了自己的图形,这几条即不命中 */
181
- [data-scope='dynamic-input'][data-part='move-up-trigger']:empty::before {
182
- content: '';
183
- display: inline-block;
184
- inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
185
- block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
186
- vertical-align: var(--xh-glyph-baseline-shift);
187
- background-color: currentColor;
188
- -webkit-mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
189
- mask: var(--xh-glyph-mark-chevron-up) center / contain no-repeat;
190
- }
191
-
192
- [data-scope='dynamic-input'][data-part='move-down-trigger']:empty::before {
193
- content: '';
194
- display: inline-block;
195
- inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
196
- block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
197
- vertical-align: var(--xh-glyph-baseline-shift);
198
- background-color: currentColor;
199
- -webkit-mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
200
- mask: var(--xh-glyph-mark-chevron-down) center / contain no-repeat;
201
- }
202
-
203
- [data-scope='dynamic-input'][data-part='item-delete-trigger']:empty::before {
204
- content: '';
205
- display: inline-block;
206
- inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
207
- block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
208
- vertical-align: var(--xh-glyph-baseline-shift);
209
- background-color: currentColor;
210
- -webkit-mask: var(--xh-glyph-mark-close) center / contain no-repeat;
211
- mask: var(--xh-glyph-mark-close) center / contain no-repeat;
212
- }
213
-
214
- /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
215
- 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
216
- [data-scope='dynamic-input'][data-part='item-content'][hidden],
217
- [data-scope='dynamic-input'][data-part='item-action'][hidden] {
218
- display: none;
219
- }
220
- }
package/css/ellipsis.css DELETED
@@ -1,52 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='ellipsis'] {
4
- --xh-ellipsis-skin: 1;
5
- }
6
-
7
- /* 单行:一行装不下就收成省略号。
8
- 行数由连接层写进这个盒子的内联 style,样式表这一行只是它缺席时的落点 */
9
- [data-scope='ellipsis'][data-part='root'] {
10
- --xh-_ellipsis-lines: 1;
11
-
12
- display: block;
13
- overflow: hidden;
14
- white-space: nowrap;
15
- text-overflow: ellipsis;
16
- }
17
-
18
- /* 多行:按行数裁,裁掉的那一行末尾收省略号 */
19
- [data-scope='ellipsis'][data-part='root'][data-multiline] {
20
- display: -webkit-box;
21
- overflow: hidden;
22
- -webkit-box-orient: vertical;
23
- -webkit-line-clamp: var(--xh-_ellipsis-lines);
24
- white-space: normal;
25
- /* 一长串没有断点的字符(网址、编号)也得断开,否则它一路撑出去,裁不住 */
26
- overflow-wrap: break-word;
27
- }
28
-
29
- /* 铺开:裁剪整个撤掉。写在两档之后,压得住上面同权重的那两条 */
30
- [data-scope='ellipsis'][data-part='root'][data-state='open'] {
31
- display: block;
32
- overflow: visible;
33
- white-space: normal;
34
- }
35
-
36
- /* 可展开时整块文字就是那颗按钮 */
37
- [data-scope='ellipsis'][data-part='root'][data-expandable] {
38
- cursor: pointer;
39
- }
40
-
41
- /* 聚焦环恒是 --xh-ring-focus,不随语气走 */
42
- [data-scope='ellipsis'][data-part='root'][data-expandable]:focus-visible {
43
- outline: var(--xh-ring-width) solid var(--xh-ring-focus);
44
- outline-offset: var(--xh-ring-offset);
45
- }
46
-
47
- /* 声明过任何 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去。
48
- 写在文件末尾:兜底必须排在该部件所有 display 声明之后 */
49
- [data-scope='ellipsis'][data-part='root'][hidden] {
50
- display: none;
51
- }
52
- }
package/css/hotkeys.css DELETED
@@ -1,90 +0,0 @@
1
- @layer xihan.components {
2
- /* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
3
- [data-scope='hotkeys'] {
4
- --xh-hotkeys-skin: 1;
5
- }
6
-
7
- /* 一排键帽连着连接符。整块不换行:一组组合被折成两行就读不出是一组了 */
8
- [data-scope='hotkeys'][data-part='root'] {
9
- /* 尺寸档只换这两个私有槽,键帽从 root 继承它们,换档不必给每个部件各写一条选择器 */
10
- --xh-_hotkeys-font-size: var(--xh-control-caption-md);
11
- --xh-_hotkeys-key-px: var(--xh-space-1);
12
-
13
- display: inline-flex;
14
- align-items: center;
15
- gap: var(--xh-hotkeys-gap, var(--xh-space-0_5));
16
- color: var(--xh-hotkeys-fg, var(--xh-fg-muted));
17
- font-size: var(--xh-hotkeys-font-size, var(--xh-_hotkeys-font-size));
18
- line-height: var(--xh-leading-none);
19
- white-space: nowrap;
20
- }
21
-
22
- /* 一枚键帽:等宽字,带描边与一层薄阴影凑出按键的样子。
23
- min-inline-size 保证单个字母的键帽不至于窄成一条 */
24
- [data-scope='hotkeys'][data-part='key'] {
25
- display: inline-flex;
26
- align-items: center;
27
- justify-content: center;
28
- min-inline-size: var(--xh-hotkeys-key-min-w, var(--xh-control-indicator-size));
29
- padding-block: var(--xh-hotkeys-key-py, var(--xh-space-0_5));
30
- padding-inline: var(--xh-hotkeys-key-px, var(--xh-_hotkeys-key-px));
31
- border: var(--xh-stroke-thin) solid var(--xh-hotkeys-key-border, var(--xh-border-subtle));
32
- border-radius: var(--xh-hotkeys-key-radius, var(--xh-shape-inset));
33
- background: var(--xh-hotkeys-key-bg, var(--xh-bg-surface));
34
- box-shadow: var(--xh-hotkeys-key-shadow, var(--xh-elevation-raised));
35
- color: var(--xh-hotkeys-key-fg, var(--xh-fg-default));
36
- /* kbd 的 UA 字体是等宽,但字号会被压小;两者都显式接过来,档位才归尺寸轴管 */
37
- font-family: var(--xh-hotkeys-key-font, var(--xh-font-family-mono));
38
- font-size: inherit;
39
- font-weight: var(--xh-hotkeys-key-font-weight, var(--xh-font-weight-medium));
40
- line-height: var(--xh-leading-none);
41
- }
42
-
43
- /* 修饰键多是符号,与主键的字母混排时字宽差得远,单独留一档给使用者调 */
44
- [data-scope='hotkeys'][data-part='key'][data-modifier] {
45
- color: var(--xh-hotkeys-key-fg-modifier, var(--xh-fg-muted));
46
- }
47
-
48
- /* 连接符是排版符号,不参与键帽的盒子 */
49
- [data-scope='hotkeys'][data-part='separator'] {
50
- color: var(--xh-hotkeys-separator-fg, var(--xh-fg-subtle));
51
- user-select: none;
52
- }
53
-
54
- /* 监听关掉时组合按不出来,整块转成不可用的样子:键帽换成暗底、去掉阴影,前景压到 fg-subtle。
55
- 这块是 role=img 的说明性文字而不是失效控件,读者仍要认出按的是哪几枚键,
56
- 所以前景不用 fg-disabled(那一档压在 muted 底上只有 2.36:1 / 1.94:1),也不叠 opacity */
57
- [data-scope='hotkeys'][data-part='root'][data-disabled] {
58
- color: var(--xh-fg-subtle);
59
- }
60
-
61
- [data-scope='hotkeys'][data-part='root'][data-disabled] [data-scope='hotkeys'][data-part='key'] {
62
- background: var(--xh-hotkeys-key-bg-disabled, var(--xh-bg-muted));
63
- box-shadow: none;
64
- color: var(--xh-fg-subtle);
65
- }
66
-
67
- [data-scope='hotkeys'][data-part='root'][data-disabled] [data-scope='hotkeys'][data-part='separator'] {
68
- color: var(--xh-fg-subtle);
69
- }
70
-
71
- /* —— 尺寸 —— */
72
- /* 缺省的 md 档写在上面的基础规则里 */
73
- [data-scope='hotkeys'][data-part='root'][data-size='sm'] {
74
- --xh-_hotkeys-font-size: var(--xh-control-caption-sm);
75
- --xh-_hotkeys-key-px: var(--xh-space-0_5);
76
- }
77
-
78
- [data-scope='hotkeys'][data-part='root'][data-size='lg'] {
79
- --xh-_hotkeys-font-size: var(--xh-control-caption-lg);
80
- --xh-_hotkeys-key-px: var(--xh-space-1_5);
81
- }
82
-
83
- /* 给了 display 的角色节点必须补这条:display 声明会盖掉 UA 的 [hidden]{display:none},
84
- 不补的话作者给节点加 hidden 后它照样显示。Mac 写法下连接符恒带 hidden,靠这条收起 */
85
- [data-scope='hotkeys'][data-part='root'][hidden],
86
- [data-scope='hotkeys'][data-part='key'][hidden],
87
- [data-scope='hotkeys'][data-part='separator'][hidden] {
88
- display: none;
89
- }
90
- }