@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.
- package/CHANGELOG.md +44 -0
- package/LICENSE +21 -0
- package/README.md +27 -0
- package/css/accordion.css +108 -0
- package/css/affix.css +27 -0
- package/css/alert.css +108 -0
- package/css/anchor.css +137 -0
- package/css/avatar-group.css +82 -0
- package/css/avatar.css +55 -0
- package/css/back-top.css +61 -0
- package/css/badge.css +50 -0
- package/css/breadcrumb.css +127 -0
- package/css/button-group.css +131 -0
- package/css/button.css +98 -0
- package/css/calendar.css +219 -0
- package/css/card.css +116 -0
- package/css/carousel.css +193 -0
- package/css/cascader.css +397 -0
- package/css/checkbox-group.css +185 -0
- package/css/checkbox.css +91 -0
- package/css/clipboard.css +133 -0
- package/css/code-block.css +81 -0
- package/css/collapsible.css +63 -0
- package/css/color-picker.css +424 -0
- package/css/combobox.css +433 -0
- package/css/composer.css +127 -0
- package/css/context-menu.css +263 -0
- package/css/countdown.css +21 -0
- package/css/date-field.css +200 -0
- package/css/date-picker.css +231 -0
- package/css/descriptions.css +200 -0
- package/css/dialog.css +127 -0
- package/css/drawer.css +372 -0
- package/css/dynamic-input.css +157 -0
- package/css/editable.css +249 -0
- package/css/ellipsis.css +41 -0
- package/css/empty-state.css +78 -0
- package/css/field.css +65 -0
- package/css/file-upload.css +298 -0
- package/css/flex.css +95 -0
- package/css/float-button.css +121 -0
- package/css/form.css +185 -0
- package/css/gradient-text.css +62 -0
- package/css/grid.css +428 -0
- package/css/highlight.css +21 -0
- package/css/hover-card.css +146 -0
- package/css/icon-wrapper.css +64 -0
- package/css/icon.css +54 -0
- package/css/image.css +45 -0
- package/css/infinite-scroll.css +22 -0
- package/css/layers.css +2 -0
- package/css/layout.css +169 -0
- package/css/list.css +117 -0
- package/css/listbox.css +174 -0
- package/css/loading-bar.css +66 -0
- package/css/log.css +66 -0
- package/css/marquee.css +182 -0
- package/css/mention.css +222 -0
- package/css/menu.css +144 -0
- package/css/menubar.css +271 -0
- package/css/motion.css +58 -0
- package/css/navigation-menu.css +270 -0
- package/css/number-animation.css +32 -0
- package/css/number-field.css +219 -0
- package/css/page-header.css +85 -0
- package/css/pagination.css +148 -0
- package/css/pin-input.css +157 -0
- package/css/popconfirm.css +150 -0
- package/css/popover.css +150 -0
- package/css/popselect.css +207 -0
- package/css/progress.css +37 -0
- package/css/qr-code.css +50 -0
- package/css/radio-group.css +101 -0
- package/css/rating.css +141 -0
- package/css/reset.css +22 -0
- package/css/result.css +104 -0
- package/css/scroll-area.css +176 -0
- package/css/select.css +264 -0
- package/css/separator.css +17 -0
- package/css/skeleton.css +78 -0
- package/css/slider.css +197 -0
- package/css/spinner.css +74 -0
- package/css/splitter.css +127 -0
- package/css/statistic.css +67 -0
- package/css/steps.css +252 -0
- package/css/switch.css +61 -0
- package/css/table.css +404 -0
- package/css/tabs.css +157 -0
- package/css/tags-input.css +360 -0
- package/css/text-field.css +195 -0
- package/css/thread.css +107 -0
- package/css/time-field.css +200 -0
- package/css/time-picker.css +347 -0
- package/css/time.css +20 -0
- package/css/timeline.css +284 -0
- package/css/toast.css +195 -0
- package/css/toaster.css +69 -0
- package/css/toggle-group.css +160 -0
- package/css/toggle.css +103 -0
- package/css/tone.css +85 -0
- package/css/toolbar.css +114 -0
- package/css/tooltip.css +109 -0
- package/css/tour.css +305 -0
- package/css/transfer.css +318 -0
- package/css/tree-select.css +441 -0
- package/css/tree.css +204 -0
- package/css/typography.css +151 -0
- package/css/undefined.css +38 -0
- package/css/virtualizer.css +104 -0
- package/css/visually-hidden.css +13 -0
- package/css/watermark.css +48 -0
- package/index.css +113 -0
- package/index.unlayered.css +16164 -0
- package/package.json +163 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
@layer xihan.components {
|
|
2
|
+
[data-scope='typography'][data-part='root'] {
|
|
3
|
+
/* 尺寸档只换这几个私有槽,各段从根上继承它们,换档不必给每个部件各写一条选择器 */
|
|
4
|
+
--xh-_typography-body-size: var(--xh-text-body-size);
|
|
5
|
+
--xh-_typography-block-gap: var(--xh-space-4);
|
|
6
|
+
--xh-_typography-heading-gap: var(--xh-space-6);
|
|
7
|
+
--xh-_typography-h1: var(--xh-font-size-3xl);
|
|
8
|
+
--xh-_typography-h2: var(--xh-font-size-2xl);
|
|
9
|
+
--xh-_typography-h3: var(--xh-font-size-xl);
|
|
10
|
+
--xh-_typography-h4: var(--xh-font-size-lg);
|
|
11
|
+
--xh-_typography-h5: var(--xh-font-size-md);
|
|
12
|
+
--xh-_typography-h6: var(--xh-font-size-sm);
|
|
13
|
+
/* 读行宽度:整块正文不收窄就会拉成一行行难读的长句 */
|
|
14
|
+
--xh-_typography-measure: 68ch;
|
|
15
|
+
/* 行内代码跟着所在那行的字号缩,用相对单位而不是档位 */
|
|
16
|
+
--xh-_typography-code-size: 0.9em;
|
|
17
|
+
|
|
18
|
+
/* 建块级格式化上下文,段落的外边距不越过根往外塌 */
|
|
19
|
+
display: flow-root;
|
|
20
|
+
max-inline-size: var(--xh-typography-measure, var(--xh-_typography-measure));
|
|
21
|
+
color: var(--xh-typography-fg, var(--xh-fg-default));
|
|
22
|
+
font-size: var(--xh-typography-font-size, var(--xh-_typography-body-size));
|
|
23
|
+
font-weight: var(--xh-typography-font-weight, var(--xh-text-body-weight));
|
|
24
|
+
line-height: var(--xh-typography-leading, var(--xh-text-body-leading));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* 上面声明了 display,会盖掉 UA 的 [hidden] 规则,收起态要在这里接回来 */
|
|
28
|
+
[data-scope='typography'][data-part='root'][hidden] {
|
|
29
|
+
display: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* —— 尺寸 —— */
|
|
33
|
+
/* 小档整体降一级字号档位 */
|
|
34
|
+
[data-scope='typography'][data-part='root'][data-size='sm'] {
|
|
35
|
+
--xh-_typography-body-size: var(--xh-font-size-sm);
|
|
36
|
+
--xh-_typography-block-gap: var(--xh-space-3);
|
|
37
|
+
--xh-_typography-heading-gap: var(--xh-space-5);
|
|
38
|
+
--xh-_typography-h1: var(--xh-font-size-2xl);
|
|
39
|
+
--xh-_typography-h2: var(--xh-font-size-xl);
|
|
40
|
+
--xh-_typography-h3: var(--xh-font-size-lg);
|
|
41
|
+
--xh-_typography-h4: var(--xh-font-size-md);
|
|
42
|
+
--xh-_typography-h5: var(--xh-font-size-sm);
|
|
43
|
+
--xh-_typography-h6: var(--xh-font-size-xs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* 大档只放大正文与段距:标题档位在 3xl 见顶,六档保持原样 */
|
|
47
|
+
[data-scope='typography'][data-part='root'][data-size='lg'] {
|
|
48
|
+
--xh-_typography-body-size: var(--xh-font-size-lg);
|
|
49
|
+
--xh-_typography-block-gap: var(--xh-space-5);
|
|
50
|
+
--xh-_typography-heading-gap: var(--xh-space-8);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* —— 块级段落 —— */
|
|
54
|
+
/* 库里没有全局 preflight,作者写的 hN / p 带着 UA 外边距,在这儿抹平 */
|
|
55
|
+
[data-scope='typography'][data-part='heading'],
|
|
56
|
+
[data-scope='typography'][data-part='paragraph'] {
|
|
57
|
+
margin: 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-scope='typography'][data-part='heading'] {
|
|
61
|
+
color: var(--xh-typography-heading-fg, var(--xh-fg-default));
|
|
62
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h3));
|
|
63
|
+
font-weight: var(--xh-typography-heading-font-weight, var(--xh-font-weight-semibold));
|
|
64
|
+
line-height: var(--xh-typography-heading-leading, var(--xh-leading-tight));
|
|
65
|
+
/* 标题折行时把各行拉得一样长 */
|
|
66
|
+
text-wrap: balance;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* —— 标题档位 —— */
|
|
70
|
+
/* 使用者槽位排在档位之前:写死一个值即盖过全部六档 */
|
|
71
|
+
[data-scope='typography'][data-part='heading'][data-level='1'] {
|
|
72
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h1));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
[data-scope='typography'][data-part='heading'][data-level='2'] {
|
|
76
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h2));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[data-scope='typography'][data-part='heading'][data-level='3'] {
|
|
80
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h3));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
[data-scope='typography'][data-part='heading'][data-level='4'] {
|
|
84
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h4));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
[data-scope='typography'][data-part='heading'][data-level='5'] {
|
|
88
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h5));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
[data-scope='typography'][data-part='heading'][data-level='6'] {
|
|
92
|
+
font-size: var(--xh-typography-heading-font-size, var(--xh-_typography-h6));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* —— 段间距 —— */
|
|
96
|
+
/* 间距画在后一块的上边,块与块之间只留一份,正文末尾也不多出一截 */
|
|
97
|
+
[data-scope='typography']:is([data-part='heading'], [data-part='paragraph'])
|
|
98
|
+
+ [data-scope='typography']:is([data-part='heading'], [data-part='paragraph']) {
|
|
99
|
+
margin-block-start: var(--xh-typography-block-gap, var(--xh-_typography-block-gap));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* 标题上面留得更开,它带起的是下面一整段 */
|
|
103
|
+
[data-scope='typography']:is([data-part='heading'], [data-part='paragraph'])
|
|
104
|
+
+ [data-scope='typography'][data-part='heading'] {
|
|
105
|
+
margin-block-start: var(--xh-typography-heading-gap, var(--xh-_typography-heading-gap));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* —— 行内文字 —— */
|
|
109
|
+
/* 不写形态与语气时就是一段普通正文,这里只声明形态各自加的那一层 */
|
|
110
|
+
[data-scope='typography'][data-part='text'][data-variant='muted'] {
|
|
111
|
+
color: var(--xh-typography-text-fg, var(--xh-fg-muted));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
[data-scope='typography'][data-part='text'][data-variant='strong'] {
|
|
115
|
+
font-weight: var(--xh-typography-text-font-weight, var(--xh-font-weight-semibold));
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
[data-scope='typography'][data-part='text'][data-variant='code'] {
|
|
119
|
+
padding-block: var(--xh-typography-code-py, var(--xh-space-0_5));
|
|
120
|
+
padding-inline: var(--xh-typography-code-px, var(--xh-space-1));
|
|
121
|
+
border-radius: var(--xh-typography-code-radius, var(--xh-radius-sm));
|
|
122
|
+
background: var(--xh-typography-code-bg, var(--xh-bg-subtle));
|
|
123
|
+
font-family: var(--xh-font-family-mono);
|
|
124
|
+
font-size: var(--xh-typography-code-font-size, var(--xh-_typography-code-size));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* 语气排在形态之后:两个轴一起写时,用哪族颜色由语气说了算 */
|
|
128
|
+
[data-scope='typography'][data-part='text'][data-tone] {
|
|
129
|
+
color: var(--xh-typography-text-fg, var(--xh-_tone-fg));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* —— 行内链接 —— */
|
|
133
|
+
[data-scope='typography'][data-part='link'] {
|
|
134
|
+
border-radius: var(--xh-typography-link-radius, var(--xh-radius-sm));
|
|
135
|
+
color: var(--xh-typography-link-fg, var(--xh-fg-brand));
|
|
136
|
+
text-decoration: underline;
|
|
137
|
+
text-underline-offset: var(--xh-typography-link-underline-offset, var(--xh-space-0_5));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* 悬停只在能用指针的设备上生效,触摸端不留一个按不掉的悬停态 */
|
|
141
|
+
@media (hover: hover) {
|
|
142
|
+
[data-scope='typography'][data-part='link']:hover {
|
|
143
|
+
color: var(--xh-typography-link-fg-hover, var(--xh-fg-brand-strong));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
[data-scope='typography'][data-part='link']:focus-visible {
|
|
148
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
149
|
+
outline-offset: var(--xh-ring-offset);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 元素升级前的形态。
|
|
3
|
+
*
|
|
4
|
+
* 收起态由元素在 wire() 里用内联 display 做,而 data-scope / data-part 也是那一刻才打上,
|
|
5
|
+
* 所以 JS 到达之前浮层子树既没有皮肤也没有收起——内容会以裸文本堆在页面流里,
|
|
6
|
+
* 并被搜索引擎与读屏当作正文。SSR / SSG 直出时这段时间尤其长。
|
|
7
|
+
*
|
|
8
|
+
* 这里按作者写的 data-xh-part 选中,那是升级前唯一存在的标记。
|
|
9
|
+
*/
|
|
10
|
+
@layer xihan.components {
|
|
11
|
+
:where(
|
|
12
|
+
xh-cascader,
|
|
13
|
+
xh-color-picker,
|
|
14
|
+
xh-combobox,
|
|
15
|
+
xh-context-menu,
|
|
16
|
+
xh-date-picker,
|
|
17
|
+
xh-dialog,
|
|
18
|
+
xh-drawer,
|
|
19
|
+
xh-hover-card,
|
|
20
|
+
xh-menu,
|
|
21
|
+
xh-menubar,
|
|
22
|
+
xh-navigation-menu,
|
|
23
|
+
xh-popover,
|
|
24
|
+
xh-select,
|
|
25
|
+
xh-time-picker,
|
|
26
|
+
xh-tooltip,
|
|
27
|
+
xh-tour,
|
|
28
|
+
xh-tree-select
|
|
29
|
+
):not(:defined)
|
|
30
|
+
:where(
|
|
31
|
+
[data-xh-part='backdrop'],
|
|
32
|
+
[data-xh-part='content'],
|
|
33
|
+
[data-xh-part='positioner'],
|
|
34
|
+
[data-xh-part='viewport']
|
|
35
|
+
) {
|
|
36
|
+
display: none;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
@layer xihan.components {
|
|
2
|
+
/* 定位分工:条目在**主轴**上的位移、以及 content 在主轴上的总长,
|
|
3
|
+
由连接层每帧写进内联样式(竖向是 inset-block-start / block-size,横向是
|
|
4
|
+
inset-inline-start / inline-size)。这份皮肤一个都不碰:内联优先级高于样式表,
|
|
5
|
+
写了不但是死声明,换向的那一帧还会跟连接层清空另一轴的动作抢位置。
|
|
6
|
+
皮肤只管另一条轴(交叉轴)、滚动能力与焦点表现。
|
|
7
|
+
|
|
8
|
+
刻意不写任何过渡与动画:条目的位移每帧都在变,一加过渡整列就永远追在滚动后面;
|
|
9
|
+
条目的进出走的是 [hidden](display:none),也没有退场动画可言。
|
|
10
|
+
|
|
11
|
+
主轴尺寸这里同样不给:给了就把动态测量钉死在这个值上——量到的永远等于钉上去的,
|
|
12
|
+
measureElement 再也收敛不了。等高列表由作者按 api 给出的 size 自己写。 */
|
|
13
|
+
|
|
14
|
+
[data-scope='virtualizer'][data-part='root'] {
|
|
15
|
+
display: block;
|
|
16
|
+
/* 作者给 root 定了尺寸后,长列表不该漫出这个框 */
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* 真正滚动的那层。滚动能力一点不减——键盘(PageUp/PageDown、方向键、Home/End)
|
|
21
|
+
与滚轮走的都还是浏览器原生通路,组件只是跟着滚动量换一批该渲的下标。 */
|
|
22
|
+
[data-scope='virtualizer'][data-part='viewport'] {
|
|
23
|
+
display: block;
|
|
24
|
+
inline-size: 100%;
|
|
25
|
+
block-size: 100%;
|
|
26
|
+
/* 逻辑等价物 overflow-inline / overflow-block 至今只有个别引擎实现,
|
|
27
|
+
这两条是本文件里仅有的物理属性,换成逻辑写法会在多数浏览器上直接失效 */
|
|
28
|
+
overflow-x: auto;
|
|
29
|
+
overflow-y: auto;
|
|
30
|
+
/* 滚到尽头时不把剩余的滚动传给外层:长列表嵌在页面里时,
|
|
31
|
+
滚到底还继续带着整页走会让人找不着北 */
|
|
32
|
+
overscroll-behavior: contain;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/* 单向列表把另一条轴关掉:那一向既没有内容也没有位移,能滚就成了滚不回来的暗格 */
|
|
36
|
+
[data-scope='virtualizer'][data-part='viewport'][data-orientation='vertical'] {
|
|
37
|
+
overflow-x: hidden;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[data-scope='virtualizer'][data-part='viewport'][data-orientation='horizontal'] {
|
|
41
|
+
overflow-y: hidden;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* 视口带 tabindex=0(长列表里可能一个可聚焦元素都没有),因此要有焦点环。
|
|
45
|
+
偏移取负:环画在视口内侧,否则会被 root 的 overflow:hidden 裁掉半圈 */
|
|
46
|
+
[data-scope='virtualizer'][data-part='viewport']:focus-visible {
|
|
47
|
+
outline: var(--xh-ring-width) solid var(--xh-ring-focus);
|
|
48
|
+
outline-offset: calc(-1 * var(--xh-ring-width));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* 撑出总长的那层,同时是条目的定位上下文——条目是绝对定位的,
|
|
52
|
+
没有它就会以最近的定位祖先(多半是页面某处)为参照,整列飘走。 */
|
|
53
|
+
[data-scope='virtualizer'][data-part='content'] {
|
|
54
|
+
position: relative;
|
|
55
|
+
display: block;
|
|
56
|
+
inline-size: 100%;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* 主轴长度来自内联样式,交叉轴铺满视口 */
|
|
60
|
+
[data-scope='virtualizer'][data-part='content'][data-orientation='horizontal'] {
|
|
61
|
+
inline-size: auto;
|
|
62
|
+
block-size: 100%;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* 条目。主轴位移来自内联样式,这里只给定位模式与单列时的交叉轴。
|
|
66
|
+
多列(lanes > 1)时交叉轴改由连接层写进内联样式,会盖过下面这两条。 */
|
|
67
|
+
[data-scope='virtualizer'][data-part='item'] {
|
|
68
|
+
position: absolute;
|
|
69
|
+
display: block;
|
|
70
|
+
box-sizing: border-box;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
[data-scope='virtualizer'][data-part='item'][data-orientation='vertical'] {
|
|
74
|
+
inset-inline-start: 0;
|
|
75
|
+
inline-size: 100%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
[data-scope='virtualizer'][data-part='item'][data-orientation='horizontal'] {
|
|
79
|
+
inset-block-start: 0;
|
|
80
|
+
block-size: 100%;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* 除视口外全是纯容器:既不进 Tab 序列也不承载焦点,作者若给它们加了 tabindex,
|
|
84
|
+
该显形的也该是视口那圈环,不是这里再多画一圈。
|
|
85
|
+
条目内部的可聚焦内容(按钮、链接)有它们自己的焦点环,不受这条影响。 */
|
|
86
|
+
[data-scope='virtualizer'][data-part='root']:focus-visible,
|
|
87
|
+
[data-scope='virtualizer'][data-part='content']:focus-visible,
|
|
88
|
+
[data-scope='virtualizer'][data-part='item']:focus-visible {
|
|
89
|
+
outline: none;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* root 上还有一个 data-scrolling 标记(手正在滚时在场)。这份皮肤刻意不用它:
|
|
93
|
+
滚动期间关掉 pointer-events 之类的常见招数会让"滚一下就点"落空,
|
|
94
|
+
留给作者按自己的取舍去接。 */
|
|
95
|
+
|
|
96
|
+
/* display 会盖掉 UA 的 [hidden]{display:none},凡是被赋了 display 的角色节点都要显式让位。
|
|
97
|
+
连接层只在条目上写 hidden(不在窗口里的那些),其余三个是防作者自己写 hidden */
|
|
98
|
+
[data-scope='virtualizer'][data-part='root'][hidden],
|
|
99
|
+
[data-scope='virtualizer'][data-part='viewport'][hidden],
|
|
100
|
+
[data-scope='virtualizer'][data-part='content'][hidden],
|
|
101
|
+
[data-scope='virtualizer'][data-part='item'][hidden] {
|
|
102
|
+
display: none;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
@layer xihan.components {
|
|
2
|
+
/*
|
|
3
|
+
* 盖水印的那块地。层叠上下文就地隔离,印子只压在这块地里,不会盖到组件外面去。
|
|
4
|
+
*/
|
|
5
|
+
[data-scope='watermark'][data-part='root'] {
|
|
6
|
+
position: relative;
|
|
7
|
+
isolation: isolate;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/* 被盖住的内容排在印子下面 */
|
|
11
|
+
[data-scope='watermark'][data-part='content'] {
|
|
12
|
+
position: relative;
|
|
13
|
+
z-index: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
* 印子。图样由连接层算成一张 SVG,这里当遮罩用而不是当背景图铺:
|
|
18
|
+
* 遮罩只取图样的透明度,颜色从下面这个槽来,深浅主题各自跟着走;
|
|
19
|
+
* 当背景图铺就得把颜色写死在 SVG 里,换主题时那张图不会跟着变。
|
|
20
|
+
* 两条前缀都写:一部分 WebKit 只认带前缀那条。
|
|
21
|
+
*
|
|
22
|
+
* 没有可印的文字时 root 落 data-state="empty",整层不画。
|
|
23
|
+
*/
|
|
24
|
+
[data-scope='watermark'][data-part='root'][data-state='ready']::after {
|
|
25
|
+
content: '';
|
|
26
|
+
|
|
27
|
+
position: absolute;
|
|
28
|
+
z-index: 1;
|
|
29
|
+
inset: 0;
|
|
30
|
+
|
|
31
|
+
/* 它只是一层印子:不吃点击,底下的内容照常点、照常选 */
|
|
32
|
+
pointer-events: none;
|
|
33
|
+
background-color: var(--xh-watermark-fg, var(--xh-fg-muted));
|
|
34
|
+
-webkit-mask-image: var(--xh-watermark-image, none);
|
|
35
|
+
mask-image: var(--xh-watermark-image, none);
|
|
36
|
+
-webkit-mask-repeat: repeat;
|
|
37
|
+
mask-repeat: repeat;
|
|
38
|
+
-webkit-mask-size: var(--xh-watermark-tile, auto);
|
|
39
|
+
mask-size: var(--xh-watermark-tile, auto);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* 遮罩不支持时整层不画:只剩底色的话,盖上去的会是一整块实心色 */
|
|
43
|
+
@supports not ((mask-image: none) or (-webkit-mask-image: none)) {
|
|
44
|
+
[data-scope='watermark'][data-part='root'][data-state='ready']::after {
|
|
45
|
+
display: none;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
package/index.css
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/* 令牌先于一切:皮肤里不写兜底值,令牌缺席就是缺陷,不是降级。
|
|
2
|
+
tokens.css 自带 @layer xihan.tokens,层序由 layers.css 定。 */
|
|
3
|
+
@import '@xihan-ui/tokens/tokens.css';
|
|
4
|
+
|
|
5
|
+
/* 层序声明必须最先,其余按层归属排列。 */
|
|
6
|
+
@import './css/affix.css';
|
|
7
|
+
@import './css/avatar-group.css';
|
|
8
|
+
@import './css/back-top.css';
|
|
9
|
+
@import './css/button-group.css';
|
|
10
|
+
@import './css/countdown.css';
|
|
11
|
+
@import './css/descriptions.css';
|
|
12
|
+
@import './css/dynamic-input.css';
|
|
13
|
+
@import './css/ellipsis.css';
|
|
14
|
+
@import './css/flex.css';
|
|
15
|
+
@import './css/float-button.css';
|
|
16
|
+
@import './css/gradient-text.css';
|
|
17
|
+
@import './css/grid.css';
|
|
18
|
+
@import './css/highlight.css';
|
|
19
|
+
@import './css/icon-wrapper.css';
|
|
20
|
+
@import './css/infinite-scroll.css';
|
|
21
|
+
@import './css/layers.css';
|
|
22
|
+
@import './css/layout.css';
|
|
23
|
+
@import './css/list.css';
|
|
24
|
+
@import './css/log.css';
|
|
25
|
+
@import './css/marquee.css';
|
|
26
|
+
@import './css/mention.css';
|
|
27
|
+
@import './css/number-animation.css';
|
|
28
|
+
@import './css/page-header.css';
|
|
29
|
+
@import './css/popconfirm.css';
|
|
30
|
+
@import './css/popselect.css';
|
|
31
|
+
@import './css/qr-code.css';
|
|
32
|
+
@import './css/reset.css';
|
|
33
|
+
@import './css/motion.css';
|
|
34
|
+
@import './css/result.css';
|
|
35
|
+
@import './css/statistic.css';
|
|
36
|
+
@import './css/time.css';
|
|
37
|
+
@import './css/timeline.css';
|
|
38
|
+
@import './css/typography.css';
|
|
39
|
+
@import './css/undefined.css';
|
|
40
|
+
@import './css/visually-hidden.css';
|
|
41
|
+
@import './css/tone.css';
|
|
42
|
+
@import './css/alert.css';
|
|
43
|
+
@import './css/empty-state.css';
|
|
44
|
+
@import './css/skeleton.css';
|
|
45
|
+
@import './css/spinner.css';
|
|
46
|
+
@import './css/accordion.css';
|
|
47
|
+
@import './css/anchor.css';
|
|
48
|
+
@import './css/avatar.css';
|
|
49
|
+
@import './css/badge.css';
|
|
50
|
+
@import './css/breadcrumb.css';
|
|
51
|
+
@import './css/button.css';
|
|
52
|
+
@import './css/calendar.css';
|
|
53
|
+
@import './css/card.css';
|
|
54
|
+
@import './css/carousel.css';
|
|
55
|
+
@import './css/cascader.css';
|
|
56
|
+
@import './css/checkbox.css';
|
|
57
|
+
@import './css/checkbox-group.css';
|
|
58
|
+
@import './css/clipboard.css';
|
|
59
|
+
@import './css/code-block.css';
|
|
60
|
+
@import './css/collapsible.css';
|
|
61
|
+
@import './css/color-picker.css';
|
|
62
|
+
@import './css/combobox.css';
|
|
63
|
+
@import './css/composer.css';
|
|
64
|
+
@import './css/context-menu.css';
|
|
65
|
+
@import './css/date-field.css';
|
|
66
|
+
@import './css/date-picker.css';
|
|
67
|
+
@import './css/dialog.css';
|
|
68
|
+
@import './css/drawer.css';
|
|
69
|
+
@import './css/editable.css';
|
|
70
|
+
@import './css/field.css';
|
|
71
|
+
@import './css/file-upload.css';
|
|
72
|
+
@import './css/form.css';
|
|
73
|
+
@import './css/hover-card.css';
|
|
74
|
+
@import './css/icon.css';
|
|
75
|
+
@import './css/image.css';
|
|
76
|
+
@import './css/listbox.css';
|
|
77
|
+
@import './css/loading-bar.css';
|
|
78
|
+
@import './css/menu.css';
|
|
79
|
+
@import './css/menubar.css';
|
|
80
|
+
@import './css/navigation-menu.css';
|
|
81
|
+
@import './css/number-field.css';
|
|
82
|
+
@import './css/pagination.css';
|
|
83
|
+
@import './css/pin-input.css';
|
|
84
|
+
@import './css/popover.css';
|
|
85
|
+
@import './css/progress.css';
|
|
86
|
+
@import './css/radio-group.css';
|
|
87
|
+
@import './css/rating.css';
|
|
88
|
+
@import './css/scroll-area.css';
|
|
89
|
+
@import './css/select.css';
|
|
90
|
+
@import './css/separator.css';
|
|
91
|
+
@import './css/slider.css';
|
|
92
|
+
@import './css/splitter.css';
|
|
93
|
+
@import './css/steps.css';
|
|
94
|
+
@import './css/switch.css';
|
|
95
|
+
@import './css/table.css';
|
|
96
|
+
@import './css/tabs.css';
|
|
97
|
+
@import './css/tags-input.css';
|
|
98
|
+
@import './css/text-field.css';
|
|
99
|
+
@import './css/thread.css';
|
|
100
|
+
@import './css/time-field.css';
|
|
101
|
+
@import './css/time-picker.css';
|
|
102
|
+
@import './css/toast.css';
|
|
103
|
+
@import './css/toaster.css';
|
|
104
|
+
@import './css/toggle.css';
|
|
105
|
+
@import './css/toggle-group.css';
|
|
106
|
+
@import './css/toolbar.css';
|
|
107
|
+
@import './css/tooltip.css';
|
|
108
|
+
@import './css/tour.css';
|
|
109
|
+
@import './css/transfer.css';
|
|
110
|
+
@import './css/tree.css';
|
|
111
|
+
@import './css/tree-select.css';
|
|
112
|
+
@import './css/virtualizer.css';
|
|
113
|
+
@import './css/watermark.css';
|