@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
@@ -1,5 +1,5 @@
1
1
  //#region src/components/drawer/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{display:contents}dialog{box-sizing:border-box;width:var(--wui-drawer-width,320px);max-width:90vw;height:100dvh;max-height:100dvh;color:var(--wui-color-text,#1b1b1b);transition:transform var(--wui-duration-drawer-enter,.28s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));background:0 0;border:none;margin:0;padding:0;font-family:inherit;inset:0 0 0 auto;overflow:visible;transform:translate(100%)}dialog::backdrop{opacity:0;background:var(--wui-drawer-overlay-bg,var(--wui-color-backdrop,#0000001f));transition:opacity var(--wui-duration-drawer-enter,.28s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog[open].is-visible,:host([placement=left]) dialog[open].is-visible,:host([placement=top]) dialog[open].is-visible,:host([placement=bottom]) dialog[open].is-visible{transform:translate(0)}dialog.is-closing{pointer-events:none;transition:transform var(--wui-duration-drawer-exit,.24s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog.is-closing::backdrop{transition:opacity var(--wui-duration-drawer-exit,.24s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog[open].is-visible::backdrop{opacity:1}:host([placement=left]) dialog{left:0;right:auto;transform:translate(-100%)}:host([placement=top]) dialog,:host([placement=bottom]) dialog{width:100vw;max-width:100vw;height:var(--wui-drawer-height,300px);max-height:90dvh}:host([placement=top]) dialog{inset:0 0 auto;transform:translateY(-100%)}:host([placement=bottom]) dialog{inset:auto 0 0;transform:translateY(100%)}.wui-drawer-body{--wui-internal-glass-shadow:var(--wui-shadow-overlay,2px 16px 40px #0006);background-color:var(--wui-drawer-bg,var(--wui-color-surface-overlay,#f6f6f6d1));flex-direction:column;height:100%;display:flex}.wui-drawer-header{border-bottom:1px solid #0000000f;justify-content:space-between;align-items:center;padding:16px 20px;font-size:18px;font-weight:600;line-height:1.4;display:flex}.wui-drawer-header[hidden]{display:none}.wui-drawer-content{overscroll-behavior:contain;font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);flex:1;padding:20px;line-height:1.5;overflow-y:auto}.wui-drawer-footer{border-top:1px solid #0000000f;flex-shrink:0;padding:16px 20px}@media (prefers-reduced-motion:reduce){dialog{transition:opacity var(--wui-duration-feedback,.1s) ease}dialog::backdrop{transition-duration:var(--wui-duration-feedback,.1s)}dialog[open].is-visible{transform:none}}.wui-drawer-footer[hidden]{display:none}.wui-drawer-close{z-index:3;position:absolute;top:16px;right:16px}:host([headless]) dialog{width:auto;max-width:none}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:contents}dialog{box-sizing:border-box;width:var(--wui-drawer-width,320px);max-width:90vw;height:100dvh;max-height:100dvh;color:var(--wui-color-text,#1b1b1b);transition:transform var(--wui-duration-drawer-enter,.28s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));background:0 0;border:none;margin:0;padding:0;font-family:inherit;inset:0 0 0 auto;overflow:visible;transform:translate(100%)}dialog::backdrop{opacity:0;background:var(--wui-drawer-overlay-bg,var(--wui-color-backdrop,#0000001f));transition:opacity var(--wui-duration-drawer-enter,.28s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog[open].is-visible{transform:translate(0)}:host(:not([headless])) dialog.is-dragging[open].is-visible,dialog.is-dragging,:is(:host(:not([headless])) dialog.is-dragging[open].is-visible,dialog.is-dragging)::backdrop{transition:none}:host([placement=left]) dialog[open].is-visible,:host([placement=top]) dialog[open].is-visible,:host([placement=bottom]) dialog[open].is-visible{transform:translate(0)}dialog.is-closing{pointer-events:none;transition:transform var(--wui-duration-drawer-exit,.24s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog.is-closing::backdrop{transition:opacity var(--wui-duration-drawer-exit,.24s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1))}dialog[open].is-visible::backdrop{opacity:var(--wui-internal-drag-backdrop-opacity,1)}.wui-drawer-drag-zone{touch-action:none;cursor:grab;z-index:4;transition:opacity var(--wui-duration-feedback,.1s) ease;justify-content:center;align-items:center;display:flex;position:absolute}dialog.is-nested-lower .wui-drawer-drag-zone{pointer-events:none;opacity:0}:host([placement=right]) .wui-drawer-drag-zone{width:24px;height:100%;top:0;left:0}:host([placement=left]) .wui-drawer-drag-zone{width:24px;height:100%;top:0;right:0}:host([placement=top]) .wui-drawer-drag-zone,:host([placement=bottom]) .wui-drawer-drag-zone{width:100%;height:24px;left:0;right:0}:host([placement=top]) .wui-drawer-drag-zone{bottom:0}:host([placement=bottom]) .wui-drawer-drag-zone{top:0}.wui-drawer-drag-bar{background:color-mix(in srgb, var(--wui-color-text,#1b1b1b) 24%, transparent);border-radius:999px;width:4px;height:48px}:host([placement=top]) .wui-drawer-drag-bar,:host([placement=bottom]) .wui-drawer-drag-bar{width:48px;height:4px}.wui-drawer-drag-zone:hover .wui-drawer-drag-bar,.wui-drawer-drag-zone:active .wui-drawer-drag-bar{background:color-mix(in srgb, var(--wui-color-text,#1b1b1b) 40%, transparent)}dialog.is-drag-close .wui-drawer-drag-zone .wui-drawer-drag-bar{background:var(--wui-color-accent,#08f)}:host([placement=left]) dialog{left:0;right:auto;transform:translate(-100%)}:host([placement=top]) dialog,:host([placement=bottom]) dialog{width:100vw;max-width:100vw;height:var(--wui-drawer-height,300px);max-height:90dvh}:host([placement=top]) dialog{inset:0 0 auto;transform:translateY(-100%)}:host([placement=bottom]) dialog{inset:auto 0 0;transform:translateY(100%)}dialog.is-dragging .wui-drawer-drag-zone{cursor:grabbing}.wui-drawer-body{--wui-internal-glass-shadow:var(--wui-shadow-overlay,2px 16px 40px #0006);--wui-glass-corner-radius:var(--wui-drawer-radius,28px);background-color:var(--wui-drawer-bg,var(--wui-color-surface-overlay,#f6f6f6d1));flex-direction:column;height:100%;display:flex}.wui-drawer-header{border-bottom:1px solid #0000000f;justify-content:space-between;align-items:center;padding:16px 20px;font-size:18px;font-weight:600;line-height:1.4;display:flex}.wui-drawer-header[hidden]{display:none}.wui-drawer-content{overscroll-behavior:contain;font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);flex:1;padding:20px;line-height:1.5;overflow-y:auto}.wui-drawer-footer{border-top:1px solid #0000000f;flex-shrink:0;padding:16px 20px}.wui-drawer-footer[hidden]{display:none}.wui-drawer-close{z-index:3;position:absolute;top:16px;right:16px}:host([headless]) dialog{--wui-internal-drawer-inset:0px;width:auto;max-width:none}:host(:not([headless])) dialog{--wui-internal-drawer-inset:var(--wui-drawer-inset,8px);--wui-internal-drawer-nested-depth:0;--wui-internal-drawer-nested-scale:1;--wui-internal-drawer-nested-shift:0px;top:var(--wui-internal-drawer-inset);right:var(--wui-internal-drawer-inset);bottom:var(--wui-internal-drawer-inset);transform:translateX(calc(100% + var(--wui-internal-drawer-inset)));border-radius:var(--wui-drawer-radius,28px);height:auto;left:auto}:host(:not([headless])) .wui-drawer-body{border-radius:inherit}:host(:not([headless])[placement=left]) dialog{top:var(--wui-internal-drawer-inset);right:auto;bottom:var(--wui-internal-drawer-inset);left:var(--wui-internal-drawer-inset);transform:translateX(calc(-100% - var(--wui-internal-drawer-inset)));height:auto}:host(:not([headless])[placement=top]) dialog{top:var(--wui-internal-drawer-inset);right:var(--wui-internal-drawer-inset);bottom:auto;left:var(--wui-internal-drawer-inset);transform:translateY(calc(-100% - var(--wui-internal-drawer-inset)));width:auto;max-width:none}:host(:not([headless])[placement=bottom]) dialog{top:auto;right:var(--wui-internal-drawer-inset);bottom:var(--wui-internal-drawer-inset);left:var(--wui-internal-drawer-inset);transform:translateY(calc(100% + var(--wui-internal-drawer-inset)));width:auto;max-width:none}:host(:not([headless])) dialog[open].is-visible{transform:translate(0);translate:calc(var(--wui-internal-drawer-nested-shift) * -1) 0;scale:var(--wui-internal-drawer-nested-scale);transition:transform var(--wui-duration-drawer-enter,.28s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1)), translate var(--wui-duration-drawer-nested,.45s) cubic-bezier(.22, 1, .36, 1), scale var(--wui-duration-drawer-nested,.45s) cubic-bezier(.22, 1, .36, 1)}:host(:not([headless])[placement=left]) dialog[open].is-visible{transform:translate(0);translate:var(--wui-internal-drawer-nested-shift) 0}:host(:not([headless])[placement=top]) dialog[open].is-visible{transform:translate(0);translate:0 var(--wui-internal-drawer-nested-shift)}:host(:not([headless])[placement=bottom]) dialog[open].is-visible{transform:translate(0);translate:0 calc(var(--wui-internal-drawer-nested-shift) * -1)}@media (prefers-reduced-motion:reduce){dialog:not(.is-dragging){transition:opacity var(--wui-duration-feedback,.1s) ease!important}dialog:not(.is-dragging)::backdrop{transition-duration:var(--wui-duration-feedback,.1s)!important}dialog[open].is-visible:not(.is-dragging){transform:translate(0)scale(1)!important}}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/drawer/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: contents;\n}\n\n/* ===== Dialog 容器 ===== */\ndialog {\n /* 默认:右侧滑出 — 需显式 left:auto 覆盖 UA dialog:modal 的 left:0 */\n top: 0;\n right: 0;\n bottom: 0;\n left: auto;\n transform: translateX(100%);\n\n /* 阴影属于抽屉主体,不能由同尺寸的原生 dialog 裁剪。内容滚动由 .wui-drawer-content 管理。 */\n overflow: visible;\n\n box-sizing: border-box;\n width: var(--wui-drawer-width, 320px);\n max-width: 90vw;\n height: 100vh;\n height: 100dvh;\n max-height: 100vh;\n max-height: 100dvh;\n margin: 0;\n padding: 0;\n border: none;\n\n font-family: inherit;\n color: var(--wui-color-text, #1b1b1b);\n\n background: transparent;\n\n transition: transform var(--wui-duration-drawer-enter, 280ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n\n &::backdrop {\n opacity: 0;\n background: var(--wui-drawer-overlay-bg, var(--wui-color-backdrop, rgb(0 0 0 / 0.12)));\n transition: opacity var(--wui-duration-drawer-enter, 280ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n }\n}\n\ndialog[open].is-visible {\n transform: translate(0, 0);\n}\n\n:host([placement='left']) dialog[open].is-visible,\n:host([placement='top']) dialog[open].is-visible,\n:host([placement='bottom']) dialog[open].is-visible {\n transform: translate(0, 0);\n}\n\ndialog.is-closing {\n pointer-events: none;\n transition: transform var(--wui-duration-drawer-exit, 240ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n}\n\ndialog.is-closing::backdrop {\n transition: opacity var(--wui-duration-drawer-exit, 240ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n}\n\ndialog[open].is-visible::backdrop {\n opacity: 1;\n}\n\n/* ===== Placement 变体 ===== */\n\n:host([placement='left']) dialog {\n right: auto;\n left: 0;\n transform: translateX(-100%);\n}\n\n:host([placement='top']) dialog,\n:host([placement='bottom']) dialog {\n width: 100vw;\n max-width: 100vw;\n height: var(--wui-drawer-height, 300px);\n max-height: 90dvh;\n}\n\n:host([placement='top']) dialog {\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n transform: translateY(-100%);\n}\n\n:host([placement='bottom']) dialog {\n top: auto;\n right: 0;\n bottom: 0;\n left: 0;\n transform: translateY(100%);\n}\n\n/* ===== 抽屉主体 ===== */\n\n.wui-drawer-body {\n --wui-internal-glass-shadow: var(--wui-shadow-overlay, 2px 16px 40px rgb(0 0 0 / 0.4));\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--wui-drawer-bg, var(--wui-color-surface-overlay, rgb(246 246 246 / 0.82)));\n}\n\n/* ===== Header ===== */\n\n.wui-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 16px 20px;\n border-bottom: 1px solid rgb(0 0 0 / 0.06);\n\n font-size: 18px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n/* ===== 隐藏态 ===== */\n\n.wui-drawer-header[hidden] {\n display: none;\n}\n\n/* ===== 内容区 ===== */\n\n.wui-drawer-content {\n overflow-y: auto;\n overscroll-behavior: contain;\n flex: 1;\n\n padding: 20px;\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n}\n\n/* ===== Footer ===== */\n\n.wui-drawer-footer {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid rgb(0 0 0 / 0.06);\n}\n\n@media (prefers-reduced-motion: reduce) {\n dialog {\n transition: opacity var(--wui-duration-feedback, 100ms) ease;\n }\n\n dialog::backdrop {\n transition-duration: var(--wui-duration-feedback, 100ms);\n }\n\n dialog[open].is-visible {\n transform: none;\n }\n}\n\n.wui-drawer-footer[hidden] {\n display: none;\n}\n\n/* ===== 关闭按钮(独立定位,与 header 解耦) ===== */\n\n.wui-drawer-close {\n position: absolute;\n z-index: 3;\n top: 16px;\n right: 16px;\n}\n\n/* ===== Headless 模式 ===== */\n\n/* Headless 模式下,dialog 只作为 overlay 容器,不渲染内置 UI */\n:host([headless]) dialog {\n /* 保持 overlay 基础设施,移除内置样式 */\n width: auto;\n max-width: none;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/drawer/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: contents;\n}\n\n/* ===== Dialog 容器 ===== */\ndialog {\n /* 默认:右侧滑出 — 需显式 left:auto 覆盖 UA dialog:modal 的 left:0 */\n top: 0;\n right: 0;\n bottom: 0;\n left: auto;\n transform: translateX(100%);\n\n /* 阴影属于抽屉主体,不能由同尺寸的原生 dialog 裁剪。内容滚动由 .wui-drawer-content 管理。 */\n overflow: visible;\n\n box-sizing: border-box;\n width: var(--wui-drawer-width, 320px);\n max-width: 90vw;\n height: 100vh;\n height: 100dvh;\n max-height: 100vh;\n max-height: 100dvh;\n margin: 0;\n padding: 0;\n border: none;\n\n font-family: inherit;\n color: var(--wui-color-text, #1b1b1b);\n\n background: transparent;\n\n transition: transform var(--wui-duration-drawer-enter, 280ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n\n &::backdrop {\n opacity: 0;\n background: var(--wui-drawer-overlay-bg, var(--wui-color-backdrop, rgb(0 0 0 / 0.12)));\n transition: opacity var(--wui-duration-drawer-enter, 280ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n }\n}\n\ndialog[open].is-visible {\n transform: translate(0, 0);\n}\n\n/*\n * 拖拽跟手期间与弹簧弹回期间,transform/backdrop 由 JS 内联样式与 WAAPI 管辖。\n * 特异性必须压过下方开放守卫块(:host(:not()) dialog[open].is-visible = (0,4,1)\n * 的 nested transition 声明),否则拖拽写入的 transform 会被平滑掉、跟手失效。\n * 复合选择器达 (0,6,1),恒高于守卫。\n */\n:host(:not([headless])) dialog.is-dragging[open].is-visible,\ndialog.is-dragging {\n transition: none;\n\n &::backdrop {\n transition: none;\n }\n}\n\n:host([placement='left']) dialog[open].is-visible,\n:host([placement='top']) dialog[open].is-visible,\n:host([placement='bottom']) dialog[open].is-visible {\n transform: translate(0, 0);\n}\n\ndialog.is-closing {\n pointer-events: none;\n transition: transform var(--wui-duration-drawer-exit, 240ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n}\n\ndialog.is-closing::backdrop {\n transition: opacity var(--wui-duration-drawer-exit, 240ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n}\n\ndialog[open].is-visible::backdrop {\n /* 拖拽期间由 JS 写入 --wui-internal-drag-backdrop-opacity 实现遮罩跟手淡出。 */\n opacity: var(--wui-internal-drag-backdrop-opacity, 1);\n}\n\n/* ===== Drag bar(拖拽关闭热区) ===== */\n\n/*\n * 热区贴在抽屉内缘,宽度约 24px 便于触控命中;胶囊本身是约 4×48px 的灰色短条。\n * 位置随 placement 切换:right 贴在左缘、left 贴在右缘、top 贴在底边、bottom 贴在顶边。\n */\n.wui-drawer-drag-zone {\n touch-action: none;\n cursor: grab;\n\n position: absolute;\n z-index: 4;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n transition: opacity var(--wui-duration-feedback, 100ms) ease;\n}\n\ndialog.is-nested-lower .wui-drawer-drag-zone {\n pointer-events: none;\n opacity: 0;\n}\n\n:host([placement='right']) .wui-drawer-drag-zone {\n top: 0;\n left: 0;\n width: 24px;\n height: 100%;\n}\n\n:host([placement='left']) .wui-drawer-drag-zone {\n top: 0;\n right: 0;\n width: 24px;\n height: 100%;\n}\n\n:host([placement='top']) .wui-drawer-drag-zone,\n:host([placement='bottom']) .wui-drawer-drag-zone {\n right: 0;\n left: 0;\n width: 100%;\n height: 24px;\n}\n\n:host([placement='top']) .wui-drawer-drag-zone {\n bottom: 0;\n}\n\n:host([placement='bottom']) .wui-drawer-drag-zone {\n top: 0;\n}\n\n.wui-drawer-drag-bar {\n width: 4px;\n height: 48px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--wui-color-text, #1b1b1b) 24%, transparent);\n}\n\n:host([placement='top']) .wui-drawer-drag-bar,\n:host([placement='bottom']) .wui-drawer-drag-bar {\n width: 48px;\n height: 4px;\n}\n\n.wui-drawer-drag-zone:hover .wui-drawer-drag-bar,\n.wui-drawer-drag-zone:active .wui-drawer-drag-bar {\n background: color-mix(in srgb, var(--wui-color-text, #1b1b1b) 40%, transparent);\n}\n\n/*\n * 达到关闭阈值的 accent 确认需压过上方 :hover/:active 中性色(拖拽全程 capture\n * 使 hover 恒成立),这里的选择器特异性 (0,3,1) 高于 hover/active 的 (0,3,0)。\n */\ndialog.is-drag-close .wui-drawer-drag-zone .wui-drawer-drag-bar {\n background: var(--wui-color-accent, #08f);\n}\n\n/* ===== Placement 变体 ===== */\n\n:host([placement='left']) dialog {\n right: auto;\n left: 0;\n transform: translateX(-100%);\n}\n\n:host([placement='top']) dialog,\n:host([placement='bottom']) dialog {\n width: 100vw;\n max-width: 100vw;\n height: var(--wui-drawer-height, 300px);\n max-height: 90dvh;\n}\n\n:host([placement='top']) dialog {\n top: 0;\n right: 0;\n bottom: auto;\n left: 0;\n transform: translateY(-100%);\n}\n\n:host([placement='bottom']) dialog {\n top: auto;\n right: 0;\n bottom: 0;\n left: 0;\n transform: translateY(100%);\n}\n\n/*\n * 拖拽中的 grabbing 光标。dialog 复合前缀使其特异性恒高于上方 placement 变体,\n * stylelint 的顺序比较对这种结构必然告警;cascade 上此规则不依赖 placement,\n * 置于其后仅为可读性,故显式豁免。\n */\n/* stylelint-disable-next-line no-descending-specificity */\ndialog.is-dragging .wui-drawer-drag-zone {\n cursor: grabbing;\n}\n\n/* ===== 抽屉主体 ===== */\n\n.wui-drawer-body {\n --wui-internal-glass-shadow: var(--wui-shadow-overlay, 2px 16px 40px rgb(0 0 0 / 0.4));\n --wui-glass-corner-radius: var(--wui-drawer-radius, 28px);\n display: flex;\n flex-direction: column;\n height: 100%;\n background-color: var(--wui-drawer-bg, var(--wui-color-surface-overlay, rgb(246 246 246 / 0.82)));\n}\n\n/* ===== Header ===== */\n\n.wui-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n\n padding: 16px 20px;\n border-bottom: 1px solid rgb(0 0 0 / 0.06);\n\n font-size: 18px;\n font-weight: 600;\n line-height: 1.4;\n}\n\n/* ===== 隐藏态 ===== */\n\n.wui-drawer-header[hidden] {\n display: none;\n}\n\n/* ===== 内容区 ===== */\n\n.wui-drawer-content {\n overflow-y: auto;\n overscroll-behavior: contain;\n flex: 1;\n\n padding: 20px;\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n}\n\n/* ===== Footer ===== */\n\n.wui-drawer-footer {\n flex-shrink: 0;\n padding: 16px 20px;\n border-top: 1px solid rgb(0 0 0 / 0.06);\n}\n\n.wui-drawer-footer[hidden] {\n display: none;\n}\n\n/* ===== 关闭按钮(独立定位,与 header 解耦) ===== */\n\n.wui-drawer-close {\n position: absolute;\n z-index: 3;\n top: 16px;\n right: 16px;\n}\n\n/* ===== Headless 模式 ===== */\n\n/* Headless 模式下,dialog 只作为 overlay 容器,不渲染内置 UI */\n:host([headless]) dialog {\n /*\n * inset 只属于浮动卡片几何;headless 嵌套在非 headless 外层内时会沿\n * flattened tree 继承到 8px,破坏 JS 读取该变量得到的贴边几何假设\n * (parseFloat('0px') 与回退 0 语义一致),故显式归零。\n */\n --wui-internal-drawer-inset: 0px;\n\n /* 保持 overlay 基础设施,移除内置样式 */\n width: auto;\n max-width: none;\n}\n\n/* ===== 浮动卡片视觉语言(ADR-0036) ===== */\n\n/*\n * 非 headless 时抽屉是四周留边的圆角卡片,与 layout sidebar 的设计语言一致;\n * 弹性拖拽使边距变化(8px → 更大)是合法状态而非渲染缺口。\n * headless 保持贴边几何,视觉由 Consumer 自绘。\n *\n * 留边经公开 token --wui-drawer-inset 暴露(默认 8px,ADR-0036 修订);\n * 置 0 即贴边几何(与 headless 相同),通常与 --wui-drawer-radius: 0 搭配。\n *\n * 闭合位移需要越过留边才能完全滑出视口,因此闭合态 transform 以\n * --wui-internal-drawer-inset 补偿;JS 在 controlled 悬停终态读取同一变量,\n * 保证两条关闭路径的行为一致。headless 将该变量显式归零(见上方 Headless 模式)。\n */\n\n/* 默认 right:四周留边、高度随上下边距拉伸,闭合位移越过右侧留边 */\n:host(:not([headless])) dialog {\n --wui-internal-drawer-inset: var(--wui-drawer-inset, 8px);\n --wui-internal-drawer-nested-depth: 0;\n --wui-internal-drawer-nested-scale: 1;\n --wui-internal-drawer-nested-shift: 0px;\n\n top: var(--wui-internal-drawer-inset);\n right: var(--wui-internal-drawer-inset);\n bottom: var(--wui-internal-drawer-inset);\n left: auto;\n transform: translateX(calc(100% + var(--wui-internal-drawer-inset)));\n\n height: auto;\n border-radius: var(--wui-drawer-radius, 28px);\n}\n\n:host(:not([headless])) .wui-drawer-body {\n border-radius: inherit;\n}\n\n:host(:not([headless])[placement='left']) dialog {\n top: var(--wui-internal-drawer-inset);\n right: auto;\n bottom: var(--wui-internal-drawer-inset);\n left: var(--wui-internal-drawer-inset);\n transform: translateX(calc(-100% - var(--wui-internal-drawer-inset)));\n\n height: auto;\n}\n\n:host(:not([headless])[placement='top']) dialog {\n top: var(--wui-internal-drawer-inset);\n right: var(--wui-internal-drawer-inset);\n bottom: auto;\n left: var(--wui-internal-drawer-inset);\n transform: translateY(calc(-100% - var(--wui-internal-drawer-inset)));\n\n width: auto;\n max-width: none;\n}\n\n:host(:not([headless])[placement='bottom']) dialog {\n top: auto;\n right: var(--wui-internal-drawer-inset);\n bottom: var(--wui-internal-drawer-inset);\n left: var(--wui-internal-drawer-inset);\n transform: translateY(calc(100% + var(--wui-internal-drawer-inset)));\n\n width: auto;\n max-width: none;\n}\n\n/*\n * 开放态守卫:上方闭合 transform 与基础 `dialog[open].is-visible` 特异性相同且\n * 在文件更后方,必须以更高特异性显式恢复打开位,否则抽屉停在闭合位。\n *\n * Nested 层叠(对齐卡片堆栈效果):非顶层抽屉按 0.95^depth 缩放并向屏幕内侧\n * 平移(shift 为正,朝屏幕中心方向),使缩小的卡片在顶层后方露出阶梯式卡片边缘。\n * 用独立 translate/scale 属性(而非并入 transform):\n * 它们是标准可过渡属性,变量变化即触发平滑过渡;且与 transform 轴上的\n * 闭合/拖拽/弹簧位移互不覆写(独立属性先于 transform 应用后合并)。\n * JS 层序管理写入 depth/scale/shift 三个内部变量,单层使用时全为中性值。\n *\n * 层叠变化的平滑过渡(Base UI nested 实测规格:450ms easeOutQuint 类曲线)。\n * transform 保持既有 enter/exit 时长;translate/scale 只在层叠数变化时更新,\n * 用更长的 nested 时长。\n */\n:host(:not([headless])) dialog[open].is-visible {\n transform: translate(0, 0);\n translate: calc(var(--wui-internal-drawer-nested-shift) * -1) 0;\n scale: var(--wui-internal-drawer-nested-scale);\n transition:\n transform var(--wui-duration-drawer-enter, 280ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1)),\n translate var(--wui-duration-drawer-nested, 450ms) cubic-bezier(0.22, 1, 0.36, 1),\n scale var(--wui-duration-drawer-nested, 450ms) cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n:host(:not([headless])[placement='left']) dialog[open].is-visible {\n transform: translate(0, 0);\n translate: var(--wui-internal-drawer-nested-shift) 0;\n}\n\n:host(:not([headless])[placement='top']) dialog[open].is-visible {\n transform: translate(0, 0);\n translate: 0 var(--wui-internal-drawer-nested-shift);\n}\n\n:host(:not([headless])[placement='bottom']) dialog[open].is-visible {\n transform: translate(0, 0);\n translate: 0 calc(var(--wui-internal-drawer-nested-shift) * -1);\n}\n\n@media (prefers-reduced-motion: reduce) {\n /*\n * reduce 下:位移一律归零、transform 不参与过渡(仅 opacity 反馈)。\n * 全部 !important:压过开放守卫(嵌套层叠变量的特异性猫鼠不可维护),\n * 排除 .is-dragging —— reduce 下拖拽仍需实时跟手(ADR-0035)。\n * JS 收尾移除内联 transform 后立即为终态,无 280ms 过渡尾巴。\n */\n dialog:not(.is-dragging) {\n transition: opacity var(--wui-duration-feedback, 100ms) ease !important;\n\n &::backdrop {\n transition-duration: var(--wui-duration-feedback, 100ms) !important;\n }\n }\n\n dialog[open].is-visible:not(.is-dragging) {\n transform: none !important;\n translate: none !important;\n scale: none !important;\n }\n}\n"],"mappings":""}
@@ -26,6 +26,7 @@ export declare class WebUiDropdown extends LitElement {
26
26
  private _shouldOpenInstantly;
27
27
  get isOpen(): boolean;
28
28
  connectedCallback(): void;
29
+ firstUpdated(): void;
29
30
  disconnectedCallback(): void;
30
31
  protected updated(changed: Map<string, unknown>): void;
31
32
  openMenu(): void;
@@ -53,6 +54,7 @@ export declare class WebUiDropdown extends LitElement {
53
54
  private _restoreSubmenuItems;
54
55
  private _syncScrollLock;
55
56
  private _queryTriggerAnchor;
57
+ private _syncTriggerAria;
56
58
  private _getSubmenuTriggerAnchor;
57
59
  private _onTriggerClick;
58
60
  private _onClickOutside;
@@ -3,17 +3,17 @@ import { normalizeLiteral as t, normalizeNumber as n } from "../../shared/normal
3
3
  import { defineOverlay as r } from "../../shared/overlay/overlay.js";
4
4
  import { hideOverlayPresence as i, showOverlayPresence as a } from "../../shared/overlay/presence.js";
5
5
  import { defineScrollLockLease as o } from "../../shared/scroll-lock/scroll-lock.js";
6
+ import { UserChangeController as s } from "../../shared/events/user-change.js";
6
7
  import "../dropdown-divider/index.js";
7
8
  import "../dropdown-header/index.js";
8
9
  import "../dropdown-item/index.js";
9
- import { UserChangeController as s } from "../../shared/events/user-change.js";
10
10
  import { createMenuPortalOverlay as c } from "../../shared/menu-portal/menu-portal.js";
11
11
  import { findFocusedMenuItem as l, focusMenuItem as u, getEnabledMenuItems as d, getMenuChildren as f, getMenuItemFromEvent as p, hideNestedMenuChildren as m, moveMenuChildren as h } from "../../shared/menu-portal/menu-tree.js";
12
12
  import g from "./style.js";
13
13
  import { LitElement as _, html as v, unsafeCSS as y } from "lit";
14
14
  import { customElement as b, property as x, state as S } from "lit/decorators.js";
15
15
  //#region src/components/dropdown/index.ts
16
- var C = "web-ui-menu-level-", w = [
16
+ var C = "web-ui-menu-level-", w = 0, T = [
17
17
  "top",
18
18
  "top-start",
19
19
  "top-end",
@@ -26,7 +26,7 @@ var C = "web-ui-menu-level-", w = [
26
26
  "left",
27
27
  "left-start",
28
28
  "left-end"
29
- ], T = class extends _ {
29
+ ], E = class extends _ {
30
30
  constructor(...e) {
31
31
  super(...e), this.open = !1, this.disabled = !1, this.matchWidth = !1, this.noScrollLock = !1, this._placement = "bottom-start", this._offset = 4, this._activePath = [], this._overlays = /* @__PURE__ */ new Map(), this._closingSubmenuOverlays = /* @__PURE__ */ new Map(), this._ignoreOutsideClick = !1, this._hoverCleanupFns = [], this._scrollLock = o().make(), this._userOpenChange = new s(), this._shouldOpenInstantly = !0, this._onTriggerClick = (e) => {
32
32
  this.disabled || (this.open ? this._closeAll(!0) : this._openMenu(e.detail === 0, !0));
@@ -89,7 +89,7 @@ var C = "web-ui-menu-level-", w = [
89
89
  return this._placement;
90
90
  }
91
91
  set placement(e) {
92
- this._placement = t(e, w, "bottom-start");
92
+ this._placement = t(e, T, "bottom-start");
93
93
  }
94
94
  get offset() {
95
95
  return this._offset;
@@ -103,12 +103,15 @@ var C = "web-ui-menu-level-", w = [
103
103
  connectedCallback() {
104
104
  super.connectedCallback(), this.addEventListener("keydown", this._onKeydown), document.addEventListener("click", this._onClickOutside);
105
105
  }
106
+ firstUpdated() {
107
+ this.shadowRoot?.querySelector("slot[name=\"trigger\"]")?.addEventListener("slotchange", () => this.requestUpdate());
108
+ }
106
109
  disconnectedCallback() {
107
110
  super.disconnectedCallback(), this.removeEventListener("keydown", this._onKeydown), document.removeEventListener("click", this._onClickOutside), clearTimeout(this._openTimer), clearTimeout(this._ignoreOutsideClickTimer), this._scrollLock.release(), this._cleanupClosedMenu(), this._hoverCleanupFns.forEach((e) => e());
108
111
  }
109
112
  updated(e) {
110
- e.has("open") && (this.open ? (this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : void 0, this._ignoreCurrentOutsideClick(), this._syncScrollLock(), this._hideAllSubmenuChildren(), requestAnimationFrame(() => {
111
- this.open && (this._ensureOverlay(0, this._shouldOpenInstantly), this._shouldOpenInstantly = !0, this._focusMenuItem(this._getEnabledLevelItems(0)[0]));
113
+ this._syncTriggerAria(), e.has("open") && (this.open ? (this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : void 0, this._ignoreCurrentOutsideClick(), this._syncScrollLock(), this._hideAllSubmenuChildren(), requestAnimationFrame(() => {
114
+ this.open && (this._ensureOverlay(0, this._shouldOpenInstantly), this._shouldOpenInstantly = !0, this._focusMenuItem(this._getEnabledLevelItems(0)[0]), this._syncTriggerAria());
112
115
  }), this._bindHoversAfterUpdate()) : (this._syncScrollLock(), this._closeRootAfterPresence()), this._userOpenChange.consume() && this.dispatchEvent(new CustomEvent("open-change", {
113
116
  detail: { open: this.open },
114
117
  bubbles: !0,
@@ -200,7 +203,7 @@ var C = "web-ui-menu-level-", w = [
200
203
  }
201
204
  _buildOverlay(e, t = !1) {
202
205
  let { panel: n, content: i } = c("dropdown-overlay", this);
203
- n.setAttribute("role", "menu"), n.dataset.level = String(e), n.addEventListener("click", this._onMenuClick), n.addEventListener("keydown", this._onKeydown);
206
+ n.setAttribute("role", "menu"), e === 0 && (n.id = `wui-dropdown-menu-${++w}`), n.dataset.level = String(e), n.addEventListener("click", this._onMenuClick), n.addEventListener("keydown", this._onKeydown);
204
207
  let o = e === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(e - 1);
205
208
  if (o) {
206
209
  let s = r().make({
@@ -244,6 +247,13 @@ var C = "web-ui-menu-level-", w = [
244
247
  let e = (this.shadowRoot?.querySelector("slot[name=\"trigger\"]"))?.assignedElements()[0];
245
248
  return e instanceof HTMLElement ? e : null;
246
249
  }
250
+ _syncTriggerAria() {
251
+ let e = this._queryTriggerAnchor();
252
+ if (!e) return;
253
+ e.setAttribute("aria-haspopup", "menu"), e.setAttribute("aria-expanded", String(this.open));
254
+ let t = this._overlays.get(0)?.overlay;
255
+ t?.id ? e.setAttribute("aria-controls", t.id) : e.removeAttribute("aria-controls");
256
+ }
247
257
  _getSubmenuTriggerAnchor(e) {
248
258
  let t = this._activePath[e];
249
259
  if (t === void 0) return null;
@@ -300,22 +310,22 @@ var C = "web-ui-menu-level-", w = [
300
310
  e([x({
301
311
  type: Boolean,
302
312
  reflect: !0
303
- })], T.prototype, "open", void 0), e([x({
313
+ })], E.prototype, "open", void 0), e([x({
304
314
  type: Boolean,
305
315
  reflect: !0
306
- })], T.prototype, "disabled", void 0), e([x({
316
+ })], E.prototype, "disabled", void 0), e([x({
307
317
  type: Boolean,
308
318
  reflect: !0,
309
319
  attribute: "match-width"
310
- })], T.prototype, "matchWidth", void 0), e([x({
320
+ })], E.prototype, "matchWidth", void 0), e([x({
311
321
  type: Boolean,
312
322
  reflect: !0,
313
323
  attribute: "no-scroll-lock"
314
- })], T.prototype, "noScrollLock", void 0), e([x({
324
+ })], E.prototype, "noScrollLock", void 0), e([x({
315
325
  type: String,
316
326
  reflect: !0
317
- })], T.prototype, "placement", null), e([x({ type: Number })], T.prototype, "offset", null), e([S()], T.prototype, "_activePath", void 0), T = e([b("web-ui-dropdown")], T);
327
+ })], E.prototype, "placement", null), e([x({ type: Number })], E.prototype, "offset", null), e([S()], E.prototype, "_activePath", void 0), E = e([b("web-ui-dropdown")], E);
318
328
  //#endregion
319
- export { T as WebUiDropdown };
329
+ export { E as WebUiDropdown };
320
330
 
321
331
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dropdown/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/dropdown-divider'\nimport '@/components/dropdown-header'\nimport '@/components/dropdown-item'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { createMenuPortalOverlay } from '@/shared/menu-portal/menu-portal'\nimport {\n findFocusedMenuItem,\n focusMenuItem,\n getEnabledMenuItems,\n getMenuChildren,\n getMenuItemFromEvent,\n hideNestedMenuChildren,\n moveMenuChildren\n} from '@/shared/menu-portal/menu-tree'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { defineOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\nexport type { Placement }\n\nconst SLOT_PREFIX = 'web-ui-menu-level-'\nconst ALLOWED_PLACEMENTS = [\n 'top',\n 'top-start',\n 'top-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end'\n] as const\n\ninterface MenuOverlay {\n api: OverlayApi\n overlay: HTMLElement\n content: HTMLElement\n}\n\n@customElement('web-ui-dropdown')\nexport class WebUiDropdown extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true, attribute: 'match-width' }) matchWidth = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n\n private _placement: Placement = 'bottom-start'\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n this._placement = normalizeLiteral(v, ALLOWED_PLACEMENTS, 'bottom-start')\n }\n\n private _offset = 4\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n this._offset = normalizeNumber(v, 0, 100, 4)\n }\n\n @state() private _activePath: number[] = []\n\n private readonly _overlays = new Map<number, MenuOverlay>()\n private readonly _closingSubmenuOverlays = new Map<HTMLElement, MenuOverlay>()\n private _openTimer?: ReturnType<typeof setTimeout>\n private _ignoreOutsideClick = false\n private _ignoreOutsideClickTimer?: ReturnType<typeof setTimeout>\n private _hoverCleanupFns: (() => void)[] = []\n private readonly _scrollLock = defineScrollLockLease().make()\n private readonly _userOpenChange = new UserChangeController()\n private _restoreFocusTarget?: HTMLElement\n private _shouldOpenInstantly = true\n\n get isOpen(): boolean {\n return this.open || this._activePath.length > 0\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this.addEventListener('keydown', this._onKeydown)\n document.addEventListener('click', this._onClickOutside)\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('keydown', this._onKeydown)\n document.removeEventListener('click', this._onClickOutside)\n clearTimeout(this._openTimer)\n clearTimeout(this._ignoreOutsideClickTimer)\n this._scrollLock.release()\n this._cleanupClosedMenu()\n this._hoverCleanupFns.forEach(fn => fn())\n }\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has('open')) {\n if (this.open) {\n this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n this._ignoreCurrentOutsideClick()\n this._syncScrollLock()\n this._hideAllSubmenuChildren()\n requestAnimationFrame(() => {\n if (!this.open) return\n this._ensureOverlay(0, this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n this._focusMenuItem(this._getEnabledLevelItems(0)[0])\n })\n this._bindHoversAfterUpdate()\n } else {\n this._syncScrollLock()\n void this._closeRootAfterPresence()\n }\n if (this._userOpenChange.consume()) {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open: this.open },\n bubbles: true,\n composed: true\n })\n )\n }\n }\n if (changed.has('noScrollLock')) this._syncScrollLock()\n if (changed.has('placement') || changed.has('offset') || changed.has('matchWidth')) {\n this._overlays.get(0)?.api.update({\n placement: this.placement,\n offset: this.offset,\n matchWidth: this.matchWidth\n })\n }\n this._bindLevelHovers()\n }\n\n // 打开菜单(命令式,不派发 `open-change`)。\n openMenu() {\n this._openMenu(true, false)\n }\n\n private _openMenu(isInstant: boolean, fromUser: boolean) {\n if (this.disabled || this.open) return\n this._ignoreCurrentOutsideClick()\n this._shouldOpenInstantly = isInstant\n if (fromUser) this._userOpenChange.mark()\n this.open = true\n }\n\n // 关闭所有层级(命令式,不派发 `open-change`)。\n closeAll() {\n this._closeAll(false)\n }\n\n private _closeAll(fromUser: boolean) {\n if (!this.open) return\n if (fromUser) this._userOpenChange.mark()\n this.open = false\n }\n\n // 清理子菜单状态(不影响 open prop)\n private _closeAllSubmenus() {\n this._closeSubmenuFrom(1, true)\n this._disposeClosingSubmenuOverlays()\n this._syncActiveAttrs()\n }\n\n private _cleanupClosedMenu() {\n this._closeAllSubmenus()\n this._returnLevel0Items()\n this._disposeAll()\n }\n\n private async _closeRootAfterPresence() {\n const overlay = this._overlays.get(0)?.overlay\n if (overlay && !(await hideOverlayPresence(overlay))) return\n if (this.open || !this.isConnected) return\n\n this._cleanupClosedMenu()\n this._restoreFocusTarget?.focus()\n this._restoreFocusTarget = undefined\n }\n\n private _hideAllSubmenuChildren() {\n hideNestedMenuChildren(this, `${SLOT_PREFIX}-hidden`)\n }\n\n private _toggleSubmenu(level: number, itemIndex: number, isInstant = false) {\n if (this._activePath[level] === itemIndex) {\n return\n }\n\n this._closeSubmenuFrom(level + 1)\n\n this._activePath = [...this._activePath.slice(0, level), itemIndex]\n this._syncActiveAttrs()\n\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.hasAttribute('submenu')) {\n requestAnimationFrame(() => {\n if (!this.open || this._activePath[level] !== itemIndex) return\n const restored = this._ensureOverlay(level + 1, isInstant, item)\n if (!restored) this._populateOverlay(level + 1, item)\n })\n }\n\n this._bindHoversAfterUpdate()\n }\n\n private _closeSubmenuFrom(level: number, isInstant = false) {\n for (let lv = this._activePath.length; lv >= level; lv--) {\n const overlay = this._overlays.get(lv)\n const parentItem = this._getLevelItems(lv - 1)[this._activePath[lv - 1]]\n if (!overlay) continue\n\n if (!parentItem || isInstant) {\n this._depopulateOverlay(lv, parentItem)\n this._disposeOverlay(lv)\n } else {\n this._overlays.delete(lv)\n this._closingSubmenuOverlays.set(parentItem, overlay)\n void this._closeSubmenuAfterPresence(overlay, parentItem)\n }\n }\n const nextActivePath = this._activePath.slice(0, level - 1)\n if (nextActivePath.length !== this._activePath.length) {\n this._activePath = nextActivePath\n }\n this._syncActiveAttrs()\n }\n\n private _syncActiveAttrs() {\n this.querySelectorAll('web-ui-dropdown-item').forEach(item => {\n item.removeAttribute('active')\n })\n this._overlays.forEach((_, level) => {\n this._getLevelItems(level).forEach(item => item.removeAttribute('active'))\n })\n this._activePath.forEach((itemIndex, level) => {\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.matches('web-ui-dropdown-item')) {\n item.setAttribute('active', '')\n }\n })\n }\n\n private _getLevelItems(level: number): HTMLElement[] {\n const content = this._overlays.get(level)?.content\n return content ? getMenuChildren(content) : []\n }\n\n private _populateLevel0() {\n const content = this._overlays.get(0)?.content\n if (content) moveMenuChildren(this, content)\n }\n\n private _returnLevel0Items() {\n const content = this._overlays.get(0)?.content\n if (content) moveMenuChildren(content, this)\n }\n\n private _populateOverlay(level: number, submenuItem: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (content) moveMenuChildren(submenuItem, content)\n }\n\n private _depopulateOverlay(level: number, parentItem?: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (!content) return\n const targetLevel = level - 1\n const submenuItem = parentItem ?? this._getLevelItems(targetLevel)[this._activePath[targetLevel]]\n if (submenuItem) moveMenuChildren(content, submenuItem)\n }\n\n private _ensureOverlay(level: number, isInstant = false, submenuItem?: HTMLElement): boolean {\n const closingOverlay = submenuItem ? this._closingSubmenuOverlays.get(submenuItem) : undefined\n if (closingOverlay) {\n this._closingSubmenuOverlays.delete(submenuItem!)\n this._overlays.set(level, closingOverlay)\n closingOverlay.api.open()\n showOverlayPresence(closingOverlay.overlay, { isInstant })\n return true\n }\n const existing = this._overlays.get(level)\n if (existing) {\n existing.api.open()\n showOverlayPresence(existing.overlay, { isInstant })\n return false\n }\n this._buildOverlay(level, isInstant)\n return false\n }\n\n private _buildOverlay(level: number, isInstant = false) {\n const { panel: overlay, content } = createMenuPortalOverlay('dropdown-overlay', this)\n overlay.setAttribute('role', 'menu')\n overlay.dataset.level = String(level)\n overlay.addEventListener('click', this._onMenuClick)\n overlay.addEventListener('keydown', this._onKeydown)\n\n const anchor = level === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(level - 1)\n\n if (anchor) {\n const ctrl = defineOverlay().make({\n anchor,\n overlay,\n placement: level === 0 ? this.placement : 'right-start',\n offset: level === 0 ? this.offset : 0,\n // 菜单至少与 trigger/父项同宽,内容可更宽(floor 来自 --wui-overlay-min-width)\n minAnchorWidth: true,\n matchWidth: level === 0 ? this.matchWidth : false,\n strategy: 'fixed'\n })\n this._overlays.set(level, { api: ctrl, overlay, content })\n if (level === 0) this._populateLevel0()\n ctrl.open()\n showOverlayPresence(overlay, { isInstant })\n }\n }\n\n private _disposeOverlay(level: number) {\n const overlay = this._overlays.get(level)?.overlay\n overlay?.removeEventListener('click', this._onMenuClick)\n overlay?.removeEventListener('keydown', this._onKeydown)\n overlay?.remove()\n this._overlays.get(level)?.api.dispose()\n this._overlays.delete(level)\n }\n\n private _disposeAll() {\n for (const level of this._overlays.keys()) {\n this._disposeOverlay(level)\n }\n }\n\n private async _closeSubmenuAfterPresence(overlay: MenuOverlay, parentItem: HTMLElement) {\n if (!(await hideOverlayPresence(overlay.overlay))) return\n if (this._closingSubmenuOverlays.get(parentItem) !== overlay) return\n\n this._closingSubmenuOverlays.delete(parentItem)\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n }\n\n private _disposeClosingSubmenuOverlays() {\n this._closingSubmenuOverlays.forEach((overlay, parentItem) => {\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n })\n this._closingSubmenuOverlays.clear()\n }\n\n private _restoreSubmenuItems(overlay: MenuOverlay, parentItem: HTMLElement) {\n moveMenuChildren(overlay.content, parentItem)\n }\n\n private _syncScrollLock(isOpen = this.open) {\n this._scrollLock.sync(isOpen && !this.noScrollLock)\n }\n\n private _queryTriggerAnchor(): HTMLElement | null {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n const el = slot?.assignedElements()[0]\n return el instanceof HTMLElement ? el : null\n }\n\n private _getSubmenuTriggerAnchor(level: number): HTMLElement | null {\n const idx = this._activePath[level]\n if (idx === undefined) return null\n const items = this._getLevelItems(level)\n const item = items[idx]\n if (!item) return null\n return item.shadowRoot?.querySelector('.item-inner') ?? item\n }\n\n private _onTriggerClick = (event: MouseEvent) => {\n if (this.disabled) return\n if (this.open) {\n this._closeAll(true)\n } else {\n this._openMenu(event.detail === 0, true)\n }\n }\n\n private _onClickOutside = (e: MouseEvent) => {\n if (!this.isOpen || this._ignoreOutsideClick) return\n if (this._isInsideShadowRoot(e)) return\n this._closeAll(true)\n }\n\n private _onMenuClick = (e: MouseEvent) => {\n const item = getMenuItemFromEvent(e)\n if (!item || item.hasAttribute('disabled') || !item.hasAttribute('submenu')) return\n\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex, e.detail === 0)\n }\n\n private _onKeydown = (e: KeyboardEvent) => {\n if (this.disabled || !this.open) return\n\n // overlay 上键盘事件 target 是菜单项而非组件自身,不能限定 e.target === this,\n // 否则鼠标打开、焦点在菜单项时 Escape 无法关闭\n if (e.key === 'Escape') {\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n e.preventDefault()\n return\n }\n\n const focused = this._getFocusedItem(e)\n const level = this._getFocusedLevel(focused)\n if (level === undefined) return\n const items = this._getEnabledLevelItems(level)\n const currentIndex = focused ? items.indexOf(focused) : -1\n\n switch (e.key) {\n case 'ArrowDown':\n this._focusMenuItem(items[(currentIndex + 1 + items.length) % items.length])\n break\n case 'ArrowUp':\n this._focusMenuItem(items[(currentIndex - 1 + items.length) % items.length])\n break\n case 'Home':\n this._focusMenuItem(items[0])\n break\n case 'End':\n this._focusMenuItem(items.at(-1))\n break\n case 'ArrowRight':\n if (focused?.hasAttribute('submenu')) {\n const itemIndex = this._getLevelItems(level).indexOf(focused)\n this._toggleSubmenu(level, itemIndex, true)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => this._focusMenuItem(this._getEnabledLevelItems(level + 1)[0]))\n )\n }\n break\n case 'ArrowLeft':\n if (level > 0) {\n this._closeSubmenuFrom(level)\n this._focusMenuItem(this._getLevelItems(level - 1)[this._activePath[level - 1]])\n }\n break\n case 'Enter':\n case ' ':\n focused?.click()\n break\n case 'Escape':\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n break\n default:\n return\n }\n e.preventDefault()\n e.stopPropagation()\n }\n\n private _getEnabledLevelItems(level: number) {\n const content = this._overlays.get(level)?.content\n return content ? getEnabledMenuItems(content) : []\n }\n\n private _getFocusedItem(event?: KeyboardEvent): HTMLElement | undefined {\n const eventItem = event\n ?.composedPath()\n .find((node): node is HTMLElement => node instanceof HTMLElement && node.matches('web-ui-dropdown-item'))\n if (eventItem) return eventItem\n\n return findFocusedMenuItem([...this._overlays.values()].map(({ overlay }) => overlay))\n }\n\n private _getFocusedLevel(item = this._getFocusedItem()): number | undefined {\n if (!item) return undefined\n const overlay = [...this._overlays.entries()].find(([, value]) => value.overlay.contains(item))\n return overlay?.[0]\n }\n\n private _focusMenuItem(item: HTMLElement | undefined) {\n focusMenuItem(item)\n }\n\n private _isInsideShadowRoot(e: MouseEvent): boolean {\n for (const node of e.composedPath()) {\n if (node === this || node === this.shadowRoot) return true\n if (node instanceof Node && node.getRootNode() === this.shadowRoot) return true\n if (node instanceof Node && [...this._overlays.values()].some(({ overlay }) => overlay.contains(node)))\n return true\n }\n return false\n }\n\n private _ignoreCurrentOutsideClick() {\n this._ignoreOutsideClick = true\n clearTimeout(this._ignoreOutsideClickTimer)\n this._ignoreOutsideClickTimer = setTimeout(() => {\n this._ignoreOutsideClick = false\n })\n }\n\n private _bindLevelHovers() {\n this._hoverCleanupFns.forEach(fn => fn())\n this._hoverCleanupFns.length = 0\n\n const maxLevel = this._activePath.length + 1\n for (let lv = 0; lv <= maxLevel; lv++) {\n const items = this._getLevelItems(lv)\n if (!items.length) continue\n items.forEach((item, idx) => {\n if (!item.matches('web-ui-dropdown-item') || item.hasAttribute('disabled')) return\n const handler = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return\n clearTimeout(this._openTimer)\n if (item.hasAttribute('submenu')) {\n if (this._activePath[lv] !== idx) {\n this._openTimer = setTimeout(() => this._toggleSubmenu(lv, idx), 200)\n }\n } else if (this._activePath.length > lv) {\n this._closeSubmenuFrom(lv + 1)\n }\n }\n item.addEventListener('pointerenter', handler, { passive: true })\n this._hoverCleanupFns.push(() => item.removeEventListener('pointerenter', handler))\n })\n }\n }\n\n private _bindHoversAfterUpdate() {\n requestAnimationFrame(() => this._bindLevelHovers())\n }\n\n override render() {\n return html`\n <div class=\"dropdown-trigger\" @click=${this._onTriggerClick}>\n <slot name=\"trigger\"></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-dropdown': WebUiDropdown\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dropdown/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/dropdown-divider'\nimport '@/components/dropdown-header'\nimport '@/components/dropdown-item'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { createMenuPortalOverlay } from '@/shared/menu-portal/menu-portal'\nimport {\n findFocusedMenuItem,\n focusMenuItem,\n getEnabledMenuItems,\n getMenuChildren,\n getMenuItemFromEvent,\n hideNestedMenuChildren,\n moveMenuChildren\n} from '@/shared/menu-portal/menu-tree'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { defineOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\nexport type { Placement }\n\nconst SLOT_PREFIX = 'web-ui-menu-level-'\n\nlet dropdownIdCounter = 0\n\nconst ALLOWED_PLACEMENTS = [\n 'top',\n 'top-start',\n 'top-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end'\n] as const\n\ninterface MenuOverlay {\n api: OverlayApi\n overlay: HTMLElement\n content: HTMLElement\n}\n\n@customElement('web-ui-dropdown')\nexport class WebUiDropdown extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true, attribute: 'match-width' }) matchWidth = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n\n private _placement: Placement = 'bottom-start'\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n this._placement = normalizeLiteral(v, ALLOWED_PLACEMENTS, 'bottom-start')\n }\n\n private _offset = 4\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n this._offset = normalizeNumber(v, 0, 100, 4)\n }\n\n @state() private _activePath: number[] = []\n\n private readonly _overlays = new Map<number, MenuOverlay>()\n private readonly _closingSubmenuOverlays = new Map<HTMLElement, MenuOverlay>()\n private _openTimer?: ReturnType<typeof setTimeout>\n private _ignoreOutsideClick = false\n private _ignoreOutsideClickTimer?: ReturnType<typeof setTimeout>\n private _hoverCleanupFns: (() => void)[] = []\n private readonly _scrollLock = defineScrollLockLease().make()\n private readonly _userOpenChange = new UserChangeController()\n private _restoreFocusTarget?: HTMLElement\n private _shouldOpenInstantly = true\n\n get isOpen(): boolean {\n return this.open || this._activePath.length > 0\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this.addEventListener('keydown', this._onKeydown)\n document.addEventListener('click', this._onClickOutside)\n }\n\n override firstUpdated() {\n // trigger slot 内容增删不触发宿主响应式更新:显式请求一轮渲染,\n // 由 updated() 的 ARIA 回写覆盖晚到的 trigger 元素。\n this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n ?.addEventListener('slotchange', () => this.requestUpdate())\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('keydown', this._onKeydown)\n document.removeEventListener('click', this._onClickOutside)\n clearTimeout(this._openTimer)\n clearTimeout(this._ignoreOutsideClickTimer)\n this._scrollLock.release()\n this._cleanupClosedMenu()\n this._hoverCleanupFns.forEach(fn => fn())\n }\n\n protected override updated(changed: Map<string, unknown>) {\n // ARIA 回写不依赖 open 分支,任何渲染后都保持与宿主状态同步。\n this._syncTriggerAria()\n\n if (changed.has('open')) {\n if (this.open) {\n this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n this._ignoreCurrentOutsideClick()\n this._syncScrollLock()\n this._hideAllSubmenuChildren()\n requestAnimationFrame(() => {\n if (!this.open) return\n this._ensureOverlay(0, this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n this._focusMenuItem(this._getEnabledLevelItems(0)[0])\n // 面板 id 在 overlay 构建后才有:回写 aria-controls 指向。\n this._syncTriggerAria()\n })\n this._bindHoversAfterUpdate()\n } else {\n this._syncScrollLock()\n void this._closeRootAfterPresence()\n }\n if (this._userOpenChange.consume()) {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open: this.open },\n bubbles: true,\n composed: true\n })\n )\n }\n }\n if (changed.has('noScrollLock')) this._syncScrollLock()\n if (changed.has('placement') || changed.has('offset') || changed.has('matchWidth')) {\n this._overlays.get(0)?.api.update({\n placement: this.placement,\n offset: this.offset,\n matchWidth: this.matchWidth\n })\n }\n this._bindLevelHovers()\n }\n\n // 命令式打开,不派发 open-change。\n openMenu() {\n this._openMenu(true, false)\n }\n\n private _openMenu(isInstant: boolean, fromUser: boolean) {\n if (this.disabled || this.open) return\n this._ignoreCurrentOutsideClick()\n this._shouldOpenInstantly = isInstant\n if (fromUser) this._userOpenChange.mark()\n this.open = true\n }\n\n // 命令式关闭全部层级,不派发 open-change。\n closeAll() {\n this._closeAll(false)\n }\n\n private _closeAll(fromUser: boolean) {\n if (!this.open) return\n if (fromUser) this._userOpenChange.mark()\n this.open = false\n }\n\n // 不影响 open prop。\n private _closeAllSubmenus() {\n this._closeSubmenuFrom(1, true)\n this._disposeClosingSubmenuOverlays()\n this._syncActiveAttrs()\n }\n\n private _cleanupClosedMenu() {\n this._closeAllSubmenus()\n this._returnLevel0Items()\n this._disposeAll()\n }\n\n private async _closeRootAfterPresence() {\n const overlay = this._overlays.get(0)?.overlay\n if (overlay && !(await hideOverlayPresence(overlay))) return\n if (this.open || !this.isConnected) return\n\n this._cleanupClosedMenu()\n this._restoreFocusTarget?.focus()\n this._restoreFocusTarget = undefined\n }\n\n private _hideAllSubmenuChildren() {\n hideNestedMenuChildren(this, `${SLOT_PREFIX}-hidden`)\n }\n\n private _toggleSubmenu(level: number, itemIndex: number, isInstant = false) {\n if (this._activePath[level] === itemIndex) {\n return\n }\n\n this._closeSubmenuFrom(level + 1)\n\n this._activePath = [...this._activePath.slice(0, level), itemIndex]\n this._syncActiveAttrs()\n\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.hasAttribute('submenu')) {\n requestAnimationFrame(() => {\n if (!this.open || this._activePath[level] !== itemIndex) return\n const restored = this._ensureOverlay(level + 1, isInstant, item)\n if (!restored) this._populateOverlay(level + 1, item)\n })\n }\n\n this._bindHoversAfterUpdate()\n }\n\n private _closeSubmenuFrom(level: number, isInstant = false) {\n for (let lv = this._activePath.length; lv >= level; lv--) {\n const overlay = this._overlays.get(lv)\n const parentItem = this._getLevelItems(lv - 1)[this._activePath[lv - 1]]\n if (!overlay) continue\n\n if (!parentItem || isInstant) {\n this._depopulateOverlay(lv, parentItem)\n this._disposeOverlay(lv)\n } else {\n this._overlays.delete(lv)\n this._closingSubmenuOverlays.set(parentItem, overlay)\n void this._closeSubmenuAfterPresence(overlay, parentItem)\n }\n }\n const nextActivePath = this._activePath.slice(0, level - 1)\n if (nextActivePath.length !== this._activePath.length) {\n this._activePath = nextActivePath\n }\n this._syncActiveAttrs()\n }\n\n private _syncActiveAttrs() {\n this.querySelectorAll('web-ui-dropdown-item').forEach(item => {\n item.removeAttribute('active')\n })\n this._overlays.forEach((_, level) => {\n this._getLevelItems(level).forEach(item => item.removeAttribute('active'))\n })\n this._activePath.forEach((itemIndex, level) => {\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.matches('web-ui-dropdown-item')) {\n item.setAttribute('active', '')\n }\n })\n }\n\n private _getLevelItems(level: number): HTMLElement[] {\n const content = this._overlays.get(level)?.content\n return content ? getMenuChildren(content) : []\n }\n\n private _populateLevel0() {\n const content = this._overlays.get(0)?.content\n if (content) moveMenuChildren(this, content)\n }\n\n private _returnLevel0Items() {\n const content = this._overlays.get(0)?.content\n if (content) moveMenuChildren(content, this)\n }\n\n private _populateOverlay(level: number, submenuItem: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (content) moveMenuChildren(submenuItem, content)\n }\n\n private _depopulateOverlay(level: number, parentItem?: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (!content) return\n const targetLevel = level - 1\n const submenuItem = parentItem ?? this._getLevelItems(targetLevel)[this._activePath[targetLevel]]\n if (submenuItem) moveMenuChildren(content, submenuItem)\n }\n\n private _ensureOverlay(level: number, isInstant = false, submenuItem?: HTMLElement): boolean {\n const closingOverlay = submenuItem ? this._closingSubmenuOverlays.get(submenuItem) : undefined\n if (closingOverlay) {\n this._closingSubmenuOverlays.delete(submenuItem!)\n this._overlays.set(level, closingOverlay)\n closingOverlay.api.open()\n showOverlayPresence(closingOverlay.overlay, { isInstant })\n return true\n }\n const existing = this._overlays.get(level)\n if (existing) {\n existing.api.open()\n showOverlayPresence(existing.overlay, { isInstant })\n return false\n }\n this._buildOverlay(level, isInstant)\n return false\n }\n\n private _buildOverlay(level: number, isInstant = false) {\n const { panel: overlay, content } = createMenuPortalOverlay('dropdown-overlay', this)\n overlay.setAttribute('role', 'menu')\n // 根层级面板带 id:trigger 的 aria-controls 指向它(Q9a)。\n if (level === 0) overlay.id = `wui-dropdown-menu-${++dropdownIdCounter}`\n overlay.dataset.level = String(level)\n overlay.addEventListener('click', this._onMenuClick)\n overlay.addEventListener('keydown', this._onKeydown)\n\n const anchor = level === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(level - 1)\n\n if (anchor) {\n const ctrl = defineOverlay().make({\n anchor,\n overlay,\n placement: level === 0 ? this.placement : 'right-start',\n offset: level === 0 ? this.offset : 0,\n // 菜单至少与 trigger/父项同宽,内容可更宽(floor 来自 --wui-overlay-min-width)\n minAnchorWidth: true,\n matchWidth: level === 0 ? this.matchWidth : false,\n strategy: 'fixed'\n })\n this._overlays.set(level, { api: ctrl, overlay, content })\n if (level === 0) this._populateLevel0()\n ctrl.open()\n showOverlayPresence(overlay, { isInstant })\n }\n }\n\n private _disposeOverlay(level: number) {\n const overlay = this._overlays.get(level)?.overlay\n overlay?.removeEventListener('click', this._onMenuClick)\n overlay?.removeEventListener('keydown', this._onKeydown)\n overlay?.remove()\n this._overlays.get(level)?.api.dispose()\n this._overlays.delete(level)\n }\n\n private _disposeAll() {\n for (const level of this._overlays.keys()) {\n this._disposeOverlay(level)\n }\n }\n\n private async _closeSubmenuAfterPresence(overlay: MenuOverlay, parentItem: HTMLElement) {\n if (!(await hideOverlayPresence(overlay.overlay))) return\n if (this._closingSubmenuOverlays.get(parentItem) !== overlay) return\n\n this._closingSubmenuOverlays.delete(parentItem)\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n }\n\n private _disposeClosingSubmenuOverlays() {\n this._closingSubmenuOverlays.forEach((overlay, parentItem) => {\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n })\n this._closingSubmenuOverlays.clear()\n }\n\n private _restoreSubmenuItems(overlay: MenuOverlay, parentItem: HTMLElement) {\n moveMenuChildren(overlay.content, parentItem)\n }\n\n private _syncScrollLock(isOpen = this.open) {\n this._scrollLock.sync(isOpen && !this.noScrollLock)\n }\n\n private _queryTriggerAnchor(): HTMLElement | null {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n const el = slot?.assignedElements()[0]\n return el instanceof HTMLElement ? el : null\n }\n\n /*\n * trigger 语义回写(Q9a):slot 进来的元素是真正的可聚焦交互元素,\n * aria-haspopup / aria-expanded / aria-controls 必须设在它身上;\n * 组件没有 trigger 包装 div,此前完全没有 ARIA 接线。\n */\n private _syncTriggerAria() {\n const trigger = this._queryTriggerAnchor()\n if (!trigger) return\n trigger.setAttribute('aria-haspopup', 'menu')\n trigger.setAttribute('aria-expanded', String(this.open))\n const rootOverlay = this._overlays.get(0)?.overlay\n if (rootOverlay?.id) trigger.setAttribute('aria-controls', rootOverlay.id)\n else trigger.removeAttribute('aria-controls')\n }\n\n private _getSubmenuTriggerAnchor(level: number): HTMLElement | null {\n const idx = this._activePath[level]\n if (idx === undefined) return null\n const items = this._getLevelItems(level)\n const item = items[idx]\n if (!item) return null\n return item.shadowRoot?.querySelector('.item-inner') ?? item\n }\n\n private _onTriggerClick = (event: MouseEvent) => {\n if (this.disabled) return\n if (this.open) {\n this._closeAll(true)\n } else {\n this._openMenu(event.detail === 0, true)\n }\n }\n\n private _onClickOutside = (e: MouseEvent) => {\n if (!this.isOpen || this._ignoreOutsideClick) return\n if (this._isInsideShadowRoot(e)) return\n this._closeAll(true)\n }\n\n private _onMenuClick = (e: MouseEvent) => {\n const item = getMenuItemFromEvent(e)\n if (!item || item.hasAttribute('disabled') || !item.hasAttribute('submenu')) return\n\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex, e.detail === 0)\n }\n\n private _onKeydown = (e: KeyboardEvent) => {\n if (this.disabled || !this.open) return\n\n // overlay 上键盘事件 target 是菜单项而非组件自身,不能限定 e.target === this,\n // 否则鼠标打开、焦点在菜单项时 Escape 无法关闭\n if (e.key === 'Escape') {\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n e.preventDefault()\n return\n }\n\n const focused = this._getFocusedItem(e)\n const level = this._getFocusedLevel(focused)\n if (level === undefined) return\n const items = this._getEnabledLevelItems(level)\n const currentIndex = focused ? items.indexOf(focused) : -1\n\n switch (e.key) {\n case 'ArrowDown':\n this._focusMenuItem(items[(currentIndex + 1 + items.length) % items.length])\n break\n case 'ArrowUp':\n this._focusMenuItem(items[(currentIndex - 1 + items.length) % items.length])\n break\n case 'Home':\n this._focusMenuItem(items[0])\n break\n case 'End':\n this._focusMenuItem(items.at(-1))\n break\n case 'ArrowRight':\n if (focused?.hasAttribute('submenu')) {\n const itemIndex = this._getLevelItems(level).indexOf(focused)\n this._toggleSubmenu(level, itemIndex, true)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => this._focusMenuItem(this._getEnabledLevelItems(level + 1)[0]))\n )\n }\n break\n case 'ArrowLeft':\n if (level > 0) {\n this._closeSubmenuFrom(level)\n this._focusMenuItem(this._getLevelItems(level - 1)[this._activePath[level - 1]])\n }\n break\n case 'Enter':\n case ' ':\n focused?.click()\n break\n case 'Escape':\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n break\n default:\n return\n }\n e.preventDefault()\n e.stopPropagation()\n }\n\n private _getEnabledLevelItems(level: number) {\n const content = this._overlays.get(level)?.content\n return content ? getEnabledMenuItems(content) : []\n }\n\n private _getFocusedItem(event?: KeyboardEvent): HTMLElement | undefined {\n const eventItem = event\n ?.composedPath()\n .find((node): node is HTMLElement => node instanceof HTMLElement && node.matches('web-ui-dropdown-item'))\n if (eventItem) return eventItem\n\n return findFocusedMenuItem([...this._overlays.values()].map(({ overlay }) => overlay))\n }\n\n private _getFocusedLevel(item = this._getFocusedItem()): number | undefined {\n if (!item) return undefined\n const overlay = [...this._overlays.entries()].find(([, value]) => value.overlay.contains(item))\n return overlay?.[0]\n }\n\n private _focusMenuItem(item: HTMLElement | undefined) {\n focusMenuItem(item)\n }\n\n private _isInsideShadowRoot(e: MouseEvent): boolean {\n for (const node of e.composedPath()) {\n if (node === this || node === this.shadowRoot) return true\n if (node instanceof Node && node.getRootNode() === this.shadowRoot) return true\n if (node instanceof Node && [...this._overlays.values()].some(({ overlay }) => overlay.contains(node)))\n return true\n }\n return false\n }\n\n private _ignoreCurrentOutsideClick() {\n this._ignoreOutsideClick = true\n clearTimeout(this._ignoreOutsideClickTimer)\n this._ignoreOutsideClickTimer = setTimeout(() => {\n this._ignoreOutsideClick = false\n })\n }\n\n private _bindLevelHovers() {\n this._hoverCleanupFns.forEach(fn => fn())\n this._hoverCleanupFns.length = 0\n\n const maxLevel = this._activePath.length + 1\n for (let lv = 0; lv <= maxLevel; lv++) {\n const items = this._getLevelItems(lv)\n if (!items.length) continue\n items.forEach((item, idx) => {\n if (!item.matches('web-ui-dropdown-item') || item.hasAttribute('disabled')) return\n const handler = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return\n clearTimeout(this._openTimer)\n if (item.hasAttribute('submenu')) {\n if (this._activePath[lv] !== idx) {\n this._openTimer = setTimeout(() => this._toggleSubmenu(lv, idx), 200)\n }\n } else if (this._activePath.length > lv) {\n this._closeSubmenuFrom(lv + 1)\n }\n }\n item.addEventListener('pointerenter', handler, { passive: true })\n this._hoverCleanupFns.push(() => item.removeEventListener('pointerenter', handler))\n })\n }\n }\n\n private _bindHoversAfterUpdate() {\n requestAnimationFrame(() => this._bindLevelHovers())\n }\n\n override render() {\n return html`\n <div class=\"dropdown-trigger\" @click=${this._onTriggerClick}>\n <slot name=\"trigger\"></slot>\n </div>\n `\n }\n\n declare readonly $events: {\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-dropdown': WebUiDropdown\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AA4BA,IAAM,IAAc,sBAEhB,IAAoB,GAElB,IAAqB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GASa,IAAN,cAA4B,EAAW;;EA6YtB,aA1Y6B,KAAA,OAAA,IACI,KAAA,WAAA,IAC4B,KAAA,aAAA,IACK,KAAA,eAAA,IAExD,KAAA,aAAA,gBAUd,KAAA,UAAA,GAUuB,KAAA,cAAA,CAAC,GAEb,KAAA,4BAAA,IAAI,IAAyB,GACf,KAAA,0CAAA,IAAI,IAA8B,GAE/C,KAAA,sBAAA,IAEa,KAAA,mBAAA,CAAC,GACb,KAAA,cAAA,EAAsB,CAAC,CAAC,KAAK,GACzB,KAAA,kBAAA,IAAI,EAAqB,GAE7B,KAAA,uBAAA,IA6UJ,KAAA,mBAAA,MAAsB;GAC3C,KAAK,aACL,KAAK,OACP,KAAK,UAAU,EAAI,IAEnB,KAAK,UAAU,EAAM,WAAW,GAAG,EAAI;EAE3C,GAE2B,KAAA,mBAAA,MAAkB;GACvC,CAAC,KAAK,UAAU,KAAK,uBACrB,KAAK,oBAAoB,CAAC,KAC9B,KAAK,UAAU,EAAI;EACrB,GAEwB,KAAA,gBAAA,MAAkB;GACxC,IAAM,IAAO,EAAqB,CAAC;GACnC,IAAI,CAAC,KAAQ,EAAK,aAAa,UAAU,KAAK,CAAC,EAAK,aAAa,SAAS,GAAG;GAE7E,IAAM,IAAQ,KAAK,iBAAiB,CAAI;GACxC,IAAI,MAAU,KAAA,GAAW;GACzB,IAAM,IAAY,KAAK,eAAe,CAAK,CAAC,CAAC,QAAQ,CAAI;GACzD,AAAI,KAAa,KAAG,KAAK,eAAe,GAAO,GAAW,EAAE,WAAW,CAAC;EAC1E,GAEsB,KAAA,cAAA,MAAqB;GACzC,IAAI,KAAK,YAAY,CAAC,KAAK,MAAM;GAIjC,IAAI,EAAE,QAAQ,UAAU;IAGtB,AAFI,KAAK,YAAY,SAAS,IAAG,KAAK,kBAAkB,KAAK,YAAY,MAAM,IAC1E,KAAK,UAAU,EAAI,GACxB,EAAE,eAAe;IACjB;GACF;GAEA,IAAM,IAAU,KAAK,gBAAgB,CAAC,GAChC,IAAQ,KAAK,iBAAiB,CAAO;GAC3C,IAAI,MAAU,KAAA,GAAW;GACzB,IAAM,IAAQ,KAAK,sBAAsB,CAAK,GACxC,IAAe,IAAU,EAAM,QAAQ,CAAO,IAAI;GAExD,QAAQ,EAAE,KAAV;IACE,KAAK;KACH,KAAK,eAAe,GAAO,IAAe,IAAI,EAAM,UAAU,EAAM,OAAO;KAC3E;IACF,KAAK;KACH,KAAK,eAAe,GAAO,IAAe,IAAI,EAAM,UAAU,EAAM,OAAO;KAC3E;IACF,KAAK;KACH,KAAK,eAAe,EAAM,EAAE;KAC5B;IACF,KAAK;KACH,KAAK,eAAe,EAAM,GAAG,EAAE,CAAC;KAChC;IACF,KAAK;KACH,IAAI,GAAS,aAAa,SAAS,GAAG;MACpC,IAAM,IAAY,KAAK,eAAe,CAAK,CAAC,CAAC,QAAQ,CAAO;MAE5D,AADA,KAAK,eAAe,GAAO,GAAW,EAAI,GAC1C,4BACE,4BAA4B,KAAK,eAAe,KAAK,sBAAsB,IAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3F;KACF;KACA;IACF,KAAK;KACH,AAAI,IAAQ,MACV,KAAK,kBAAkB,CAAK,GAC5B,KAAK,eAAe,KAAK,eAAe,IAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,IAAQ,GAAG;KAEjF;IACF,KAAK;IACL,KAAK;KACH,GAAS,MAAM;KACf;IACF,KAAK;KACH,AAAI,KAAK,YAAY,SAAS,IAAG,KAAK,kBAAkB,KAAK,YAAY,MAAM,IAC1E,KAAK,UAAU,EAAI;KACxB;IACF,SACE;GACJ;GAEA,AADA,EAAE,eAAe,GACjB,EAAE,gBAAgB;EACpB;;;EAvcyB,KAAA,SAAA,EAAU,CAAK;;CASxC,IACI,YAAuB;EACzB,OAAO,KAAK;CACd;CACA,IAAI,UAAU,GAAW;EACvB,KAAK,aAAa,EAAiB,GAAG,GAAoB,cAAc;CAC1E;CAIA,IACI,SAAiB;EACnB,OAAO,KAAK;CACd;CACA,IAAI,OAAO,GAAW;EACpB,KAAK,UAAU,EAAgB,GAAG,GAAG,KAAK,CAAC;CAC7C;CAeA,IAAI,SAAkB;EACpB,OAAO,KAAK,QAAQ,KAAK,YAAY,SAAS;CAChD;CAEA,oBAA6B;EAG3B,AAFA,MAAM,kBAAkB,GACxB,KAAK,iBAAiB,WAAW,KAAK,UAAU,GAChD,SAAS,iBAAiB,SAAS,KAAK,eAAe;CACzD;CAEA,eAAwB;EAGtB,KAAK,YACD,cAA+B,wBAAsB,CAAC,EACtD,iBAAiB,oBAAoB,KAAK,cAAc,CAAC;CAC/D;CAEA,uBAAgC;EAQ9B,AAPA,MAAM,qBAAqB,GAC3B,KAAK,oBAAoB,WAAW,KAAK,UAAU,GACnD,SAAS,oBAAoB,SAAS,KAAK,eAAe,GAC1D,aAAa,KAAK,UAAU,GAC5B,aAAa,KAAK,wBAAwB,GAC1C,KAAK,YAAY,QAAQ,GACzB,KAAK,mBAAmB,GACxB,KAAK,iBAAiB,SAAQ,MAAM,EAAG,CAAC;CAC1C;CAEA,QAA2B,GAA+B;EAyCxD,AAvCA,KAAK,iBAAiB,GAElB,EAAQ,IAAI,MAAM,MAChB,KAAK,QACP,KAAK,wBAAwB,SAAS,yBAAyB,cAAc,SAAS,gBAAgB,KAAA,GACtG,KAAK,2BAA2B,GAChC,KAAK,gBAAgB,GACrB,KAAK,wBAAwB,GAC7B,4BAA4B;GACrB,KAAK,SACV,KAAK,eAAe,GAAG,KAAK,oBAAoB,GAChD,KAAK,uBAAuB,IAC5B,KAAK,eAAe,KAAK,sBAAsB,CAAC,CAAC,CAAC,EAAE,GAEpD,KAAK,iBAAiB;EACxB,CAAC,GACD,KAAK,uBAAuB,MAE5B,KAAK,gBAAgB,GACrB,KAAU,wBAAwB,IAEhC,KAAK,gBAAgB,QAAQ,KAC/B,KAAK,cACH,IAAI,YAAY,eAAe;GAC7B,QAAQ,EAAE,MAAM,KAAK,KAAK;GAC1B,SAAS;GACT,UAAU;EACZ,CAAC,CACH,IAGA,EAAQ,IAAI,cAAc,KAAG,KAAK,gBAAgB,IAClD,EAAQ,IAAI,WAAW,KAAK,EAAQ,IAAI,QAAQ,KAAK,EAAQ,IAAI,YAAY,MAC/E,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE,IAAI,OAAO;GAChC,WAAW,KAAK;GAChB,QAAQ,KAAK;GACb,YAAY,KAAK;EACnB,CAAC,GAEH,KAAK,iBAAiB;CACxB;CAGA,WAAW;EACT,KAAK,UAAU,IAAM,EAAK;CAC5B;CAEA,UAAkB,GAAoB,GAAmB;EACnD,KAAK,YAAY,KAAK,SAC1B,KAAK,2BAA2B,GAChC,KAAK,uBAAuB,GACxB,KAAU,KAAK,gBAAgB,KAAK,GACxC,KAAK,OAAO;CACd;CAGA,WAAW;EACT,KAAK,UAAU,EAAK;CACtB;CAEA,UAAkB,GAAmB;EAC9B,AAEL,KAAK,UADD,KAAU,KAAK,gBAAgB,KAAK,GAC5B;CACd;CAGA,oBAA4B;EAG1B,AAFA,KAAK,kBAAkB,GAAG,EAAI,GAC9B,KAAK,+BAA+B,GACpC,KAAK,iBAAiB;CACxB;CAEA,qBAA6B;EAG3B,AAFA,KAAK,kBAAkB,GACvB,KAAK,mBAAmB,GACxB,KAAK,YAAY;CACnB;CAEA,MAAc,0BAA0B;EACtC,IAAM,IAAU,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE;EACnC,KAAW,CAAE,MAAM,EAAoB,CAAO,KAC9C,KAAK,QAAQ,CAAC,KAAK,gBAEvB,KAAK,mBAAmB,GACxB,KAAK,qBAAqB,MAAM,GAChC,KAAK,sBAAsB,KAAA;CAC7B;CAEA,0BAAkC;EAChC,EAAuB,MAAM,GAAG,EAAY,QAAQ;CACtD;CAEA,eAAuB,GAAe,GAAmB,IAAY,IAAO;EAC1E,IAAI,KAAK,YAAY,OAAW,GAC9B;EAMF,AAHA,KAAK,kBAAkB,IAAQ,CAAC,GAEhC,KAAK,cAAc,CAAC,GAAG,KAAK,YAAY,MAAM,GAAG,CAAK,GAAG,CAAS,GAClE,KAAK,iBAAiB;EAEtB,IAAM,IAAO,KAAK,eAAe,CAAK,CAAC,CAAC;EASxC,AARI,GAAM,aAAa,SAAS,KAC9B,4BAA4B;GACtB,CAAC,KAAK,QAAQ,KAAK,YAAY,OAAW,KAC7B,KAAK,eAAe,IAAQ,GAAG,GAAW,CACtD,KAAU,KAAK,iBAAiB,IAAQ,GAAG,CAAI;EACtD,CAAC,GAGH,KAAK,uBAAuB;CAC9B;CAEA,kBAA0B,GAAe,IAAY,IAAO;EAC1D,KAAK,IAAI,IAAK,KAAK,YAAY,QAAQ,KAAM,GAAO,KAAM;GACxD,IAAM,IAAU,KAAK,UAAU,IAAI,CAAE,GAC/B,IAAa,KAAK,eAAe,IAAK,CAAC,CAAC,CAAC,KAAK,YAAY,IAAK;GAChE,MAED,CAAC,KAAc,KACjB,KAAK,mBAAmB,GAAI,CAAU,GACtC,KAAK,gBAAgB,CAAE,MAEvB,KAAK,UAAU,OAAO,CAAE,GACxB,KAAK,wBAAwB,IAAI,GAAY,CAAO,GACpD,KAAU,2BAA2B,GAAS,CAAU;EAE5D;EACA,IAAM,IAAiB,KAAK,YAAY,MAAM,GAAG,IAAQ,CAAC;EAI1D,AAHI,EAAe,WAAW,KAAK,YAAY,WAC7C,KAAK,cAAc,IAErB,KAAK,iBAAiB;CACxB;CAEA,mBAA2B;EAOzB,AANA,KAAK,iBAAiB,sBAAsB,CAAC,CAAC,SAAQ,MAAQ;GAC5D,EAAK,gBAAgB,QAAQ;EAC/B,CAAC,GACD,KAAK,UAAU,SAAS,GAAG,MAAU;GACnC,KAAK,eAAe,CAAK,CAAC,CAAC,SAAQ,MAAQ,EAAK,gBAAgB,QAAQ,CAAC;EAC3E,CAAC,GACD,KAAK,YAAY,SAAS,GAAW,MAAU;GAC7C,IAAM,IAAO,KAAK,eAAe,CAAK,CAAC,CAAC;GACxC,AAAI,GAAM,QAAQ,sBAAsB,KACtC,EAAK,aAAa,UAAU,EAAE;EAElC,CAAC;CACH;CAEA,eAAuB,GAA8B;EACnD,IAAM,IAAU,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE;EAC3C,OAAO,IAAU,EAAgB,CAAO,IAAI,CAAC;CAC/C;CAEA,kBAA0B;EACxB,IAAM,IAAU,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE;EACvC,AAAI,KAAS,EAAiB,MAAM,CAAO;CAC7C;CAEA,qBAA6B;EAC3B,IAAM,IAAU,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE;EACvC,AAAI,KAAS,EAAiB,GAAS,IAAI;CAC7C;CAEA,iBAAyB,GAAe,GAA0B;EAChE,IAAM,IAAU,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE;EAC3C,AAAI,KAAS,EAAiB,GAAa,CAAO;CACpD;CAEA,mBAA2B,GAAe,GAA0B;EAClE,IAAM,IAAU,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE;EAC3C,IAAI,CAAC,GAAS;EACd,IAAM,IAAc,IAAQ,GACtB,IAAc,KAAc,KAAK,eAAe,CAAW,CAAC,CAAC,KAAK,YAAY;EACpF,AAAI,KAAa,EAAiB,GAAS,CAAW;CACxD;CAEA,eAAuB,GAAe,IAAY,IAAO,GAAoC;EAC3F,IAAM,IAAiB,IAAc,KAAK,wBAAwB,IAAI,CAAW,IAAI,KAAA;EACrF,IAAI,GAKF,OAJA,KAAK,wBAAwB,OAAO,CAAY,GAChD,KAAK,UAAU,IAAI,GAAO,CAAc,GACxC,EAAe,IAAI,KAAK,GACxB,EAAoB,EAAe,SAAS,EAAE,aAAU,CAAC,GAClD;EAET,IAAM,IAAW,KAAK,UAAU,IAAI,CAAK;EAOzC,OANI,KACF,EAAS,IAAI,KAAK,GAClB,EAAoB,EAAS,SAAS,EAAE,aAAU,CAAC,GAC5C,OAET,KAAK,cAAc,GAAO,CAAS,GAC5B;CACT;CAEA,cAAsB,GAAe,IAAY,IAAO;EACtD,IAAM,EAAE,OAAO,GAAS,eAAY,EAAwB,oBAAoB,IAAI;EAMpF,AALA,EAAQ,aAAa,QAAQ,MAAM,GAE/B,MAAU,MAAG,EAAQ,KAAK,qBAAqB,EAAE,MACrD,EAAQ,QAAQ,QAAQ,OAAO,CAAK,GACpC,EAAQ,iBAAiB,SAAS,KAAK,YAAY,GACnD,EAAQ,iBAAiB,WAAW,KAAK,UAAU;EAEnD,IAAM,IAAS,MAAU,IAAI,KAAK,oBAAoB,IAAI,KAAK,yBAAyB,IAAQ,CAAC;EAEjG,IAAI,GAAQ;GACV,IAAM,IAAO,EAAc,CAAC,CAAC,KAAK;IAChC;IACA;IACA,WAAW,MAAU,IAAI,KAAK,YAAY;IAC1C,QAAQ,MAAU,IAAI,KAAK,SAAS;IAEpC,gBAAgB;IAChB,YAAY,MAAU,KAAI,KAAK;IAC/B,UAAU;GACZ,CAAC;GAID,AAHA,KAAK,UAAU,IAAI,GAAO;IAAE,KAAK;IAAM;IAAS;GAAQ,CAAC,GACrD,MAAU,KAAG,KAAK,gBAAgB,GACtC,EAAK,KAAK,GACV,EAAoB,GAAS,EAAE,aAAU,CAAC;EAC5C;CACF;CAEA,gBAAwB,GAAe;EACrC,IAAM,IAAU,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE;EAK3C,AAJA,GAAS,oBAAoB,SAAS,KAAK,YAAY,GACvD,GAAS,oBAAoB,WAAW,KAAK,UAAU,GACvD,GAAS,OAAO,GAChB,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE,IAAI,QAAQ,GACvC,KAAK,UAAU,OAAO,CAAK;CAC7B;CAEA,cAAsB;EACpB,KAAK,IAAM,KAAS,KAAK,UAAU,KAAK,GACtC,KAAK,gBAAgB,CAAK;CAE9B;CAEA,MAAc,2BAA2B,GAAsB,GAAyB;EAChF,MAAM,EAAoB,EAAQ,OAAO,KAC3C,KAAK,wBAAwB,IAAI,CAAU,MAAM,MAErD,KAAK,wBAAwB,OAAO,CAAU,GAC9C,KAAK,qBAAqB,GAAS,CAAU,GAC7C,EAAQ,IAAI,QAAQ,GACpB,EAAQ,QAAQ,OAAO;CACzB;CAEA,iCAAyC;EAMvC,AALA,KAAK,wBAAwB,SAAS,GAAS,MAAe;GAG5D,AAFA,KAAK,qBAAqB,GAAS,CAAU,GAC7C,EAAQ,IAAI,QAAQ,GACpB,EAAQ,QAAQ,OAAO;EACzB,CAAC,GACD,KAAK,wBAAwB,MAAM;CACrC;CAEA,qBAA6B,GAAsB,GAAyB;EAC1E,EAAiB,EAAQ,SAAS,CAAU;CAC9C;CAEA,gBAAwB,IAAS,KAAK,MAAM;EAC1C,KAAK,YAAY,KAAK,KAAU,CAAC,KAAK,YAAY;CACpD;CAEA,sBAAkD;EAEhD,IAAM,KADO,KAAK,YAAY,cAA+B,wBAAsB,EAAA,EAClE,iBAAiB,CAAC,CAAC;EACpC,OAAO,aAAc,cAAc,IAAK;CAC1C;CAOA,mBAA2B;EACzB,IAAM,IAAU,KAAK,oBAAoB;EACzC,IAAI,CAAC,GAAS;EAEd,AADA,EAAQ,aAAa,iBAAiB,MAAM,GAC5C,EAAQ,aAAa,iBAAiB,OAAO,KAAK,IAAI,CAAC;EACvD,IAAM,IAAc,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE;EAC3C,AAAI,GAAa,KAAI,EAAQ,aAAa,iBAAiB,EAAY,EAAE,IACpE,EAAQ,gBAAgB,eAAe;CAC9C;CAEA,yBAAiC,GAAmC;EAClE,IAAM,IAAM,KAAK,YAAY;EAC7B,IAAI,MAAQ,KAAA,GAAW,OAAO;EAE9B,IAAM,IADQ,KAAK,eAAe,CACrB,CAAA,CAAM;EAEnB,OADK,IACE,EAAK,YAAY,cAAc,aAAa,KAAK,IADtC;CAEpB;CAwFA,sBAA8B,GAAe;EAC3C,IAAM,IAAU,KAAK,UAAU,IAAI,CAAK,CAAC,EAAE;EAC3C,OAAO,IAAU,EAAoB,CAAO,IAAI,CAAC;CACnD;CAEA,gBAAwB,GAAgD;EAMtE,OALkB,GACd,aAAa,CAAC,CACf,MAAM,MAA8B,aAAgB,eAAe,EAAK,QAAQ,sBAAsB,CAAC,KAGnG,EAAoB,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAc,CAAO,CAAC;CACvF;CAEA,iBAAyB,IAAO,KAAK,gBAAgB,GAAuB;EACrE,OAEL,OADgB,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,OAAW,EAAM,QAAQ,SAAS,CAAI,CACtF,CAAA,GAAU;CACnB;CAEA,eAAuB,GAA+B;EACpD,EAAc,CAAI;CACpB;CAEA,oBAA4B,GAAwB;EAClD,KAAK,IAAM,KAAQ,EAAE,aAAa,GAGhC,IAFI,MAAS,QAAQ,MAAS,KAAK,cAC/B,aAAgB,QAAQ,EAAK,YAAY,MAAM,KAAK,cACpD,aAAgB,QAAQ,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,iBAAc,EAAQ,SAAS,CAAI,CAAC,GACnG,OAAO;EAEX,OAAO;CACT;CAEA,6BAAqC;EAGnC,AAFA,KAAK,sBAAsB,IAC3B,aAAa,KAAK,wBAAwB,GAC1C,KAAK,2BAA2B,iBAAiB;GAC/C,KAAK,sBAAsB;EAC7B,CAAC;CACH;CAEA,mBAA2B;EAEzB,AADA,KAAK,iBAAiB,SAAQ,MAAM,EAAG,CAAC,GACxC,KAAK,iBAAiB,SAAS;EAE/B,IAAM,IAAW,KAAK,YAAY,SAAS;EAC3C,KAAK,IAAI,IAAK,GAAG,KAAM,GAAU,KAAM;GACrC,IAAM,IAAQ,KAAK,eAAe,CAAE;GAC/B,EAAM,UACX,EAAM,SAAS,GAAM,MAAQ;IAC3B,IAAI,CAAC,EAAK,QAAQ,sBAAsB,KAAK,EAAK,aAAa,UAAU,GAAG;IAC5E,IAAM,KAAW,MAAwB;KACnC,EAAM,gBAAgB,YAC1B,aAAa,KAAK,UAAU,GACxB,EAAK,aAAa,SAAS,IACzB,KAAK,YAAY,OAAQ,MAC3B,KAAK,aAAa,iBAAiB,KAAK,eAAe,GAAI,CAAG,GAAG,GAAG,KAE7D,KAAK,YAAY,SAAS,KACnC,KAAK,kBAAkB,IAAK,CAAC;IAEjC;IAEA,AADA,EAAK,iBAAiB,gBAAgB,GAAS,EAAE,SAAS,GAAK,CAAC,GAChE,KAAK,iBAAiB,WAAW,EAAK,oBAAoB,gBAAgB,CAAO,CAAC;GACpF,CAAC;EACH;CACF;CAEA,yBAAiC;EAC/B,4BAA4B,KAAK,iBAAiB,CAAC;CACrD;CAEA,SAAkB;EAChB,OAAO,CAAI;6CAC8B,KAAK,gBAAgB;;;;CAIhE;AAKF;AA3hBG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GACzC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,YAAA,KAAA,CAAA,GACzC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAc,CAAC,CAAA,GAAA,EAAA,WAAA,cAAA,KAAA,CAAA,GACnE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAiB,CAAC,CAAA,GAAA,EAAA,WAAA,gBAAA,KAAA,CAAA,GAItE,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,aAAA,IAAA,GAUxC,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,UAAA,IAAA,GAQzB,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,GA7BR,IAAA,EAAA,CAAA,EAAc,iBAAiB,CAAA,GAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/dropdown-item/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{display:block}:host([disabled]){cursor:not-allowed;opacity:.4}.item-inner{-webkit-user-select:none;user-select:none;height:32px;font-size:var(--wui-font-size,14px);color:inherit;white-space:nowrap;transition:color var(--wui-duration-feedback,.1s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1)), background-color var(--wui-duration-feedback,.1s) var(--wui-ease-enter,cubic-bezier(.23, 1, .32, 1));border-radius:2147483647px;outline:none;align-items:center;gap:8px;padding:0 8px;display:flex}.item-inner:focus-visible{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}:host([active]) .item-inner{color:inherit;background:var(--wui-color-border,#0000001a)}@media (hover:hover) and (pointer:fine){:host(:hover) .item-inner{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}}.item-label{min-width:0;color:inherit;text-overflow:ellipsis;flex:1;overflow:hidden}.item-suffix{opacity:.4;flex:none}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:block}:host([disabled]){cursor:not-allowed;opacity:.4}.item-inner{-webkit-user-select:none;user-select:none;height:32px;font-size:var(--wui-font-size,14px);color:inherit;white-space:nowrap;border-radius:2147483647px;outline:none;align-items:center;gap:8px;padding:0 8px;display:flex}.item-inner:focus-visible{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}:host([active]) .item-inner{color:inherit;background:var(--wui-color-border,#0000001a)}@media (hover:hover) and (pointer:fine){:host(:hover) .item-inner{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}}.item-label{min-width:0;color:inherit;text-overflow:ellipsis;flex:1;overflow:hidden}.item-suffix{opacity:.4;flex:none}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dropdown-item/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.item-inner {\n user-select: none;\n\n display: flex;\n gap: 8px;\n align-items: center;\n\n height: 32px;\n padding: 0 8px;\n border-radius: calc(infinity * 1px);\n\n font-size: var(--wui-font-size, 14px);\n color: inherit;\n white-space: nowrap;\n\n outline: none;\n\n transition:\n color var(--wui-duration-feedback, 100ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1)),\n background-color var(--wui-duration-feedback, 100ms) var(--wui-ease-enter, cubic-bezier(0.23, 1, 0.32, 1));\n}\n\n.item-inner:focus-visible {\n color: var(--wui-color-on-accent, #fff);\n background: var(--wui-color-accent, #08f);\n}\n\n:host([active]) .item-inner {\n color: inherit;\n background: var(--wui-color-border, rgb(0 0 0 / 0.1));\n}\n\n@media (hover: hover) and (pointer: fine) {\n :host(:hover) .item-inner {\n color: var(--wui-color-on-accent, #fff);\n background: var(--wui-color-accent, #08f);\n }\n}\n\n.item-label {\n overflow: hidden;\n flex: 1;\n\n min-width: 0;\n\n color: inherit;\n text-overflow: ellipsis;\n}\n\n.item-suffix {\n flex: none;\n opacity: 0.4;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dropdown-item/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.item-inner {\n user-select: none;\n\n display: flex;\n gap: 8px;\n align-items: center;\n\n height: 32px;\n padding: 0 8px;\n border-radius: calc(infinity * 1px);\n\n font-size: var(--wui-font-size, 14px);\n color: inherit;\n white-space: nowrap;\n\n outline: none;\n}\n\n.item-inner:focus-visible {\n color: var(--wui-color-on-accent, #fff);\n background: var(--wui-color-accent, #08f);\n}\n\n:host([active]) .item-inner {\n color: inherit;\n background: var(--wui-color-border, rgb(0 0 0 / 0.1));\n}\n\n@media (hover: hover) and (pointer: fine) {\n :host(:hover) .item-inner {\n color: var(--wui-color-on-accent, #fff);\n background: var(--wui-color-accent, #08f);\n }\n}\n\n.item-label {\n overflow: hidden;\n flex: 1;\n\n min-width: 0;\n\n color: inherit;\n text-overflow: ellipsis;\n}\n\n.item-suffix {\n flex: none;\n opacity: 0.4;\n}\n"],"mappings":""}
@@ -4,6 +4,7 @@ export declare class WebUiEmpty extends LitElement {
4
4
  static styles: import('lit').CSSResult[];
5
5
  title: string;
6
6
  description: string;
7
+ private get _iconSize();
7
8
  set size(value: string);
8
9
  get size(): EmptySize;
9
10
  private _size;
@@ -1,28 +1,30 @@
1
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/lucide-inbox.js";
4
- import n from "../../assets/glass.js";
5
- import { normalizeLiteral as r } from "../../shared/normalize/index.js";
6
- import i from "./style.js";
7
- import { LitElement as a, html as o, unsafeCSS as s } from "lit";
8
- import { customElement as c, property as l, state as u } from "lit/decorators.js";
9
- import { classMap as d } from "lit/directives/class-map.js";
4
+ import { normalizeLiteral as n } from "../../shared/normalize/index.js";
5
+ import r from "./style.js";
6
+ import { LitElement as i, html as a, unsafeCSS as o } from "lit";
7
+ import { customElement as s, property as c, state as l } from "lit/decorators.js";
8
+ import { classMap as u } from "lit/directives/class-map.js";
10
9
  //#region src/components/empty/index.ts
11
- var f = [
10
+ var d = [
12
11
  "small",
13
12
  "medium",
14
13
  "large"
15
- ], p = class extends a {
14
+ ], f = class extends i {
16
15
  constructor(...e) {
17
16
  super(...e), this.title = "", this.description = "", this._size = "medium", this._hasTitleSlot = !1, this._hasDescriptionSlot = !1, this._hasActionSlot = !1, this._syncSlotContent = () => {
18
17
  this._hasTitleSlot = this._hasAssignedContent(), this._hasDescriptionSlot = this._hasAssignedContent("description"), this._hasActionSlot = this._hasAssignedContent("action");
19
18
  };
20
19
  }
21
20
  static {
22
- this.styles = [s(n), s(i)];
21
+ this.styles = [o(r)];
22
+ }
23
+ get _iconSize() {
24
+ return this._size === "small" ? 16 : this._size === "large" ? 32 : 24;
23
25
  }
24
26
  set size(e) {
25
- let t = r(e, f, "medium");
27
+ let t = n(e, d, "medium");
26
28
  if (this._size !== t) {
27
29
  let e = this._size;
28
30
  this._size = t, this.requestUpdate("size", e);
@@ -40,24 +42,24 @@ var f = [
40
42
  }
41
43
  render() {
42
44
  let e = this._hasTitleSlot || !!this.title, n = this._hasDescriptionSlot || !!this.description;
43
- return o`
45
+ return a`
44
46
  <section class="empty">
45
- <div class="empty-icon wui-glass" aria-hidden="true">
46
- <slot name="icon"><web-ui-icon .icon=${t}></web-ui-icon></slot>
47
+ <div class="empty-icon" aria-hidden="true">
48
+ <slot name="icon"><web-ui-icon .icon=${t} .size=${this._iconSize}></web-ui-icon></slot>
47
49
  </div>
48
- <div class=${d({
50
+ <div class=${u({
49
51
  "empty-title": !0,
50
52
  "is-hidden": !e
51
53
  })}>
52
54
  <slot @slotchange=${this._syncSlotContent}>${this.title}</slot>
53
55
  </div>
54
- <div class=${d({
56
+ <div class=${u({
55
57
  "empty-description": !0,
56
58
  "is-hidden": !n
57
59
  })}>
58
60
  <slot name="description" @slotchange=${this._syncSlotContent}>${this.description}</slot>
59
61
  </div>
60
- <div class=${d({
62
+ <div class=${u({
61
63
  "empty-action": !0,
62
64
  "is-hidden": !this._hasActionSlot
63
65
  })}>
@@ -67,17 +69,17 @@ var f = [
67
69
  `;
68
70
  }
69
71
  };
70
- e([l({
72
+ e([c({
71
73
  type: String,
72
74
  reflect: !0
73
- })], p.prototype, "title", void 0), e([l({
75
+ })], f.prototype, "title", void 0), e([c({
74
76
  type: String,
75
77
  reflect: !0
76
- })], p.prototype, "description", void 0), e([l({
78
+ })], f.prototype, "description", void 0), e([c({
77
79
  type: String,
78
80
  reflect: !0
79
- })], p.prototype, "size", null), e([u()], p.prototype, "_hasTitleSlot", void 0), e([u()], p.prototype, "_hasDescriptionSlot", void 0), e([u()], p.prototype, "_hasActionSlot", void 0), p = e([c("web-ui-empty")], p);
81
+ })], f.prototype, "size", null), e([l()], f.prototype, "_hasTitleSlot", void 0), e([l()], f.prototype, "_hasDescriptionSlot", void 0), e([l()], f.prototype, "_hasActionSlot", void 0), f = e([s("web-ui-empty")], f);
80
82
  //#endregion
81
- export { p as WebUiEmpty };
83
+ export { f as WebUiEmpty };
82
84
 
83
85
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/empty/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport '@/components/icon'\nimport glass from '@/assets/glass.css?inline'\nimport { lucideInbox } from '@/icons'\nimport { normalizeLiteral } from '@/shared/normalize'\n\nimport style from './style.css?inline'\n\nexport type EmptySize = 'small' | 'medium' | 'large'\n\nconst ALLOWED_SIZES = ['small', 'medium', 'large'] as const\n\n@customElement('web-ui-empty')\nexport class WebUiEmpty extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n @property({ type: String, reflect: true }) override title = ''\n\n @property({ type: String, reflect: true }) description = ''\n\n @property({ type: String, reflect: true })\n set size(value: string) {\n const normalized = normalizeLiteral(value, ALLOWED_SIZES, 'medium')\n if (this._size !== normalized) {\n const old = this._size\n this._size = normalized\n this.requestUpdate('size', old)\n }\n if (this.getAttribute('size') !== normalized) {\n this.setAttribute('size', normalized)\n }\n }\n\n get size(): EmptySize {\n return this._size\n }\n\n private _size: EmptySize = 'medium'\n\n @state() private _hasTitleSlot = false\n @state() private _hasDescriptionSlot = false\n @state() private _hasActionSlot = false\n\n override connectedCallback() {\n super.connectedCallback()\n this._syncSlotContent()\n }\n\n private _syncSlotContent = () => {\n this._hasTitleSlot = this._hasAssignedContent()\n this._hasDescriptionSlot = this._hasAssignedContent('description')\n this._hasActionSlot = this._hasAssignedContent('action')\n }\n\n private _hasAssignedContent(slotName?: string): boolean {\n return [...this.childNodes].some(node => {\n if (node instanceof HTMLElement && (node.getAttribute('slot') ?? '') === (slotName ?? '')) return true\n return !slotName && node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n })\n }\n\n override render() {\n const showTitle = this._hasTitleSlot || Boolean(this.title)\n const showDescription = this._hasDescriptionSlot || Boolean(this.description)\n\n return html`\n <section class=\"empty\">\n <div class=\"empty-icon wui-glass\" aria-hidden=\"true\">\n <slot name=\"icon\"><web-ui-icon .icon=${lucideInbox}></web-ui-icon></slot>\n </div>\n <div class=${classMap({ 'empty-title': true, 'is-hidden': !showTitle })}>\n <slot @slotchange=${this._syncSlotContent}>${this.title}</slot>\n </div>\n <div class=${classMap({ 'empty-description': true, 'is-hidden': !showDescription })}>\n <slot name=\"description\" @slotchange=${this._syncSlotContent}>${this.description}</slot>\n </div>\n <div class=${classMap({ 'empty-action': true, 'is-hidden': !this._hasActionSlot })}>\n <slot name=\"action\" @slotchange=${this._syncSlotContent}></slot>\n </div>\n </section>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-empty': WebUiEmpty\n }\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAM,IAAgB;CAAC;CAAS;CAAU;AAAO,GAGpC,IAAN,cAAyB,EAAW;;EAmCR,aAhC2B,KAAA,QAAA,IAEH,KAAA,cAAA,IAmB9B,KAAA,QAAA,UAEM,KAAA,gBAAA,IACM,KAAA,sBAAA,IACL,KAAA,iBAAA,IAOD,KAAA,yBAAA;GAG/B,AAFA,KAAK,gBAAgB,KAAK,oBAAoB,GAC9C,KAAK,sBAAsB,KAAK,oBAAoB,aAAa,GACjE,KAAK,iBAAiB,KAAK,oBAAoB,QAAQ;EACzD;;;EAtCyB,KAAA,SAAA,CAAC,EAAU,CAAK,GAAG,EAAU,CAAK,CAAC;;CAM5D,IACI,KAAK,GAAe;EACtB,IAAM,IAAa,EAAiB,GAAO,GAAe,QAAQ;EAClE,IAAI,KAAK,UAAU,GAAY;GAC7B,IAAM,IAAM,KAAK;GAEjB,AADA,KAAK,QAAQ,GACb,KAAK,cAAc,QAAQ,CAAG;EAChC;EACA,AAAI,KAAK,aAAa,MAAM,MAAM,KAChC,KAAK,aAAa,QAAQ,CAAU;CAExC;CAEA,IAAI,OAAkB;EACpB,OAAO,KAAK;CACd;CAQA,oBAA6B;EAE3B,AADA,MAAM,kBAAkB,GACxB,KAAK,iBAAiB;CACxB;CAQA,oBAA4B,GAA4B;EACtD,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,MAAK,MAC3B,aAAgB,gBAAgB,EAAK,aAAa,MAAM,KAAK,SAAS,KAAY,OAC/E,CAAC,KAAY,EAAK,aAAa,KAAK,aAAa,EAAQ,EAAK,aAAa,KAAK,CACxF;CACH;CAEA,SAAkB;EAChB,IAAM,IAAY,KAAK,iBAAiB,EAAQ,KAAK,OAC/C,IAAkB,KAAK,uBAAuB,EAAQ,KAAK;EAEjE,OAAO,CAAI;;;iDAGkC,EAAY;;qBAExC,EAAS;GAAE,eAAe;GAAM,aAAa,CAAC;EAAU,CAAC,EAAE;8BAClD,KAAK,iBAAiB,GAAG,KAAK,MAAM;;qBAE7C,EAAS;GAAE,qBAAqB;GAAM,aAAa,CAAC;EAAgB,CAAC,EAAE;iDAC3C,KAAK,iBAAiB,GAAG,KAAK,YAAY;;qBAEtE,EAAS;GAAE,gBAAgB;GAAM,aAAa,CAAC,KAAK;EAAe,CAAC,EAAE;4CAC/C,KAAK,iBAAiB;;;;CAIhE;AACF;AAlEG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,GAExC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,GAExC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,IAAA,GAmBxC,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,iBAAA,KAAA,CAAA,GACN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,uBAAA,KAAA,CAAA,GACN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GA7BR,IAAA,EAAA,CAAA,EAAc,cAAc,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/empty/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport '@/components/icon'\nimport { lucideInbox } from '@/icons'\nimport { normalizeLiteral } from '@/shared/normalize'\n\nimport style from './style.css?inline'\n\nexport type EmptySize = 'small' | 'medium' | 'large'\n\nconst ALLOWED_SIZES = ['small', 'medium', 'large'] as const\n\n@customElement('web-ui-empty')\nexport class WebUiEmpty extends LitElement {\n static override styles = [unsafeCSS(style)]\n\n @property({ type: String, reflect: true }) override title = ''\n\n @property({ type: String, reflect: true }) description = ''\n\n private get _iconSize(): number {\n return this._size === 'small' ? 16 : this._size === 'large' ? 32 : 24\n }\n\n @property({ type: String, reflect: true })\n set size(value: string) {\n const normalized = normalizeLiteral(value, ALLOWED_SIZES, 'medium')\n if (this._size !== normalized) {\n const old = this._size\n this._size = normalized\n this.requestUpdate('size', old)\n }\n if (this.getAttribute('size') !== normalized) {\n this.setAttribute('size', normalized)\n }\n }\n\n get size(): EmptySize {\n return this._size\n }\n\n private _size: EmptySize = 'medium'\n\n @state() private _hasTitleSlot = false\n @state() private _hasDescriptionSlot = false\n @state() private _hasActionSlot = false\n\n override connectedCallback() {\n super.connectedCallback()\n this._syncSlotContent()\n }\n\n private _syncSlotContent = () => {\n this._hasTitleSlot = this._hasAssignedContent()\n this._hasDescriptionSlot = this._hasAssignedContent('description')\n this._hasActionSlot = this._hasAssignedContent('action')\n }\n\n private _hasAssignedContent(slotName?: string): boolean {\n return [...this.childNodes].some(node => {\n if (node instanceof HTMLElement && (node.getAttribute('slot') ?? '') === (slotName ?? '')) return true\n return !slotName && node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim())\n })\n }\n\n override render() {\n const showTitle = this._hasTitleSlot || Boolean(this.title)\n const showDescription = this._hasDescriptionSlot || Boolean(this.description)\n\n return html`\n <section class=\"empty\">\n <div class=\"empty-icon\" aria-hidden=\"true\">\n <slot name=\"icon\"><web-ui-icon .icon=${lucideInbox} .size=${this._iconSize}></web-ui-icon></slot>\n </div>\n <div class=${classMap({ 'empty-title': true, 'is-hidden': !showTitle })}>\n <slot @slotchange=${this._syncSlotContent}>${this.title}</slot>\n </div>\n <div class=${classMap({ 'empty-description': true, 'is-hidden': !showDescription })}>\n <slot name=\"description\" @slotchange=${this._syncSlotContent}>${this.description}</slot>\n </div>\n <div class=${classMap({ 'empty-action': true, 'is-hidden': !this._hasActionSlot })}>\n <slot name=\"action\" @slotchange=${this._syncSlotContent}></slot>\n </div>\n </section>\n `\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-empty': WebUiEmpty\n }\n}\n"],"mappings":";;;;;;;;;AAYA,IAAM,IAAgB;CAAC;CAAS;CAAU;AAAO,GAGpC,IAAN,cAAyB,EAAW;;EAuCR,aApC2B,KAAA,QAAA,IAEH,KAAA,cAAA,IAuB9B,KAAA,QAAA,UAEM,KAAA,gBAAA,IACM,KAAA,sBAAA,IACL,KAAA,iBAAA,IAOD,KAAA,yBAAA;GAG/B,AAFA,KAAK,gBAAgB,KAAK,oBAAoB,GAC9C,KAAK,sBAAsB,KAAK,oBAAoB,aAAa,GACjE,KAAK,iBAAiB,KAAK,oBAAoB,QAAQ;EACzD;;;EA1CyB,KAAA,SAAA,CAAC,EAAU,CAAK,CAAC;;CAM1C,IAAY,YAAoB;EAC9B,OAAO,KAAK,UAAU,UAAU,KAAK,KAAK,UAAU,UAAU,KAAK;CACrE;CAEA,IACI,KAAK,GAAe;EACtB,IAAM,IAAa,EAAiB,GAAO,GAAe,QAAQ;EAClE,IAAI,KAAK,UAAU,GAAY;GAC7B,IAAM,IAAM,KAAK;GAEjB,AADA,KAAK,QAAQ,GACb,KAAK,cAAc,QAAQ,CAAG;EAChC;EACA,AAAI,KAAK,aAAa,MAAM,MAAM,KAChC,KAAK,aAAa,QAAQ,CAAU;CAExC;CAEA,IAAI,OAAkB;EACpB,OAAO,KAAK;CACd;CAQA,oBAA6B;EAE3B,AADA,MAAM,kBAAkB,GACxB,KAAK,iBAAiB;CACxB;CAQA,oBAA4B,GAA4B;EACtD,OAAO,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,MAAK,MAC3B,aAAgB,gBAAgB,EAAK,aAAa,MAAM,KAAK,SAAS,KAAY,OAC/E,CAAC,KAAY,EAAK,aAAa,KAAK,aAAa,EAAQ,EAAK,aAAa,KAAK,CACxF;CACH;CAEA,SAAkB;EAChB,IAAM,IAAY,KAAK,iBAAiB,EAAQ,KAAK,OAC/C,IAAkB,KAAK,uBAAuB,EAAQ,KAAK;EAEjE,OAAO,CAAI;;;iDAGkC,EAAY,SAAS,KAAK,UAAU;;qBAEhE,EAAS;GAAE,eAAe;GAAM,aAAa,CAAC;EAAU,CAAC,EAAE;8BAClD,KAAK,iBAAiB,GAAG,KAAK,MAAM;;qBAE7C,EAAS;GAAE,qBAAqB;GAAM,aAAa,CAAC;EAAgB,CAAC,EAAE;iDAC3C,KAAK,iBAAiB,GAAG,KAAK,YAAY;;qBAEtE,EAAS;GAAE,gBAAgB;GAAM,aAAa,CAAC,KAAK;EAAe,CAAC,EAAE;4CAC/C,KAAK,iBAAiB;;;;CAIhE;AACF;AAtEG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,SAAA,KAAA,CAAA,GAExC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA,GAMxC,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,IAAA,GAmBxC,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,iBAAA,KAAA,CAAA,GACN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,uBAAA,KAAA,CAAA,GACN,EAAA,CAAA,EAAM,CAAA,GAAA,EAAA,WAAA,kBAAA,KAAA,CAAA,GAjCR,IAAA,EAAA,CAAA,EAAc,cAAc,CAAA,GAAA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/empty/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{display:block}.empty{width:100%;min-block-size:var(--wui-empty-min-height,240px);padding:var(--wui-empty-padding,32px 24px);text-align:center;flex-direction:column;align-items:center;display:flex}.empty-icon{width:var(--wui-empty-icon-size,56px);height:var(--wui-empty-icon-size,56px);color:var(--wui-color-text-secondary,#6a6a6a);background-color:var(--wui-color-surface-raised,#f2f2f7);box-shadow:none;border-radius:16px;flex:none;justify-content:center;align-items:center;display:flex}.empty-title,.empty-description,.empty-action{max-inline-size:var(--wui-empty-content-width,480px)}.empty-title{margin-top:var(--wui-empty-title-margin-top,16px);font-size:var(--wui-empty-title-font-size,16px);color:var(--wui-color-text,#1b1b1b);overflow-wrap:anywhere;font-weight:600;line-height:1.5}.empty-description{font-size:var(--wui-empty-description-font-size,14px);color:var(--wui-color-text-secondary,#6a6a6a);overflow-wrap:anywhere;margin-top:6px;line-height:1.6}.empty-action{margin-top:var(--wui-empty-action-margin-top,20px)}.is-hidden{display:none}:host([size=small]){--wui-empty-min-height:160px;--wui-empty-padding:20px 16px;--wui-empty-icon-size:40px;--wui-empty-title-margin-top:12px;--wui-empty-title-font-size:14px;--wui-empty-description-font-size:13px;--wui-empty-action-margin-top:16px}:host([size=large]){--wui-empty-min-height:320px;--wui-empty-padding:48px 32px;--wui-empty-icon-size:72px;--wui-empty-title-margin-top:20px;--wui-empty-title-font-size:18px;--wui-empty-action-margin-top:24px}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:block}.empty{width:100%;min-block-size:var(--wui-empty-min-height,240px);padding:var(--wui-empty-padding,32px 24px);text-align:center;flex-direction:column;align-items:center;display:flex}.empty-icon{width:var(--wui-empty-icon-size,56px);height:var(--wui-empty-icon-size,56px);color:var(--wui-color-text-secondary,#6a6a6a);background-color:var(--wui-color-surface-track,#e5e5ea);box-shadow:none;border-radius:16px;flex:none;justify-content:center;align-items:center;display:flex}.empty-title,.empty-description,.empty-action{max-inline-size:var(--wui-empty-content-width,480px)}.empty-title{margin-top:var(--wui-empty-title-margin-top,16px);font-size:var(--wui-empty-title-font-size,16px);color:var(--wui-color-text,#1b1b1b);overflow-wrap:anywhere;font-weight:600;line-height:1.5}.empty-description{font-size:var(--wui-empty-description-font-size,14px);color:var(--wui-color-text-secondary,#6a6a6a);overflow-wrap:anywhere;margin-top:6px;line-height:1.6}.empty-action{margin-top:var(--wui-empty-action-margin-top,20px)}.is-hidden{display:none}:host([size=small]){--wui-empty-min-height:160px;--wui-empty-padding:20px 16px;--wui-empty-icon-size:40px;--wui-empty-title-margin-top:12px;--wui-empty-title-font-size:14px;--wui-empty-description-font-size:13px;--wui-empty-action-margin-top:16px}:host([size=large]){--wui-empty-min-height:320px;--wui-empty-padding:48px 32px;--wui-empty-icon-size:72px;--wui-empty-title-margin-top:20px;--wui-empty-title-font-size:18px;--wui-empty-action-margin-top:24px}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/empty/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n width: 100%;\n min-block-size: var(--wui-empty-min-height, 240px);\n padding: var(--wui-empty-padding, 32px 24px);\n\n text-align: center;\n}\n\n.empty-icon {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n width: var(--wui-empty-icon-size, 56px);\n height: var(--wui-empty-icon-size, 56px);\n border-radius: 16px;\n\n color: var(--wui-color-text-secondary, #6a6a6a);\n\n background-color: var(--wui-color-surface-raised, #f2f2f7);\n box-shadow: none;\n}\n\n.empty-title,\n.empty-description,\n.empty-action {\n max-inline-size: var(--wui-empty-content-width, 480px);\n}\n\n.empty-title {\n margin-top: var(--wui-empty-title-margin-top, 16px);\n\n font-size: var(--wui-empty-title-font-size, 16px);\n font-weight: 600;\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n overflow-wrap: anywhere;\n}\n\n.empty-description {\n margin-top: 6px;\n\n font-size: var(--wui-empty-description-font-size, 14px);\n line-height: 1.6;\n color: var(--wui-color-text-secondary, #6a6a6a);\n overflow-wrap: anywhere;\n}\n\n.empty-action {\n margin-top: var(--wui-empty-action-margin-top, 20px);\n}\n\n.is-hidden {\n display: none;\n}\n\n:host([size='small']) {\n --wui-empty-min-height: 160px;\n --wui-empty-padding: 20px 16px;\n --wui-empty-icon-size: 40px;\n --wui-empty-title-margin-top: 12px;\n --wui-empty-title-font-size: 14px;\n --wui-empty-description-font-size: 13px;\n --wui-empty-action-margin-top: 16px;\n}\n\n:host([size='large']) {\n --wui-empty-min-height: 320px;\n --wui-empty-padding: 48px 32px;\n --wui-empty-icon-size: 72px;\n --wui-empty-title-margin-top: 20px;\n --wui-empty-title-font-size: 18px;\n --wui-empty-action-margin-top: 24px;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/empty/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n.empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n width: 100%;\n min-block-size: var(--wui-empty-min-height, 240px);\n padding: var(--wui-empty-padding, 32px 24px);\n\n text-align: center;\n}\n\n.empty-icon {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n\n width: var(--wui-empty-icon-size, 56px);\n height: var(--wui-empty-icon-size, 56px);\n border-radius: 16px;\n\n color: var(--wui-color-text-secondary, #6a6a6a);\n\n background-color: var(--wui-color-surface-track, #e5e5ea);\n box-shadow: none;\n}\n\n.empty-title,\n.empty-description,\n.empty-action {\n max-inline-size: var(--wui-empty-content-width, 480px);\n}\n\n.empty-title {\n margin-top: var(--wui-empty-title-margin-top, 16px);\n\n font-size: var(--wui-empty-title-font-size, 16px);\n font-weight: 600;\n line-height: 1.5;\n color: var(--wui-color-text, #1b1b1b);\n overflow-wrap: anywhere;\n}\n\n.empty-description {\n margin-top: 6px;\n\n font-size: var(--wui-empty-description-font-size, 14px);\n line-height: 1.6;\n color: var(--wui-color-text-secondary, #6a6a6a);\n overflow-wrap: anywhere;\n}\n\n.empty-action {\n margin-top: var(--wui-empty-action-margin-top, 20px);\n}\n\n.is-hidden {\n display: none;\n}\n\n:host([size='small']) {\n --wui-empty-min-height: 160px;\n --wui-empty-padding: 20px 16px;\n --wui-empty-icon-size: 40px;\n --wui-empty-title-margin-top: 12px;\n --wui-empty-title-font-size: 14px;\n --wui-empty-description-font-size: 13px;\n --wui-empty-action-margin-top: 16px;\n}\n\n:host([size='large']) {\n --wui-empty-min-height: 320px;\n --wui-empty-padding: 48px 32px;\n --wui-empty-icon-size: 72px;\n --wui-empty-title-margin-top: 20px;\n --wui-empty-title-font-size: 18px;\n --wui-empty-action-margin-top: 24px;\n}\n"],"mappings":""}
@@ -6,6 +6,7 @@ export * from './button';
6
6
  export * from './button-group';
7
7
  export * from './checkbox';
8
8
  export * from './checkbox-group';
9
+ export * from './collapse';
9
10
  export * from './context-menu';
10
11
  export * from './dialog';
11
12
  export * from './drawer';
@@ -8,31 +8,32 @@ import { WebUiBadge as o } from "./badge/index.js";
8
8
  import { WebUiButtonGroup as s } from "./button-group/index.js";
9
9
  import { WebUiCheckbox as c } from "./checkbox/index.js";
10
10
  import { WebUiCheckboxGroup as l } from "./checkbox-group/index.js";
11
- import { WebUiDropdownDivider as u } from "./dropdown-divider/index.js";
12
- import { WebUiDropdownHeader as d } from "./dropdown-header/index.js";
13
- import { WebUiDropdownItem as f } from "./dropdown-item/index.js";
14
- import { WebUiContextMenu as p } from "./context-menu/index.js";
15
- import { WebUiDialog as m } from "./dialog/index.js";
16
- import { WebUiDrawer as h } from "./drawer/index.js";
17
- import { WebUiDropdown as g } from "./dropdown/index.js";
18
- import { WebUiEmpty as _ } from "./empty/index.js";
19
- import { WebUiInput as v } from "./input/index.js";
20
- import { WebUiInputNumber as y } from "./input-number/index.js";
21
- import { WebUiLayout as b } from "./layout/index.js";
22
- import { WebUiPopover as x } from "./popover/index.js";
23
- import { WebUiRadio as S } from "./radio/index.js";
24
- import { WebUiRadioGroup as C } from "./radio-group/index.js";
25
- import { WebUiSegmented as w } from "./segmented/index.js";
26
- import { WebUiSegmentedTrigger as T } from "./segmented-trigger/index.js";
27
- import { WebUiSelect as E } from "./select/index.js";
28
- import { WebUiSlider as D } from "./slider/index.js";
29
- import { WebUiSpinner as O } from "./spinner/index.js";
30
- import { WebUiTextarea as k } from "./textarea/index.js";
31
- import { WebUiTheme as A } from "./theme/index.js";
32
- import { toast as j } from "./toast/manager.js";
33
- import { WebUiToast as M } from "./toast/toast.js";
11
+ import { WebUiCollapse as u } from "./collapse/index.js";
12
+ import { WebUiDropdownDivider as d } from "./dropdown-divider/index.js";
13
+ import { WebUiDropdownHeader as f } from "./dropdown-header/index.js";
14
+ import { WebUiDropdownItem as p } from "./dropdown-item/index.js";
15
+ import { WebUiContextMenu as m } from "./context-menu/index.js";
16
+ import { WebUiDialog as h } from "./dialog/index.js";
17
+ import { WebUiDrawer as g } from "./drawer/index.js";
18
+ import { WebUiDropdown as _ } from "./dropdown/index.js";
19
+ import { WebUiEmpty as v } from "./empty/index.js";
20
+ import { WebUiInput as y } from "./input/index.js";
21
+ import { WebUiInputNumber as b } from "./input-number/index.js";
22
+ import { WebUiLayout as x } from "./layout/index.js";
23
+ import { WebUiPopover as S } from "./popover/index.js";
24
+ import { WebUiRadio as C } from "./radio/index.js";
25
+ import { WebUiRadioGroup as w } from "./radio-group/index.js";
26
+ import { WebUiSegmented as T } from "./segmented/index.js";
27
+ import { WebUiSegmentedTrigger as E } from "./segmented-trigger/index.js";
28
+ import { WebUiSelect as D } from "./select/index.js";
29
+ import { WebUiSlider as O } from "./slider/index.js";
30
+ import { WebUiSpinner as k } from "./spinner/index.js";
31
+ import { WebUiTextarea as A } from "./textarea/index.js";
32
+ import { WebUiTheme as j } from "./theme/index.js";
33
+ import { toast as M } from "./toast/manager.js";
34
+ import { WebUiToast as N } from "./toast/toast.js";
34
35
  import "./toast/index.js";
35
- import { WebUiSvgDrawLines as N } from "./svg-draw-lines/index.js";
36
- import { WebUiSwitch as P } from "./switch/index.js";
37
- import { WebUiTooltip as F } from "./tooltip/index.js";
38
- export { n as WebUiAutocomplete, r as WebUiAvatar, a as WebUiBackTop, o as WebUiBadge, i as WebUiButton, s as WebUiButtonGroup, c as WebUiCheckbox, l as WebUiCheckboxGroup, p as WebUiContextMenu, m as WebUiDialog, h as WebUiDrawer, g as WebUiDropdown, u as WebUiDropdownDivider, d as WebUiDropdownHeader, f as WebUiDropdownItem, _ as WebUiEmpty, e as WebUiIcon, v as WebUiInput, y as WebUiInputNumber, b as WebUiLayout, t as WebUiOption, x as WebUiPopover, S as WebUiRadio, C as WebUiRadioGroup, w as WebUiSegmented, T as WebUiSegmentedTrigger, E as WebUiSelect, D as WebUiSlider, O as WebUiSpinner, N as WebUiSvgDrawLines, P as WebUiSwitch, k as WebUiTextarea, A as WebUiTheme, M as WebUiToast, F as WebUiTooltip, j as toast };
36
+ import { WebUiSvgDrawLines as P } from "./svg-draw-lines/index.js";
37
+ import { WebUiSwitch as F } from "./switch/index.js";
38
+ import { WebUiTooltip as I } from "./tooltip/index.js";
39
+ export { n as WebUiAutocomplete, r as WebUiAvatar, a as WebUiBackTop, o as WebUiBadge, i as WebUiButton, s as WebUiButtonGroup, c as WebUiCheckbox, l as WebUiCheckboxGroup, u as WebUiCollapse, m as WebUiContextMenu, h as WebUiDialog, g as WebUiDrawer, _ as WebUiDropdown, d as WebUiDropdownDivider, f as WebUiDropdownHeader, p as WebUiDropdownItem, v as WebUiEmpty, e as WebUiIcon, y as WebUiInput, b as WebUiInputNumber, x as WebUiLayout, t as WebUiOption, S as WebUiPopover, C as WebUiRadio, w as WebUiRadioGroup, T as WebUiSegmented, E as WebUiSegmentedTrigger, D as WebUiSelect, O as WebUiSlider, k as WebUiSpinner, P as WebUiSvgDrawLines, F as WebUiSwitch, A as WebUiTextarea, j as WebUiTheme, N as WebUiToast, I as WebUiTooltip, M as toast };