@xihan-ui/styles 1.0.0-alpha.1 → 1.0.0-alpha.2
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 +80 -0
- package/css/accordion.css +5 -0
- package/css/affix.css +5 -0
- package/css/alert.css +5 -0
- package/css/anchor.css +5 -0
- package/css/avatar-group.css +5 -0
- package/css/avatar.css +5 -0
- package/css/back-top.css +5 -0
- package/css/badge.css +5 -0
- package/css/breadcrumb.css +5 -0
- package/css/button-group.css +5 -0
- package/css/button.css +15 -0
- package/css/calendar.css +5 -0
- package/css/card.css +5 -0
- package/css/carousel.css +5 -0
- package/css/cascader.css +8 -3
- package/css/checkbox-group.css +5 -0
- package/css/checkbox.css +5 -0
- package/css/clipboard.css +5 -0
- package/css/code-block.css +5 -0
- package/css/collapsible.css +5 -0
- package/css/color-picker.css +6 -1
- package/css/combobox.css +19 -0
- package/css/composer.css +5 -0
- package/css/context-menu.css +6 -8
- package/css/countdown.css +5 -0
- package/css/date-field.css +5 -0
- package/css/date-picker.css +6 -1
- package/css/descriptions.css +5 -0
- package/css/dialog.css +69 -9
- package/css/drawer.css +30 -9
- package/css/dynamic-input.css +5 -0
- package/css/editable.css +5 -0
- package/css/ellipsis.css +5 -0
- package/css/empty-state.css +5 -0
- package/css/field.css +5 -0
- package/css/file-upload.css +5 -0
- package/css/flex.css +5 -0
- package/css/float-button.css +5 -0
- package/css/form.css +6 -1
- package/css/gradient-text.css +5 -0
- package/css/grid.css +5 -0
- package/css/highlight.css +5 -0
- package/css/hover-card.css +19 -6
- package/css/icon-wrapper.css +5 -0
- package/css/icon.css +5 -0
- package/css/image-viewer.css +31 -11
- package/css/image.css +5 -0
- package/css/infinite-scroll.css +5 -0
- package/css/layout.css +5 -0
- package/css/list.css +5 -0
- package/css/listbox.css +5 -0
- package/css/loading-bar.css +5 -0
- package/css/log.css +5 -0
- package/css/marquee.css +5 -0
- package/css/mention.css +19 -0
- package/css/menu.css +19 -0
- package/css/menubar.css +6 -8
- package/css/navigation-menu.css +6 -1
- package/css/number-animation.css +5 -0
- package/css/number-field.css +5 -0
- package/css/page-header.css +5 -0
- package/css/pagination.css +5 -0
- package/css/pin-input.css +5 -0
- package/css/popconfirm.css +28 -7
- package/css/popover.css +19 -0
- package/css/popselect.css +19 -0
- package/css/progress.css +5 -0
- package/css/qr-code.css +5 -0
- package/css/radio-group.css +5 -0
- package/css/rating.css +5 -0
- package/css/result.css +5 -0
- package/css/scroll-area.css +5 -6
- package/css/select.css +19 -0
- package/css/separator.css +5 -0
- package/css/side-nav.css +5 -0
- package/css/skeleton.css +5 -0
- package/css/slider.css +5 -0
- package/css/spinner.css +9 -1
- package/css/splitter.css +5 -0
- package/css/statistic.css +5 -0
- package/css/steps.css +5 -0
- package/css/switch.css +14 -7
- package/css/table.css +5 -0
- package/css/tabs.css +5 -0
- package/css/tags-input.css +5 -0
- package/css/text-field.css +5 -0
- package/css/thread.css +5 -0
- package/css/time-field.css +5 -0
- package/css/time-picker.css +6 -1
- package/css/time.css +5 -0
- package/css/timeline.css +5 -0
- package/css/toast.css +13 -12
- package/css/toaster.css +5 -0
- package/css/toggle-group.css +5 -0
- package/css/toggle.css +5 -0
- package/css/toolbar.css +5 -0
- package/css/tooltip.css +19 -6
- package/css/tour.css +29 -9
- package/css/transfer.css +5 -0
- package/css/tree-select.css +19 -0
- package/css/tree.css +5 -0
- package/css/typography.css +5 -0
- package/css/virtualizer.css +5 -0
- package/css/watermark.css +5 -0
- package/index.css +0 -1
- package/index.unlayered.css +804 -153
- package/package.json +2 -3
- package/css/motion.css +0 -58
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,85 @@
|
|
|
1
1
|
# @xihan-ui/styles
|
|
2
2
|
|
|
3
|
+
## 1.0.0-alpha.2
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- 934e126: 每份皮肤现在都能单独引入了,动画不再指望别处的文件在场。
|
|
8
|
+
|
|
9
|
+
`styles` 的 exports 逐组件铺了一百多条子入口,`import '@xihan-ui/styles/dialog.css'` 是受支持的用法。但 `xh-fade-in`、`xh-fade-out`、`xh-spin`、`xh-dialog-in/out` 这五支关键帧住在 `motion.css` 里,被 15 份别的皮肤引用——单独引入其中任何一份,动画名都查不到。`@keyframes` 的名字查找只认「文档里有没有这个名字」,查不到既不报错也不降级,看上去就是「这个组件没做动效」。`spinner.css` / `switch.css` / `popconfirm.css` 三处注释早就写明了这条理由,只是这五支没照办。
|
|
10
|
+
|
|
11
|
+
现在每份皮肤都自带它用到的关键帧。`motion.css` 因此空了,**已删除,`./motion.css` 子入口一并移除**——如果你显式引过它,删掉那行即可,它提供的关键帧已经跟着各组件走了。
|
|
12
|
+
|
|
13
|
+
新增 `check-keyframe-refs` 门禁盯住三件事:引用的动画名必须在同一份皮肤里定义、同名的多份定义必须逐字一致(名字是全局的,两份不同内容会互相覆盖)、关键帧必须写在 `@layer xihan.motion` 里(使用者按层覆盖时才盖得住)。
|
|
14
|
+
|
|
15
|
+
产物只大了 60 B:重复的关键帧对 gzip 几乎是免费的。
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- 091bbef: 补上动效地基的四个缺口。
|
|
20
|
+
|
|
21
|
+
**减弱动效此前基本是失效的。** `tokens.css` 里一个 `prefers-reduced-motion` 都没有,降级靠 19 份皮肤各写各的 `@media`,而它们只把 `animation-duration` 压到 `0.01ms`——位移与缩放是写死的字面量,压时长压不掉。前庭不适恰恰来自大位移与缩放,所以「减弱动效」的用户看到的是瞬间跳完整段位移。现在幅度走 `--xh-motion-distance-sm/-md` 与 `--xh-motion-scale-enter`,令牌层在 reduce 下把它们归零,皮肤不必自带 `@media`。删掉 8 份已经冗余的降级块(含 8 条 `!important`);marquee / skeleton / spinner 那几处有讲得通的自定义降级,保留。
|
|
22
|
+
|
|
23
|
+
**dialog 与 image-viewer 的退场动画从来没播过。** 皮肤给挂着退场动画的 `content` 补了 `[hidden]{display:none}`,收起时元素当场不生成盒子,动画不启动,退场探测器放弃申领租约、就地卸载。drawer 早就绕开了这个坑,它的注释还写着「与 dialog 一致」——而 dialog 恰恰是反的。现在真的一致了,四条退场动画同时补上 `forwards`。
|
|
24
|
+
|
|
25
|
+
**Web Components 端全域没有退场动画。** 三个浮层元素把收起写死在展开态上,与 `data-state="closed"` 同帧写内联 `display:none`。现在收起跟着 presence 走;Light DOM 下被拉长的不是节点存在的时间,而是可见的时间。
|
|
26
|
+
|
|
27
|
+
**破坏性程度**:进场缩放统一到 `0.96`(此前 0.98 与 0.96 混用),dialog / toast 进场 / color-picker 的起势略明显一点。button 的加载转圈不再被压成 `0.01ms`——转圈是「系统还在做事」的唯一可感知信号,压掉等于把加载态变成假死。
|
|
28
|
+
|
|
29
|
+
回归测试进了 `tests/browser/`:jsdom 不把样式表里的 animation 算进 `getComputedStyle`,这三件事在 jsdom 里结构性测不到。
|
|
30
|
+
|
|
31
|
+
### Patch Changes
|
|
32
|
+
|
|
33
|
+
- 7a5d898: 漏引皮肤不再静默:新增 `startSkinCheck()` 开发期探测与 `styles.missing-skin` 诊断码。
|
|
34
|
+
|
|
35
|
+
按需引皮肤时漏掉一行原本是这个库最难查的失效:那个组件的 `data-scope` / `data-part` 照常都在、
|
|
36
|
+
别的皮肤也确实加载了,只有它渲染成没有内边距、没有底色的裸元素,看起来像组件坏了而不是少引了一行。
|
|
37
|
+
这一条正是「按组件挑」在真实项目里立不住的根本原因。
|
|
38
|
+
|
|
39
|
+
每份组件皮肤现在在自己的 `[data-scope='X']` 上落一个 `--xh-X-skin` 标记(104 份)。
|
|
40
|
+
`startSkinCheck()` 扫页面上出现过的每个 scope,取不到标记就报诊断:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
if (import.meta.env.DEV) {
|
|
44
|
+
const { startSkinCheck } = await import("@xihan-ui/kernel/skin-check");
|
|
45
|
+
startSkinCheck();
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
[xh][button] [styles] button 的皮肤没引:import '@xihan-ui/styles/button.css',或改引全量的 '@xihan-ui/styles'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
两处刻意的取舍:
|
|
54
|
+
|
|
55
|
+
- **每个 scope 只探一次。** 探测要读计算样式,逐实例探是真实的强制样式重算;一个 scope 的皮肤
|
|
56
|
+
在不在场与实例数无关,探一次就够。
|
|
57
|
+
- **标记落在 `[data-scope='X']` 而不是 root 部件上。** 浮层族的 `content` 被 portal 到 body,
|
|
58
|
+
不在 root 的子树里,只在 root 上声明的话自定义属性继承不过去,这些部件会误报。
|
|
59
|
+
|
|
60
|
+
探测器走 `@xihan-ui/kernel/skin-check` 子路径而不是主入口:它是开发期工具,不该躺在每个消费方都会打包的那条入口里(放主入口会让 kernel 的体积棘轮超 118 B,那条棘轮量的正是整包)。
|
|
61
|
+
|
|
62
|
+
新增 `check-skin-markers` 门禁守住 104 份皮肤的标记齐全——漏一份,那个组件就退回静默失效,
|
|
63
|
+
而且探测器还一声不吭。`pnpm gate` 十九项 → 二十项。
|
|
64
|
+
|
|
65
|
+
- 59c86fa: 新增 `check-style-entries` 门禁:每份皮肤都必须进得了全量入口、也够得着按需入口。
|
|
66
|
+
|
|
67
|
+
`index.css` 的 `@import` 清单是手工维护的,`package.json` 的子路径导出也是。两处任何一处漏了,
|
|
68
|
+
结果都是静默的:漏进 `index.css`,全量引入的人拿不到那份皮肤,组件渲染成裸元素;
|
|
69
|
+
漏了子路径导出,按需引入的人根本 import 不到它。今天 109 份皮肤两处齐全,但没有任何东西守着。
|
|
70
|
+
|
|
71
|
+
门禁同时把「按需产物的顺序只能由 `index.css` 过滤得来」钉在这里。同一个 `@layer xihan.components`
|
|
72
|
+
内,等特异性的规则靠源序定胜负;另起一套排序(按字母、按目录读取序)今天看不出差别——
|
|
73
|
+
当前仅有的 3 处跨 scope 规则在两种排序下相对次序恰好一致——但那正是它危险的地方:
|
|
74
|
+
将来加进第四处,按需引入的人就会与全量引入的人渲染不同,而且全绿。
|
|
75
|
+
|
|
76
|
+
`installation.md` 的「样式的三种接法」如实补上第二种要自己扛的两条风险,并给出体积口径
|
|
77
|
+
(全量 51 kB gzip,含令牌与 109 份皮肤),建议没有明确体积压力就用全量。
|
|
78
|
+
|
|
79
|
+
- Updated dependencies [3469066]
|
|
80
|
+
- Updated dependencies [091bbef]
|
|
81
|
+
- @xihan-ui/tokens@1.0.0-alpha.2
|
|
82
|
+
|
|
3
83
|
## 1.0.0-alpha.1
|
|
4
84
|
|
|
5
85
|
### Major Changes
|
package/css/accordion.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='accordion'] {
|
|
4
|
+
--xh-accordion-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='accordion'][data-part='root'] {
|
|
3
8
|
/* 尺寸档只换这四个私有槽,标题栏从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
|
4
9
|
--xh-_accordion-trigger-h: var(--xh-control-h-md);
|
package/css/affix.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='affix'] {
|
|
4
|
+
--xh-affix-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 占位盒就是 content 在常规流里占的那块地方。
|
|
3
8
|
这里不声明 display,也不写高度:吸住时冻结的高度由连接层量好写进内联样式(它量得到,样式表量不到),
|
|
4
9
|
没吸住时高度就该跟着内容走。不给 display,UA 的 [hidden]{display:none} 也仍然压得住 */
|
package/css/alert.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='alert'] {
|
|
4
|
+
--xh-alert-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
[data-scope='alert'][data-part='root'] {
|
|
3
8
|
/* 强调色随语气走,底色/描边/图标色都由它推导出来,换语气不必逐条属性各写一遍。
|
|
4
9
|
没写 data-tone 时 --xh-_tone 没被声明,退回原来的 info 蓝 */
|
package/css/anchor.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='anchor'] {
|
|
4
|
+
--xh-anchor-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 nav 地标,不参与排版:整条目录的布局全在 list 上,
|
|
3
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
4
9
|
[data-scope='anchor'][data-part='root'] {
|
package/css/avatar-group.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='avatar-group'] {
|
|
4
|
+
--xh-avatar-group-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 一排叠放的头像:后一枚压在前一枚上。
|
|
3
8
|
组内共用的直径与字号在容器上写一次,沿继承流给每一枚;自己写了档位的那一枚仍按自己的档走 */
|
|
4
9
|
[data-scope='avatar-group'][data-part='root'] {
|
package/css/avatar.css
CHANGED
package/css/back-top.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='back-top'] {
|
|
4
|
+
--xh-back-top-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 定位壳:钉在视口的尾下角,用逻辑属性,RTL 下自动换到另一侧。
|
|
3
8
|
不声明 display —— 收起态由连接层写 hidden,UA 的 [hidden]{display:none} 得压得住 */
|
|
4
9
|
[data-scope='back-top'][data-part='root'] {
|
package/css/badge.css
CHANGED
package/css/breadcrumb.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='breadcrumb'] {
|
|
4
|
+
--xh-breadcrumb-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 nav 地标,不参与排版:整条路径的行为全在 list 上,
|
|
3
8
|
这里不给 display,UA 的 [hidden]{display:none} 就仍然压得住 */
|
|
4
9
|
[data-scope='breadcrumb'][data-part='root'] {
|
package/css/button-group.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='button-group'] {
|
|
4
|
+
--xh-button-group-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 一组按钮连成一条:段与段之间不留缝,靠共边接上,所以不设 gap。
|
|
3
8
|
排布只能读 data-orientation——role=group 不收 aria-orientation,连接层根本不输出它。
|
|
4
9
|
圆角槽位在容器上先收成 0,组内每段都取得到,两端的圆角再逐段补回来 */
|
package/css/button.css
CHANGED
|
@@ -1,4 +1,19 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-spin {
|
|
5
|
+
to {
|
|
6
|
+
transform: rotate(360deg);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
1
11
|
@layer xihan.components {
|
|
12
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
13
|
+
[data-scope='button'] {
|
|
14
|
+
--xh-button-skin: 1;
|
|
15
|
+
}
|
|
16
|
+
|
|
2
17
|
[data-scope='button'][data-part='root'] {
|
|
3
18
|
/* 私有槽位:组件令牌 → 语义令牌两级回退,变体只改这几个槽位 */
|
|
4
19
|
--xh-_bg: var(--xh-button-bg, var(--xh-bg-subtle));
|
package/css/calendar.css
CHANGED
package/css/card.css
CHANGED
package/css/carousel.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='carousel'] {
|
|
4
|
+
--xh-carousel-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根节点是 region 地标:把上一张 / 视口 / 下一张排成一行,指示点另起一行。
|
|
3
8
|
两端按钮浮在视口上还是排在两侧由作者定,这里只给最朴素的一版排布 */
|
|
4
9
|
[data-scope='carousel'][data-part='root'] {
|
package/css/cascader.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='cascader'] {
|
|
4
|
+
--xh-cascader-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 解剖里没有把「触发器 + 清空按钮」裹在一起的 control 部件,一行是靠 flex-wrap 分出来的:
|
|
3
8
|
标签占满整行把后面的挤到下一行,触发器与清空按钮就并排落在同一行上。
|
|
4
9
|
这样作者少写标签、少写清空按钮,剩下的部件也不会塌 */
|
|
@@ -277,13 +282,13 @@
|
|
|
277
282
|
|
|
278
283
|
[data-scope='cascader'][data-part='content'][data-state='open'] {
|
|
279
284
|
/* 入场横移沿书写方向起始缘:位移量经私有槽供给关键帧,rtl 只翻符号 */
|
|
280
|
-
--xh-_cascader-slide: -
|
|
285
|
+
--xh-_cascader-slide: calc(-1 * var(--xh-motion-distance-sm));
|
|
281
286
|
|
|
282
287
|
animation: xh-cascader-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
283
288
|
}
|
|
284
289
|
|
|
285
290
|
[dir='rtl'] [data-scope='cascader'][data-part='content'][data-state='open'] {
|
|
286
|
-
--xh-_cascader-slide:
|
|
291
|
+
--xh-_cascader-slide: var(--xh-motion-distance-sm);
|
|
287
292
|
}
|
|
288
293
|
|
|
289
294
|
/* 一列:宽度由内容撑出、设下限防塌,高度定死——切换展开路径时浮层不上下跳动,
|
|
@@ -561,7 +566,7 @@
|
|
|
561
566
|
@keyframes xh-cascader-in {
|
|
562
567
|
from {
|
|
563
568
|
opacity: 0;
|
|
564
|
-
translate: var(--xh-_cascader-slide, -
|
|
569
|
+
translate: var(--xh-_cascader-slide, calc(-1 * var(--xh-motion-distance-sm))) 0;
|
|
565
570
|
}
|
|
566
571
|
|
|
567
572
|
to {
|
package/css/checkbox-group.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='checkbox-group'] {
|
|
4
|
+
--xh-checkbox-group-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 组容器:label、trigger、条目都是它的直接子节点,排布方式只能读 data-orientation——
|
|
3
8
|
连接层明说了 role=group 不接受 aria-orientation,那个属性它根本没输出 */
|
|
4
9
|
[data-scope='checkbox-group'][data-part='root'] {
|
package/css/checkbox.css
CHANGED
package/css/clipboard.css
CHANGED
package/css/code-block.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='code-block'] {
|
|
4
|
+
--xh-code-block-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* overflow: hidden 让内部 <pre> 的滚动内容沿圆角收边;不设 display,排布由作者决定 */
|
|
3
8
|
[data-scope='code-block'][data-part='root'] {
|
|
4
9
|
overflow: hidden;
|
package/css/collapsible.css
CHANGED
package/css/color-picker.css
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
@keyframes xh-color-picker-fade-in {
|
|
3
3
|
from {
|
|
4
4
|
opacity: 0;
|
|
5
|
-
scale:
|
|
5
|
+
scale: var(--xh-motion-scale-enter);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
to {
|
|
@@ -13,6 +13,11 @@
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
@layer xihan.components {
|
|
16
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
17
|
+
[data-scope='color-picker'] {
|
|
18
|
+
--xh-color-picker-skin: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
16
21
|
/* 定位分工:取色区拇指的两条轴(inset-inline-start / inset-block-start)、
|
|
17
22
|
通道拇指的主轴(inset-inline-start)、浮层坐标、取色区底色、透明度轨道的渐变,
|
|
18
23
|
全都由连接层每帧写进内联样式。这份皮肤一个都不碰:内联优先级高于样式表,
|
package/css/combobox.css
CHANGED
|
@@ -1,4 +1,23 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-fade-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
1
15
|
@layer xihan.components {
|
|
16
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
17
|
+
[data-scope='combobox'] {
|
|
18
|
+
--xh-combobox-skin: 1;
|
|
19
|
+
}
|
|
20
|
+
|
|
2
21
|
[data-scope='combobox'][data-part='root'] {
|
|
3
22
|
/* 尺寸档只换这五个私有槽,输入行、标题与候选都从 root 继承它们,
|
|
4
23
|
换档不必给每个部件各写一条选择器。浮层在 positioner 里、也是 root 的后代,一并继承 */
|
package/css/composer.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='composer'] {
|
|
4
|
+
--xh-composer-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 边框画在 root 上,内部 textarea 无边框;align-items: flex-end 让按钮随输入框长高贴着底边 */
|
|
3
8
|
[data-scope='composer'][data-part='root'] {
|
|
4
9
|
/* 输入与发送按钮共用的控件高度 */
|
package/css/context-menu.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='context-menu'] {
|
|
4
|
+
--xh-context-menu-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 根只是把触发区与浮层圈在一起做作用域,不该在作者布局里多插一层盒子 */
|
|
3
8
|
[data-scope='context-menu'][data-part='root'] {
|
|
4
9
|
/* 尺寸档只换这四个私有槽,条目与分组标题都从 root 继承它们,
|
|
@@ -102,13 +107,6 @@
|
|
|
102
107
|
animation: xh-context-menu-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
/* 关掉动效的用户不该被涨开动画晃一下;这里只管本组件,公共那份不动 */
|
|
106
|
-
@media (prefers-reduced-motion: reduce) {
|
|
107
|
-
[data-scope='context-menu'][data-part='content'][data-state='open'] {
|
|
108
|
-
animation-duration: 0.01ms;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
110
|
[data-scope='context-menu'][data-part='group'] {
|
|
113
111
|
display: flex;
|
|
114
112
|
flex-direction: column;
|
|
@@ -282,7 +280,7 @@
|
|
|
282
280
|
@keyframes xh-context-menu-in {
|
|
283
281
|
from {
|
|
284
282
|
opacity: 0;
|
|
285
|
-
scale:
|
|
283
|
+
scale: var(--xh-motion-scale-enter);
|
|
286
284
|
}
|
|
287
285
|
|
|
288
286
|
to {
|
package/css/countdown.css
CHANGED
package/css/date-field.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='date-field'] {
|
|
4
|
+
--xh-date-field-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 与文本框、数字框同一套堆叠:标签一行、分段框一行 */
|
|
3
8
|
[data-scope='date-field'][data-part='root'] {
|
|
4
9
|
/* 尺寸档只换这四个私有槽,标题与分段框都从 root 继承它们,换档不必给每个部件各写一条选择器 */
|
package/css/date-picker.css
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
@layer xihan.components {
|
|
2
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
3
|
+
[data-scope='date-picker'] {
|
|
4
|
+
--xh-date-picker-skin: 1;
|
|
5
|
+
}
|
|
6
|
+
|
|
2
7
|
/* 与文本框、分段日期同一套堆叠:标签一行、输入行一行 */
|
|
3
8
|
[data-scope='date-picker'][data-part='root'] {
|
|
4
9
|
display: inline-flex;
|
|
@@ -284,7 +289,7 @@
|
|
|
284
289
|
@keyframes xh-date-picker-in {
|
|
285
290
|
from {
|
|
286
291
|
opacity: 0;
|
|
287
|
-
translate: 0 -
|
|
292
|
+
translate: 0 calc(-1 * var(--xh-motion-distance-sm));
|
|
288
293
|
}
|
|
289
294
|
|
|
290
295
|
to {
|
package/css/descriptions.css
CHANGED
package/css/dialog.css
CHANGED
|
@@ -1,4 +1,63 @@
|
|
|
1
|
+
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-fade-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@keyframes xh-fade-out {
|
|
15
|
+
from {
|
|
16
|
+
opacity: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
to {
|
|
20
|
+
opacity: 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* 幅度走令牌,减弱动效时由令牌层归零;位移与缩放用独立属性而非 transform 简写,
|
|
25
|
+
两者互不覆盖,手势期间写 translate 也不会把 scale 抹掉 */
|
|
26
|
+
@keyframes xh-dialog-in {
|
|
27
|
+
from {
|
|
28
|
+
opacity: 0;
|
|
29
|
+
translate: 0 var(--xh-motion-distance-md);
|
|
30
|
+
scale: var(--xh-motion-scale-enter);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
to {
|
|
34
|
+
opacity: 1;
|
|
35
|
+
translate: 0 0;
|
|
36
|
+
scale: 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@keyframes xh-dialog-out {
|
|
41
|
+
from {
|
|
42
|
+
opacity: 1;
|
|
43
|
+
translate: 0 0;
|
|
44
|
+
scale: 1;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
to {
|
|
48
|
+
opacity: 0;
|
|
49
|
+
translate: 0 var(--xh-motion-distance-md);
|
|
50
|
+
scale: var(--xh-motion-scale-enter);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
1
55
|
@layer xihan.components {
|
|
56
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
57
|
+
[data-scope='dialog'] {
|
|
58
|
+
--xh-dialog-skin: 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
2
61
|
[data-scope='dialog'][data-part='backdrop'] {
|
|
3
62
|
position: fixed;
|
|
4
63
|
inset: 0;
|
|
@@ -10,8 +69,9 @@
|
|
|
10
69
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
11
70
|
}
|
|
12
71
|
|
|
72
|
+
/* 退场补 forwards:动画播完到宿主真正卸载之间还有一帧,不定住终态遮罩会闪回全黑 */
|
|
13
73
|
[data-scope='dialog'][data-part='backdrop'][data-state='closed'] {
|
|
14
|
-
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
|
|
74
|
+
animation: xh-fade-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
15
75
|
}
|
|
16
76
|
|
|
17
77
|
[data-scope='dialog'][data-part='positioner'] {
|
|
@@ -48,12 +108,13 @@
|
|
|
48
108
|
box-shadow: var(--xh-dialog-shadow, var(--xh-elevation-3));
|
|
49
109
|
}
|
|
50
110
|
|
|
51
|
-
/*
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
111
|
+
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 drawer 一致:
|
|
112
|
+
收起态连接层会给 content 打 hidden,而上面那条 display: flex 正是要盖掉 UA 的
|
|
113
|
+
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
114
|
+
读到才申领租约、等 animationend 才卸载;一旦 display: none,元素不生成盒子、
|
|
115
|
+
动画根本不启动,探测器直接放弃租约,退场动画一帧都播不出来。
|
|
116
|
+
真正的收起由适配器兜住:Vue 卸载整棵,WC 写内联 style.display。
|
|
117
|
+
其余声明了 display 的角色节点仍补 [hidden],那几处没有退场动画。 */
|
|
57
118
|
|
|
58
119
|
/* —— 尺寸 —— */
|
|
59
120
|
/* 只有最大宽度分档;中间档不写规则,缺省即中档。
|
|
@@ -70,13 +131,12 @@
|
|
|
70
131
|
outline: none;
|
|
71
132
|
}
|
|
72
133
|
|
|
73
|
-
/* 入场用 @starting-style 只驱动动画名切换;退场由 presence 保留 DOM 后播放 */
|
|
74
134
|
[data-scope='dialog'][data-part='content'][data-state='open'] {
|
|
75
135
|
animation: xh-dialog-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
|
|
76
136
|
}
|
|
77
137
|
|
|
78
138
|
[data-scope='dialog'][data-part='content'][data-state='closed'] {
|
|
79
|
-
animation: xh-dialog-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit);
|
|
139
|
+
animation: xh-dialog-out var(--xh-motion-duration-exit) var(--xh-motion-ease-exit) forwards;
|
|
80
140
|
}
|
|
81
141
|
|
|
82
142
|
[data-scope='dialog'][data-part='title'] {
|
package/css/drawer.css
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
@layer xihan.motion {
|
|
2
|
+
/* 动画名的查找只认「文档里有没有这个名字」:引用别处文件里的名字,那份文件不一定在场,
|
|
3
|
+
动画会静默地整个不跑。每份皮肤都能单独引入,所以它用到的关键帧都写在自己身上。 */
|
|
4
|
+
@keyframes xh-fade-in {
|
|
5
|
+
from {
|
|
6
|
+
opacity: 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
to {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@keyframes xh-fade-out {
|
|
15
|
+
from {
|
|
16
|
+
opacity: 1;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
to {
|
|
20
|
+
opacity: 0;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
2
24
|
/* 四条边各一对滑入/滑出。位移量用 translate 的百分比,参照的是面板自己的边框盒,
|
|
3
25
|
所以不管 --xh-drawer-size 被改成多少,"正好推到视口外"这件事都成立。
|
|
4
26
|
|
|
@@ -85,15 +107,14 @@
|
|
|
85
107
|
translate: 0 var(--xh-_drawer-shift-block, 100%);
|
|
86
108
|
}
|
|
87
109
|
}
|
|
88
|
-
|
|
89
|
-
@media (prefers-reduced-motion: reduce) {
|
|
90
|
-
[data-scope='drawer'][data-part] {
|
|
91
|
-
animation-duration: 0.01ms !important;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
110
|
}
|
|
95
111
|
|
|
96
112
|
@layer xihan.components {
|
|
113
|
+
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
114
|
+
[data-scope='drawer'] {
|
|
115
|
+
--xh-drawer-skin: 1;
|
|
116
|
+
}
|
|
117
|
+
|
|
97
118
|
/* root 留在页面原地,只是 data-side / data-state 的落点,不该凭空多出一层盒子把
|
|
98
119
|
trigger 从作者的 flex / grid 行里挤出去,故 display: contents。 */
|
|
99
120
|
[data-scope='drawer'][data-part='root'] {
|
|
@@ -218,9 +239,9 @@
|
|
|
218
239
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致。
|
|
219
240
|
收起态连接层会给 content 打 hidden,而上面这条 display: flex 正是要盖掉
|
|
220
241
|
UA 的 [hidden]{display:none}——退场动画得先能播:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
242
|
+
presence 读的是 content 的 animationName,读到就申领租约、等 animationend 才卸载;
|
|
243
|
+
一旦 display: none,元素不生成盒子、动画根本不启动,退场探测器会直接放弃申领
|
|
244
|
+
(否则就要等一个永不到来的 animationend),面板不播动画就地卸载。
|
|
224
245
|
真正的收起两个适配器各自兜住了:Vue 卸载整棵,WC 写内联 style.display。
|
|
225
246
|
其余声明了 display 的角色节点仍补了 [hidden],那几处没有退场动画,作者手写 hidden 要生效。 */
|
|
226
247
|
|