@greypan/web-ui 3.0.1 → 5.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 +495 -125
- package/README.md +504 -125
- package/dist/_virtual/{_@oxc-project_runtime@0.140.0 → _@oxc-project_runtime@0.146.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/toast-containers.js +1 -1
- package/dist/assets/toast-containers.js.map +1 -1
- package/dist/components/autocomplete/index.d.ts +12 -12
- package/dist/components/autocomplete/index.js +162 -111
- 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.d.ts +0 -1
- package/dist/components/avatar/index.js +8 -13
- package/dist/components/avatar/index.js.map +1 -1
- package/dist/components/back-top/index.js +2 -2
- package/dist/components/back-top/index.js.map +1 -1
- package/dist/components/back-top/style.js +1 -1
- package/dist/components/back-top/style.js.map +1 -1
- package/dist/components/badge/index.d.ts +1 -0
- package/dist/components/badge/index.js +12 -14
- package/dist/components/badge/index.js.map +1 -1
- package/dist/components/button/index.d.ts +2 -0
- package/dist/components/button/index.js +52 -38
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button/style.js +1 -1
- package/dist/components/button/style.js.map +1 -1
- package/dist/components/button-group/index.d.ts +1 -2
- package/dist/components/button-group/index.js +21 -23
- package/dist/components/button-group/index.js.map +1 -1
- package/dist/components/button-group/style.js +1 -1
- package/dist/components/button-group/style.js.map +1 -1
- package/dist/components/checkbox/index.d.ts +4 -7
- package/dist/components/checkbox/index.js +56 -38
- 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 +4 -10
- package/dist/components/checkbox-group/index.js +74 -60
- package/dist/components/checkbox-group/index.js.map +1 -1
- package/dist/components/collapse/index.d.ts +66 -0
- package/dist/components/collapse/index.js +159 -0
- package/dist/components/collapse/index.js.map +1 -0
- package/dist/components/collapse/style.js +6 -0
- package/dist/components/collapse/style.js.map +1 -0
- package/dist/components/context-menu/index.d.ts +29 -0
- package/dist/components/context-menu/index.js +168 -53
- 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 +34 -13
- 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 +45 -0
- package/dist/components/drawer/index.js +270 -56
- 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 +2 -0
- package/dist/components/dropdown/index.js +24 -14
- 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-header/style.js +1 -1
- package/dist/components/dropdown-header/style.js.map +1 -1
- package/dist/components/dropdown-item/index.js +3 -2
- package/dist/components/dropdown-item/index.js.map +1 -1
- package/dist/components/dropdown-item/style.js +1 -1
- package/dist/components/dropdown-item/style.js.map +1 -1
- package/dist/components/empty/index.d.ts +1 -0
- package/dist/components/empty/index.js +24 -22
- package/dist/components/empty/index.js.map +1 -1
- package/dist/components/empty/style.js +1 -1
- package/dist/components/empty/style.js.map +1 -1
- package/dist/components/icon/index.js +1 -1
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +21 -20
- package/dist/components/input/index.d.ts +2 -3
- package/dist/components/input/index.js +62 -52
- package/dist/components/input/index.js.map +1 -1
- package/dist/components/input/style.js +1 -1
- package/dist/components/input/style.js.map +1 -1
- package/dist/components/input-number/index.d.ts +2 -3
- package/dist/components/input-number/index.js +58 -38
- package/dist/components/input-number/index.js.map +1 -1
- package/dist/components/input-number/style.js +1 -1
- package/dist/components/input-number/style.js.map +1 -1
- package/dist/components/layout/index.d.ts +76 -3
- package/dist/components/layout/index.js +250 -39
- 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/option/style.js +1 -1
- package/dist/components/option/style.js.map +1 -1
- package/dist/components/popover/index.d.ts +2 -1
- package/dist/components/popover/index.js +14 -8
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/popover/style.js +1 -1
- package/dist/components/popover/style.js.map +1 -1
- package/dist/components/radio/index.d.ts +4 -7
- package/dist/components/radio/index.js +51 -37
- 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 +4 -10
- package/dist/components/radio-group/index.js +70 -52
- package/dist/components/radio-group/index.js.map +1 -1
- package/dist/components/segmented/index.d.ts +14 -12
- package/dist/components/segmented/index.js +132 -54
- package/dist/components/segmented/index.js.map +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.d.ts +1 -2
- package/dist/components/segmented-trigger/index.js +23 -21
- package/dist/components/segmented-trigger/index.js.map +1 -1
- package/dist/components/segmented-trigger/style.js +1 -1
- package/dist/components/segmented-trigger/style.js.map +1 -1
- package/dist/components/select/index.d.ts +13 -8
- package/dist/components/select/index.js +114 -75
- 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.d.ts +6 -7
- package/dist/components/slider/index.js +99 -64
- 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.d.ts +0 -2
- package/dist/components/spinner/index.js +14 -13
- 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.js +1 -1
- package/dist/components/switch/index.d.ts +13 -6
- package/dist/components/switch/index.js +102 -41
- 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.d.ts +5 -6
- package/dist/components/textarea/index.js +74 -67
- package/dist/components/textarea/index.js.map +1 -1
- package/dist/components/textarea/style.js +1 -1
- package/dist/components/textarea/style.js.map +1 -1
- package/dist/components/theme/index.js +1 -1
- package/dist/components/theme/style.js +1 -1
- package/dist/components/theme/style.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.js +12 -12
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/tooltip/index.js +3 -3
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/components/tooltip/style.js +1 -1
- package/dist/components/tooltip/style.js.map +1 -1
- package/dist/icons/generated/heroicons-arrow-down-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-arrow-up-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +10 -0
- package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -0
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +6 -0
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +10 -0
- package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -0
- package/dist/icons/generated/lucide-clapperboard.d.ts +6 -0
- package/dist/icons/generated/lucide-clapperboard.js +10 -0
- package/dist/icons/generated/lucide-clapperboard.js.map +1 -0
- package/dist/icons/generated/lucide-code.d.ts +6 -0
- package/dist/icons/generated/lucide-code.js +10 -0
- package/dist/icons/generated/lucide-code.js.map +1 -0
- package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +6 -0
- package/dist/icons/generated/lucide-ellipsis-vertical.js +10 -0
- package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -0
- package/dist/icons/generated/lucide-eye.d.ts +6 -0
- package/dist/icons/generated/lucide-eye.js +10 -0
- package/dist/icons/generated/lucide-eye.js.map +1 -0
- package/dist/icons/generated/lucide-headphones.d.ts +6 -0
- package/dist/icons/generated/lucide-headphones.js +10 -0
- package/dist/icons/generated/lucide-headphones.js.map +1 -0
- package/dist/icons/generated/lucide-link.d.ts +6 -0
- package/dist/icons/generated/lucide-link.js +10 -0
- package/dist/icons/generated/lucide-link.js.map +1 -0
- package/dist/icons/generated/lucide-list-filter.d.ts +6 -0
- package/dist/icons/generated/lucide-list-filter.js +10 -0
- package/dist/icons/generated/lucide-list-filter.js.map +1 -0
- package/dist/icons/generated/lucide-list-restart.d.ts +6 -0
- package/dist/icons/generated/lucide-list-restart.js +10 -0
- package/dist/icons/generated/lucide-list-restart.js.map +1 -0
- package/dist/icons/generated/lucide-pen-line.d.ts +6 -0
- package/dist/icons/generated/lucide-pen-line.js +10 -0
- package/dist/icons/generated/lucide-pen-line.js.map +1 -0
- package/dist/icons/generated/lucide-play.d.ts +6 -0
- package/dist/icons/generated/lucide-play.js +10 -0
- package/dist/icons/generated/lucide-play.js.map +1 -0
- package/dist/icons/generated/lucide-sliders-horizontal.d.ts +6 -0
- package/dist/icons/generated/lucide-sliders-horizontal.js +10 -0
- package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -0
- package/dist/icons/generated/lucide-tag.d.ts +6 -0
- package/dist/icons/generated/lucide-tag.js +10 -0
- package/dist/icons/generated/lucide-tag.js.map +1 -0
- package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +6 -0
- package/dist/icons/generated/tabler-sort-ascending-letters.js +10 -0
- package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -0
- package/dist/icons/index.d.ts +15 -0
- package/dist/icons/index.js +18 -3
- package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +1 -3
- package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -1
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +2 -1
- package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -1
- package/dist/shared/events/user-change.js.map +1 -1
- package/dist/shared/form-association/index.js +41 -0
- package/dist/shared/form-association/index.js.map +1 -0
- package/dist/shared/gesture/drag-gesture.js +133 -0
- package/dist/shared/gesture/drag-gesture.js.map +1 -0
- package/dist/shared/gesture/physics.js +45 -0
- package/dist/shared/gesture/physics.js.map +1 -0
- package/dist/shared/group-management/index.js +111 -0
- package/dist/shared/group-management/index.js.map +1 -0
- package/dist/shared/menu-portal/menu-portal.js +22 -10
- package/dist/shared/menu-portal/menu-portal.js.map +1 -1
- package/dist/shared/menu-portal/menu-tree.js +22 -7
- package/dist/shared/menu-portal/menu-tree.js.map +1 -1
- package/dist/shared/option-portal/index.js +65 -0
- package/dist/shared/option-portal/index.js.map +1 -0
- package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
- package/dist/shared/overlay/nested-drawer-layers.js +55 -0
- package/dist/shared/overlay/nested-drawer-layers.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 +47 -13
- package/dist/shared/overlay/portal.js.map +1 -1
- package/dist/shared/overlay/presence.js.map +1 -1
- package/dist/shared/visible-area/index.js +69 -0
- package/dist/shared/visible-area/index.js.map +1 -0
- package/package.json +8 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e from "../../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
|
|
2
2
|
import t from "../../assets/glass.js";
|
|
3
3
|
import { defineScrollLockLease as n } from "../../shared/scroll-lock/scroll-lock.js";
|
|
4
4
|
import "../button/index.js";
|
|
@@ -10,14 +10,20 @@ import { customElement as l, property as u, state as d } from "lit/decorators.js
|
|
|
10
10
|
//#region src/components/dialog/index.ts
|
|
11
11
|
var f = class extends o {
|
|
12
12
|
constructor(...e) {
|
|
13
|
-
super(...e), this.open = !1, this.noScrollLock = !1, this.noBackdropClose = !1, this.noEscapeClose = !1, this._hasBody = !1, this._userOpenChange = new r(), this._scrollLock = n().make(), this._presence = i().make({
|
|
13
|
+
super(...e), this.open = !1, this.noScrollLock = !1, this.noBackdropClose = !1, this.noEscapeClose = !1, this.controlled = !1, this._hasBody = !1, this._userOpenChange = new r(), this._scrollLock = n().make(), this._presence = i().make({
|
|
14
14
|
getDialog: () => this.dialog,
|
|
15
15
|
isConnected: () => this.isConnected,
|
|
16
16
|
isOpen: () => this.open
|
|
17
17
|
}), this._onTransitionEnd = (e) => {
|
|
18
18
|
this._presence.handleTransitionEnd(e);
|
|
19
19
|
}, this._onNativeClose = () => {
|
|
20
|
-
|
|
20
|
+
if (this.open) {
|
|
21
|
+
if (this.controlled) {
|
|
22
|
+
this._presence.sync(!0), this.emitOpenChange(!1);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this._presence.handleNativeClose(), this._userOpenChange.mark(), this.open = !1;
|
|
26
|
+
}
|
|
21
27
|
};
|
|
22
28
|
}
|
|
23
29
|
static {
|
|
@@ -39,14 +45,26 @@ var f = class extends o {
|
|
|
39
45
|
this.open = !1;
|
|
40
46
|
}
|
|
41
47
|
handleCancel(e) {
|
|
42
|
-
e.
|
|
48
|
+
if (e.target === e.currentTarget && (e.preventDefault(), !this.noEscapeClose)) {
|
|
49
|
+
if (this.controlled) {
|
|
50
|
+
this.emitOpenChange(!1);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this._userOpenChange.mark(), this.close();
|
|
54
|
+
}
|
|
43
55
|
}
|
|
44
56
|
handleBackdropClick(e) {
|
|
45
|
-
e.target === e.currentTarget &&
|
|
57
|
+
if (e.target === e.currentTarget && !this.noBackdropClose) {
|
|
58
|
+
if (this.controlled) {
|
|
59
|
+
this.emitOpenChange(!1);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this._userOpenChange.mark(), this.close();
|
|
63
|
+
}
|
|
46
64
|
}
|
|
47
|
-
emitOpenChange() {
|
|
65
|
+
emitOpenChange(e = this.open) {
|
|
48
66
|
this.dispatchEvent(new CustomEvent("open-change", {
|
|
49
|
-
detail: { open:
|
|
67
|
+
detail: { open: e },
|
|
50
68
|
bubbles: !0,
|
|
51
69
|
composed: !0
|
|
52
70
|
}));
|
|
@@ -67,11 +85,11 @@ var f = class extends o {
|
|
|
67
85
|
>
|
|
68
86
|
<div class="wui-dialog-body wui-glass">
|
|
69
87
|
${this._hasBody ? s`<slot name="body" @slotchange=${this._onBodySlotChange}></slot>` : s`
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
88
|
+
<slot name="body" @slotchange=${this._onBodySlotChange} hidden></slot>
|
|
89
|
+
<div class="title"><slot name="title"></slot></div>
|
|
90
|
+
<div class="desc"><slot></slot></div>
|
|
91
|
+
<div class="wui-dialog-footer"><slot name="footer"></slot></div>
|
|
92
|
+
`}
|
|
75
93
|
</div>
|
|
76
94
|
</dialog>
|
|
77
95
|
`;
|
|
@@ -92,7 +110,10 @@ e([u({
|
|
|
92
110
|
type: Boolean,
|
|
93
111
|
reflect: !0,
|
|
94
112
|
attribute: "no-escape-close"
|
|
95
|
-
})], f.prototype, "noEscapeClose", void 0), e([
|
|
113
|
+
})], f.prototype, "noEscapeClose", void 0), e([u({
|
|
114
|
+
type: Boolean,
|
|
115
|
+
reflect: !0
|
|
116
|
+
})], f.prototype, "controlled", void 0), e([d()], f.prototype, "_hasBody", void 0), f = e([l("web-ui-dialog")], f);
|
|
96
117
|
//#endregion
|
|
97
118
|
export { f as WebUiDialog };
|
|
98
119
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dialog/index.ts"],"sourcesContent":["import { html, LitElement, type PropertyValues, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/button'\nimport glass from '@/assets/glass.css?inline'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { defineNativeDialogPresence } from '@/shared/overlay/native-dialog-presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-dialog')\nexport class WebUiDialog extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n @property({ type: Boolean, reflect: true, attribute: 'no-backdrop-close' }) noBackdropClose = false\n @property({ type: Boolean, reflect: true, attribute: 'no-escape-close' }) noEscapeClose = false\n\n @state() private _hasBody = false\n private readonly _userOpenChange = new UserChangeController()\n\n private readonly _scrollLock = defineScrollLockLease().make()\n private readonly _presence = defineNativeDialogPresence().make({\n getDialog: () => this.dialog,\n isConnected: () => this.isConnected,\n isOpen: () => this.open\n })\n\n private get dialog() {\n return this.shadowRoot?.querySelector('dialog') ?? null\n }\n\n protected override updated(props: PropertyValues) {\n super.updated(props)\n if (!this.isConnected) return\n\n if (props.has('open')) {\n if (this._userOpenChange.consume()) this.emitOpenChange()\n this._presence.sync(this.open)\n }\n if (props.has('open') || props.has('noScrollLock')) this._syncScrollLock()\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._presence.dispose()\n this._scrollLock.release()\n }\n\n // 以模态方式打开对话框(命令式)\n showModal() {\n if (this.open) return\n this.open = true\n }\n\n close() {\n this.open = false\n }\n\n private handleCancel(e: Event) {\n // 保留 top layer 直到视觉退场完成,避免原生关闭跳过退出动画。\n e.preventDefault()\n if (this.noEscapeClose) return\n this._userOpenChange.mark()\n this.close()\n }\n\n private handleBackdropClick(e: MouseEvent) {\n if (e.target !== (e.currentTarget as HTMLDialogElement)) return\n if (this.noBackdropClose) return\n this._userOpenChange.mark()\n this.close()\n }\n\n private emitOpenChange() {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dialog/index.ts"],"sourcesContent":["import { html, LitElement, type PropertyValues, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/button'\nimport glass from '@/assets/glass.css?inline'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { defineNativeDialogPresence } from '@/shared/overlay/native-dialog-presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-dialog')\nexport class WebUiDialog extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n @property({ type: Boolean, reflect: true, attribute: 'no-backdrop-close' }) noBackdropClose = false\n @property({ type: Boolean, reflect: true, attribute: 'no-escape-close' }) noEscapeClose = false\n\n /**\n * Controlled 模式下,Escape 和遮罩点击只派发 `open-change` 请求,\n * 不会自行修改 `open`。Consumer 回写 `open` 后才执行关闭动画。\n * 程序化 API(showModal/close/直接赋值 open)不受此模式影响,始终直通。\n */\n @property({ type: Boolean, reflect: true }) controlled = false\n\n @state() private _hasBody = false\n private readonly _userOpenChange = new UserChangeController()\n\n private readonly _scrollLock = defineScrollLockLease().make()\n private readonly _presence = defineNativeDialogPresence().make({\n getDialog: () => this.dialog,\n isConnected: () => this.isConnected,\n isOpen: () => this.open\n })\n\n private get dialog() {\n return this.shadowRoot?.querySelector('dialog') ?? null\n }\n\n protected override updated(props: PropertyValues) {\n super.updated(props)\n if (!this.isConnected) return\n\n if (props.has('open')) {\n if (this._userOpenChange.consume()) this.emitOpenChange()\n this._presence.sync(this.open)\n }\n if (props.has('open') || props.has('noScrollLock')) this._syncScrollLock()\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._presence.dispose()\n this._scrollLock.release()\n }\n\n // 以模态方式打开对话框(命令式)\n showModal() {\n if (this.open) return\n this.open = true\n }\n\n close() {\n this.open = false\n }\n\n private handleCancel(e: Event) {\n // 子控件(例如 file input)可能派发冒泡的 cancel;只让 native dialog 自身的 cancel 关闭。\n if (e.target !== e.currentTarget) return\n\n // 保留 top layer 直到视觉退场完成,避免原生关闭跳过退出动画。\n e.preventDefault()\n if (this.noEscapeClose) return\n if (this.controlled) {\n this.emitOpenChange(false)\n return\n }\n this._userOpenChange.mark()\n this.close()\n }\n\n private handleBackdropClick(e: MouseEvent) {\n if (e.target !== (e.currentTarget as HTMLDialogElement)) return\n if (this.noBackdropClose) return\n if (this.controlled) {\n this.emitOpenChange(false)\n return\n }\n this._userOpenChange.mark()\n this.close()\n }\n\n // controlled 下派发关闭请求:detail 固定 false(用户只能请求关闭,打开永远由 Consumer 写)。\n private emitOpenChange(open = this.open) {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open },\n bubbles: true,\n composed: true\n })\n )\n }\n\n private _onTransitionEnd = (event: TransitionEvent) => {\n this._presence.handleTransitionEnd(event)\n }\n\n private _onNativeClose = () => {\n if (!this.open) return\n\n // controlled 下原生关闭(如表单 method=\"dialog\")视为未经 Consumer 批准的状态丢失:\n // 恢复受控状态并派发关闭请求,由 Consumer 决定是否关闭。\n if (this.controlled) {\n this._presence.sync(true)\n this.emitOpenChange(false)\n return\n }\n\n this._presence.handleNativeClose()\n this._userOpenChange.mark()\n this.open = false\n }\n\n private _syncScrollLock(isOpen = this.open) {\n this._scrollLock.sync(isOpen && !this.noScrollLock)\n }\n\n private _onBodySlotChange(e: Event) {\n if (!(e.target instanceof HTMLSlotElement)) return\n this._hasBody = e.target.assignedElements().length > 0\n }\n\n override render() {\n return html`\n <dialog\n @cancel=${this.handleCancel}\n @close=${this._onNativeClose}\n @click=${this.handleBackdropClick}\n @transitionend=${this._onTransitionEnd}\n >\n <div class=\"wui-dialog-body wui-glass\">\n ${\n this._hasBody\n ? html`<slot name=\"body\" @slotchange=${this._onBodySlotChange}></slot>`\n : html`\n <slot name=\"body\" @slotchange=${this._onBodySlotChange} hidden></slot>\n <div class=\"title\"><slot name=\"title\"></slot></div>\n <div class=\"desc\"><slot></slot></div>\n <div class=\"wui-dialog-footer\"><slot name=\"footer\"></slot></div>\n `\n }\n </div>\n </dialog>\n `\n }\n\n declare readonly $events: {\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-dialog': WebUiDialog\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/dialog/style.css?inline
|
|
2
|
-
var e = "*,:before,:after{box-sizing:border-box}:host{display:contents}dialog{transform:scale(var(--wui-scale-enter,.97));box-sizing:border-box;max-width:min(90vw, var(--wui-dialog-max-width,360px));max-height:90vh;color:var(--wui-color-text,#1b1b1b);opacity:0;transition:opacity var(--wui-duration-overlay-enter,.18s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1)), transform var(--wui-duration-overlay-enter,.18s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));background:0 0;border:none;padding:0;font-family:inherit;overflow:visible}dialog::backdrop{opacity:0;background:var(--wui-dialog-overlay-bg,var(--wui-color-backdrop,#0000001a));transition:opacity var(--wui-duration-overlay-enter,.18s) ease}dialog[open].is-visible{opacity:1;transform:scale(1)}dialog.is-closing{pointer-events:none;transition-duration:var(--wui-duration-overlay-exit,.14s)}dialog.is-closing::backdrop{transition-duration:var(--wui-duration-overlay-exit,.14s)}dialog[open].is-visible::backdrop{opacity:1}@media (prefers-reduced-motion:reduce){dialog,dialog[open].is-visible{transition-duration:var(--wui-duration-feedback,.1s);transform:none}}.wui-dialog-body{--wui-glass-shadow:var(--wui-shadow-overlay,2px 16px 40px #0006);background-color:var(--wui-color-surface-overlay,#f6f6f6e0);border-radius:32px;padding:
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{display:contents}dialog{transform:scale(var(--wui-scale-enter,.97));box-sizing:border-box;max-width:min(90vw, var(--wui-dialog-max-width,360px));max-height:90vh;color:var(--wui-color-text,#1b1b1b);opacity:0;transition:opacity var(--wui-duration-overlay-enter,.18s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1)), transform var(--wui-duration-overlay-enter,.18s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));background:0 0;border:none;padding:0;font-family:inherit;overflow:visible}dialog::backdrop{opacity:0;background:var(--wui-dialog-overlay-bg,var(--wui-color-backdrop,#0000001a));transition:opacity var(--wui-duration-overlay-enter,.18s) ease}dialog[open].is-visible{opacity:1;transform:scale(1)}dialog.is-closing{pointer-events:none;transition-duration:var(--wui-duration-overlay-exit,.14s)}dialog.is-closing::backdrop{transition-duration:var(--wui-duration-overlay-exit,.14s)}dialog[open].is-visible::backdrop{opacity:1}@media (prefers-reduced-motion:reduce){dialog,dialog[open].is-visible{transition-duration:var(--wui-duration-feedback,.1s);transform:none}}.wui-dialog-body{--wui-internal-glass-shadow:var(--wui-shadow-overlay,2px 16px 40px #0006);--wui-glass-corner-radius:32px;background-color:var(--wui-dialog-bg,var(--wui-color-surface-overlay,#f6f6f6e0));border-radius:32px;padding:20px 24px 24px}.title{color:var(--wui-color-text,#1b1b1b);margin:0 0 16px;padding:0;font-size:18px;font-weight:600;line-height:1.2}.desc{color:var(--wui-color-text,#1b1b1b);margin:0 0 24px;padding:0;font-size:14px;line-height:1.5}.wui-dialog-footer{flex-direction:column;gap:10px;display:flex}.wui-dialog-footer ::slotted(web-ui-button){width:100%;display:flex}:host([horizontal]) .wui-dialog-footer{flex-direction:row;justify-content:center;gap:12px}:host([horizontal]) .wui-dialog-footer ::slotted(web-ui-button:not([full])){width:auto}:host([horizontal]) .wui-dialog-footer ::slotted(web-ui-button[full]){flex:1;min-width:0}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dialog/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: contents;\n}\n\ndialog {\n transform: scale(var(--wui-scale-enter, 0.97));\n\n overflow: visible;\n\n box-sizing: border-box;\n max-width: min(90vw, var(--wui-dialog-max-width, 360px));\n max-height: 90vh;\n padding: 0;\n border: none;\n\n font-family: inherit;\n color: var(--wui-color-text, #1b1b1b);\n\n opacity: 0;\n background: transparent;\n\n transition:\n opacity var(--wui-duration-overlay-enter, 180ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1)),\n transform var(--wui-duration-overlay-enter, 180ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n\n &::backdrop {\n opacity: 0;\n background: var(--wui-dialog-overlay-bg, var(--wui-color-backdrop, rgb(0 0 0 / 0.1)));\n transition: opacity var(--wui-duration-overlay-enter, 180ms) ease;\n }\n}\n\ndialog[open].is-visible {\n transform: scale(1);\n opacity: 1;\n}\n\ndialog.is-closing {\n pointer-events: none;\n transition-duration: var(--wui-duration-overlay-exit, 140ms);\n}\n\ndialog.is-closing::backdrop {\n transition-duration: var(--wui-duration-overlay-exit, 140ms);\n}\n\ndialog[open].is-visible::backdrop {\n opacity: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n dialog,\n dialog[open].is-visible {\n transform: none;\n transition-duration: var(--wui-duration-feedback, 100ms);\n }\n}\n\n/* ===== 玻璃卡片主体(样式由 glass.css 提供) ===== */\n\n.wui-dialog-body {\n --wui-glass-shadow: var(--wui-shadow-overlay, 2px 16px 40px rgb(0 0 0 / 0.4));\n
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dialog/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: contents;\n}\n\ndialog {\n transform: scale(var(--wui-scale-enter, 0.97));\n\n overflow: visible;\n\n box-sizing: border-box;\n max-width: min(90vw, var(--wui-dialog-max-width, 360px));\n max-height: 90vh;\n padding: 0;\n border: none;\n\n font-family: inherit;\n color: var(--wui-color-text, #1b1b1b);\n\n opacity: 0;\n background: transparent;\n\n transition:\n opacity var(--wui-duration-overlay-enter, 180ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1)),\n transform var(--wui-duration-overlay-enter, 180ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n\n &::backdrop {\n opacity: 0;\n background: var(--wui-dialog-overlay-bg, var(--wui-color-backdrop, rgb(0 0 0 / 0.1)));\n transition: opacity var(--wui-duration-overlay-enter, 180ms) ease;\n }\n}\n\ndialog[open].is-visible {\n transform: scale(1);\n opacity: 1;\n}\n\ndialog.is-closing {\n pointer-events: none;\n transition-duration: var(--wui-duration-overlay-exit, 140ms);\n}\n\ndialog.is-closing::backdrop {\n transition-duration: var(--wui-duration-overlay-exit, 140ms);\n}\n\ndialog[open].is-visible::backdrop {\n opacity: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n dialog,\n dialog[open].is-visible {\n transform: none;\n transition-duration: var(--wui-duration-feedback, 100ms);\n }\n}\n\n/* ===== 玻璃卡片主体(样式由 glass.css 提供) ===== */\n\n.wui-dialog-body {\n --wui-internal-glass-shadow: var(--wui-shadow-overlay, 2px 16px 40px rgb(0 0 0 / 0.4));\n --wui-glass-corner-radius: 32px;\n padding: 20px 24px 24px;\n border-radius: 32px;\n background-color: var(--wui-dialog-bg, var(--wui-color-surface-overlay, rgb(246 246 246 / 0.88)));\n}\n\n/* ===== 标题 ===== */\n\n.title {\n margin: 0 0 16px;\n padding: 0;\n\n font-size: 18px;\n font-weight: 600;\n line-height: 1.2;\n color: var(--wui-color-text, #1b1b1b);\n}\n\n/* ===== 描述 ===== */\n\n.desc {\n margin: 0 0 24px;\n padding: 0;\n\n font-size: 14px;\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n}\n\n/* ===== 按钮区域 ===== */\n\n.wui-dialog-footer {\n display: flex;\n flex-direction: column;\n gap: 10px;\n\n /* ===== 按钮全宽(默认垂直排列) ===== */\n\n & ::slotted(web-ui-button) {\n display: flex;\n width: 100%;\n }\n}\n\n/* ===== horizontal 模式 ===== */\n\n:host([horizontal]) .wui-dialog-footer {\n flex-direction: row;\n gap: 12px;\n justify-content: center;\n\n /* 非 full 按钮:居中,不拉伸 */\n\n & ::slotted(web-ui-button:not([full])) {\n width: auto;\n }\n\n /* full 按钮:平分剩余空间 */\n\n & ::slotted(web-ui-button[full]) {\n flex: 1;\n min-width: 0;\n }\n}\n"],"mappings":""}
|
|
@@ -6,17 +6,62 @@ export declare class WebUiDrawer extends LitElement {
|
|
|
6
6
|
open: boolean;
|
|
7
7
|
noScrollLock: boolean;
|
|
8
8
|
noBackdropClose: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Controlled 模式下,Escape、遮罩、关闭按钮和拖拽关闭只派发 `open-change` 请求,
|
|
11
|
+
* 不会自行修改 `open`。Consumer 回写 `open` 后才执行关闭动画。
|
|
12
|
+
* 程序化 API(show/close/直接赋值 open)不受此模式影响,始终直通。
|
|
13
|
+
*/
|
|
14
|
+
controlled: boolean;
|
|
9
15
|
get placement(): DrawerPlacement;
|
|
10
16
|
set placement(v: string);
|
|
11
17
|
private _placement;
|
|
12
18
|
heading: string;
|
|
13
19
|
closable: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Headless 模式:只保留 overlay 基础设施(backdrop、动画、scroll lock、dialog 语义),
|
|
22
|
+
* 移除内置 UI(glass 样式、header、close 按钮、footer)。Consumer 自定义内容样式。
|
|
23
|
+
*/
|
|
24
|
+
headless: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 内部原生 dialog 的 accessible name。headless 模式必须由 Consumer 提供,
|
|
27
|
+
* 因为该模式不会渲染可自动关联的内置 header。
|
|
28
|
+
*/
|
|
29
|
+
dialogLabel: string;
|
|
30
|
+
/**
|
|
31
|
+
* 启用拖拽关闭:打开态在抽屉内缘渲染 drag bar(灰色胶囊 + 加宽热区),
|
|
32
|
+
* 指针拖拽实时跟手,松手按位移与甩动速度判定关闭或弹回。
|
|
33
|
+
* 关闭态基于原生 dialog 无可见渲染物,因此不支持从关闭态拖拽打开。
|
|
34
|
+
*/
|
|
35
|
+
draggable: boolean;
|
|
14
36
|
private get dialog();
|
|
15
37
|
private _hasHeaderSlot;
|
|
16
38
|
private _hasFooterSlot;
|
|
17
39
|
private readonly _userOpenChange;
|
|
18
40
|
private readonly _scrollLock;
|
|
19
41
|
private readonly _presence;
|
|
42
|
+
private readonly _nestedLayers;
|
|
43
|
+
private _dragGesture;
|
|
44
|
+
private _dragInitialOffset;
|
|
45
|
+
private _dragOffset;
|
|
46
|
+
private _dragAnimation;
|
|
47
|
+
private _dragAwaitWriteback;
|
|
48
|
+
private _dragRequestTimer;
|
|
49
|
+
private get _dragAxis();
|
|
50
|
+
private get _dragCloseSign();
|
|
51
|
+
private _measureDragSize;
|
|
52
|
+
private _readDrawerInset;
|
|
53
|
+
private _dragCloseDistance;
|
|
54
|
+
private _isReducedMotion;
|
|
55
|
+
private _isDragging;
|
|
56
|
+
private _cancelDragAwait;
|
|
57
|
+
private _handleDragPointerDown;
|
|
58
|
+
private _cancelActiveDrag;
|
|
59
|
+
private _applyDragOffset;
|
|
60
|
+
private _clearDragStyles;
|
|
61
|
+
private _springToClose;
|
|
62
|
+
private _springRebound;
|
|
63
|
+
private _closeFromDrag;
|
|
64
|
+
private readonly _handleDragWritebackTimeout;
|
|
20
65
|
connectedCallback(): void;
|
|
21
66
|
firstUpdated(): void;
|
|
22
67
|
disconnectedCallback(): void;
|
|
@@ -1,44 +1,211 @@
|
|
|
1
|
-
import e from "../../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
|
|
2
2
|
import "../icon/index.js";
|
|
3
3
|
import t from "../../icons/generated/ooui-close.js";
|
|
4
4
|
import n from "../../assets/glass.js";
|
|
5
5
|
import { normalizeLiteral as r } from "../../shared/normalize/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { findNearestTheme as i } from "../../shared/theme/theme-scope.js";
|
|
7
|
+
import { defineScrollLockLease as a } from "../../shared/scroll-lock/scroll-lock.js";
|
|
7
8
|
import "../button/index.js";
|
|
8
|
-
import { UserChangeController as
|
|
9
|
-
import { defineNativeDialogPresence as
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
9
|
+
import { UserChangeController as o } from "../../shared/events/user-change.js";
|
|
10
|
+
import { defineNativeDialogPresence as s } from "../../shared/overlay/native-dialog-presence.js";
|
|
11
|
+
import { attachDragGesture as c } from "../../shared/gesture/drag-gesture.js";
|
|
12
|
+
import { SPRING_PRESETS as l, rubberband as u, springOffsets as d } from "../../shared/gesture/physics.js";
|
|
13
|
+
import { defineNestedDrawerLayers as f } from "../../shared/overlay/nested-drawer-layers.js";
|
|
14
|
+
import p from "./style.js";
|
|
15
|
+
import { LitElement as m, html as h, nothing as g, unsafeCSS as _ } from "lit";
|
|
16
|
+
import { customElement as v, property as y } from "lit/decorators.js";
|
|
13
17
|
//#region src/components/drawer/index.ts
|
|
14
|
-
var
|
|
18
|
+
var b = [
|
|
15
19
|
"right",
|
|
16
20
|
"left",
|
|
17
21
|
"top",
|
|
18
22
|
"bottom"
|
|
19
|
-
],
|
|
23
|
+
], x = 1 / 3, S = 500, C = 120, w = 16;
|
|
24
|
+
if (typeof CSS < "u" && "registerProperty" in CSS) {
|
|
25
|
+
try {
|
|
26
|
+
CSS.registerProperty({
|
|
27
|
+
name: "--wui-internal-drag-backdrop-opacity",
|
|
28
|
+
syntax: "<number>",
|
|
29
|
+
inherits: !0,
|
|
30
|
+
initialValue: "1"
|
|
31
|
+
});
|
|
32
|
+
} catch {}
|
|
33
|
+
try {
|
|
34
|
+
CSS.registerProperty({
|
|
35
|
+
name: "--wui-drawer-inset",
|
|
36
|
+
syntax: "<length>",
|
|
37
|
+
inherits: !0,
|
|
38
|
+
initialValue: "8px"
|
|
39
|
+
});
|
|
40
|
+
} catch {}
|
|
41
|
+
}
|
|
42
|
+
var T = class extends m {
|
|
20
43
|
constructor(...e) {
|
|
21
|
-
super(...e), this.open = !1, this.noScrollLock = !1, this.noBackdropClose = !1, this._placement = "right", this.heading = "", this.closable = !1, this._hasHeaderSlot = !1, this._hasFooterSlot = !1, this._userOpenChange = new
|
|
44
|
+
super(...e), this.open = !1, this.noScrollLock = !1, this.noBackdropClose = !1, this.controlled = !1, this._placement = "right", this.heading = "", this.closable = !1, this.headless = !1, this.dialogLabel = "", this.draggable = !1, this._hasHeaderSlot = !1, this._hasFooterSlot = !1, this._userOpenChange = new o(), this._scrollLock = a().make(), this._presence = s().make({
|
|
22
45
|
getDialog: () => this.dialog,
|
|
23
46
|
isConnected: () => this.isConnected,
|
|
24
47
|
isOpen: () => this.open
|
|
25
|
-
}), this.
|
|
26
|
-
|
|
48
|
+
}), this._nestedLayers = f().make({
|
|
49
|
+
getDialog: () => this.dialog,
|
|
50
|
+
getPlacement: () => this._placement
|
|
51
|
+
}), this._dragGesture = null, this._dragInitialOffset = 0, this._dragOffset = 0, this._dragAnimation = null, this._dragAwaitWriteback = !1, this._handleDragWritebackTimeout = () => {
|
|
52
|
+
if (this._dragRequestTimer = void 0, !this._dragAwaitWriteback || !this.open || this._isDragging()) {
|
|
53
|
+
this._dragAwaitWriteback = !1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this._dragAwaitWriteback = !1;
|
|
57
|
+
let e = this.dialog;
|
|
58
|
+
e && (e.classList.add("is-visible"), this._springRebound(e, 0, this._dragCloseDistance(e)));
|
|
59
|
+
}, this._closeFromUser = () => {
|
|
60
|
+
if (this.open && !this._dragAwaitWriteback) {
|
|
61
|
+
if (this.controlled) {
|
|
62
|
+
this.emitOpenChange(!1);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this._userOpenChange.mark(), this.close();
|
|
66
|
+
}
|
|
27
67
|
};
|
|
28
68
|
}
|
|
29
69
|
static {
|
|
30
|
-
this.styles = [
|
|
70
|
+
this.styles = [_(n), _(p)];
|
|
31
71
|
}
|
|
32
72
|
get placement() {
|
|
33
73
|
return this._placement;
|
|
34
74
|
}
|
|
35
75
|
set placement(e) {
|
|
36
76
|
let t = this._placement;
|
|
37
|
-
this._placement = r(e,
|
|
77
|
+
this._placement = r(e, b, "right"), this.requestUpdate("placement", t);
|
|
38
78
|
}
|
|
39
79
|
get dialog() {
|
|
40
80
|
return this.shadowRoot?.querySelector("dialog") ?? null;
|
|
41
81
|
}
|
|
82
|
+
get _dragAxis() {
|
|
83
|
+
return this._placement === "left" || this._placement === "right" ? "x" : "y";
|
|
84
|
+
}
|
|
85
|
+
get _dragCloseSign() {
|
|
86
|
+
switch (this._placement) {
|
|
87
|
+
case "right": return 1;
|
|
88
|
+
case "left": return -1;
|
|
89
|
+
case "top": return -1;
|
|
90
|
+
case "bottom": return 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
_measureDragSize() {
|
|
94
|
+
let e = this.dialog;
|
|
95
|
+
return e ? this._dragAxis === "x" ? e.offsetWidth : e.offsetHeight : 0;
|
|
96
|
+
}
|
|
97
|
+
_readDrawerInset(e) {
|
|
98
|
+
let t = getComputedStyle(e).getPropertyValue("--wui-internal-drawer-inset"), n = Number.parseFloat(t);
|
|
99
|
+
return Number.isFinite(n) ? n : 0;
|
|
100
|
+
}
|
|
101
|
+
_dragCloseDistance(e) {
|
|
102
|
+
return this._measureDragSize() + this._readDrawerInset(e);
|
|
103
|
+
}
|
|
104
|
+
_isReducedMotion() {
|
|
105
|
+
let e = i(this);
|
|
106
|
+
if (e) return e.isReducedMotion();
|
|
107
|
+
try {
|
|
108
|
+
return typeof window.matchMedia == "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
109
|
+
} catch {
|
|
110
|
+
return !1;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
_isDragging() {
|
|
114
|
+
return this._dragGesture?.isDragging() ?? !1;
|
|
115
|
+
}
|
|
116
|
+
_cancelDragAwait() {
|
|
117
|
+
this._dragRequestTimer !== void 0 && (clearTimeout(this._dragRequestTimer), this._dragRequestTimer = void 0), this._dragAwaitWriteback = !1;
|
|
118
|
+
}
|
|
119
|
+
_handleDragPointerDown(e) {
|
|
120
|
+
if (!this.open || !this.draggable || this._isDragging() || e.isPrimary === !1) return;
|
|
121
|
+
let t = this.dialog;
|
|
122
|
+
if (!t || !t.classList.contains("is-visible")) return;
|
|
123
|
+
let n = getComputedStyle(t).transform, r = n && n !== "none" && typeof DOMMatrixReadOnly == "function" ? new DOMMatrixReadOnly(n)[this._dragAxis === "x" ? "m41" : "m42"] : 0;
|
|
124
|
+
this._dragAnimation?.cancel(), this._dragAnimation = null, this._cancelDragAwait(), this._dragInitialOffset = r * this._dragCloseSign, this._dragOffset = this._dragInitialOffset, t.classList.add("is-dragging"), this._dragGesture = c(e, {
|
|
125
|
+
axis: this._dragAxis,
|
|
126
|
+
onMove: (e) => {
|
|
127
|
+
let n = this._dragAxis === "x" ? e.deltaX : e.deltaY, r = this._dragInitialOffset + n * this._dragCloseSign;
|
|
128
|
+
this._dragOffset = u(r, this._measureDragSize() * .1, .15);
|
|
129
|
+
let i = this._measureDragSize();
|
|
130
|
+
t.classList.toggle("is-drag-close", i > 0 && this._dragOffset > i * x), this._applyDragOffset(t, this._dragOffset);
|
|
131
|
+
},
|
|
132
|
+
onEnd: (e) => {
|
|
133
|
+
this._dragGesture = null, t.classList.remove("is-dragging", "is-drag-close");
|
|
134
|
+
let n = this._measureDragSize(), r = (this._dragAxis === "x" ? e.velocityX : e.velocityY) * this._dragCloseSign;
|
|
135
|
+
this._dragOffset > n * x || this._dragOffset > 8 && r > S ? this._springToClose(t, r) : this._springRebound(t, r, this._dragOffset);
|
|
136
|
+
},
|
|
137
|
+
onCancel: () => {
|
|
138
|
+
this._dragGesture = null, t.classList.remove("is-dragging", "is-drag-close"), this._springRebound(t, 0, this._dragOffset);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
_cancelActiveDrag() {
|
|
143
|
+
if (!this._isDragging()) return;
|
|
144
|
+
this._dragGesture?.destroy(), this._dragGesture = null;
|
|
145
|
+
let e = this.dialog;
|
|
146
|
+
e && (e.classList.remove("is-dragging", "is-drag-close"), this._clearDragStyles(e));
|
|
147
|
+
}
|
|
148
|
+
_applyDragOffset(e, t) {
|
|
149
|
+
let n = t * this._dragCloseSign;
|
|
150
|
+
e.style.transform = this._dragAxis === "x" ? `translateX(${n}px)` : `translateY(${n}px)`;
|
|
151
|
+
let r = this._measureDragSize(), i = r > 0 ? Math.min(1, Math.max(0, t / r)) : 0;
|
|
152
|
+
e.style.setProperty("--wui-internal-drag-backdrop-opacity", String(1 - i));
|
|
153
|
+
}
|
|
154
|
+
_clearDragStyles(e) {
|
|
155
|
+
e.style.removeProperty("transform"), e.style.removeProperty("--wui-internal-drag-backdrop-opacity");
|
|
156
|
+
}
|
|
157
|
+
_springToClose(e, t) {
|
|
158
|
+
let n = this._dragOffset;
|
|
159
|
+
this._dragOffset = 0;
|
|
160
|
+
let r = this._dragCloseSign, i = this._dragCloseDistance(e), a = this._measureDragSize(), o = () => {
|
|
161
|
+
if (this.controlled) {
|
|
162
|
+
let t = i;
|
|
163
|
+
e.style.transform = this._dragAxis === "x" ? `translateX(${t * r}px)` : `translateY(${t * r}px)`, e.style.setProperty("--wui-internal-drag-backdrop-opacity", "0");
|
|
164
|
+
} else e.classList.remove("is-visible"), this._clearDragStyles(e);
|
|
165
|
+
this._closeFromDrag();
|
|
166
|
+
};
|
|
167
|
+
if (this._isReducedMotion() || typeof e.animate != "function") {
|
|
168
|
+
o();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
let s = d(n, i, t, l.close), c = s.map((e) => ({
|
|
172
|
+
transform: this._dragAxis === "x" ? `translateX(${e * r}px)` : `translateY(${e * r}px)`,
|
|
173
|
+
"--wui-internal-drag-backdrop-opacity": String(Math.max(0, 1 - e / a))
|
|
174
|
+
})), u = (s.length - 1) * w, f = e.animate(c, {
|
|
175
|
+
duration: u,
|
|
176
|
+
easing: "linear",
|
|
177
|
+
fill: "both"
|
|
178
|
+
});
|
|
179
|
+
f.onfinish = () => {
|
|
180
|
+
f.cancel(), o();
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
_springRebound(e, t, n) {
|
|
184
|
+
this._dragOffset = 0;
|
|
185
|
+
let r = () => {
|
|
186
|
+
this._dragAnimation = null, e.classList.remove("is-dragging"), this._clearDragStyles(e);
|
|
187
|
+
};
|
|
188
|
+
if (this._isReducedMotion() || typeof e.animate != "function" || Math.abs(n) < 1) {
|
|
189
|
+
r();
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
let i = this._dragCloseSign, a = this._measureDragSize(), o = d(n, 0, t, l.rebound), s = o.map((e) => ({
|
|
193
|
+
transform: this._dragAxis === "x" ? `translateX(${e * i}px)` : `translateY(${e * i}px)`,
|
|
194
|
+
"--wui-internal-drag-backdrop-opacity": String(Math.max(0, 1 - e / a))
|
|
195
|
+
}));
|
|
196
|
+
e.classList.add("is-dragging");
|
|
197
|
+
let c = (o.length - 1) * w, u = e.animate(s, {
|
|
198
|
+
duration: c,
|
|
199
|
+
easing: "linear",
|
|
200
|
+
fill: "both"
|
|
201
|
+
});
|
|
202
|
+
u.onfinish = () => {
|
|
203
|
+
u.cancel(), r();
|
|
204
|
+
}, this._dragAnimation = u;
|
|
205
|
+
}
|
|
206
|
+
_closeFromDrag() {
|
|
207
|
+
this._closeFromUser(), this.controlled && (this._dragAwaitWriteback = !0, this._dragRequestTimer = setTimeout(this._handleDragWritebackTimeout, C));
|
|
208
|
+
}
|
|
42
209
|
connectedCallback() {
|
|
43
210
|
super.connectedCallback(), this._hasHeaderSlot = Array.from(this.children).some((e) => e.getAttribute?.("slot") === "header"), this._hasFooterSlot = Array.from(this.children).some((e) => e.getAttribute?.("slot") === "footer");
|
|
44
211
|
}
|
|
@@ -46,7 +213,7 @@ var m = [
|
|
|
46
213
|
this._checkSlotContent("footer");
|
|
47
214
|
}
|
|
48
215
|
disconnectedCallback() {
|
|
49
|
-
super.disconnectedCallback(), this._presence.dispose(), this._scrollLock.release();
|
|
216
|
+
super.disconnectedCallback(), this._nestedLayers.dispose(), this._dragGesture?.destroy(), this._dragGesture = null, this._presence.dispose(), this._scrollLock.release(), this._dragAnimation?.cancel(), this._dragAnimation = null, this._cancelDragAwait();
|
|
50
217
|
}
|
|
51
218
|
_checkSlotContent(e) {
|
|
52
219
|
let t = this.shadowRoot?.querySelector(`slot[name="${e}"]`);
|
|
@@ -63,13 +230,31 @@ var m = [
|
|
|
63
230
|
t !== this._hasFooterSlot && (this._hasFooterSlot = t, this.requestUpdate());
|
|
64
231
|
}
|
|
65
232
|
updated(e) {
|
|
66
|
-
super.updated(e), this.isConnected
|
|
233
|
+
if (super.updated(e), this.isConnected) {
|
|
234
|
+
if (e.has("open")) {
|
|
235
|
+
if (this._isDragging() && !this.open && this._cancelActiveDrag(), this._userOpenChange.consume() && this.emitOpenChange(), this._dragAwaitWriteback) {
|
|
236
|
+
this._cancelDragAwait();
|
|
237
|
+
let e = this.dialog;
|
|
238
|
+
e && !this.open ? (e.classList.remove("is-visible"), this._clearDragStyles(e)) : e && this.open && this._springRebound(e, 0, this._dragCloseDistance(e));
|
|
239
|
+
}
|
|
240
|
+
this._presence.sync(this.open), this.open ? this._nestedLayers.register() : this._nestedLayers.unregister();
|
|
241
|
+
}
|
|
242
|
+
(e.has("open") || e.has("noScrollLock")) && this._syncScrollLock();
|
|
243
|
+
}
|
|
67
244
|
}
|
|
68
245
|
handleTransitionEnd(e) {
|
|
69
246
|
this._presence.handleTransitionEnd(e);
|
|
70
247
|
}
|
|
71
248
|
handleKeydown(e) {
|
|
72
|
-
e.key
|
|
249
|
+
if (e.key !== "Escape") return;
|
|
250
|
+
let t = e.composedPath(), n = t.indexOf(e.currentTarget);
|
|
251
|
+
if (!(n > 0 && t.slice(0, n).some((e) => e instanceof HTMLDialogElement))) {
|
|
252
|
+
if (this._isDragging()) {
|
|
253
|
+
e.preventDefault();
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
e.preventDefault(), this._closeFromUser();
|
|
257
|
+
}
|
|
73
258
|
}
|
|
74
259
|
show() {
|
|
75
260
|
this.open ||= !0;
|
|
@@ -81,14 +266,24 @@ var m = [
|
|
|
81
266
|
e.preventDefault(), this._closeFromUser();
|
|
82
267
|
}
|
|
83
268
|
handleNativeClose() {
|
|
84
|
-
|
|
269
|
+
if (this.open) {
|
|
270
|
+
if (this._dragAwaitWriteback) {
|
|
271
|
+
this._cancelDragAwait();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (this.controlled) {
|
|
275
|
+
this._presence.sync(!0), this.emitOpenChange(!1);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
this._presence.handleNativeClose(), this._userOpenChange.mark(), this.open = !1;
|
|
279
|
+
}
|
|
85
280
|
}
|
|
86
281
|
handleBackdropClick(e) {
|
|
87
|
-
e.target === e.currentTarget && (this.noBackdropClose || this._closeFromUser());
|
|
282
|
+
e.target === e.currentTarget && (this.noBackdropClose || this._isDragging() || this._closeFromUser());
|
|
88
283
|
}
|
|
89
|
-
emitOpenChange() {
|
|
284
|
+
emitOpenChange(e = this.open) {
|
|
90
285
|
this.dispatchEvent(new CustomEvent("open-change", {
|
|
91
|
-
detail: { open:
|
|
286
|
+
detail: { open: e },
|
|
92
287
|
bubbles: !0,
|
|
93
288
|
composed: !0
|
|
94
289
|
}));
|
|
@@ -97,65 +292,84 @@ var m = [
|
|
|
97
292
|
this._scrollLock.sync(e && !this.noScrollLock);
|
|
98
293
|
}
|
|
99
294
|
render() {
|
|
100
|
-
let e = this._hasHeaderSlot || !!this.heading
|
|
101
|
-
|
|
295
|
+
let e = this._hasHeaderSlot || !!this.heading, n = this.dialogLabel.trim(), r = !n && !this.headless && e ? "wui-drawer-heading" : g, i = this.draggable ? h`
|
|
296
|
+
<div class="wui-drawer-drag-zone" @pointerdown=${this._handleDragPointerDown}>
|
|
297
|
+
<div class="wui-drawer-drag-bar"></div>
|
|
298
|
+
</div>
|
|
299
|
+
` : g;
|
|
300
|
+
return h`
|
|
102
301
|
<dialog
|
|
302
|
+
aria-label=${n || g}
|
|
303
|
+
aria-labelledby=${r}
|
|
103
304
|
@cancel=${this.handleCancel}
|
|
104
305
|
@close=${this.handleNativeClose}
|
|
105
306
|
@click=${this.handleBackdropClick}
|
|
106
307
|
@keydown=${this.handleKeydown}
|
|
107
308
|
@transitionend=${this.handleTransitionEnd}
|
|
108
309
|
>
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
310
|
+
${this.headless ? h`<slot></slot>${i}` : h`
|
|
311
|
+
<div class="wui-drawer-body wui-glass">
|
|
312
|
+
<div class="wui-drawer-header" id="wui-drawer-heading" ?hidden=${!e}>
|
|
313
|
+
<slot name="header" @slotchange=${this.handleHeaderSlotChange}>
|
|
314
|
+
${this.heading ? h`<span class="wui-drawer-heading">${this.heading}</span>` : g}
|
|
315
|
+
</slot>
|
|
316
|
+
</div>
|
|
317
|
+
<div class="wui-drawer-content">
|
|
318
|
+
<slot></slot>
|
|
319
|
+
</div>
|
|
320
|
+
<div class="wui-drawer-footer" ?hidden=${!this._hasFooterSlot}>
|
|
321
|
+
<slot name="footer" @slotchange=${this.handleFooterSlotChange}></slot>
|
|
322
|
+
</div>
|
|
115
323
|
</div>
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
icon
|
|
131
|
-
size="26"
|
|
132
|
-
>
|
|
133
|
-
<web-ui-icon .icon=${t} size="16"></web-ui-icon>
|
|
134
|
-
</web-ui-button>
|
|
135
|
-
` : u}
|
|
324
|
+
${this.closable ? h`
|
|
325
|
+
<web-ui-button
|
|
326
|
+
class="wui-drawer-close"
|
|
327
|
+
@click=${this._closeFromUser}
|
|
328
|
+
aria-label="关闭"
|
|
329
|
+
variant="secondary"
|
|
330
|
+
icon
|
|
331
|
+
size="26"
|
|
332
|
+
>
|
|
333
|
+
<web-ui-icon size="14" .icon=${t}></web-ui-icon>
|
|
334
|
+
</web-ui-button>
|
|
335
|
+
` : g}
|
|
336
|
+
${i}
|
|
337
|
+
`}
|
|
136
338
|
</dialog>
|
|
137
339
|
`;
|
|
138
340
|
}
|
|
139
341
|
};
|
|
140
|
-
e([
|
|
342
|
+
e([y({
|
|
141
343
|
type: Boolean,
|
|
142
344
|
reflect: !0
|
|
143
|
-
})],
|
|
345
|
+
})], T.prototype, "open", void 0), e([y({
|
|
144
346
|
type: Boolean,
|
|
145
347
|
reflect: !0,
|
|
146
348
|
attribute: "no-scroll-lock"
|
|
147
|
-
})],
|
|
349
|
+
})], T.prototype, "noScrollLock", void 0), e([y({
|
|
148
350
|
type: Boolean,
|
|
149
351
|
reflect: !0,
|
|
150
352
|
attribute: "no-backdrop-close"
|
|
151
|
-
})],
|
|
353
|
+
})], T.prototype, "noBackdropClose", void 0), e([y({
|
|
354
|
+
type: Boolean,
|
|
355
|
+
reflect: !0
|
|
356
|
+
})], T.prototype, "controlled", void 0), e([y({
|
|
152
357
|
type: String,
|
|
153
358
|
reflect: !0
|
|
154
|
-
})],
|
|
359
|
+
})], T.prototype, "placement", null), e([y({ type: String })], T.prototype, "heading", void 0), e([y({
|
|
360
|
+
type: Boolean,
|
|
361
|
+
reflect: !0
|
|
362
|
+
})], T.prototype, "closable", void 0), e([y({
|
|
363
|
+
type: Boolean,
|
|
364
|
+
reflect: !0
|
|
365
|
+
})], T.prototype, "headless", void 0), e([y({
|
|
366
|
+
type: String,
|
|
367
|
+
attribute: "dialog-label"
|
|
368
|
+
})], T.prototype, "dialogLabel", void 0), e([y({
|
|
155
369
|
type: Boolean,
|
|
156
370
|
reflect: !0
|
|
157
|
-
})],
|
|
371
|
+
})], T.prototype, "draggable", void 0), T = e([v("web-ui-drawer")], T);
|
|
158
372
|
//#endregion
|
|
159
|
-
export {
|
|
373
|
+
export { T as WebUiDrawer };
|
|
160
374
|
|
|
161
375
|
//# sourceMappingURL=index.js.map
|