@greypan/web-ui 4.0.0 → 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 (158) hide show
  1. package/README.CN.md +248 -139
  2. package/README.md +255 -139
  3. package/dist/assets/glass.js +1 -1
  4. package/dist/assets/glass.js.map +1 -1
  5. package/dist/assets/menu-portal.js +1 -1
  6. package/dist/assets/menu-portal.js.map +1 -1
  7. package/dist/components/autocomplete/index.d.ts +8 -0
  8. package/dist/components/autocomplete/index.js +108 -50
  9. package/dist/components/autocomplete/index.js.map +1 -1
  10. package/dist/components/autocomplete/style.js +1 -1
  11. package/dist/components/autocomplete/style.js.map +1 -1
  12. package/dist/components/back-top/index.js +1 -1
  13. package/dist/components/back-top/index.js.map +1 -1
  14. package/dist/components/back-top/style.js +1 -1
  15. package/dist/components/back-top/style.js.map +1 -1
  16. package/dist/components/button/index.js +33 -32
  17. package/dist/components/button/index.js.map +1 -1
  18. package/dist/components/button/style.js +1 -1
  19. package/dist/components/button/style.js.map +1 -1
  20. package/dist/components/button-group/index.js +14 -12
  21. package/dist/components/button-group/index.js.map +1 -1
  22. package/dist/components/button-group/style.js +1 -1
  23. package/dist/components/button-group/style.js.map +1 -1
  24. package/dist/components/checkbox/index.js +23 -16
  25. package/dist/components/checkbox/index.js.map +1 -1
  26. package/dist/components/checkbox/style.js +1 -1
  27. package/dist/components/checkbox/style.js.map +1 -1
  28. package/dist/components/collapse/index.d.ts +66 -0
  29. package/dist/components/collapse/index.js +159 -0
  30. package/dist/components/collapse/index.js.map +1 -0
  31. package/dist/components/collapse/style.js +6 -0
  32. package/dist/components/collapse/style.js.map +1 -0
  33. package/dist/components/context-menu/index.d.ts +29 -0
  34. package/dist/components/context-menu/index.js +167 -51
  35. package/dist/components/context-menu/index.js.map +1 -1
  36. package/dist/components/dialog/index.d.ts +6 -0
  37. package/dist/components/dialog/index.js +28 -7
  38. package/dist/components/dialog/index.js.map +1 -1
  39. package/dist/components/dialog/style.js +1 -1
  40. package/dist/components/dialog/style.js.map +1 -1
  41. package/dist/components/drawer/index.d.ts +32 -2
  42. package/dist/components/drawer/index.js +229 -39
  43. package/dist/components/drawer/index.js.map +1 -1
  44. package/dist/components/drawer/style.js +1 -1
  45. package/dist/components/drawer/style.js.map +1 -1
  46. package/dist/components/dropdown/index.d.ts +2 -0
  47. package/dist/components/dropdown/index.js +23 -13
  48. package/dist/components/dropdown/index.js.map +1 -1
  49. package/dist/components/dropdown-item/style.js +1 -1
  50. package/dist/components/dropdown-item/style.js.map +1 -1
  51. package/dist/components/empty/index.d.ts +1 -0
  52. package/dist/components/empty/index.js +23 -21
  53. package/dist/components/empty/index.js.map +1 -1
  54. package/dist/components/empty/style.js +1 -1
  55. package/dist/components/empty/style.js.map +1 -1
  56. package/dist/components/index.d.ts +1 -0
  57. package/dist/components/index.js +28 -27
  58. package/dist/components/input/style.js +1 -1
  59. package/dist/components/input/style.js.map +1 -1
  60. package/dist/components/input-number/style.js +1 -1
  61. package/dist/components/input-number/style.js.map +1 -1
  62. package/dist/components/layout/index.d.ts +23 -0
  63. package/dist/components/layout/index.js +134 -30
  64. package/dist/components/layout/index.js.map +1 -1
  65. package/dist/components/layout/style.js +1 -1
  66. package/dist/components/layout/style.js.map +1 -1
  67. package/dist/components/option/style.js +1 -1
  68. package/dist/components/option/style.js.map +1 -1
  69. package/dist/components/popover/index.d.ts +2 -1
  70. package/dist/components/popover/index.js +8 -4
  71. package/dist/components/popover/index.js.map +1 -1
  72. package/dist/components/popover/style.js +1 -1
  73. package/dist/components/popover/style.js.map +1 -1
  74. package/dist/components/radio/index.js +18 -15
  75. package/dist/components/radio/index.js.map +1 -1
  76. package/dist/components/radio/style.js +1 -1
  77. package/dist/components/radio/style.js.map +1 -1
  78. package/dist/components/segmented/index.d.ts +8 -1
  79. package/dist/components/segmented/index.js +87 -21
  80. package/dist/components/segmented/index.js.map +1 -1
  81. package/dist/components/segmented/style.js +1 -1
  82. package/dist/components/segmented/style.js.map +1 -1
  83. package/dist/components/segmented-trigger/index.js +17 -14
  84. package/dist/components/segmented-trigger/index.js.map +1 -1
  85. package/dist/components/segmented-trigger/style.js +1 -1
  86. package/dist/components/segmented-trigger/style.js.map +1 -1
  87. package/dist/components/select/index.js +32 -28
  88. package/dist/components/select/index.js.map +1 -1
  89. package/dist/components/select/style.js +1 -1
  90. package/dist/components/select/style.js.map +1 -1
  91. package/dist/components/slider/index.d.ts +3 -2
  92. package/dist/components/slider/index.js +65 -47
  93. package/dist/components/slider/index.js.map +1 -1
  94. package/dist/components/slider/style.js +1 -1
  95. package/dist/components/slider/style.js.map +1 -1
  96. package/dist/components/spinner/index.js.map +1 -1
  97. package/dist/components/switch/index.d.ts +8 -0
  98. package/dist/components/switch/index.js +72 -25
  99. package/dist/components/switch/index.js.map +1 -1
  100. package/dist/components/switch/style.js +1 -1
  101. package/dist/components/switch/style.js.map +1 -1
  102. package/dist/components/textarea/index.js +1 -4
  103. package/dist/components/textarea/index.js.map +1 -1
  104. package/dist/components/textarea/style.js +1 -1
  105. package/dist/components/textarea/style.js.map +1 -1
  106. package/dist/components/theme/style.js +1 -1
  107. package/dist/components/theme/style.js.map +1 -1
  108. package/dist/components/toast/style.js +1 -1
  109. package/dist/components/toast/style.js.map +1 -1
  110. package/dist/components/toast/toast.js.map +1 -1
  111. package/dist/components/tooltip/index.js +2 -2
  112. package/dist/components/tooltip/index.js.map +1 -1
  113. package/dist/components/tooltip/style.js +1 -1
  114. package/dist/components/tooltip/style.js.map +1 -1
  115. package/dist/icons/generated/heroicons-arrow-down-16-solid.d.ts +6 -0
  116. package/dist/icons/generated/heroicons-arrow-up-16-solid.d.ts +6 -0
  117. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +6 -0
  118. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +10 -0
  119. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -0
  120. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +6 -0
  121. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +10 -0
  122. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -0
  123. package/dist/icons/generated/lucide-code.d.ts +6 -0
  124. package/dist/icons/generated/lucide-code.js +10 -0
  125. package/dist/icons/generated/lucide-code.js.map +1 -0
  126. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +6 -0
  127. package/dist/icons/generated/lucide-ellipsis-vertical.js +10 -0
  128. package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -0
  129. package/dist/icons/generated/lucide-list-filter.d.ts +6 -0
  130. package/dist/icons/generated/lucide-list-filter.js +10 -0
  131. package/dist/icons/generated/lucide-list-filter.js.map +1 -0
  132. package/dist/icons/generated/lucide-list-restart.d.ts +6 -0
  133. package/dist/icons/generated/lucide-list-restart.js +10 -0
  134. package/dist/icons/generated/lucide-list-restart.js.map +1 -0
  135. package/dist/icons/generated/lucide-tag.d.ts +6 -0
  136. package/dist/icons/generated/lucide-tag.js +10 -0
  137. package/dist/icons/generated/lucide-tag.js.map +1 -0
  138. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +6 -0
  139. package/dist/icons/generated/tabler-sort-ascending-letters.js +10 -0
  140. package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -0
  141. package/dist/icons/index.d.ts +8 -0
  142. package/dist/icons/index.js +18 -10
  143. package/dist/shared/gesture/drag-gesture.js +133 -0
  144. package/dist/shared/gesture/drag-gesture.js.map +1 -0
  145. package/dist/shared/gesture/physics.js +45 -0
  146. package/dist/shared/gesture/physics.js.map +1 -0
  147. package/dist/shared/group-management/index.js +49 -47
  148. package/dist/shared/group-management/index.js.map +1 -1
  149. package/dist/shared/menu-portal/menu-portal.js +22 -10
  150. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  151. package/dist/shared/menu-portal/menu-tree.js +4 -2
  152. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  153. package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
  154. package/dist/shared/overlay/nested-drawer-layers.js +55 -0
  155. package/dist/shared/overlay/nested-drawer-layers.js.map +1 -0
  156. package/dist/shared/overlay/portal.js +44 -13
  157. package/dist/shared/overlay/portal.js.map +1 -1
  158. package/package.json +5 -3
@@ -2,45 +2,76 @@ import { getFallbackOverlayRoot as e } from "../theme/overlay-root.js";
2
2
  import { findNearestTheme as t, findRootTheme as n } from "../theme/theme-scope.js";
3
3
  import { definePlugin as r } from "@greypan/js-kit";
4
4
  //#region src/shared/overlay/portal.ts
5
- var i = () => r((e) => {
5
+ function i(e, t, n) {
6
+ let r = getComputedStyle(t);
7
+ for (let t of n) {
8
+ let n = r.getPropertyValue(t).trim();
9
+ n && e.style.setProperty(t, n);
10
+ }
11
+ }
12
+ var a = () => r((e) => {
6
13
  let t = document.createElement("div");
7
14
  t.style.display = "contents";
8
15
  let n = t.attachShadow({ mode: "open" }), r = document.createElement("style");
9
16
  r.textContent = e.style;
10
17
  let i = document.createElement("div");
11
18
  i.className = e.className, i.dataset.wuiPresence = "entering", n.append(r, i);
12
- let o = [], s = new MutationObserver(() => e.onContentChange?.()), c = (e) => {
19
+ let a = [], o = new MutationObserver((t) => e.onContentChange?.(t)), s = (e) => {
13
20
  e.forEach((e) => {
14
- let t = o.indexOf(e);
15
- t >= 0 && o.splice(t, 1);
21
+ let t = a.indexOf(e);
22
+ t >= 0 && a.splice(t, 1);
16
23
  });
17
24
  };
18
- return a(e.container, e.target).appendChild(t), e.onContentChange && s.observe(i, {
25
+ return c(e.container, e.target).appendChild(t), e.onContentChange && o.observe(i, {
19
26
  childList: !0,
20
27
  subtree: !0
21
28
  }), {
22
29
  panel: i,
23
30
  moveContent(e, t = i) {
24
- o.splice(0, o.length, ...e), t.append(...o);
31
+ a.splice(0, a.length, ...e), t.append(...a);
25
32
  },
26
33
  appendContent(e, t = i) {
27
- c(e), o.push(...e), t.append(...e);
34
+ s(e), a.push(...e), t.append(...e);
28
35
  },
29
36
  removeContent(e) {
30
- c(e);
37
+ s(e);
31
38
  },
32
39
  restoreContent() {
33
- e.target.append(...o), o.length = 0;
40
+ e.target.append(...a), a.length = 0;
34
41
  },
35
42
  remove() {
36
- s.disconnect(), t.remove();
43
+ o.disconnect(), t.remove();
37
44
  }
38
45
  };
39
46
  });
40
- function a(r, i, a = {}) {
41
- return (typeof r == "function" ? r() : r) || ((a.preferRootTheme ? n() : t(i))?.getOverlayRoot() ?? e());
47
+ function o(e, t, n) {
48
+ let r = e;
49
+ for (; r && r !== n;) {
50
+ if (r === t) return !0;
51
+ r = r.parentNode;
52
+ }
53
+ return !1;
54
+ }
55
+ function s(e) {
56
+ let t = e;
57
+ for (; t && t !== document.documentElement;) {
58
+ if (t instanceof HTMLDialogElement && t.open) return t;
59
+ if (t instanceof Element && t.shadowRoot) {
60
+ let n = t.shadowRoot.querySelectorAll("dialog");
61
+ for (let r of n) {
62
+ if (!(r instanceof HTMLDialogElement) || !r.open) continue;
63
+ let n = r.querySelectorAll("slot");
64
+ for (let i of n) for (let n of i.assignedNodes()) if (n instanceof Node && o(e, n, t)) return r;
65
+ }
66
+ }
67
+ t = t.parentNode;
68
+ }
69
+ return null;
70
+ }
71
+ function c(r, i, a = {}) {
72
+ return (typeof r == "function" ? r() : r) || s(i) || ((a.preferRootTheme ? n() : t(i))?.getOverlayRoot() ?? e());
42
73
  }
43
74
  //#endregion
44
- export { i as defineOverlayPortal, a as resolveOverlayContainer };
75
+ export { i as applyOverlayVariables, a as defineOverlayPortal, c as resolveOverlayContainer };
45
76
 
46
77
  //# sourceMappingURL=portal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"portal.js","names":[],"sources":["../../../src/shared/overlay/portal.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nimport { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme, findRootTheme } from '@/shared/theme/theme-scope'\n\nexport type OverlayContainer = HTMLElement | (() => HTMLElement | undefined)\n\nexport interface OverlayContainerResolutionOptions {\n /** 无 target 时优先使用文档中的 root theme。 */\n preferRootTheme?: boolean\n}\n\nexport interface OverlayPortalOptions {\n container?: OverlayContainer\n target: Element\n style: string\n className: string\n onContentChange?: () => void\n}\n\nexport interface OverlayPortal {\n readonly panel: HTMLElement\n restoreContent(): void\n moveContent(nodes: Node[], target?: HTMLElement): void\n appendContent(nodes: Node[], target?: HTMLElement): void\n removeContent(nodes: Node[]): void\n remove(): void\n}\n\n/**\n * 构建带 Shadow DOM 样式边界的 Portal 面板,并追踪被迁移的内容节点以便恢复。\n */\nexport const defineOverlayPortal = () =>\n definePlugin<OverlayPortal, OverlayPortalOptions>(ctx => {\n const host = document.createElement('div')\n // :host 规则可能让宿主在 overlay 容器中生成行盒;display: contents 保留面板定位而不参与布局。\n host.style.display = 'contents'\n\n const root = host.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = ctx.style\n const panel = document.createElement('div')\n panel.className = ctx.className\n panel.dataset.wuiPresence = 'entering'\n root.append(style, panel)\n\n const trackedNodes: Node[] = []\n const contentObserver = new MutationObserver(() => ctx.onContentChange?.())\n const untrackNodes = (nodes: Node[]) => {\n nodes.forEach(node => {\n const index = trackedNodes.indexOf(node)\n if (index >= 0) trackedNodes.splice(index, 1)\n })\n }\n\n resolveOverlayContainer(ctx.container, ctx.target).appendChild(host)\n if (ctx.onContentChange) contentObserver.observe(panel, { childList: true, subtree: true })\n\n return {\n panel,\n\n moveContent(nodes, target = panel) {\n trackedNodes.splice(0, trackedNodes.length, ...nodes)\n target.append(...trackedNodes)\n },\n\n appendContent(nodes, target = panel) {\n untrackNodes(nodes)\n trackedNodes.push(...nodes)\n target.append(...nodes)\n },\n\n removeContent(nodes) {\n untrackNodes(nodes)\n },\n\n restoreContent() {\n ctx.target.append(...trackedNodes)\n trackedNodes.length = 0\n },\n\n remove() {\n contentObserver.disconnect()\n host.remove()\n }\n }\n })\n\nexport function resolveOverlayContainer(\n container: OverlayContainer | undefined,\n target: Element,\n options: OverlayContainerResolutionOptions = {}\n): HTMLElement {\n const explicit = typeof container === 'function' ? container() : container\n if (explicit) return explicit\n\n // 无 target 的调用(如菜单)优先使用 root theme;有 target 时使用最近的 theme。\n const theme = options.preferRootTheme ? findRootTheme() : findNearestTheme(target)\n return theme?.getOverlayRoot() ?? getFallbackOverlayRoot()\n}\n"],"mappings":";;;;AAgCA,IAAa,UACX,GAAkD,MAAO;CACvD,IAAM,IAAO,SAAS,cAAc,KAAK;CAEzC,EAAK,MAAM,UAAU;CAErB,IAAM,IAAO,EAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GACzC,IAAQ,SAAS,cAAc,OAAO;CAC5C,EAAM,cAAc,EAAI;CACxB,IAAM,IAAQ,SAAS,cAAc,KAAK;CAG1C,AAFA,EAAM,YAAY,EAAI,WACtB,EAAM,QAAQ,cAAc,YAC5B,EAAK,OAAO,GAAO,CAAK;CAExB,IAAM,IAAuB,CAAC,GACxB,IAAkB,IAAI,uBAAuB,EAAI,kBAAkB,CAAC,GACpE,KAAgB,MAAkB;EACtC,EAAM,SAAQ,MAAQ;GACpB,IAAM,IAAQ,EAAa,QAAQ,CAAI;GACvC,AAAI,KAAS,KAAG,EAAa,OAAO,GAAO,CAAC;EAC9C,CAAC;CACH;CAKA,OAHA,EAAwB,EAAI,WAAW,EAAI,MAAM,CAAC,CAAC,YAAY,CAAI,GAC/D,EAAI,mBAAiB,EAAgB,QAAQ,GAAO;EAAE,WAAW;EAAM,SAAS;CAAK,CAAC,GAEnF;EACL;EAEA,YAAY,GAAO,IAAS,GAAO;GAEjC,AADA,EAAa,OAAO,GAAG,EAAa,QAAQ,GAAG,CAAK,GACpD,EAAO,OAAO,GAAG,CAAY;EAC/B;EAEA,cAAc,GAAO,IAAS,GAAO;GAGnC,AAFA,EAAa,CAAK,GAClB,EAAa,KAAK,GAAG,CAAK,GAC1B,EAAO,OAAO,GAAG,CAAK;EACxB;EAEA,cAAc,GAAO;GACnB,EAAa,CAAK;EACpB;EAEA,iBAAiB;GAEf,AADA,EAAI,OAAO,OAAO,GAAG,CAAY,GACjC,EAAa,SAAS;EACxB;EAEA,SAAS;GAEP,AADA,EAAgB,WAAW,GAC3B,EAAK,OAAO;EACd;CACF;AACF,CAAC;AAEH,SAAgB,EACd,GACA,GACA,IAA6C,CAAC,GACjC;CAMb,QALiB,OAAO,KAAc,aAAa,EAAU,IAAI,QAInD,EAAQ,kBAAkB,EAAc,IAAI,EAAiB,CAAM,EAAA,EACnE,eAAe,KAAK,EAAuB;AAC3D"}
1
+ {"version":3,"file":"portal.js","names":[],"sources":["../../../src/shared/overlay/portal.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nimport { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme, findRootTheme } from '@/shared/theme/theme-scope'\n\nexport type OverlayContainer = HTMLElement | (() => HTMLElement | undefined)\n\nexport interface OverlayContainerResolutionOptions {\n /** 无 target 时优先使用文档中的 root theme。 */\n preferRootTheme?: boolean\n}\n\nexport interface OverlayPortalOptions {\n container?: OverlayContainer\n target: Element\n style: string\n className: string\n onContentChange?: (mutations: MutationRecord[]) => void\n}\n\nexport interface OverlayPortal {\n readonly panel: HTMLElement\n restoreContent(): void\n moveContent(nodes: Node[], target?: HTMLElement): void\n appendContent(nodes: Node[], target?: HTMLElement): void\n removeContent(nodes: Node[]): void\n remove(): void\n}\n\n/**\n * Portal 面板位于独立 shadow root,宿主上的 CSS 自定义属性不会沿渲染树继承到 panel。\n * 这里在创建时镜像锚点解析后的变量,让组件 host 上的尺寸配置对 portal 仍然生效。\n */\nexport function applyOverlayVariables(panel: HTMLElement, source: Element, variables: readonly string[]): void {\n const computedStyle = getComputedStyle(source)\n for (const variable of variables) {\n const value = computedStyle.getPropertyValue(variable).trim()\n if (value) panel.style.setProperty(variable, value)\n }\n}\n\n/**\n * 构建带 Shadow DOM 样式边界的 Portal 面板,并追踪被迁移的内容节点以便恢复。\n */\nexport const defineOverlayPortal = () =>\n definePlugin<OverlayPortal, OverlayPortalOptions>(ctx => {\n const host = document.createElement('div')\n // :host 规则可能让宿主在 overlay 容器中生成行盒;display: contents 保留面板定位而不参与布局。\n host.style.display = 'contents'\n\n const root = host.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = ctx.style\n const panel = document.createElement('div')\n panel.className = ctx.className\n panel.dataset.wuiPresence = 'entering'\n root.append(style, panel)\n\n const trackedNodes: Node[] = []\n const contentObserver = new MutationObserver(mutations => ctx.onContentChange?.(mutations))\n const untrackNodes = (nodes: Node[]) => {\n nodes.forEach(node => {\n const index = trackedNodes.indexOf(node)\n if (index >= 0) trackedNodes.splice(index, 1)\n })\n }\n\n resolveOverlayContainer(ctx.container, ctx.target).appendChild(host)\n if (ctx.onContentChange) contentObserver.observe(panel, { childList: true, subtree: true })\n\n return {\n panel,\n\n moveContent(nodes, target = panel) {\n trackedNodes.splice(0, trackedNodes.length, ...nodes)\n target.append(...trackedNodes)\n },\n\n appendContent(nodes, target = panel) {\n untrackNodes(nodes)\n trackedNodes.push(...nodes)\n target.append(...nodes)\n },\n\n removeContent(nodes) {\n untrackNodes(nodes)\n },\n\n restoreContent() {\n ctx.target.append(...trackedNodes)\n trackedNodes.length = 0\n },\n\n remove() {\n contentObserver.disconnect()\n host.remove()\n }\n }\n })\n\n/**\n * 判断 node 是否是 slot 已分配节点(或其 light DOM 后代),即 node 实际渲染在 shadowRoot 内。\n * slotted 内容的 parentNode 仍停留在 light DOM,因此不能用普通祖先遍历跨过 shadow 边界,\n * 只能通过 slot.assignedNodes() 判断内容被渲染到哪个 slot。\n */\nfunction isAssignedIntoTarget(node: Node, assignedNode: Node, boundary: Node): boolean {\n let current: Node | null = node\n while (current && current !== boundary) {\n if (current === assignedNode) return true\n current = current.parentNode\n }\n return false\n}\n\n/**\n * 查找包含 target 且处于打开态的最近原生 <dialog>。\n * 原生 showModal() 会把 dialog 提升到浏览器 top layer,而常规 overlay 容器在普通文档流,\n * 二者无法靠 z-index 叠序——overlay 会被 top layer 的 dialog 遮住。\n * 因此 target 被渲染到某个已打开的原生 dialog 内时,应把 overlay 挂到该 dialog 上,\n * 使其一并进入 top layer(抽屉 / 对话框内的 dropdown、tooltip、context-menu 均适用)。\n */\nfunction findEnclosingOpenDialog(target: Element): HTMLDialogElement | null {\n let current: Node | null = target\n while (current && current !== document.documentElement) {\n if (current instanceof HTMLDialogElement && current.open) return current\n\n // 跨过 shadow host:检查其 shadowRoot 内已打开的 dialog 是否渲染了 target。\n if (current instanceof Element && current.shadowRoot) {\n const dialogs = current.shadowRoot.querySelectorAll('dialog')\n for (const dialog of dialogs) {\n if (!(dialog instanceof HTMLDialogElement) || !dialog.open) continue\n const slots = dialog.querySelectorAll('slot')\n for (const slot of slots) {\n for (const assigned of slot.assignedNodes()) {\n if (!(assigned instanceof Node)) continue\n if (isAssignedIntoTarget(target, assigned, current)) return dialog\n }\n }\n }\n }\n\n current = current.parentNode\n }\n return null\n}\n\nexport function resolveOverlayContainer(\n container: OverlayContainer | undefined,\n target: Element,\n options: OverlayContainerResolutionOptions = {}\n): HTMLElement {\n const explicit = typeof container === 'function' ? container() : container\n if (explicit) return explicit\n\n // target 在已打开的原生 dialog / drawer 内:挂到该 dialog,加入 top layer。\n const enclosingDialog = findEnclosingOpenDialog(target)\n if (enclosingDialog) return enclosingDialog\n\n // 无 target 的调用(如菜单)优先使用 root theme;有 target 时使用最近的 theme。\n const theme = options.preferRootTheme ? findRootTheme() : findNearestTheme(target)\n return theme?.getOverlayRoot() ?? getFallbackOverlayRoot()\n}\n"],"mappings":";;;;AAiCA,SAAgB,EAAsB,GAAoB,GAAiB,GAAoC;CAC7G,IAAM,IAAgB,iBAAiB,CAAM;CAC7C,KAAK,IAAM,KAAY,GAAW;EAChC,IAAM,IAAQ,EAAc,iBAAiB,CAAQ,CAAC,CAAC,KAAK;EAC5D,AAAI,KAAO,EAAM,MAAM,YAAY,GAAU,CAAK;CACpD;AACF;AAKA,IAAa,UACX,GAAkD,MAAO;CACvD,IAAM,IAAO,SAAS,cAAc,KAAK;CAEzC,EAAK,MAAM,UAAU;CAErB,IAAM,IAAO,EAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GACzC,IAAQ,SAAS,cAAc,OAAO;CAC5C,EAAM,cAAc,EAAI;CACxB,IAAM,IAAQ,SAAS,cAAc,KAAK;CAG1C,AAFA,EAAM,YAAY,EAAI,WACtB,EAAM,QAAQ,cAAc,YAC5B,EAAK,OAAO,GAAO,CAAK;CAExB,IAAM,IAAuB,CAAC,GACxB,IAAkB,IAAI,kBAAiB,MAAa,EAAI,kBAAkB,CAAS,CAAC,GACpF,KAAgB,MAAkB;EACtC,EAAM,SAAQ,MAAQ;GACpB,IAAM,IAAQ,EAAa,QAAQ,CAAI;GACvC,AAAI,KAAS,KAAG,EAAa,OAAO,GAAO,CAAC;EAC9C,CAAC;CACH;CAKA,OAHA,EAAwB,EAAI,WAAW,EAAI,MAAM,CAAC,CAAC,YAAY,CAAI,GAC/D,EAAI,mBAAiB,EAAgB,QAAQ,GAAO;EAAE,WAAW;EAAM,SAAS;CAAK,CAAC,GAEnF;EACL;EAEA,YAAY,GAAO,IAAS,GAAO;GAEjC,AADA,EAAa,OAAO,GAAG,EAAa,QAAQ,GAAG,CAAK,GACpD,EAAO,OAAO,GAAG,CAAY;EAC/B;EAEA,cAAc,GAAO,IAAS,GAAO;GAGnC,AAFA,EAAa,CAAK,GAClB,EAAa,KAAK,GAAG,CAAK,GAC1B,EAAO,OAAO,GAAG,CAAK;EACxB;EAEA,cAAc,GAAO;GACnB,EAAa,CAAK;EACpB;EAEA,iBAAiB;GAEf,AADA,EAAI,OAAO,OAAO,GAAG,CAAY,GACjC,EAAa,SAAS;EACxB;EAEA,SAAS;GAEP,AADA,EAAgB,WAAW,GAC3B,EAAK,OAAO;EACd;CACF;AACF,CAAC;AAOH,SAAS,EAAqB,GAAY,GAAoB,GAAyB;CACrF,IAAI,IAAuB;CAC3B,OAAO,KAAW,MAAY,IAAU;EACtC,IAAI,MAAY,GAAc,OAAO;EACrC,IAAU,EAAQ;CACpB;CACA,OAAO;AACT;AASA,SAAS,EAAwB,GAA2C;CAC1E,IAAI,IAAuB;CAC3B,OAAO,KAAW,MAAY,SAAS,kBAAiB;EACtD,IAAI,aAAmB,qBAAqB,EAAQ,MAAM,OAAO;EAGjE,IAAI,aAAmB,WAAW,EAAQ,YAAY;GACpD,IAAM,IAAU,EAAQ,WAAW,iBAAiB,QAAQ;GAC5D,KAAK,IAAM,KAAU,GAAS;IAC5B,IAAI,EAAE,aAAkB,sBAAsB,CAAC,EAAO,MAAM;IAC5D,IAAM,IAAQ,EAAO,iBAAiB,MAAM;IAC5C,KAAK,IAAM,KAAQ,GACjB,KAAK,IAAM,KAAY,EAAK,cAAc,GAClC,iBAAoB,QACtB,EAAqB,GAAQ,GAAU,CAAO,GAAG,OAAO;GAGlE;EACF;EAEA,IAAU,EAAQ;CACpB;CACA,OAAO;AACT;AAEA,SAAgB,EACd,GACA,GACA,IAA6C,CAAC,GACjC;CAUb,QATiB,OAAO,KAAc,aAAa,EAAU,IAAI,MAIzC,EAAwB,CAC5C,OAGU,EAAQ,kBAAkB,EAAc,IAAI,EAAiB,CAAM,EAAA,EACnE,eAAe,KAAK,EAAuB;AAC3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greypan/web-ui",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Lit-based web components for React, Vue, and vanilla JS",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -41,13 +41,15 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@floating-ui/dom": "^1.8.0",
44
- "@greypan/js-kit": "2.0.0",
45
- "@greypan/browser-kit": "2.0.0"
44
+ "@lit/context": "^1.1.6",
45
+ "@greypan/browser-kit": "2.1.0",
46
+ "@greypan/js-kit": "2.0.0"
46
47
  },
47
48
  "devDependencies": {
48
49
  "@iconify-json/jam": "^1.2.3",
49
50
  "@iconify-json/lucide": "^1.2.126",
50
51
  "@iconify-json/si": "^1.2.17",
52
+ "@iconify-json/tabler": "^1.2.38",
51
53
  "@iconify-json/heroicons": "^1.2.3",
52
54
  "@iconify-json/ooui": "^1.2.20",
53
55
  "@iconify-json/radix-icons": "^1.2.6",