@xihan-ui/styles 1.0.0-alpha.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 (114) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/LICENSE +21 -0
  3. package/README.md +27 -0
  4. package/css/accordion.css +108 -0
  5. package/css/affix.css +27 -0
  6. package/css/alert.css +108 -0
  7. package/css/anchor.css +137 -0
  8. package/css/avatar-group.css +82 -0
  9. package/css/avatar.css +55 -0
  10. package/css/back-top.css +61 -0
  11. package/css/badge.css +50 -0
  12. package/css/breadcrumb.css +127 -0
  13. package/css/button-group.css +131 -0
  14. package/css/button.css +98 -0
  15. package/css/calendar.css +219 -0
  16. package/css/card.css +116 -0
  17. package/css/carousel.css +193 -0
  18. package/css/cascader.css +397 -0
  19. package/css/checkbox-group.css +185 -0
  20. package/css/checkbox.css +91 -0
  21. package/css/clipboard.css +133 -0
  22. package/css/code-block.css +81 -0
  23. package/css/collapsible.css +63 -0
  24. package/css/color-picker.css +424 -0
  25. package/css/combobox.css +433 -0
  26. package/css/composer.css +127 -0
  27. package/css/context-menu.css +263 -0
  28. package/css/countdown.css +21 -0
  29. package/css/date-field.css +200 -0
  30. package/css/date-picker.css +231 -0
  31. package/css/descriptions.css +200 -0
  32. package/css/dialog.css +127 -0
  33. package/css/drawer.css +372 -0
  34. package/css/dynamic-input.css +157 -0
  35. package/css/editable.css +249 -0
  36. package/css/ellipsis.css +41 -0
  37. package/css/empty-state.css +78 -0
  38. package/css/field.css +65 -0
  39. package/css/file-upload.css +298 -0
  40. package/css/flex.css +95 -0
  41. package/css/float-button.css +121 -0
  42. package/css/form.css +185 -0
  43. package/css/gradient-text.css +62 -0
  44. package/css/grid.css +428 -0
  45. package/css/highlight.css +21 -0
  46. package/css/hover-card.css +146 -0
  47. package/css/icon-wrapper.css +64 -0
  48. package/css/icon.css +54 -0
  49. package/css/image.css +45 -0
  50. package/css/infinite-scroll.css +22 -0
  51. package/css/layers.css +2 -0
  52. package/css/layout.css +169 -0
  53. package/css/list.css +117 -0
  54. package/css/listbox.css +174 -0
  55. package/css/loading-bar.css +66 -0
  56. package/css/log.css +66 -0
  57. package/css/marquee.css +182 -0
  58. package/css/mention.css +222 -0
  59. package/css/menu.css +144 -0
  60. package/css/menubar.css +271 -0
  61. package/css/motion.css +58 -0
  62. package/css/navigation-menu.css +270 -0
  63. package/css/number-animation.css +32 -0
  64. package/css/number-field.css +219 -0
  65. package/css/page-header.css +85 -0
  66. package/css/pagination.css +148 -0
  67. package/css/pin-input.css +157 -0
  68. package/css/popconfirm.css +150 -0
  69. package/css/popover.css +150 -0
  70. package/css/popselect.css +207 -0
  71. package/css/progress.css +37 -0
  72. package/css/qr-code.css +50 -0
  73. package/css/radio-group.css +101 -0
  74. package/css/rating.css +141 -0
  75. package/css/reset.css +22 -0
  76. package/css/result.css +104 -0
  77. package/css/scroll-area.css +176 -0
  78. package/css/select.css +264 -0
  79. package/css/separator.css +17 -0
  80. package/css/skeleton.css +78 -0
  81. package/css/slider.css +197 -0
  82. package/css/spinner.css +74 -0
  83. package/css/splitter.css +127 -0
  84. package/css/statistic.css +67 -0
  85. package/css/steps.css +252 -0
  86. package/css/switch.css +61 -0
  87. package/css/table.css +404 -0
  88. package/css/tabs.css +157 -0
  89. package/css/tags-input.css +360 -0
  90. package/css/text-field.css +195 -0
  91. package/css/thread.css +107 -0
  92. package/css/time-field.css +200 -0
  93. package/css/time-picker.css +347 -0
  94. package/css/time.css +20 -0
  95. package/css/timeline.css +284 -0
  96. package/css/toast.css +195 -0
  97. package/css/toaster.css +69 -0
  98. package/css/toggle-group.css +160 -0
  99. package/css/toggle.css +103 -0
  100. package/css/tone.css +85 -0
  101. package/css/toolbar.css +114 -0
  102. package/css/tooltip.css +109 -0
  103. package/css/tour.css +305 -0
  104. package/css/transfer.css +318 -0
  105. package/css/tree-select.css +441 -0
  106. package/css/tree.css +204 -0
  107. package/css/typography.css +151 -0
  108. package/css/undefined.css +38 -0
  109. package/css/virtualizer.css +104 -0
  110. package/css/visually-hidden.css +13 -0
  111. package/css/watermark.css +48 -0
  112. package/index.css +113 -0
  113. package/index.unlayered.css +16164 -0
  114. package/package.json +163 -0
@@ -0,0 +1,133 @@
1
+ @layer xihan.components {
2
+ /* 与文本框同一套堆叠:标签一行、输入行一行 */
3
+ [data-scope='clipboard'][data-part='root'] {
4
+ display: inline-flex;
5
+ flex-direction: column;
6
+ gap: var(--xh-clipboard-gap, var(--xh-space-1));
7
+ }
8
+
9
+ /* 声明了 display 就盖掉了 UA 的 [hidden]{display:none},收起态得自己还回去 */
10
+ [data-scope='clipboard'][data-part='root'][hidden] {
11
+ display: none;
12
+ }
13
+
14
+ [data-scope='clipboard'][data-part='label'] {
15
+ color: var(--xh-clipboard-label-fg, var(--xh-fg-default));
16
+ font-size: var(--xh-clipboard-label-font-size, var(--xh-text-label-size));
17
+ font-weight: var(--xh-clipboard-label-font-weight, var(--xh-text-label-weight));
18
+ line-height: var(--xh-leading-none);
19
+ }
20
+
21
+ [data-scope='clipboard'][data-part='label'][hidden] {
22
+ display: none;
23
+ }
24
+
25
+ /* 输入框与按钮并排,两者各自把高度对齐即可成一体 */
26
+ [data-scope='clipboard'][data-part='control'] {
27
+ display: inline-flex;
28
+ align-items: center;
29
+ gap: var(--xh-clipboard-control-gap, var(--xh-control-gap-md));
30
+ }
31
+
32
+ [data-scope='clipboard'][data-part='control'][hidden] {
33
+ display: none;
34
+ }
35
+
36
+ [data-scope='clipboard'][data-part='input'] {
37
+ min-inline-size: var(--xh-clipboard-input-min-w, 12rem);
38
+ block-size: var(--xh-clipboard-input-h, var(--xh-control-h-md));
39
+ padding-inline: var(--xh-clipboard-input-px, var(--xh-control-px-md));
40
+ padding-block: 0;
41
+ border: var(--xh-stroke-thin) solid var(--xh-clipboard-input-border, var(--xh-border-default));
42
+ border-radius: var(--xh-clipboard-input-radius, var(--xh-shape-control));
43
+ /* 只读态压低底色表示"改不动",但仍可聚焦、可选中复制 */
44
+ background: var(--xh-clipboard-input-bg, var(--xh-bg-subtle));
45
+ color: var(--xh-clipboard-input-fg, var(--xh-fg-default));
46
+ /* 表单控件不继承页面字体,只给字号会让输入框用 UA 默认字族 */
47
+ font-family: inherit;
48
+ font-size: var(--xh-clipboard-input-font-size, var(--xh-text-body-size));
49
+ line-height: var(--xh-leading-normal);
50
+ /* 密钥、哈希这类内容一律等宽:截断与换行处对得齐,也更好逐字核对 */
51
+ font-variant-numeric: tabular-nums;
52
+ text-overflow: ellipsis;
53
+ }
54
+
55
+ [data-scope='clipboard'][data-part='input']:focus-visible {
56
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
57
+ outline-offset: var(--xh-ring-offset);
58
+ }
59
+
60
+ [data-scope='clipboard'][data-part='trigger'] {
61
+ display: inline-flex;
62
+ flex: none;
63
+ align-items: center;
64
+ justify-content: center;
65
+ gap: var(--xh-clipboard-trigger-gap, var(--xh-control-gap-sm));
66
+ block-size: var(--xh-clipboard-trigger-h, var(--xh-control-h-md));
67
+ padding-inline: var(--xh-clipboard-trigger-px, var(--xh-control-px-md));
68
+ padding-block: 0;
69
+ border: var(--xh-stroke-thin) solid var(--xh-clipboard-trigger-border, var(--xh-border-default));
70
+ border-radius: var(--xh-clipboard-trigger-radius, var(--xh-shape-control));
71
+ background: var(--xh-clipboard-trigger-bg, var(--xh-bg-canvas));
72
+ color: var(--xh-clipboard-trigger-fg, var(--xh-fg-default));
73
+ font-family: inherit;
74
+ font-size: var(--xh-clipboard-trigger-font-size, var(--xh-text-body-size));
75
+ line-height: var(--xh-leading-none);
76
+ white-space: nowrap;
77
+ cursor: pointer;
78
+ /* 复制按钮常被连点,触屏上默认会当成双击缩放 */
79
+ user-select: none;
80
+ touch-action: manipulation;
81
+ transition:
82
+ background var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
83
+ border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
84
+ }
85
+
86
+ /* 上面给了 display,UA 的 [hidden]{display:none} 已被盖掉,这里补回来 */
87
+ [data-scope='clipboard'][data-part='trigger'][hidden] {
88
+ display: none;
89
+ }
90
+
91
+ [data-scope='clipboard'][data-part='trigger']:hover {
92
+ border-color: var(--xh-clipboard-trigger-border-hover, var(--xh-border-strong));
93
+ background: var(--xh-clipboard-trigger-bg-hover, var(--xh-bg-subtle-hover));
94
+ }
95
+
96
+ [data-scope='clipboard'][data-part='trigger']:active {
97
+ background: var(--xh-clipboard-trigger-bg-active, var(--xh-bg-subtle-active));
98
+ }
99
+
100
+ [data-scope='clipboard'][data-part='trigger']:focus-visible {
101
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
102
+ outline-offset: var(--xh-ring-offset);
103
+ }
104
+
105
+ /* 写入在途:按钮还在原地不动,只把它压暗一点,免得连点 */
106
+ [data-scope='clipboard'][data-part='trigger'][data-state='copying'] {
107
+ cursor: progress;
108
+ opacity: 0.7;
109
+ }
110
+
111
+ /* 复制成功那一段换成成功色,撑住"这次真的写进去了"这句话 */
112
+ [data-scope='clipboard'][data-part='trigger'][data-copied] {
113
+ border-color: var(--xh-clipboard-trigger-border-copied, var(--xh-fg-success));
114
+ color: var(--xh-clipboard-trigger-fg-copied, var(--xh-fg-success));
115
+ }
116
+
117
+ [data-scope='clipboard'][data-part='indicator'] {
118
+ display: inline-flex;
119
+ flex: none;
120
+ align-items: center;
121
+ justify-content: center;
122
+ }
123
+
124
+ /* 两个指示器靠 hidden 互斥显隐;上面给了 display,这条不补的话收起态当场失效 */
125
+ [data-scope='clipboard'][data-part='indicator'][hidden] {
126
+ display: none;
127
+ }
128
+
129
+ /* 成功那一侧的图标用成功色;平时那侧跟着按钮的文字色走 */
130
+ [data-scope='clipboard'][data-part='indicator'][data-copied] {
131
+ color: var(--xh-clipboard-indicator-fg-copied, var(--xh-fg-success));
132
+ }
133
+ }
@@ -0,0 +1,81 @@
1
+ @layer xihan.components {
2
+ /* overflow: hidden 让内部 <pre> 的滚动内容沿圆角收边;不设 display,排布由作者决定 */
3
+ [data-scope='code-block'][data-part='root'] {
4
+ overflow: hidden;
5
+ border-radius: var(--xh-code-block-radius, var(--xh-shape-surface));
6
+ background: var(--xh-code-block-bg, var(--xh-bg-subtle));
7
+ }
8
+
9
+ /* 显式 block 使作者用 <span> 时也能吃进 padding-block;user-select: none 让它不被框选带走 */
10
+ [data-scope='code-block'][data-part='lang-label'] {
11
+ display: block;
12
+ padding-inline: var(--xh-code-block-label-px, var(--xh-space-3));
13
+ padding-block: var(--xh-code-block-label-py, var(--xh-space-1));
14
+ color: var(--xh-code-block-label-fg, var(--xh-fg-muted));
15
+ font-size: var(--xh-code-block-label-font-size, var(--xh-text-label-size));
16
+ line-height: var(--xh-leading-none);
17
+ user-select: none;
18
+ }
19
+
20
+ /* 上面声明的 display 会盖掉 UA 的 [hidden]{display:none},这里补回 */
21
+ [data-scope='code-block'][data-part='lang-label'][hidden] {
22
+ display: none;
23
+ }
24
+
25
+ /* margin: 0 去掉 UA 给 <pre> 的默认外边距。
26
+ --xh-code-block-line-height 的兜底值须与连接层内联 min-block-size 用的一致,
27
+ 且因参与 calc 乘法必须是长度而非无单位倍数。 */
28
+ [data-scope='code-block'][data-part='pre'] {
29
+ /* 逻辑属性 overflow-inline 尚无可用实现,写物理轴 */
30
+ overflow-x: auto;
31
+ padding: var(--xh-code-block-p, var(--xh-space-3));
32
+ margin: 0;
33
+ line-height: var(--xh-code-block-line-height, 1.5rem);
34
+ }
35
+
36
+ /* <pre> 带 tabindex=0,需要焦点环;偏移取负画在内侧,避免被 root 的 overflow: hidden 裁掉 */
37
+ [data-scope='code-block'][data-part='pre']:focus-visible {
38
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
39
+ outline-offset: calc(-1 * var(--xh-ring-width));
40
+ }
41
+
42
+ /* white-space: pre 保留缩进不自动换行,长行改为横向滚动 */
43
+ [data-scope='code-block'][data-part='code'] {
44
+ font-family: var(--xh-code-block-font, var(--xh-font-family-mono));
45
+ white-space: pre;
46
+ }
47
+
48
+ /* 语法配色。令牌集里没有语法色这一类,所以就地声明成可覆盖的变量:
49
+ 注释与标点复用既有语义色,只有三种真需要色相的走 light-dark()。
50
+ 浏览器不认 light-dark() 时这几条整体失效,退化成单色代码,读起来照常。 */
51
+ [data-scope='code-block'][data-part='root'] {
52
+ --xh-code-block-comment-fg: var(--xh-fg-muted);
53
+ --xh-code-block-punctuation-fg: var(--xh-fg-subtle);
54
+ --xh-code-block-string-fg: light-dark(#0a7f5f, #7ee2b8);
55
+ --xh-code-block-number-fg: light-dark(#9a5b00, #f0b866);
56
+ --xh-code-block-keyword-fg: light-dark(#8250df, #d2a8ff);
57
+ }
58
+
59
+ /* 记号本身不带任何布局,只上色:它是 <code> 里的行内片段,多一点盒模型都会破坏对齐 */
60
+ [data-scope='code-block'][data-part='token'][data-kind='comment'] {
61
+ color: var(--xh-code-block-comment-fg);
62
+ font-style: italic;
63
+ }
64
+
65
+ [data-scope='code-block'][data-part='token'][data-kind='string'] {
66
+ color: var(--xh-code-block-string-fg);
67
+ }
68
+
69
+ [data-scope='code-block'][data-part='token'][data-kind='number'] {
70
+ color: var(--xh-code-block-number-fg);
71
+ }
72
+
73
+ [data-scope='code-block'][data-part='token'][data-kind='keyword'] {
74
+ color: var(--xh-code-block-keyword-fg);
75
+ font-weight: var(--xh-code-block-keyword-weight, 600);
76
+ }
77
+
78
+ [data-scope='code-block'][data-part='token'][data-kind='punctuation'] {
79
+ color: var(--xh-code-block-punctuation-fg);
80
+ }
81
+ }
@@ -0,0 +1,63 @@
1
+ @layer xihan.components {
2
+ /* 根容器自己不排版,这条只声明尺寸档的私有槽:触发按钮从 root 继承它们,
3
+ 换档不必给部件各写一条选择器 */
4
+ [data-scope='collapsible'][data-part='root'] {
5
+ --xh-_collapsible-trigger-h: var(--xh-control-h-md);
6
+ --xh-_collapsible-trigger-px: var(--xh-control-px-md);
7
+ --xh-_collapsible-trigger-gap: var(--xh-control-gap-md);
8
+ --xh-_collapsible-trigger-font-size: var(--xh-text-label-size);
9
+ }
10
+
11
+ /* —— 尺寸 —— */
12
+ /* 缺省档写在上面那条里 */
13
+ [data-scope='collapsible'][data-part='root'][data-size='sm'] {
14
+ --xh-_collapsible-trigger-h: var(--xh-control-h-sm);
15
+ --xh-_collapsible-trigger-px: var(--xh-control-px-sm);
16
+ --xh-_collapsible-trigger-gap: var(--xh-control-gap-sm);
17
+ --xh-_collapsible-trigger-font-size: var(--xh-font-size-sm);
18
+ }
19
+
20
+ [data-scope='collapsible'][data-part='root'][data-size='lg'] {
21
+ --xh-_collapsible-trigger-h: var(--xh-control-h-lg);
22
+ --xh-_collapsible-trigger-px: var(--xh-control-px-lg);
23
+ --xh-_collapsible-trigger-gap: var(--xh-control-gap-lg);
24
+ --xh-_collapsible-trigger-font-size: var(--xh-font-size-lg);
25
+ }
26
+
27
+ [data-scope='collapsible'][data-part='trigger'] {
28
+ display: inline-flex;
29
+ align-items: center;
30
+ justify-content: space-between;
31
+ inline-size: 100%;
32
+ gap: var(--xh-collapsible-trigger-gap, var(--xh-_collapsible-trigger-gap));
33
+ block-size: var(--xh-collapsible-trigger-h, var(--xh-_collapsible-trigger-h));
34
+ padding-inline: var(--xh-collapsible-trigger-px, var(--xh-_collapsible-trigger-px));
35
+ border: 0;
36
+ border-radius: var(--xh-collapsible-trigger-radius, var(--xh-shape-control));
37
+ background: var(--xh-collapsible-trigger-bg, transparent);
38
+ color: var(--xh-collapsible-trigger-fg, var(--xh-fg-default));
39
+ font-size: var(--xh-collapsible-trigger-font-size, var(--xh-_collapsible-trigger-font-size));
40
+ font-weight: var(--xh-collapsible-trigger-font-weight, var(--xh-text-label-weight));
41
+ line-height: var(--xh-leading-none);
42
+ cursor: pointer;
43
+ }
44
+
45
+ [data-scope='collapsible'][data-part='trigger']:hover {
46
+ background: var(--xh-collapsible-trigger-bg-hover, var(--xh-bg-subtle));
47
+ }
48
+
49
+ [data-scope='collapsible'][data-part='trigger']:focus-visible {
50
+ outline: var(--xh-ring-width) solid var(--xh-ring-focus);
51
+ outline-offset: var(--xh-ring-offset);
52
+ }
53
+
54
+ [data-scope='collapsible'][data-part='trigger'][data-disabled] {
55
+ cursor: not-allowed;
56
+ opacity: var(--xh-state-disabled-opacity);
57
+ }
58
+
59
+ [data-scope='collapsible'][data-part='content'] {
60
+ padding-block: var(--xh-collapsible-content-py, var(--xh-stack-gap-md));
61
+ color: var(--xh-collapsible-content-fg, var(--xh-fg-default));
62
+ }
63
+ }