@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.
Files changed (238) hide show
  1. package/README.CN.md +495 -125
  2. package/README.md +504 -125
  3. package/dist/_virtual/{_@oxc-project_runtime@0.140.0 → _@oxc-project_runtime@0.146.0}/helpers/esm/decorate.js +1 -1
  4. package/dist/assets/glass.js +1 -1
  5. package/dist/assets/glass.js.map +1 -1
  6. package/dist/assets/menu-portal.js +1 -1
  7. package/dist/assets/menu-portal.js.map +1 -1
  8. package/dist/assets/overlay-motion.js +1 -1
  9. package/dist/assets/overlay-motion.js.map +1 -1
  10. package/dist/assets/toast-containers.js +1 -1
  11. package/dist/assets/toast-containers.js.map +1 -1
  12. package/dist/components/autocomplete/index.d.ts +12 -12
  13. package/dist/components/autocomplete/index.js +162 -111
  14. package/dist/components/autocomplete/index.js.map +1 -1
  15. package/dist/components/autocomplete/style.js +1 -1
  16. package/dist/components/autocomplete/style.js.map +1 -1
  17. package/dist/components/avatar/index.d.ts +0 -1
  18. package/dist/components/avatar/index.js +8 -13
  19. package/dist/components/avatar/index.js.map +1 -1
  20. package/dist/components/back-top/index.js +2 -2
  21. package/dist/components/back-top/index.js.map +1 -1
  22. package/dist/components/back-top/style.js +1 -1
  23. package/dist/components/back-top/style.js.map +1 -1
  24. package/dist/components/badge/index.d.ts +1 -0
  25. package/dist/components/badge/index.js +12 -14
  26. package/dist/components/badge/index.js.map +1 -1
  27. package/dist/components/button/index.d.ts +2 -0
  28. package/dist/components/button/index.js +52 -38
  29. package/dist/components/button/index.js.map +1 -1
  30. package/dist/components/button/style.js +1 -1
  31. package/dist/components/button/style.js.map +1 -1
  32. package/dist/components/button-group/index.d.ts +1 -2
  33. package/dist/components/button-group/index.js +21 -23
  34. package/dist/components/button-group/index.js.map +1 -1
  35. package/dist/components/button-group/style.js +1 -1
  36. package/dist/components/button-group/style.js.map +1 -1
  37. package/dist/components/checkbox/index.d.ts +4 -7
  38. package/dist/components/checkbox/index.js +56 -38
  39. package/dist/components/checkbox/index.js.map +1 -1
  40. package/dist/components/checkbox/style.js +1 -1
  41. package/dist/components/checkbox/style.js.map +1 -1
  42. package/dist/components/checkbox-group/index.d.ts +4 -10
  43. package/dist/components/checkbox-group/index.js +74 -60
  44. package/dist/components/checkbox-group/index.js.map +1 -1
  45. package/dist/components/collapse/index.d.ts +66 -0
  46. package/dist/components/collapse/index.js +159 -0
  47. package/dist/components/collapse/index.js.map +1 -0
  48. package/dist/components/collapse/style.js +6 -0
  49. package/dist/components/collapse/style.js.map +1 -0
  50. package/dist/components/context-menu/index.d.ts +29 -0
  51. package/dist/components/context-menu/index.js +168 -53
  52. package/dist/components/context-menu/index.js.map +1 -1
  53. package/dist/components/dialog/index.d.ts +6 -0
  54. package/dist/components/dialog/index.js +34 -13
  55. package/dist/components/dialog/index.js.map +1 -1
  56. package/dist/components/dialog/style.js +1 -1
  57. package/dist/components/dialog/style.js.map +1 -1
  58. package/dist/components/drawer/index.d.ts +45 -0
  59. package/dist/components/drawer/index.js +270 -56
  60. package/dist/components/drawer/index.js.map +1 -1
  61. package/dist/components/drawer/style.js +1 -1
  62. package/dist/components/drawer/style.js.map +1 -1
  63. package/dist/components/dropdown/index.d.ts +2 -0
  64. package/dist/components/dropdown/index.js +24 -14
  65. package/dist/components/dropdown/index.js.map +1 -1
  66. package/dist/components/dropdown-divider/index.js +1 -1
  67. package/dist/components/dropdown-header/index.js +1 -1
  68. package/dist/components/dropdown-header/style.js +1 -1
  69. package/dist/components/dropdown-header/style.js.map +1 -1
  70. package/dist/components/dropdown-item/index.js +3 -2
  71. package/dist/components/dropdown-item/index.js.map +1 -1
  72. package/dist/components/dropdown-item/style.js +1 -1
  73. package/dist/components/dropdown-item/style.js.map +1 -1
  74. package/dist/components/empty/index.d.ts +1 -0
  75. package/dist/components/empty/index.js +24 -22
  76. package/dist/components/empty/index.js.map +1 -1
  77. package/dist/components/empty/style.js +1 -1
  78. package/dist/components/empty/style.js.map +1 -1
  79. package/dist/components/icon/index.js +1 -1
  80. package/dist/components/index.d.ts +1 -0
  81. package/dist/components/index.js +21 -20
  82. package/dist/components/input/index.d.ts +2 -3
  83. package/dist/components/input/index.js +62 -52
  84. package/dist/components/input/index.js.map +1 -1
  85. package/dist/components/input/style.js +1 -1
  86. package/dist/components/input/style.js.map +1 -1
  87. package/dist/components/input-number/index.d.ts +2 -3
  88. package/dist/components/input-number/index.js +58 -38
  89. package/dist/components/input-number/index.js.map +1 -1
  90. package/dist/components/input-number/style.js +1 -1
  91. package/dist/components/input-number/style.js.map +1 -1
  92. package/dist/components/layout/index.d.ts +76 -3
  93. package/dist/components/layout/index.js +250 -39
  94. package/dist/components/layout/index.js.map +1 -1
  95. package/dist/components/layout/style.js +1 -1
  96. package/dist/components/layout/style.js.map +1 -1
  97. package/dist/components/option/index.js +1 -1
  98. package/dist/components/option/style.js +1 -1
  99. package/dist/components/option/style.js.map +1 -1
  100. package/dist/components/popover/index.d.ts +2 -1
  101. package/dist/components/popover/index.js +14 -8
  102. package/dist/components/popover/index.js.map +1 -1
  103. package/dist/components/popover/style.js +1 -1
  104. package/dist/components/popover/style.js.map +1 -1
  105. package/dist/components/radio/index.d.ts +4 -7
  106. package/dist/components/radio/index.js +51 -37
  107. package/dist/components/radio/index.js.map +1 -1
  108. package/dist/components/radio/style.js +1 -1
  109. package/dist/components/radio/style.js.map +1 -1
  110. package/dist/components/radio-group/index.d.ts +4 -10
  111. package/dist/components/radio-group/index.js +70 -52
  112. package/dist/components/radio-group/index.js.map +1 -1
  113. package/dist/components/segmented/index.d.ts +14 -12
  114. package/dist/components/segmented/index.js +132 -54
  115. package/dist/components/segmented/index.js.map +1 -1
  116. package/dist/components/segmented/style.js +1 -1
  117. package/dist/components/segmented/style.js.map +1 -1
  118. package/dist/components/segmented-trigger/index.d.ts +1 -2
  119. package/dist/components/segmented-trigger/index.js +23 -21
  120. package/dist/components/segmented-trigger/index.js.map +1 -1
  121. package/dist/components/segmented-trigger/style.js +1 -1
  122. package/dist/components/segmented-trigger/style.js.map +1 -1
  123. package/dist/components/select/index.d.ts +13 -8
  124. package/dist/components/select/index.js +114 -75
  125. package/dist/components/select/index.js.map +1 -1
  126. package/dist/components/select/style.js +1 -1
  127. package/dist/components/select/style.js.map +1 -1
  128. package/dist/components/slider/index.d.ts +6 -7
  129. package/dist/components/slider/index.js +99 -64
  130. package/dist/components/slider/index.js.map +1 -1
  131. package/dist/components/slider/style.js +1 -1
  132. package/dist/components/slider/style.js.map +1 -1
  133. package/dist/components/spinner/index.d.ts +0 -2
  134. package/dist/components/spinner/index.js +14 -13
  135. package/dist/components/spinner/index.js.map +1 -1
  136. package/dist/components/spinner/style.js +1 -1
  137. package/dist/components/spinner/style.js.map +1 -1
  138. package/dist/components/svg-draw-lines/index.js +1 -1
  139. package/dist/components/switch/index.d.ts +13 -6
  140. package/dist/components/switch/index.js +102 -41
  141. package/dist/components/switch/index.js.map +1 -1
  142. package/dist/components/switch/style.js +1 -1
  143. package/dist/components/switch/style.js.map +1 -1
  144. package/dist/components/textarea/index.d.ts +5 -6
  145. package/dist/components/textarea/index.js +74 -67
  146. package/dist/components/textarea/index.js.map +1 -1
  147. package/dist/components/textarea/style.js +1 -1
  148. package/dist/components/textarea/style.js.map +1 -1
  149. package/dist/components/theme/index.js +1 -1
  150. package/dist/components/theme/style.js +1 -1
  151. package/dist/components/theme/style.js.map +1 -1
  152. package/dist/components/toast/style.js +1 -1
  153. package/dist/components/toast/style.js.map +1 -1
  154. package/dist/components/toast/toast.js +12 -12
  155. package/dist/components/toast/toast.js.map +1 -1
  156. package/dist/components/tooltip/index.js +3 -3
  157. package/dist/components/tooltip/index.js.map +1 -1
  158. package/dist/components/tooltip/style.js +1 -1
  159. package/dist/components/tooltip/style.js.map +1 -1
  160. package/dist/icons/generated/heroicons-arrow-down-16-solid.d.ts +6 -0
  161. package/dist/icons/generated/heroicons-arrow-up-16-solid.d.ts +6 -0
  162. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +6 -0
  163. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +10 -0
  164. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -0
  165. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +6 -0
  166. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +10 -0
  167. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -0
  168. package/dist/icons/generated/lucide-clapperboard.d.ts +6 -0
  169. package/dist/icons/generated/lucide-clapperboard.js +10 -0
  170. package/dist/icons/generated/lucide-clapperboard.js.map +1 -0
  171. package/dist/icons/generated/lucide-code.d.ts +6 -0
  172. package/dist/icons/generated/lucide-code.js +10 -0
  173. package/dist/icons/generated/lucide-code.js.map +1 -0
  174. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +6 -0
  175. package/dist/icons/generated/lucide-ellipsis-vertical.js +10 -0
  176. package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -0
  177. package/dist/icons/generated/lucide-eye.d.ts +6 -0
  178. package/dist/icons/generated/lucide-eye.js +10 -0
  179. package/dist/icons/generated/lucide-eye.js.map +1 -0
  180. package/dist/icons/generated/lucide-headphones.d.ts +6 -0
  181. package/dist/icons/generated/lucide-headphones.js +10 -0
  182. package/dist/icons/generated/lucide-headphones.js.map +1 -0
  183. package/dist/icons/generated/lucide-link.d.ts +6 -0
  184. package/dist/icons/generated/lucide-link.js +10 -0
  185. package/dist/icons/generated/lucide-link.js.map +1 -0
  186. package/dist/icons/generated/lucide-list-filter.d.ts +6 -0
  187. package/dist/icons/generated/lucide-list-filter.js +10 -0
  188. package/dist/icons/generated/lucide-list-filter.js.map +1 -0
  189. package/dist/icons/generated/lucide-list-restart.d.ts +6 -0
  190. package/dist/icons/generated/lucide-list-restart.js +10 -0
  191. package/dist/icons/generated/lucide-list-restart.js.map +1 -0
  192. package/dist/icons/generated/lucide-pen-line.d.ts +6 -0
  193. package/dist/icons/generated/lucide-pen-line.js +10 -0
  194. package/dist/icons/generated/lucide-pen-line.js.map +1 -0
  195. package/dist/icons/generated/lucide-play.d.ts +6 -0
  196. package/dist/icons/generated/lucide-play.js +10 -0
  197. package/dist/icons/generated/lucide-play.js.map +1 -0
  198. package/dist/icons/generated/lucide-sliders-horizontal.d.ts +6 -0
  199. package/dist/icons/generated/lucide-sliders-horizontal.js +10 -0
  200. package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -0
  201. package/dist/icons/generated/lucide-tag.d.ts +6 -0
  202. package/dist/icons/generated/lucide-tag.js +10 -0
  203. package/dist/icons/generated/lucide-tag.js.map +1 -0
  204. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +6 -0
  205. package/dist/icons/generated/tabler-sort-ascending-letters.js +10 -0
  206. package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -0
  207. package/dist/icons/index.d.ts +15 -0
  208. package/dist/icons/index.js +18 -3
  209. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +1 -3
  210. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -1
  211. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +2 -1
  212. 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
  213. package/dist/shared/events/user-change.js.map +1 -1
  214. package/dist/shared/form-association/index.js +41 -0
  215. package/dist/shared/form-association/index.js.map +1 -0
  216. package/dist/shared/gesture/drag-gesture.js +133 -0
  217. package/dist/shared/gesture/drag-gesture.js.map +1 -0
  218. package/dist/shared/gesture/physics.js +45 -0
  219. package/dist/shared/gesture/physics.js.map +1 -0
  220. package/dist/shared/group-management/index.js +111 -0
  221. package/dist/shared/group-management/index.js.map +1 -0
  222. package/dist/shared/menu-portal/menu-portal.js +22 -10
  223. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  224. package/dist/shared/menu-portal/menu-tree.js +22 -7
  225. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  226. package/dist/shared/option-portal/index.js +65 -0
  227. package/dist/shared/option-portal/index.js.map +1 -0
  228. package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
  229. package/dist/shared/overlay/nested-drawer-layers.js +55 -0
  230. package/dist/shared/overlay/nested-drawer-layers.js.map +1 -0
  231. package/dist/shared/overlay/overlay.js +1 -1
  232. package/dist/shared/overlay/overlay.js.map +1 -1
  233. package/dist/shared/overlay/portal.js +47 -13
  234. package/dist/shared/overlay/portal.js.map +1 -1
  235. package/dist/shared/overlay/presence.js.map +1 -1
  236. package/dist/shared/visible-area/index.js +69 -0
  237. package/dist/shared/visible-area/index.js.map +1 -0
  238. package/package.json +8 -4
@@ -1,4 +1,4 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
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
- this.open &&= (this._presence.handleNativeClose(), this._userOpenChange.mark(), !1);
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.preventDefault(), !this.noEscapeClose && (this._userOpenChange.mark(), this.close());
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 && (this.noBackdropClose || (this._userOpenChange.mark(), this.close()));
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: this.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
- <slot name="body" @slotchange=${this._onBodySlotChange} hidden></slot>
71
- <div class="title"><slot name="title"></slot></div>
72
- <div class="desc"><slot></slot></div>
73
- <div class="wui-dialog-footer"><slot name="footer"></slot></div>
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([d()], f.prototype, "_hasBody", void 0), f = e([l("web-ui-dialog")], f);
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: this.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 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 ${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 </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":";;;;;;;;;;AAYO,IAAM,IAAN,cAA0B,EAAW;;EA8EX,aA3EoB,KAAA,OAAA,IACqC,KAAA,eAAA,IACM,KAAA,kBAAA,IACJ,KAAA,gBAAA,IAE9D,KAAA,WAAA,IACO,KAAA,kBAAA,IAAI,EAAqB,GAE7B,KAAA,cAAA,EAAsB,CAAC,CAAC,KAAK,GAC/B,KAAA,YAAA,EAA2B,CAAC,CAAC,KAAK;GAC7D,iBAAiB,KAAK;GACtB,mBAAmB,KAAK;GACxB,cAAc,KAAK;EACrB,CAAC,GA0D2B,KAAA,oBAAA,MAA2B;GACrD,KAAK,UAAU,oBAAoB,CAAK;EAC1C,GAE+B,KAAA,uBAAA;GACxB,AAGL,KAAK,UAFL,KAAK,UAAU,kBAAkB,GACjC,KAAK,gBAAgB,KAAK,GACd;EACd;;;EAlFyB,KAAA,SAAA,CAAC,EAAU,CAAK,GAAG,EAAU,CAAK,CAAC;;CAiB5D,IAAY,SAAS;EACnB,OAAO,KAAK,YAAY,cAAc,QAAQ,KAAK;CACrD;CAEA,QAA2B,GAAuB;EAChD,MAAM,QAAQ,CAAK,GACd,KAAK,gBAEN,EAAM,IAAI,MAAM,MACd,KAAK,gBAAgB,QAAQ,KAAG,KAAK,eAAe,GACxD,KAAK,UAAU,KAAK,KAAK,IAAI,KAE3B,EAAM,IAAI,MAAM,KAAK,EAAM,IAAI,cAAc,MAAG,KAAK,gBAAgB;CAC3E;CAEA,uBAAgC;EAG9B,AAFA,MAAM,qBAAqB,GAC3B,KAAK,UAAU,QAAQ,GACvB,KAAK,YAAY,QAAQ;CAC3B;CAGA,YAAY;EACN,AACJ,KAAK,SAAO;CACd;CAEA,QAAQ;EACN,KAAK,OAAO;CACd;CAEA,aAAqB,GAAU;EAE7B,EAAE,eAAe,GACb,MAAK,kBACT,KAAK,gBAAgB,KAAK,GAC1B,KAAK,MAAM;CACb;CAEA,oBAA4B,GAAe;EACrC,EAAE,WAAY,EAAE,kBAChB,KAAK,oBACT,KAAK,gBAAgB,KAAK,GAC1B,KAAK,MAAM;CACb;CAEA,iBAAyB;EACvB,KAAK,cACH,IAAI,YAAY,eAAe;GAC7B,QAAQ,EAAE,MAAM,KAAK,KAAK;GAC1B,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAaA,gBAAwB,IAAS,KAAK,MAAM;EAC1C,KAAK,YAAY,KAAK,KAAU,CAAC,KAAK,YAAY;CACpD;CAEA,kBAA0B,GAAU;EAC5B,EAAE,kBAAkB,oBAC1B,KAAK,WAAW,EAAE,OAAO,iBAAiB,CAAC,CAAC,SAAS;CACvD;CAEA,SAAkB;EAChB,OAAO,CAAI;;kBAEG,KAAK,aAAa;iBACnB,KAAK,eAAe;iBACpB,KAAK,oBAAoB;yBACjB,KAAK,iBAAiB;;;YAGnC,KAAK,WACH,CAAI,iCAAiC,KAAK,kBAAkB,YAC5D,CAAI;gDAC8B,KAAK,kBAAkB;;;;gBAIvD;;;;CAId;AAKF;AApHG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GACzC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAiB,CAAC,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GACtE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAoB,CAAC,CAAA,GAAA,EAAA,WAAA,mBAAA,KAAA,CAAA,GACzE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAkB,CAAC,CAAA,GAAA,EAAA,WAAA,iBAAA,KAAA,CAAA,GAEvE,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GATR,IAAA,EAAA,CAAA,EAAc,eAAe,CAAA,GAAA,CAAA"}
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:32px 24px 24px}.title{color:var(--wui-color-text,#1b1b1b);margin:0 0 16px;padding:0;font-size:18px;font-weight:600;line-height:1.4}.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}";
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 padding: 32px 24px 24px;\n border-radius: 32px;\n background-color: 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.4;\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":""}
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.140.0/helpers/esm/decorate.js";
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 { defineScrollLockLease as i } from "../../shared/scroll-lock/scroll-lock.js";
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 a } from "../../shared/events/user-change.js";
9
- import { defineNativeDialogPresence as o } from "../../shared/overlay/native-dialog-presence.js";
10
- import s from "./style.js";
11
- import { LitElement as c, html as l, nothing as u, unsafeCSS as d } from "lit";
12
- import { customElement as f, property as p } from "lit/decorators.js";
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 m = [
18
+ var b = [
15
19
  "right",
16
20
  "left",
17
21
  "top",
18
22
  "bottom"
19
- ], h = class extends c {
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 a(), this._scrollLock = i().make(), this._presence = o().make({
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._closeFromUser = () => {
26
- this.open && (this._userOpenChange.mark(), this.close());
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 = [d(n), d(s)];
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, m, "right"), this.requestUpdate("placement", t);
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 && (e.has("open") && (this._userOpenChange.consume() && this.emitOpenChange(), this._presence.sync(this.open)), (e.has("open") || e.has("noScrollLock")) && this._syncScrollLock());
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 === "Escape" && (e.preventDefault(), this._closeFromUser());
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
- this.open &&= (this._presence.handleNativeClose(), this._userOpenChange.mark(), !1);
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: this.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
- return l`
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
- <div class="wui-drawer-body wui-glass">
110
- ${e ? l`
111
- <div class="wui-drawer-header">
112
- <slot name="header" @slotchange=${this.handleHeaderSlotChange}>
113
- ${this.heading ? l`<span class="wui-drawer-heading">${this.heading}</span>` : u}
114
- </slot>
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
- ` : u}
117
- <div class="wui-drawer-content">
118
- <slot></slot>
119
- </div>
120
- <div class="wui-drawer-footer" ?hidden=${!this._hasFooterSlot}>
121
- <slot name="footer" @slotchange=${this.handleFooterSlotChange}></slot>
122
- </div>
123
- </div>
124
- ${this.closable ? l`
125
- <web-ui-button
126
- class="wui-drawer-close"
127
- @click=${this._closeFromUser}
128
- aria-label="关闭"
129
- variant="secondary"
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([p({
342
+ e([y({
141
343
  type: Boolean,
142
344
  reflect: !0
143
- })], h.prototype, "open", void 0), e([p({
345
+ })], T.prototype, "open", void 0), e([y({
144
346
  type: Boolean,
145
347
  reflect: !0,
146
348
  attribute: "no-scroll-lock"
147
- })], h.prototype, "noScrollLock", void 0), e([p({
349
+ })], T.prototype, "noScrollLock", void 0), e([y({
148
350
  type: Boolean,
149
351
  reflect: !0,
150
352
  attribute: "no-backdrop-close"
151
- })], h.prototype, "noBackdropClose", void 0), e([p({
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
- })], h.prototype, "placement", null), e([p({ type: String })], h.prototype, "heading", void 0), e([p({
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
- })], h.prototype, "closable", void 0), h = e([f("web-ui-drawer")], h);
371
+ })], T.prototype, "draggable", void 0), T = e([v("web-ui-drawer")], T);
158
372
  //#endregion
159
- export { h as WebUiDrawer };
373
+ export { T as WebUiDrawer };
160
374
 
161
375
  //# sourceMappingURL=index.js.map