@greypan/web-ui 6.3.1 → 7.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.
- package/README.CN.md +145 -42
- package/README.md +156 -53
- package/dist/_virtual/{_@oxc-project_runtime@0.146.0 → _@oxc-project_runtime@0.149.0}/helpers/esm/decorate.js +1 -1
- package/dist/assets/glass.js +1 -1
- package/dist/assets/glass.js.map +1 -1
- package/dist/assets/menu-portal.js +1 -1
- package/dist/assets/menu-portal.js.map +1 -1
- package/dist/assets/overlay-motion.js +1 -1
- package/dist/assets/overlay-motion.js.map +1 -1
- package/dist/assets/selection-control.js +6 -0
- package/dist/assets/selection-control.js.map +1 -0
- package/dist/assets/toast-containers.js.map +1 -1
- package/dist/components/autocomplete/index.d.ts +2 -0
- package/dist/components/autocomplete/index.js +22 -23
- package/dist/components/autocomplete/index.js.map +1 -1
- package/dist/components/autocomplete/style.js +1 -1
- package/dist/components/autocomplete/style.js.map +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/back-top/index.js +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/badge/style.js.map +1 -1
- package/dist/components/button/index.js +1 -1
- package/dist/components/button/style.js.map +1 -1
- package/dist/components/button-group/index.js +1 -1
- package/dist/components/checkbox/index.d.ts +9 -2
- package/dist/components/checkbox/index.js +52 -28
- package/dist/components/checkbox/index.js.map +1 -1
- package/dist/components/checkbox/style.js +1 -1
- package/dist/components/checkbox/style.js.map +1 -1
- package/dist/components/checkbox-group/index.d.ts +3 -0
- package/dist/components/checkbox-group/index.js +26 -15
- package/dist/components/checkbox-group/index.js.map +1 -1
- package/dist/components/checkbox-group/style.js +1 -1
- package/dist/components/checkbox-group/style.js.map +1 -1
- package/dist/components/collapse/index.js +3 -3
- package/dist/components/collapse/index.js.map +1 -1
- package/dist/components/context-menu/index.d.ts +10 -0
- package/dist/components/context-menu/index.js +53 -39
- package/dist/components/context-menu/index.js.map +1 -1
- package/dist/components/dialog/index.d.ts +6 -0
- package/dist/components/dialog/index.js +46 -21
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dialog/style.js +1 -1
- package/dist/components/dialog/style.js.map +1 -1
- package/dist/components/drawer/index.d.ts +22 -4
- package/dist/components/drawer/index.js +135 -107
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/style.js +1 -1
- package/dist/components/drawer/style.js.map +1 -1
- package/dist/components/dropdown/index.d.ts +21 -1
- package/dist/components/dropdown/index.js +78 -55
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropdown-divider/index.js +1 -1
- package/dist/components/dropdown-header/index.js +1 -1
- package/dist/components/dropdown-item/index.js +1 -1
- package/dist/components/empty/index.js +1 -1
- package/dist/components/icon/index.js +1 -1
- package/dist/components/icon/style.js +1 -1
- package/dist/components/icon/style.js.map +1 -1
- package/dist/components/image-preview/index.js +89 -69
- package/dist/components/image-preview/index.js.map +1 -1
- package/dist/components/image-preview/style.js +1 -1
- package/dist/components/image-preview/style.js.map +1 -1
- package/dist/components/index.js +29 -29
- package/dist/components/input/index.js +4 -4
- package/dist/components/input/index.js.map +1 -1
- package/dist/components/input/style.js.map +1 -1
- package/dist/components/input-number/index.js +2 -2
- package/dist/components/input-number/index.js.map +1 -1
- package/dist/components/layout/index.js +3 -3
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/layout/style.js +1 -1
- package/dist/components/layout/style.js.map +1 -1
- package/dist/components/option/index.js +1 -1
- package/dist/components/popover/index.d.ts +8 -2
- package/dist/components/popover/index.js +48 -53
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/radio/index.d.ts +1 -1
- package/dist/components/radio/index.js +16 -15
- package/dist/components/radio/index.js.map +1 -1
- package/dist/components/radio/style.js +1 -1
- package/dist/components/radio/style.js.map +1 -1
- package/dist/components/radio-group/index.d.ts +3 -0
- package/dist/components/radio-group/index.js +26 -15
- package/dist/components/radio-group/index.js.map +1 -1
- package/dist/components/radio-group/style.js +1 -1
- package/dist/components/radio-group/style.js.map +1 -1
- package/dist/components/segmented/index.js +1 -1
- package/dist/components/segmented/style.js +1 -1
- package/dist/components/segmented/style.js.map +1 -1
- package/dist/components/segmented-trigger/index.js +1 -1
- package/dist/components/select/index.d.ts +2 -0
- package/dist/components/select/index.js +23 -22
- package/dist/components/select/index.js.map +1 -1
- package/dist/components/select/style.js +1 -1
- package/dist/components/select/style.js.map +1 -1
- package/dist/components/slider/index.js +1 -1
- package/dist/components/slider/index.js.map +1 -1
- package/dist/components/slider/style.js +1 -1
- package/dist/components/slider/style.js.map +1 -1
- package/dist/components/spinner/index.js +2 -2
- package/dist/components/spinner/index.js.map +1 -1
- package/dist/components/spinner/style.js +1 -1
- package/dist/components/spinner/style.js.map +1 -1
- package/dist/components/svg-draw-lines/index.d.ts +13 -2
- package/dist/components/svg-draw-lines/index.js +45 -32
- package/dist/components/svg-draw-lines/index.js.map +1 -1
- package/dist/components/switch/index.js +2 -2
- package/dist/components/switch/index.js.map +1 -1
- package/dist/components/switch/style.js +1 -1
- package/dist/components/switch/style.js.map +1 -1
- package/dist/components/textarea/index.js +5 -5
- package/dist/components/textarea/index.js.map +1 -1
- package/dist/components/textarea/style.js.map +1 -1
- package/dist/components/theme/index.d.ts +17 -0
- package/dist/components/theme/index.js +181 -21
- package/dist/components/theme/index.js.map +1 -1
- package/dist/components/theme/style.js +1 -1
- package/dist/components/theme/style.js.map +1 -1
- package/dist/components/toast/index.d.ts +1 -1
- package/dist/components/toast/manager.d.ts +1 -3
- package/dist/components/toast/manager.js +92 -49
- package/dist/components/toast/manager.js.map +1 -1
- package/dist/components/toast/style.js +1 -1
- package/dist/components/toast/style.js.map +1 -1
- package/dist/components/toast/toast.d.ts +37 -0
- package/dist/components/toast/toast.js +62 -9
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/toast/types.d.ts +0 -4
- package/dist/components/tooltip/index.d.ts +6 -1
- package/dist/components/tooltip/index.js +17 -15
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/shared/form-association/index.js +1 -1
- package/dist/shared/form-association/index.js.map +1 -1
- package/dist/shared/gesture/drag-gesture.js +66 -64
- package/dist/shared/gesture/drag-gesture.js.map +1 -1
- package/dist/shared/gesture/physics.js +7 -29
- package/dist/shared/gesture/physics.js.map +1 -1
- package/dist/shared/menu-behavior/index.js +3 -4
- package/dist/shared/menu-behavior/index.js.map +1 -1
- package/dist/shared/menu-portal/menu-tree.js +1 -1
- package/dist/shared/menu-portal/menu-tree.js.map +1 -1
- package/dist/shared/option-portal/combobox-shell.js +7 -8
- package/dist/shared/option-portal/combobox-shell.js.map +1 -1
- package/dist/shared/overlay/anchored-panel.js +36 -31
- package/dist/shared/overlay/anchored-panel.js.map +1 -1
- package/dist/shared/overlay/native-dialog-presence.js +18 -2
- package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
- package/dist/shared/overlay/nested-drawer-layers.js +7 -4
- package/dist/shared/overlay/nested-drawer-layers.js.map +1 -1
- package/dist/shared/overlay/open-overlay.js +182 -0
- package/dist/shared/overlay/open-overlay.js.map +1 -0
- package/dist/shared/overlay/overlay.js +1 -1
- package/dist/shared/overlay/overlay.js.map +1 -1
- package/dist/shared/overlay/portal.js +1 -1
- package/dist/shared/overlay/portal.js.map +1 -1
- package/dist/shared/overlay/presence.js +19 -22
- package/dist/shared/overlay/presence.js.map +1 -1
- package/dist/shared/theme/duration.js +9 -0
- package/dist/shared/theme/duration.js.map +1 -0
- package/dist/shared/theme/reduced-motion.js +15 -0
- package/dist/shared/theme/reduced-motion.js.map +1 -0
- package/dist/shared/visible-area/index.js +1 -1
- package/dist/shared/visible-area/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/shared/overlay/composition.js +0 -57
- package/dist/shared/overlay/composition.js.map +0 -1
- package/dist/shared/overlay/lifecycle.js +0 -41
- package/dist/shared/overlay/lifecycle.js.map +0 -1
- package/dist/vite.svg +0 -1
package/README.CN.md
CHANGED
|
@@ -478,8 +478,7 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
478
478
|
| `--wui-slider-height` | `var(--wui-slider-track-size, 6px)` | 轨道厚度 |
|
|
479
479
|
| `--wui-slider-track-size` | `6px` | 轨道尺寸 |
|
|
480
480
|
| `--wui-slider-thumb-width` | `24px` | 滑块宽度 |
|
|
481
|
-
| `--wui-slider-thumb-height` | `
|
|
482
|
-
| `--wui-slider-thumb-radius` | `8px` | 滑块圆角 |
|
|
481
|
+
| `--wui-slider-thumb-height` | `20px` | 滑块高度 |
|
|
483
482
|
| `--wui-slider-marks-inset` | `0` | 刻度内缩 |
|
|
484
483
|
|
|
485
484
|
#### `<web-ui-checkbox>`
|
|
@@ -500,6 +499,12 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
500
499
|
|
|
501
500
|
使用 `role="checkbox"` 和 `aria-checked`。Enter/Space 键盘切换。
|
|
502
501
|
|
|
502
|
+
**布局:** 宿主是 inline-flex 盒,高度由内容撑开、不继承页面行高,因此不会在指示器上下留出多余缝隙;`--wui-selection-control-size`(`18px`)决定指示器宽高,宿主与相邻文字的对齐固定为 `vertical-align: middle`。`<web-ui-radio>` 共用同一套契约。
|
|
503
|
+
|
|
504
|
+
**选中动画:** 对勾是控件自持的描边路径(不再走 `<web-ui-icon>` 图标资产),外层包 `<web-ui-svg-draw-lines>` 并带 `no-autoplay`,所以挂载时就已勾选的控件显示静态勾。勾选时线条自左向右按恒定笔速画出,时长取 `--wui-duration-trigger`(默认 160ms),在切换当下从已生效的主题解析,和指示器底色那条 transition 落在同一拍;取消时沿同一条路径收回到空白,而不是只淡出;主题范围为 `motion="reduced"` 时两者都跳过,两个状态直接切换。
|
|
505
|
+
|
|
506
|
+
**未激活态:** 未选中指示器的底色取 `--wui-color-surface-control`(与中性按钮同一档控件底),深色模式下也能和 `--wui-color-page` 分辨开。触发区内任意位置(指示器、间距或右侧 slot 标签)被 hover 时,该底色再叠 6% 状态层。hover 只在 `(hover: hover) and (pointer: fine)` 设备上生效;没有按下态,已选中和禁用态保持各自底色。`<web-ui-radio>` 共用同一套状态。
|
|
507
|
+
|
|
503
508
|
#### `<web-ui-radio>`
|
|
504
509
|
|
|
505
510
|
单个单选按钮。
|
|
@@ -516,6 +521,8 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
516
521
|
|
|
517
522
|
**插槽:** `default`(标签文本)
|
|
518
523
|
|
|
524
|
+
**布局:** 与 `<web-ui-checkbox>` 共用同一套选择控件盒契约——宿主高度由内容撑开、不继承页面行高,指示器宽高走 `--wui-selection-control-size`,与相邻文字按 `vertical-align: middle` 对齐。
|
|
525
|
+
|
|
519
526
|
#### `<web-ui-switch>`
|
|
520
527
|
|
|
521
528
|
开关切换。
|
|
@@ -558,35 +565,69 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
558
565
|
|
|
559
566
|
多选复选框组。
|
|
560
567
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
|
564
|
-
|
|
|
565
|
-
| `
|
|
566
|
-
| `
|
|
568
|
+
##### 属性
|
|
569
|
+
|
|
570
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
571
|
+
| ----------- | ---------------------------- | ------------ | -------------- |
|
|
572
|
+
| `value` | `string[]` | `[]` | 已选项的值数组 |
|
|
573
|
+
| `name` | `string` | `''` | 表单字段名 |
|
|
574
|
+
| `disabled` | `boolean` | `false` | 禁用全部子项 |
|
|
575
|
+
| `required` | `boolean` | `false` | 必填校验 |
|
|
576
|
+
| `direction` | `'horizontal' \| 'vertical'` | `'vertical'` | 布局方向 |
|
|
567
577
|
|
|
568
578
|
**事件:** `input`, `change`
|
|
569
579
|
|
|
570
580
|
**插槽:** `default`(投影 `<web-ui-checkbox>` 元素)
|
|
571
581
|
|
|
572
|
-
同步子 checkbox 的 `checked` 状态。`disabled` 提供继承的有效禁用状态,不改写子项自身的 `disabled` 属性。监听子项 `change`
|
|
582
|
+
同步子 checkbox 的 `checked` 状态。`disabled` 提供继承的有效禁用状态,不改写子项自身的 `disabled` 属性。监听子项 `change` 事件。`direction` 传入非法值时回退为 `vertical`。
|
|
583
|
+
|
|
584
|
+
##### Token
|
|
585
|
+
|
|
586
|
+
| Token | 默认值 | 说明 |
|
|
587
|
+
| -------------------------- | ------ | ------------------------ |
|
|
588
|
+
| `--wui-checkbox-group-gap` | `8px` | 成员 checkbox 之间的间距 |
|
|
589
|
+
|
|
590
|
+
在 group 元素本身,或同一个 `<web-ui-theme>` 作用域内的祖先元素上设置。theme 宿主会为自己的子树声明 `8px`,写在 `<web-ui-theme>` 元素之外的覆盖到不了 group。
|
|
591
|
+
|
|
592
|
+
```css
|
|
593
|
+
web-ui-checkbox-group {
|
|
594
|
+
--wui-checkbox-group-gap: 16px;
|
|
595
|
+
}
|
|
596
|
+
```
|
|
573
597
|
|
|
574
598
|
#### `<web-ui-radio-group>`
|
|
575
599
|
|
|
576
600
|
单选组。
|
|
577
601
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
|
581
|
-
|
|
|
582
|
-
| `
|
|
583
|
-
| `
|
|
602
|
+
##### 属性
|
|
603
|
+
|
|
604
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
605
|
+
| ----------- | ---------------------------- | ------------ | ------------------------ |
|
|
606
|
+
| `value` | `string` | `''` | 当前选中值 |
|
|
607
|
+
| `name` | `string` | `''` | 表单字段名(传递到子项) |
|
|
608
|
+
| `disabled` | `boolean` | `false` | 禁用全部子项 |
|
|
609
|
+
| `required` | `boolean` | `false` | 必填校验 |
|
|
610
|
+
| `direction` | `'horizontal' \| 'vertical'` | `'vertical'` | 布局方向 |
|
|
584
611
|
|
|
585
612
|
**事件:** `input`, `change`
|
|
586
613
|
|
|
587
614
|
**插槽:** `default`(投影 `<web-ui-radio>` 元素)
|
|
588
615
|
|
|
589
|
-
`disabled` 提供继承的有效禁用状态,不改写子项自身的 `disabled`
|
|
616
|
+
`disabled` 提供继承的有效禁用状态,不改写子项自身的 `disabled` 属性。`direction` 传入非法值时回退为 `vertical`。
|
|
617
|
+
|
|
618
|
+
##### Token
|
|
619
|
+
|
|
620
|
+
| Token | 默认值 | 说明 |
|
|
621
|
+
| ----------------------- | ------ | --------------------- |
|
|
622
|
+
| `--wui-radio-group-gap` | `8px` | 成员 radio 之间的间距 |
|
|
623
|
+
|
|
624
|
+
在 group 元素本身,或同一个 `<web-ui-theme>` 作用域内的祖先元素上设置。theme 宿主会为自己的子树声明 `8px`,写在 `<web-ui-theme>` 元素之外的覆盖到不了 group。
|
|
625
|
+
|
|
626
|
+
```css
|
|
627
|
+
web-ui-radio-group {
|
|
628
|
+
--wui-radio-group-gap: 16px;
|
|
629
|
+
}
|
|
630
|
+
```
|
|
590
631
|
|
|
591
632
|
---
|
|
592
633
|
|
|
@@ -665,6 +706,8 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
665
706
|
|
|
666
707
|
使用原生 `<dialog>`,`@cancel` 阻止默认关闭行为。除非存在 `no-escape-close`,否则 Escape 调用 `close()`;除非存在 `no-backdrop-close`,否则点击遮罩关闭。启用 `controlled` 后,两者都只派发关闭请求而不自关闭。
|
|
667
708
|
|
|
709
|
+
> **Escape 归属**:Escape 由共享仲裁者统一判定,一次按键只关闭**最内层**的已打开浮层(popover、select、autocomplete、dropdown、context-menu、drawer、dialog 都参与)。例如在 drawer 内打开 select,第一次 Escape 只关 select,第二次才关 drawer。互不嵌套的并列浮层按打开顺序关闭最上层。`image-preview` 同样参与:它的原生 `<dialog>` 会登记进同一个仲裁者,Escape 按层级判定;组件的 `cancel` handler 只是拦掉原生的瞬时关闭,把 top layer 保留到退场过渡结束。
|
|
710
|
+
|
|
668
711
|
**CSS 自定义属性:**
|
|
669
712
|
|
|
670
713
|
| 属性 | 默认值 | 说明 |
|
|
@@ -678,6 +721,7 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
678
721
|
| `--wui-dialog-desc-gap` | `24px` | 正文内容下方间距 |
|
|
679
722
|
| `--wui-dialog-footer-gap` | `10px` / horizontal `12px` | Footer 按钮间距 |
|
|
680
723
|
| `--wui-dialog-footer-justify` | `flex-end`(默认)/ `center`(horizontal) | Footer `justify-content`;horizontal 模式下覆盖为 `flex-end` 可右对齐 |
|
|
724
|
+
| `--wui-dialog-scale-enter` | `1.1` | 进场缩放起点:由 `1.1` 收缩到 `1`,退场反向 |
|
|
681
725
|
|
|
682
726
|
#### `<web-ui-drawer>`
|
|
683
727
|
|
|
@@ -711,10 +755,18 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
711
755
|
**拖拽关闭:** 启用 `draggable` 后,打开的抽屉在内缘显示灰色胶囊 drag bar(默认 4×56px,视觉中线距内缘 10px,位于 20px 厚的命中热区内;`right` 在左缘、`left` 在右缘、`top` 在下缘、`bottom` 在上缘):
|
|
712
756
|
|
|
713
757
|
- 拖拽实时跟手,遮罩透明度按比例淡出。
|
|
714
|
-
-
|
|
758
|
+
- 遮罩点击关闭只认**轻点链路**:按下起点在遮罩上、且按-放位移在轻点量级内的 click 才关闭。浏览器对「按下 → 拖动 → 松手」生成的 click 落在起点与松手点的共同祖先(dialog)上——从面板内容或遮罩上开始拖拽、松手落在遮罩时,click 的 target 同样是 dialog;组件在 `pointerdown` 记录起点与坐标做回溯校验,这类拖拽松手一律弹回。`detail` 为 0 的 click(键盘/程序化来源)不消费指针记录。
|
|
759
|
+
- 松手时自抓取瞬间起的**净位移**超过抽屉尺寸的一半(下限 10px)或快速甩动即关闭,否则弹回打开位;方向随 placement 适配。判定的每一环都与 Base UI `useSwipeDismiss` 对齐:
|
|
760
|
+
- 位移零点与判定时钟都在**首个 `pointermove`** 处重置,用来吸收「按下 → 首个 move」之间的空隙;该次 move 的整程位移被整体丢弃,因此一次手势至少要两个 move 才可能累积出位移。
|
|
761
|
+
- 甩动看的是**整段手势**的平均速度(净位移 ÷ 手势时长,分母下限 50ms)**达到** 500px/s,不是释放瞬间的瞬时速度。滑窗只描述最后一小段轨迹;在整段平均速度下,「先往边缘拖出、再快速扫回」不再能凑成甩动。时长为 0 时速度取 0 而不是按 50ms 兜底,因此测不到时长的手势永远不会被读成甩动。
|
|
762
|
+
- 净位移没有朝闭合方向的松手一律弹回打开位。
|
|
763
|
+
- 距离判据同样用净位移:从弹回途中抓取后不再拖动就松手,不会被当成「已经拖过一半」。
|
|
764
|
+
- 自「方向确认点」起反向回撤满 10px 即取消本次甩动,因此拖出后回扫不会关闭。位移重新越过距离阈值会清除该标记,所以「已经拖过一半」不受小幅回撤影响。上游有同一个守卫(`cancelledSwipe`),但在 drawer 这条路径上永远走不到——`DrawerViewport.onRelease` 必然返回一个决定。
|
|
765
|
+
- 朝打开方向的拖拽按平方根压缩(`sign(d) · |d| ** 0.5`),对齐 `applyDirectionalDamping`。阻尼作用于本次手势的**增量**、叠加在抓取瞬间的位移之上,因此自限幅而不需要固定的位移上限。
|
|
766
|
+
- 释放速度只决定收尾过渡的时长(180–420ms);收尾本身是一次交还 CSS 的 `transform` 过渡,不再创建 WAAPI 动画。
|
|
715
767
|
- 启用 `controlled` 后,超过阈值松手仅派发 `open-change(false)`;抽屉在闭合位短暂等待(120ms 回写窗口),Consumer 拒绝或超时未回写时弹回打开位。
|
|
716
768
|
- 不支持拖拽打开——关闭态的抽屉在原生 dialog 之外没有任何渲染物。
|
|
717
|
-
- `prefers-reduced-motion`
|
|
769
|
+
- `prefers-reduced-motion` 下松手即时到位,不播放收尾过渡。
|
|
718
770
|
|
|
719
771
|
**CSS 自定义属性:**
|
|
720
772
|
|
|
@@ -731,7 +783,7 @@ Portal 面板创建时会镜像 host 上解析后的这些变量;更新 host
|
|
|
731
783
|
| `--wui-drawer-drag-bar-length` | `56px` | Drag bar 胶囊长度(沿抽屉边缘) |
|
|
732
784
|
| `--wui-drawer-header-padding` | `16px 20px` | Header 区域 padding |
|
|
733
785
|
| `--wui-drawer-close-top` | `16px` | 内置关闭按钮相对 header 顶部的偏移 |
|
|
734
|
-
| `--wui-drawer-close-right` | `
|
|
786
|
+
| `--wui-drawer-close-right` | `16px` | 内置关闭按钮相对抽屉右缘的偏移 |
|
|
735
787
|
| `--wui-drawer-content-padding` | `20px` | 内容区 padding;同时驱动 drag bar 视觉中线(取半值) |
|
|
736
788
|
| `--wui-drawer-footer-padding` | `16px 20px` | Footer 区域 padding |
|
|
737
789
|
|
|
@@ -1083,9 +1135,10 @@ html`<web-ui-icon .icon=${lucideLoaderCircle} spin />`
|
|
|
1083
1135
|
|
|
1084
1136
|
**CSS 自定义属性:**
|
|
1085
1137
|
|
|
1086
|
-
| 属性
|
|
1087
|
-
|
|
|
1088
|
-
| `--wui-icon-color`
|
|
1138
|
+
| 属性 | 默认值 | 说明 |
|
|
1139
|
+
| --------------------- | --------- | ----------------------------------------------- |
|
|
1140
|
+
| `--wui-icon-color` | `inherit` | 图标颜色 |
|
|
1141
|
+
| `--wui-duration-spin` | `600ms` | `spin` 旋转周期;reduce 下放慢到 `1600ms`,不停 |
|
|
1089
1142
|
|
|
1090
1143
|
#### `<web-ui-spinner>`
|
|
1091
1144
|
|
|
@@ -1113,6 +1166,13 @@ WebUiSpinner.hide() // 隐藏
|
|
|
1113
1166
|
|
|
1114
1167
|
`WebUiSpinner.show(options?: { size?: number; duration?: number; description?: string })`
|
|
1115
1168
|
|
|
1169
|
+
**CSS 自定义属性:**
|
|
1170
|
+
|
|
1171
|
+
| 属性 | 默认值 | 说明 |
|
|
1172
|
+
| ------------------------ | ------- | -------------------------------------------- |
|
|
1173
|
+
| `--wui-spinner-size` | `24px` | 尺寸,由 `size` 属性写入 |
|
|
1174
|
+
| `--wui-duration-spinner` | `800ms` | 叶片追光周期;reduce 下放慢到 `1600ms`,不停 |
|
|
1175
|
+
|
|
1116
1176
|
---
|
|
1117
1177
|
|
|
1118
1178
|
### 布局与工具
|
|
@@ -1183,10 +1243,10 @@ WebUiSpinner.hide() // 隐藏
|
|
|
1183
1243
|
|
|
1184
1244
|
**CSS 自定义属性:**
|
|
1185
1245
|
|
|
1186
|
-
| 属性 | 默认值
|
|
1187
|
-
| ---------------------------------- |
|
|
1188
|
-
| `--wui-layout-sidebar-radius` | `
|
|
1189
|
-
| `--wui-layout-mobile-toggle-inset` | `8px`
|
|
1246
|
+
| 属性 | 默认值 | 说明 |
|
|
1247
|
+
| ---------------------------------- | ------ | ------------------------------------ |
|
|
1248
|
+
| `--wui-layout-sidebar-radius` | `24px` | 侧边栏卡片圆角(桌面端和移动端共用) |
|
|
1249
|
+
| `--wui-layout-mobile-toggle-inset` | `8px` | 移动端 header Toggle 的左缩进 |
|
|
1190
1250
|
|
|
1191
1251
|
#### `<web-ui-back-top>`
|
|
1192
1252
|
|
|
@@ -1220,20 +1280,25 @@ WebUiSpinner.hide() // 隐藏
|
|
|
1220
1280
|
|
|
1221
1281
|
#### `<web-ui-svg-draw-lines>`
|
|
1222
1282
|
|
|
1223
|
-
SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动画 —— 不克隆、不操作 DOM
|
|
1283
|
+
SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动画 —— 不克隆、不操作 DOM。两个播放方向:默认按从无到有描出几何形状,`replay({ reverse: true })` 沿原路收回,从有到无。
|
|
1284
|
+
|
|
1285
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
1286
|
+
| ------------- | --------- | ---------- | ---------------------------------------- |
|
|
1287
|
+
| `duration` | `number` | `1000` | 动画时长(毫秒),限制在 `[0, 30000]` |
|
|
1288
|
+
| `easing` | `string` | `'linear'` | CSS 缓动函数,传递给 `element.animate()` |
|
|
1289
|
+
| `no-autoplay` | `boolean` | `false` | 关闭内容首次出现时的自动播放 |
|
|
1224
1290
|
|
|
1225
|
-
|
|
1226
|
-
| ---------- | -------- | ---------- | -------------------------------------------- |
|
|
1227
|
-
| `duration` | `number` | `1000` | 动画时长(毫秒),限制在 `[0, 30000]` 范围内 |
|
|
1228
|
-
| `easing` | `string` | `'linear'` | CSS 缓动函数,传递给 `element.animate()` |
|
|
1291
|
+
三个属性均会反射(reflected)。
|
|
1229
1292
|
|
|
1230
|
-
|
|
1293
|
+
**自动播放:** slot 内容第一次稳定时自动播放一次画入。设置 `no-autoplay` 后保持资产原样、由调用方决定何时播放 —— `<web-ui-checkbox>` 正是靠它避免挂载时就已勾选的勾在页面首帧画出来。
|
|
1231
1294
|
|
|
1232
|
-
**方法:** `replay(): Promise<void>` — 取消当前动画,重新从 DOM 收集几何元素并开始新动画。所有目标以相同的 duration/easing 并行播放。动画全部完成后 resolve
|
|
1295
|
+
**方法:** `replay(options?: { reverse?: boolean }): Promise<void>` — 取消当前动画,重新从 DOM 收集几何元素并开始新动画。所有目标以相同的 duration/easing 并行播放。动画全部完成后 resolve。收回段以「空白」收尾,并把这一末态留在 DOM 上:动画本身在收尾时撤销,但让描边隐去的 dash 值作为内联样式保留,直到下一次 `replay()` 把它替换或撤掉。画入段则恢复消费者自己写的内联样式。收回总是从完整描边起收,所以在画入途中打断也会把整条路径描回去,而不是只收掉看得见的那一段。最近主题范围为 `motion="reduced"` 时不启动任何动画 —— 但上一次收回留下的空白仍会被撤掉,几何回到资产原样,可见性完全交给消费者自己的样式;`motion="system"` 在匹配 `prefers-reduced-motion: reduce` 时行为相同。
|
|
1296
|
+
|
|
1297
|
+
**收回末态:** 收回留下的空白是写在被动画的几何元素上的内联样式,包括嵌套开放 Shadow Root(如 `<web-ui-icon>`)里的节点。克隆这些节点(`cloneNode`、`innerHTML` 往返)会把空白一起带走;把节点摘下来再挂回去,描边也仍然是隐去的 —— 收回结束是一个 DOM 状态而不是一条还活着的动画,没有留下任何东西去复原它。要重新显示就调用 `replay()`。由于组件会递归进入嵌套的开放 Shadow Root,两层 `<web-ui-svg-draw-lines>` 不得覆盖同一批几何元素:每个实例只在第一次动画某个元素时记录它的内联 dash 值,内层留下的空白会被外层当成「消费者自己写的值」。
|
|
1233
1298
|
|
|
1234
1299
|
**插槽:** `default` — 需要动画的 SVG 内容。接受内联 `<svg>` 元素(light DOM)以及将 SVG 渲染在开放 Shadow DOM 中的组件(如 `<web-ui-icon>`)。closed Shadow Root 被跳过。
|
|
1235
1300
|
|
|
1236
|
-
递归遍历 light DOM 和所有开放 Shadow Root,查找 `path`、`rect`、`circle`、`line`、`polyline`、`polygon`、`ellipse` 元素。以 `Z`/`z` 结尾的 `<path>`
|
|
1301
|
+
递归遍历 light DOM 和所有开放 Shadow Root,查找 `path`、`rect`、`circle`、`line`、`polyline`、`polygon`、`ellipse` 元素。以 `Z`/`z` 结尾的 `<path>` 会临时应用缺口修复逻辑确保闭合段正确渲染。画入段完成或取消后恢复所有内联样式。
|
|
1237
1302
|
|
|
1238
1303
|
#### `<web-ui-theme>`
|
|
1239
1304
|
|
|
@@ -1243,6 +1308,7 @@ SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动
|
|
|
1243
1308
|
| ------------ | --------------------------------- | ---------- | -------------------------- |
|
|
1244
1309
|
| `appearance` | `'light' \| 'dark' \| 'system'` | `'light'` | 配色方案 |
|
|
1245
1310
|
| `motion` | `'full' \| 'reduced' \| 'system'` | `'system'` | 当前嵌套主题范围的动效偏好 |
|
|
1311
|
+
| `transition` | `boolean` | `false` | 配色变化时的圆形揭示动画 |
|
|
1246
1312
|
|
|
1247
1313
|
**方法:** `getOverlayRoot()` — 返回该主题拥有的 theme-owned overlay root
|
|
1248
1314
|
|
|
@@ -1250,6 +1316,8 @@ SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动
|
|
|
1250
1316
|
|
|
1251
1317
|
在其子树中定义基础、颜色、层级、阴影和动效 token。`motion="system"` 跟随 `prefers-reduced-motion`;使用 `motion="reduced"` 降低当前作用域动效,或在嵌套主题中使用 `motion="full"` 恢复默认 token。System 配色模式跟随 `prefers-color-scheme`。
|
|
1252
1318
|
|
|
1319
|
+
设置 `transition` 布尔属性后,使用 View Transitions API 播放配色变化;移除属性即关闭,框架动态切换时必须绑定 boolean property。根主题揭示整页;嵌套主题只揭示自己的 capture box。圆心优先取最近一次 pointerdown 坐标,否则回退主题盒或视口中心;深浅两个方向反向播放。不支持的浏览器、reduced-motion 作用域、时长为 0 以及同一 flight 内已有未完成请求都会立即落地新 appearance;当前版本对 `appearance="system"` 的 OS 深浅翻转不做动画。
|
|
1320
|
+
|
|
1253
1321
|
主题宿主使用 `display: contents` 且不绘制任何背景:组件库不在宿主页面画背景,嵌入方对主题子树背后的表面保留完全控制权。自定义属性仍可靠继承到 slotted 内容。
|
|
1254
1322
|
|
|
1255
1323
|
**基础 token:**
|
|
@@ -1262,6 +1330,14 @@ SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动
|
|
|
1262
1330
|
| `--wui-overlay-min-width` | `200px` | 锚定浮层最小宽度 |
|
|
1263
1331
|
| `--wui-focus-ring-width` | `3px` | Focus 指示器宽度 |
|
|
1264
1332
|
|
|
1333
|
+
**选择控件 token(radio、checkbox):**
|
|
1334
|
+
|
|
1335
|
+
| 属性 | 默认值 | 说明 |
|
|
1336
|
+
| ------------------------------ | ------ | ------------------------------------ |
|
|
1337
|
+
| `--wui-selection-control-size` | `18px` | 指示器(圆点 / 方框)宽高 |
|
|
1338
|
+
| `--wui-radio-group-gap` | `8px` | `<web-ui-radio-group>` 的成员间距 |
|
|
1339
|
+
| `--wui-checkbox-group-gap` | `8px` | `<web-ui-checkbox-group>` 的成员间距 |
|
|
1340
|
+
|
|
1265
1341
|
**圆角 token:**
|
|
1266
1342
|
|
|
1267
1343
|
| 属性 | 默认值 | 说明 |
|
|
@@ -1286,7 +1362,7 @@ SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动
|
|
|
1286
1362
|
| `--wui-layer-toast` | `200` | Toast |
|
|
1287
1363
|
| `--wui-layer-loading` | `300` | 阻塞式 Loading |
|
|
1288
1364
|
|
|
1289
|
-
**动效 token:** duration 默认值为 `--wui-duration-press: 80ms`、`--wui-duration-feedback: 100ms`、`--wui-duration-trigger: 160ms`、`--wui-duration-focus: 200ms`、`--wui-duration-float-enter:
|
|
1365
|
+
**动效 token:** duration 默认值为 `--wui-duration-press: 80ms`、`--wui-duration-feedback: 100ms`、`--wui-duration-trigger: 160ms`、`--wui-duration-focus: 200ms`、`--wui-duration-float-enter: 240ms`、`--wui-duration-float-exit: 160ms`、`--wui-duration-dialog-enter: 320ms`、`--wui-duration-dialog-exit: 260ms`、`--wui-duration-drawer-enter: 280ms`、`--wui-duration-drawer-exit: 240ms`、`--wui-duration-drawer-nested: 450ms`、`--wui-duration-toast-enter: 280ms`、`--wui-duration-toast-exit: 200ms`、`--wui-duration-collapse-enter: 200ms`、`--wui-duration-collapse-exit: 160ms`、`--wui-duration-layout: 200ms`、`--wui-duration-swipe-settle: 220ms`(image-preview 轮播回位)、`--wui-duration-spin: 600ms`(icon 旋转)、`--wui-duration-spinner: 800ms`(spinner 叶片追光)与 `--wui-theme-transition-duration: 500ms`(主题配色揭示)。Easing token 是 `--wui-ease-enter`、`--wui-ease-dialog`(`cubic-bezier(0.2, 0, 0, 1)`)、`--wui-ease-slide`、`--wui-ease-float`(`cubic-bezier(0.4, 0.38, 0.2, 1)`,锚定浮动面板专用的无回弹弹簧拟合曲线)、`--wui-ease-swipe`(`cubic-bezier(0.32, 0.72, 0, 1)`,轮播回位的减速收尾)与 `--wui-theme-transition-easing: ease-in`;进入缩放是 `--wui-scale-enter: 0.95`(浮动面板与 image-preview 的图片舞台层由小到大展开),dialog 使用 `--wui-dialog-scale-enter: 1.1`(由大到小收缩入场,退场反向)。`motion="reduced"` 下所有转场时长归零(轮播回位一并归零),两个无限加载循环只放慢、不停(`--wui-duration-spin` / `--wui-duration-spinner`:`600ms` / `800ms` → `1600ms`)。加载指示冻结会被读成界面卡死。hover/active 背景反馈即时切换、无过渡动画;选中态、按压与 focus 走带时长的过渡,reduce 下同样归零。
|
|
1290
1366
|
|
|
1291
1367
|
**颜色 token:**
|
|
1292
1368
|
|
|
@@ -1313,8 +1389,8 @@ SVG 线条绘制动画,基于 `stroke-dashoffset`。直接在原元素上动
|
|
|
1313
1389
|
| `--wui-color-border` | `rgb(0 0 0 / 0.1)` | `rgb(255 255 255 / 0.14)` | 常规边框和分隔线 |
|
|
1314
1390
|
| `--wui-color-glass-border` | `transparent` | `rgb(255 255 255 / 0.05)` | Glass 边框色调 |
|
|
1315
1391
|
| `--wui-color-glass-highlight` | `rgb(255 255 255 / 0.9)` | `rgb(255 255 255 / 0.1)` | Glass 高光边缘 |
|
|
1316
|
-
| `--wui-color-glass-corner` | `rgb(255 255 255 / 0.
|
|
1317
|
-
| `--wui-color-glass-shade` | `rgb(0 0 0 / 0.
|
|
1392
|
+
| `--wui-color-glass-corner` | `rgb(255 255 255 / 0.5)` | `rgb(255 255 255 / 0.2)` | Glass 边框角落光泽 |
|
|
1393
|
+
| `--wui-color-glass-shade` | `rgb(0 0 0 / 0.03)` | `rgb(0 0 0 / 0.5)` | Glass 边框背光角压暗 |
|
|
1318
1394
|
| `--wui-color-accent` | `#08f` | `#0a84ff` | Accent 和输入焦点边框 |
|
|
1319
1395
|
| `--wui-color-on-accent` | `#fff` | `#fff` | Accent 上的前景色 |
|
|
1320
1396
|
| `--wui-color-on-control` | `#fff` | `#f2f2f7` | 控件内芯前景色 |
|
|
@@ -1365,10 +1441,18 @@ const id = toast({ message: '自定义', type: 'info', position: 'bottom-right',
|
|
|
1365
1441
|
toast.close(id)
|
|
1366
1442
|
toast.clear()
|
|
1367
1443
|
|
|
1368
|
-
//
|
|
1369
|
-
toast.
|
|
1444
|
+
// upsert:同一 id 再次调用是更新那一条,而不是再建一条
|
|
1445
|
+
toast.error('网络连接中断,正在重试…', { id: 'network' })
|
|
1446
|
+
toast.error('网络连接中断(第 2 次重试)', { id: 'network' })
|
|
1447
|
+
|
|
1448
|
+
// 一条 toast 走完整个生命周期
|
|
1449
|
+
toast.info('上传中 0%', { id: 'upload', duration: 0 })
|
|
1450
|
+
toast.info('上传中 60%', { id: 'upload' }) // 省略 duration,计时不动
|
|
1451
|
+
toast.success('上传完成', { id: 'upload', duration: 3000 }) // 换 type,重新开始倒计时
|
|
1370
1452
|
```
|
|
1371
1453
|
|
|
1454
|
+
每次调用都返回这条 toast 的最终 id,调用方无需区分新建还是更新。
|
|
1455
|
+
|
|
1372
1456
|
**ToastOptions:**
|
|
1373
1457
|
|
|
1374
1458
|
| 选项 | 类型 | 默认值 | 说明 |
|
|
@@ -1377,17 +1461,36 @@ toast.updateMessage(id, { message: '上传已完成 60%', heading: '正在上传
|
|
|
1377
1461
|
| `type` | `'success' \| 'info' \| 'warning' \| 'error'` | `'info'` | 类型 |
|
|
1378
1462
|
| `duration` | `number` | `3000`(error 为 `5000`) | 自动关闭时间(0=不自动关闭) |
|
|
1379
1463
|
| `closable` | `boolean` | `true` | 显示关闭按钮 |
|
|
1380
|
-
| `id` | `string` | auto |
|
|
1464
|
+
| `id` | `string` | auto | 合并键:同一 id 的调用更新同一条 |
|
|
1381
1465
|
| `heading` | `string` | `''` | 粗体标题 |
|
|
1382
1466
|
| `position` | 6 种位置 | `'top-right'` | 屏幕位置 |
|
|
1383
1467
|
| `target` | `Element` | — | 用于查找最近 theme-owned overlay root |
|
|
1384
1468
|
| `container` | `HTMLElement` | — | 显式挂载容器(最高优先级) |
|
|
1385
1469
|
|
|
1386
|
-
|
|
1470
|
+
**upsert 语义** —— 同一 `id` 再次调用的结果:
|
|
1471
|
+
|
|
1472
|
+
| 目标状态 | 结果 |
|
|
1473
|
+
| -------------------- | ------------------------------------------------ |
|
|
1474
|
+
| 已挂载 | 返回同一个 id;给出的字段覆盖,未给出的保持原值 |
|
|
1475
|
+
| 同 tick 内仍在待挂载 | patch 待挂载的 options,挂载后生效,不产生第二条 |
|
|
1476
|
+
| 已关闭或正在退场 | 新建一条;正在离场的那条自行走完退场动画 |
|
|
1477
|
+
|
|
1478
|
+
`duration` 只有显式传入才重启倒计时(悬停暂停期间是例外:只记新值不点火,指针离开后按新时长计满);`message`、`heading`、`type` 是普通属性,不碰计时。`toast.error` 的 5000 默认值在**创建时**兜底,不算显式传入,因此重复调用 `toast.error(msg, { id })` 不会重置倒计时。`position` 变化会把元素搬到新容器并保住剩余计时(支持 `moveBefore` 的引擎直接搬,其余走暂停/续跑降级);若倒计时在主线程被占用期间已经到期,降级路径会在续跑时直接退场,而不是让它一直挂着。`container` 与 `target` 以首次调用为准,不支持把已存在的 toast 换到另一个 overlay root。
|
|
1479
|
+
|
|
1480
|
+
**关闭语义** —— `toast.close(id)` 覆盖 toast 出现的每个阶段,包括「还没开始显示」的两种:
|
|
1481
|
+
|
|
1482
|
+
| 目标状态 | 结果 |
|
|
1483
|
+
| --------------------- | ---------------------------------------- |
|
|
1484
|
+
| 已显示 | 播放退场动画,结束后派发 `toast-close` |
|
|
1485
|
+
| 已挂载、`show()` 未跑 | 没有退场动画可播,立即派发 `toast-close` |
|
|
1486
|
+
| 同 tick 仍在待挂载 | 挂载前出队:不会出现,也不派发事件 |
|
|
1487
|
+
| 已在退场 | 空操作,由那条 toast 自己走完退场 |
|
|
1488
|
+
|
|
1489
|
+
`toast.clear()` 的口径相同:队列条目一并取消,已挂载的全部关闭。
|
|
1387
1490
|
|
|
1388
1491
|
**事件:** `toast-close` (`CustomEvent<{ id: string; reason: 'auto' | 'manual' | 'programmatic' | 'clear' }>`)
|
|
1389
1492
|
|
|
1390
|
-
悬停暂停自动关闭计时器(使用 `pointerenter`/`pointerleave
|
|
1493
|
+
悬停暂停自动关闭计时器(使用 `pointerenter`/`pointerleave`),指针离开后**续跑剩余时间**,而不是重新计满。暂停期间漏掉 `pointerleave`(指针拖出窗口、元素在悬停中被搬迁或摘出)时,由 document 级 `pointerover`/`pointerout`/`pointerleave` 兜底恢复,不会永久停在屏幕上。同一微任务中批量挂载 Toast。
|
|
1391
1494
|
|
|
1392
1495
|
**CSS 自定义属性:**
|
|
1393
1496
|
|