@greypan/web-ui 1.4.2 → 2.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 (343) hide show
  1. package/README.CN.md +674 -232
  2. package/README.md +683 -237
  3. package/dist/_virtual/{_@oxc-project_runtime@0.138.0 → _@oxc-project_runtime@0.140.0}/helpers/esm/decorate.js +1 -1
  4. package/dist/assets/glass.js +6 -0
  5. package/dist/assets/glass.js.map +1 -0
  6. package/dist/assets/menu-portal.js +6 -0
  7. package/dist/assets/menu-portal.js.map +1 -0
  8. package/dist/assets/overlay-motion.js +6 -0
  9. package/dist/assets/overlay-motion.js.map +1 -0
  10. package/dist/assets/toast-containers.js +6 -0
  11. package/dist/assets/toast-containers.js.map +1 -0
  12. package/dist/components/avatar/index.d.ts +30 -0
  13. package/dist/components/avatar/index.js +112 -0
  14. package/dist/components/avatar/index.js.map +1 -0
  15. package/dist/components/avatar/style.js +6 -0
  16. package/dist/components/avatar/style.js.map +1 -0
  17. package/dist/components/back-top/index.d.ts +8 -7
  18. package/dist/components/back-top/index.js +37 -32
  19. package/dist/components/back-top/index.js.map +1 -1
  20. package/dist/components/back-top/style.js +1 -1
  21. package/dist/components/back-top/style.js.map +1 -1
  22. package/dist/components/badge/index.d.ts +27 -0
  23. package/dist/components/badge/index.js +121 -0
  24. package/dist/components/badge/index.js.map +1 -0
  25. package/dist/components/badge/style.js +6 -0
  26. package/dist/components/badge/style.js.map +1 -0
  27. package/dist/components/button/index.d.ts +16 -3
  28. package/dist/components/button/index.js +56 -17
  29. package/dist/components/button/index.js.map +1 -1
  30. package/dist/components/button/style.js +1 -1
  31. package/dist/components/button/style.js.map +1 -1
  32. package/dist/components/button-group/index.d.ts +16 -0
  33. package/dist/components/button-group/index.js +49 -0
  34. package/dist/components/button-group/index.js.map +1 -0
  35. package/dist/components/button-group/style.js +6 -0
  36. package/dist/components/button-group/style.js.map +1 -0
  37. package/dist/components/checkbox/index.d.ts +39 -0
  38. package/dist/components/checkbox/index.js +111 -0
  39. package/dist/components/checkbox/index.js.map +1 -0
  40. package/dist/components/checkbox/style.js +6 -0
  41. package/dist/components/checkbox/style.js.map +1 -0
  42. package/dist/components/checkbox-group/index.d.ts +35 -0
  43. package/dist/components/checkbox-group/index.js +99 -0
  44. package/dist/components/checkbox-group/index.js.map +1 -0
  45. package/dist/components/checkbox-group/style.js +6 -0
  46. package/dist/components/checkbox-group/style.js.map +1 -0
  47. package/dist/components/context-menu/index.d.ts +84 -0
  48. package/dist/components/context-menu/index.js +294 -0
  49. package/dist/components/context-menu/index.js.map +1 -0
  50. package/dist/components/context-menu/style.js +6 -0
  51. package/dist/components/context-menu/style.js.map +1 -0
  52. package/dist/components/dialog/index.d.ts +41 -0
  53. package/dist/components/dialog/index.js +118 -0
  54. package/dist/components/dialog/index.js.map +1 -0
  55. package/dist/components/dialog/style.js +6 -0
  56. package/dist/components/dialog/style.js.map +1 -0
  57. package/dist/components/drawer/index.d.ts +57 -0
  58. package/dist/components/drawer/index.js +172 -0
  59. package/dist/components/drawer/index.js.map +1 -0
  60. package/dist/components/drawer/style.js +6 -0
  61. package/dist/components/drawer/style.js.map +1 -0
  62. package/dist/components/dropdown-divider/index.d.ts +11 -0
  63. package/dist/components/dropdown-divider/index.js +18 -0
  64. package/dist/components/dropdown-divider/index.js.map +1 -0
  65. package/dist/components/dropdown-divider/style.js +6 -0
  66. package/dist/components/dropdown-divider/style.js.map +1 -0
  67. package/dist/components/dropdown-header/index.d.ts +11 -0
  68. package/dist/components/dropdown-header/index.js +18 -0
  69. package/dist/components/dropdown-header/index.js.map +1 -0
  70. package/dist/components/dropdown-header/style.js +6 -0
  71. package/dist/components/dropdown-header/style.js.map +1 -0
  72. package/dist/components/dropdown-item/index.d.ts +17 -0
  73. package/dist/components/dropdown-item/index.js +44 -0
  74. package/dist/components/dropdown-item/index.js.map +1 -0
  75. package/dist/components/dropdown-item/style.js +6 -0
  76. package/dist/components/dropdown-item/style.js.map +1 -0
  77. package/dist/components/dropdown-menu/index.d.ts +87 -0
  78. package/dist/components/dropdown-menu/index.js +324 -0
  79. package/dist/components/dropdown-menu/index.js.map +1 -0
  80. package/dist/components/dropdown-menu/style.js +6 -0
  81. package/dist/components/dropdown-menu/style.js.map +1 -0
  82. package/dist/components/empty/index.d.ts +23 -0
  83. package/dist/components/empty/index.js +83 -0
  84. package/dist/components/empty/index.js.map +1 -0
  85. package/dist/components/empty/style.js +6 -0
  86. package/dist/components/empty/style.js.map +1 -0
  87. package/dist/components/icon/index.d.ts +16 -0
  88. package/dist/components/icon/index.js +45 -0
  89. package/dist/components/icon/index.js.map +1 -0
  90. package/dist/components/icon/style.js +6 -0
  91. package/dist/components/icon/style.js.map +1 -0
  92. package/dist/components/index.d.ts +34 -0
  93. package/dist/components/index.js +37 -0
  94. package/dist/components/input/index.d.ts +47 -0
  95. package/dist/components/input/index.js +140 -0
  96. package/dist/components/input/index.js.map +1 -0
  97. package/dist/components/input/style.js +6 -0
  98. package/dist/components/input/style.js.map +1 -0
  99. package/dist/components/input-number/index.d.ts +52 -0
  100. package/dist/components/input-number/index.js +178 -0
  101. package/dist/components/input-number/index.js.map +1 -0
  102. package/dist/components/input-number/style.js +6 -0
  103. package/dist/components/input-number/style.js.map +1 -0
  104. package/dist/components/layout/index.d.ts +7 -1
  105. package/dist/components/layout/index.js +24 -21
  106. package/dist/components/layout/index.js.map +1 -1
  107. package/dist/components/layout/style.js +1 -1
  108. package/dist/components/layout/style.js.map +1 -1
  109. package/dist/components/option/index.d.ts +33 -0
  110. package/dist/components/option/index.js +78 -0
  111. package/dist/components/option/index.js.map +1 -0
  112. package/dist/components/option/style.js +6 -0
  113. package/dist/components/option/style.js.map +1 -0
  114. package/dist/components/popover/index.d.ts +69 -0
  115. package/dist/components/popover/index.js +231 -0
  116. package/dist/components/popover/index.js.map +1 -0
  117. package/dist/components/popover/style.js +6 -0
  118. package/dist/components/popover/style.js.map +1 -0
  119. package/dist/components/radio/index.d.ts +39 -0
  120. package/dist/components/radio/index.js +105 -0
  121. package/dist/components/radio/index.js.map +1 -0
  122. package/dist/components/radio/style.js +6 -0
  123. package/dist/components/radio/style.js.map +1 -0
  124. package/dist/components/radio-group/index.d.ts +35 -0
  125. package/dist/components/radio-group/index.js +87 -0
  126. package/dist/components/radio-group/index.js.map +1 -0
  127. package/dist/components/radio-group/style.js +6 -0
  128. package/dist/components/radio-group/style.js.map +1 -0
  129. package/dist/components/segmented/index.d.ts +33 -0
  130. package/dist/components/segmented/index.js +95 -0
  131. package/dist/components/segmented/index.js.map +1 -0
  132. package/dist/components/segmented/style.js +6 -0
  133. package/dist/components/segmented/style.js.map +1 -0
  134. package/dist/components/segmented-trigger/index.d.ts +18 -0
  135. package/dist/components/segmented-trigger/index.js +52 -0
  136. package/dist/components/segmented-trigger/index.js.map +1 -0
  137. package/dist/components/segmented-trigger/style.js +6 -0
  138. package/dist/components/segmented-trigger/style.js.map +1 -0
  139. package/dist/components/select/index.d.ts +80 -0
  140. package/dist/components/select/index.js +291 -0
  141. package/dist/components/select/index.js.map +1 -0
  142. package/dist/components/select/style.js +6 -0
  143. package/dist/components/select/style.js.map +1 -0
  144. package/dist/components/slider/index.d.ts +61 -0
  145. package/dist/components/slider/index.js +219 -0
  146. package/dist/components/slider/index.js.map +1 -0
  147. package/dist/components/slider/style.js +6 -0
  148. package/dist/components/slider/style.js.map +1 -0
  149. package/dist/components/spinner/index.d.ts +32 -0
  150. package/dist/components/spinner/index.js +52 -0
  151. package/dist/components/spinner/index.js.map +1 -0
  152. package/dist/components/spinner/style.js +6 -0
  153. package/dist/components/spinner/style.js.map +1 -0
  154. package/dist/components/svg-draw-lines/index.d.ts +30 -9
  155. package/dist/components/svg-draw-lines/index.js +87 -62
  156. package/dist/components/svg-draw-lines/index.js.map +1 -1
  157. package/dist/components/svg-draw-lines/style.js +1 -1
  158. package/dist/components/svg-draw-lines/style.js.map +1 -1
  159. package/dist/components/switch/index.d.ts +37 -0
  160. package/dist/components/switch/index.js +117 -0
  161. package/dist/components/switch/index.js.map +1 -0
  162. package/dist/components/switch/style.js +6 -0
  163. package/dist/components/switch/style.js.map +1 -0
  164. package/dist/components/textarea/index.d.ts +65 -0
  165. package/dist/components/textarea/index.js +204 -0
  166. package/dist/components/textarea/index.js.map +1 -0
  167. package/dist/components/textarea/style.js +6 -0
  168. package/dist/components/textarea/style.js.map +1 -0
  169. package/dist/components/theme/index.d.ts +29 -0
  170. package/dist/components/theme/index.js +78 -0
  171. package/dist/components/theme/index.js.map +1 -0
  172. package/dist/components/theme/style.js +6 -0
  173. package/dist/components/theme/style.js.map +1 -0
  174. package/dist/components/toast/index.d.ts +3 -0
  175. package/dist/components/toast/index.js +3 -0
  176. package/dist/components/toast/manager.d.ts +15 -0
  177. package/dist/components/toast/manager.js +98 -0
  178. package/dist/components/toast/manager.js.map +1 -0
  179. package/dist/components/toast/style.js +6 -0
  180. package/dist/components/toast/style.js.map +1 -0
  181. package/dist/components/toast/toast.d.ts +42 -0
  182. package/dist/components/toast/toast.js +122 -0
  183. package/dist/components/toast/toast.js.map +1 -0
  184. package/dist/components/toast/types.d.ts +23 -0
  185. package/dist/components/tooltip/index.d.ts +59 -0
  186. package/dist/components/tooltip/index.js +190 -0
  187. package/dist/components/tooltip/index.js.map +1 -0
  188. package/dist/components/tooltip/style.js +6 -0
  189. package/dist/components/tooltip/style.js.map +1 -0
  190. package/dist/icons/generated/heroicons-check-16-solid.d.ts +6 -0
  191. package/dist/icons/generated/heroicons-check-16-solid.js +10 -0
  192. package/dist/icons/generated/heroicons-check-16-solid.js.map +1 -0
  193. package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts +6 -0
  194. package/dist/icons/generated/heroicons-x-mark-16-solid.js +10 -0
  195. package/dist/icons/generated/heroicons-x-mark-16-solid.js.map +1 -0
  196. package/dist/icons/generated/jam-close-circle-f.d.ts +8 -0
  197. package/dist/icons/generated/jam-close-circle-f.js +12 -0
  198. package/dist/icons/generated/jam-close-circle-f.js.map +1 -0
  199. package/dist/icons/generated/jam-volume.d.ts +8 -0
  200. package/dist/icons/generated/jam-watch-f.d.ts +8 -0
  201. package/dist/icons/generated/lucide-arrow-down-to-line.d.ts +6 -0
  202. package/dist/icons/generated/lucide-arrow-down-to-line.js +10 -0
  203. package/dist/icons/generated/lucide-arrow-down-to-line.js.map +1 -0
  204. package/dist/icons/generated/lucide-arrow-up-to-line.d.ts +6 -0
  205. package/dist/icons/generated/lucide-arrow-up-to-line.js +10 -0
  206. package/dist/icons/generated/lucide-arrow-up-to-line.js.map +1 -0
  207. package/dist/icons/generated/lucide-bell.d.ts +6 -0
  208. package/dist/icons/generated/lucide-bell.js +10 -0
  209. package/dist/icons/generated/lucide-bell.js.map +1 -0
  210. package/dist/icons/generated/lucide-check.d.ts +6 -0
  211. package/dist/icons/generated/lucide-check.js +10 -0
  212. package/dist/icons/generated/lucide-check.js.map +1 -0
  213. package/dist/icons/generated/lucide-chevron-down.d.ts +6 -0
  214. package/dist/icons/generated/lucide-chevron-down.js +10 -0
  215. package/dist/icons/generated/lucide-chevron-down.js.map +1 -0
  216. package/dist/icons/generated/lucide-chevron-left.d.ts +6 -0
  217. package/dist/icons/generated/lucide-chevron-left.js +10 -0
  218. package/dist/icons/generated/lucide-chevron-left.js.map +1 -0
  219. package/dist/icons/generated/lucide-chevron-right.d.ts +6 -0
  220. package/dist/icons/generated/lucide-chevron-right.js +10 -0
  221. package/dist/icons/generated/lucide-chevron-right.js.map +1 -0
  222. package/dist/icons/generated/lucide-chevron-up.d.ts +6 -0
  223. package/dist/icons/generated/lucide-chevron-up.js +10 -0
  224. package/dist/icons/generated/lucide-chevron-up.js.map +1 -0
  225. package/dist/icons/generated/lucide-circle-alert.d.ts +6 -0
  226. package/dist/icons/generated/lucide-circle-alert.js +10 -0
  227. package/dist/icons/generated/lucide-circle-alert.js.map +1 -0
  228. package/dist/icons/generated/lucide-clipboard-paste.d.ts +6 -0
  229. package/dist/icons/generated/lucide-clipboard-paste.js +10 -0
  230. package/dist/icons/generated/lucide-clipboard-paste.js.map +1 -0
  231. package/dist/icons/generated/lucide-copy.d.ts +6 -0
  232. package/dist/icons/generated/lucide-copy.js +10 -0
  233. package/dist/icons/generated/lucide-copy.js.map +1 -0
  234. package/dist/icons/generated/lucide-download.d.ts +6 -0
  235. package/dist/icons/generated/lucide-download.js +10 -0
  236. package/dist/icons/generated/lucide-download.js.map +1 -0
  237. package/dist/icons/generated/lucide-file.d.ts +6 -0
  238. package/dist/icons/generated/lucide-file.js +10 -0
  239. package/dist/icons/generated/lucide-file.js.map +1 -0
  240. package/dist/icons/generated/lucide-folder.d.ts +6 -0
  241. package/dist/icons/generated/lucide-folder.js +10 -0
  242. package/dist/icons/generated/lucide-folder.js.map +1 -0
  243. package/dist/icons/generated/lucide-globe.d.ts +6 -0
  244. package/dist/icons/generated/lucide-globe.js +10 -0
  245. package/dist/icons/generated/lucide-globe.js.map +1 -0
  246. package/dist/icons/generated/lucide-heart.d.ts +6 -0
  247. package/dist/icons/generated/lucide-heart.js +10 -0
  248. package/dist/icons/generated/lucide-heart.js.map +1 -0
  249. package/dist/icons/generated/lucide-image.d.ts +6 -0
  250. package/dist/icons/generated/lucide-image.js +10 -0
  251. package/dist/icons/generated/lucide-image.js.map +1 -0
  252. package/dist/icons/generated/lucide-inbox.d.ts +6 -0
  253. package/dist/icons/generated/lucide-inbox.js +10 -0
  254. package/dist/icons/generated/lucide-inbox.js.map +1 -0
  255. package/dist/icons/generated/lucide-info.d.ts +6 -0
  256. package/dist/icons/generated/lucide-info.js +10 -0
  257. package/dist/icons/generated/lucide-info.js.map +1 -0
  258. package/dist/icons/generated/lucide-loader-circle.d.ts +6 -0
  259. package/dist/icons/generated/lucide-loader-circle.js +10 -0
  260. package/dist/icons/generated/lucide-loader-circle.js.map +1 -0
  261. package/dist/icons/generated/lucide-mail.d.ts +6 -0
  262. package/dist/icons/generated/lucide-mail.js +10 -0
  263. package/dist/icons/generated/lucide-mail.js.map +1 -0
  264. package/dist/icons/generated/lucide-minus.d.ts +6 -0
  265. package/dist/icons/generated/lucide-minus.js +10 -0
  266. package/dist/icons/generated/lucide-minus.js.map +1 -0
  267. package/dist/icons/generated/lucide-plus.d.ts +6 -0
  268. package/dist/icons/generated/lucide-plus.js +10 -0
  269. package/dist/icons/generated/lucide-plus.js.map +1 -0
  270. package/dist/icons/generated/lucide-printer.d.ts +6 -0
  271. package/dist/icons/generated/lucide-printer.js +10 -0
  272. package/dist/icons/generated/lucide-printer.js.map +1 -0
  273. package/dist/icons/generated/lucide-redo-2.d.ts +6 -0
  274. package/dist/icons/generated/lucide-redo-2.js +10 -0
  275. package/dist/icons/generated/lucide-redo-2.js.map +1 -0
  276. package/dist/icons/generated/lucide-scissors.d.ts +6 -0
  277. package/dist/icons/generated/lucide-scissors.js +10 -0
  278. package/dist/icons/generated/lucide-scissors.js.map +1 -0
  279. package/dist/icons/generated/lucide-search.d.ts +6 -0
  280. package/dist/icons/generated/lucide-search.js +10 -0
  281. package/dist/icons/generated/lucide-search.js.map +1 -0
  282. package/dist/icons/generated/lucide-settings.d.ts +6 -0
  283. package/dist/icons/generated/lucide-settings.js +10 -0
  284. package/dist/icons/generated/lucide-settings.js.map +1 -0
  285. package/dist/icons/generated/lucide-star.d.ts +6 -0
  286. package/dist/icons/generated/lucide-star.js +10 -0
  287. package/dist/icons/generated/lucide-star.js.map +1 -0
  288. package/dist/icons/generated/lucide-trash-2.d.ts +6 -0
  289. package/dist/icons/generated/lucide-trash-2.js +10 -0
  290. package/dist/icons/generated/lucide-trash-2.js.map +1 -0
  291. package/dist/icons/generated/lucide-triangle-alert.d.ts +6 -0
  292. package/dist/icons/generated/lucide-triangle-alert.js +10 -0
  293. package/dist/icons/generated/lucide-triangle-alert.js.map +1 -0
  294. package/dist/icons/generated/lucide-undo-2.d.ts +6 -0
  295. package/dist/icons/generated/lucide-undo-2.js +10 -0
  296. package/dist/icons/generated/lucide-undo-2.js.map +1 -0
  297. package/dist/icons/generated/lucide-upload.d.ts +6 -0
  298. package/dist/icons/generated/lucide-upload.js +10 -0
  299. package/dist/icons/generated/lucide-upload.js.map +1 -0
  300. package/dist/icons/generated/lucide-user.d.ts +6 -0
  301. package/dist/icons/generated/lucide-user.js +10 -0
  302. package/dist/icons/generated/lucide-user.js.map +1 -0
  303. package/dist/icons/generated/lucide-x.d.ts +6 -0
  304. package/dist/icons/generated/lucide-x.js +10 -0
  305. package/dist/icons/generated/lucide-x.js.map +1 -0
  306. package/dist/icons/generated/ooui-check.d.ts +6 -0
  307. package/dist/icons/generated/radix-icons-check.d.ts +6 -0
  308. package/dist/icons/generated/si-check-alt-fill.d.ts +6 -0
  309. package/dist/icons/index.d.ts +38 -0
  310. package/dist/icons/index.js +39 -0
  311. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js +248 -0
  312. package/dist/node_modules/.pnpm/@floating-ui_core@1.8.0/node_modules/@floating-ui/core/dist/floating-ui.core.js.map +1 -0
  313. package/dist/node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +324 -0
  314. package/dist/node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js.map +1 -0
  315. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js +99 -0
  316. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.js.map +1 -0
  317. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js +102 -0
  318. package/dist/node_modules/.pnpm/@floating-ui_utils@0.2.12/node_modules/@floating-ui/utils/dist/floating-ui.utils.js.map +1 -0
  319. package/dist/shared/menu-portal/menu-portal.js +11 -0
  320. package/dist/shared/menu-portal/menu-portal.js.map +1 -0
  321. package/dist/shared/normalize/index.js +11 -0
  322. package/dist/shared/normalize/index.js.map +1 -0
  323. package/dist/shared/overlay/overlay.js +68 -0
  324. package/dist/shared/overlay/overlay.js.map +1 -0
  325. package/dist/shared/overlay/portal.js +29 -0
  326. package/dist/shared/overlay/portal.js.map +1 -0
  327. package/dist/shared/overlay/presence.js +34 -0
  328. package/dist/shared/overlay/presence.js.map +1 -0
  329. package/dist/shared/property-converters/boolean-with-false-string.js +9 -0
  330. package/dist/shared/property-converters/boolean-with-false-string.js.map +1 -0
  331. package/dist/shared/scroll-lock/scroll-lock.js +12 -0
  332. package/dist/shared/scroll-lock/scroll-lock.js.map +1 -0
  333. package/dist/shared/theme/overlay-root.js +28 -0
  334. package/dist/shared/theme/overlay-root.js.map +1 -0
  335. package/dist/shared/theme/theme-scope.js +27 -0
  336. package/dist/shared/theme/theme-scope.js.map +1 -0
  337. package/dist/types/iconify.d.ts +1 -0
  338. package/dist/types/react.d.ts +35 -9
  339. package/dist/types/utils.d.ts +14 -0
  340. package/dist/types/vue.d.ts +47 -7
  341. package/package.json +27 -11
  342. package/dist/index.d.ts +0 -4
  343. package/dist/index.js +0 -5
@@ -0,0 +1,291 @@
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
2
+ import "../icon/index.js";
3
+ import t from "../../assets/glass.js";
4
+ import n from "../../icons/generated/lucide-chevron-down.js";
5
+ import { booleanWithFalseString as r } from "../../shared/property-converters/boolean-with-false-string.js";
6
+ import i from "../../assets/overlay-motion.js";
7
+ import { hideOverlayPresence as a, showOverlayPresence as o } from "../../shared/overlay/presence.js";
8
+ import { lockScroll as s, unlockScroll as c } from "../../shared/scroll-lock/scroll-lock.js";
9
+ import { withOverlay as l } from "../../shared/overlay/overlay.js";
10
+ import "../option/index.js";
11
+ import { createOverlayPortal as u } from "../../shared/overlay/portal.js";
12
+ import d from "./style.js";
13
+ import { LitElement as f, html as p, nothing as m, unsafeCSS as h } from "lit";
14
+ import { customElement as g, property as _, state as v } from "lit/decorators.js";
15
+ //#region src/components/select/index.ts
16
+ var y = class extends f {
17
+ constructor(...e) {
18
+ super(...e), this._formDisabled = !1, this.placeholder = "", this.disabled = !1, this.required = !1, this.portal = !1, this.lockScroll = !0, this.name = "", this._value = "", this._isOpen = !1, this._activeIndex = -1, this._selectedLabel = "", this._hasTriggerSlot = !1, this._options = [], this._hasScrollLock = !1, this._onClickOutside = (e) => {
19
+ this._isOpen && e.target instanceof Node && !this.contains(e.target) && !this._portal?.panel.contains(e.target) && this._close();
20
+ }, this._onFocusOut = () => {
21
+ requestAnimationFrame(() => {
22
+ this._isOpen && !this.matches(":focus-within") && !this._portal?.panel.matches(":focus-within") && this._close();
23
+ });
24
+ }, this._onTriggerSlotChange = (e) => {
25
+ let t = e.target.assignedElements().length > 0;
26
+ this._hasTriggerSlot !== t && (this._hasTriggerSlot = t, this._reconfigureOverlay());
27
+ }, this._onOptionRegister = (e) => {
28
+ if (!(e.target instanceof HTMLElement)) return;
29
+ let t = e.target;
30
+ t.addEventListener("click", this._handleOptionClick), t.addEventListener("pointerover", this._handleOptionPointerOver), t.addEventListener("pointerdown", this._handleOptionPointerDown), t.addEventListener("option-update", this._onOptionUpdate), this._options.push(t), this._ensureOptionIds(), this._syncSelected();
31
+ }, this._onOptionUnregister = (e) => {
32
+ if (!(e.target instanceof HTMLElement)) return;
33
+ let t = e.target;
34
+ t.removeEventListener("click", this._handleOptionClick), t.removeEventListener("pointerover", this._handleOptionPointerOver), t.removeEventListener("pointerdown", this._handleOptionPointerDown), t.removeEventListener("option-update", this._onOptionUpdate), this._options = this._options.filter((e) => e !== t);
35
+ }, this._onSlotChange = () => {
36
+ let e = this._portal ? [...this._portal.panel.querySelectorAll("web-ui-option")] : [...this.querySelectorAll("web-ui-option")];
37
+ this._options = e, this._ensureOptionIds(), this._syncSelected();
38
+ }, this._handleOptionClick = (e) => {
39
+ if (!(e.currentTarget instanceof HTMLElement)) return;
40
+ let t = e.currentTarget;
41
+ t.disabled || (this.value = t.value, this._close(), this._notifyValueChange());
42
+ }, this._onOptionUpdate = () => {
43
+ this._syncSelected(), this._syncActiveOption();
44
+ }, this._handleOptionPointerOver = (e) => {
45
+ e.pointerType !== "touch" && (!this._isOpen || this._activeIndex < 0 || !(e.currentTarget instanceof HTMLElement) || (this._activeIndex = -1, this._syncActiveOption()));
46
+ }, this._handleOptionPointerDown = (e) => {
47
+ e.preventDefault();
48
+ }, this._onKeydown = (e) => {
49
+ if (!this._isDisabled) switch (e.key) {
50
+ case "Escape":
51
+ this._isOpen && (this._close(), e.preventDefault());
52
+ break;
53
+ case "ArrowDown":
54
+ e.preventDefault(), this._isOpen ? this._navigateActive(1) : this._open(!0);
55
+ break;
56
+ case "ArrowUp":
57
+ e.preventDefault(), this._isOpen ? this._navigateActive(-1) : this._open(!0);
58
+ break;
59
+ case "Enter":
60
+ if (this._isOpen && this._activeIndex >= 0) {
61
+ let t = this._options[this._activeIndex];
62
+ t && !t.disabled && (this.value = t.value, this._notifyValueChange()), this._close(), e.preventDefault();
63
+ }
64
+ break;
65
+ }
66
+ };
67
+ }
68
+ static {
69
+ this.styles = [
70
+ h(t),
71
+ h(i),
72
+ h(d)
73
+ ];
74
+ }
75
+ static {
76
+ this.formAssociated = !0;
77
+ }
78
+ get value() {
79
+ return this._value;
80
+ }
81
+ set value(e) {
82
+ let t = this._value;
83
+ this._value = e, this._internals?.setFormValue?.(e), this.toggleAttribute("data-has-value", !!e), this.requestUpdate("value", t);
84
+ }
85
+ get _isDisabled() {
86
+ return this.disabled || this._formDisabled;
87
+ }
88
+ get isOpen() {
89
+ return this._isOpen;
90
+ }
91
+ get open() {
92
+ return this._isOpen;
93
+ }
94
+ connectedCallback() {
95
+ super.connectedCallback(), this._internals = this.attachInternals();
96
+ let e = this.getAttribute("value");
97
+ e !== null && (this._value = e, this.toggleAttribute("data-has-value", !!e)), this._internals?.setFormValue?.(this._value), this.addEventListener("option-register", this._onOptionRegister), this.addEventListener("option-unregister", this._onOptionUnregister), this.addEventListener("keydown", this._onKeydown), this.addEventListener("focusout", this._onFocusOut), document.addEventListener("click", this._onClickOutside);
98
+ }
99
+ disconnectedCallback() {
100
+ super.disconnectedCallback(), this.removeEventListener("option-register", this._onOptionRegister), this.removeEventListener("option-unregister", this._onOptionUnregister), this.removeEventListener("keydown", this._onKeydown), this.removeEventListener("focusout", this._onFocusOut), document.removeEventListener("click", this._onClickOutside), this._options.forEach((e) => {
101
+ e.removeEventListener("click", this._handleOptionClick), e.removeEventListener("pointerover", this._handleOptionPointerOver), e.removeEventListener("pointerdown", this._handleOptionPointerDown), e.removeEventListener("option-update", this._onOptionUpdate);
102
+ }), this._close(), this._disposeOverlay();
103
+ }
104
+ firstUpdated() {
105
+ this._initLocalOverlay(), requestAnimationFrame(() => {
106
+ this.isConnected && this._onSlotChange();
107
+ });
108
+ }
109
+ willUpdate() {
110
+ this._options = this._portal ? [...this._portal.panel.querySelectorAll("web-ui-option")] : [...this.querySelectorAll("web-ui-option")], this._ensureOptionIds(), this._syncSelected();
111
+ }
112
+ updated(e) {
113
+ (e.has("portal") || e.has("overlayContainer")) && requestAnimationFrame(() => this._reconfigureOverlay()), e.has("lockScroll") && this._syncScrollLock(), this._syncOpenAttribute(), this._syncValidity();
114
+ }
115
+ formResetCallback() {
116
+ this.value = this.getAttribute("value") || "";
117
+ }
118
+ formDisabledCallback(e) {
119
+ this._formDisabled = e;
120
+ }
121
+ _syncValidity() {
122
+ !this._internals || typeof this._internals.setValidity != "function" || (this._isDisabled || !this.required || this.value ? this._internals.setValidity({}) : this._internals.setValidity({ valueMissing: !0 }, "请选择一项"));
123
+ }
124
+ _syncOpenAttribute() {
125
+ this.toggleAttribute("open", this._isOpen);
126
+ }
127
+ _syncSelected() {
128
+ if (this._options.forEach((e) => {
129
+ e.selected = e.value === this.value;
130
+ }), !this.value) {
131
+ this._selectedLabel = this.placeholder;
132
+ return;
133
+ }
134
+ let e = this._options.find((e) => e.value === this.value);
135
+ this._selectedLabel = e?.label || this.placeholder;
136
+ }
137
+ _ensureOptionIds() {
138
+ this._options.forEach((e, t) => {
139
+ e.id ||= `${this.localName}-option-${t}`;
140
+ });
141
+ }
142
+ _navigateActive(e) {
143
+ let t = this._options.filter((e) => !e.disabled);
144
+ if (!t.length) return;
145
+ let n = this._options.find((e) => e.value === this.value && !e.disabled), r = (this._activeIndex >= 0 ? t.indexOf(this._options[this._activeIndex]) : n ? t.indexOf(n) : e > 0 ? -1 : 0) + e;
146
+ r < 0 && (r = t.length - 1), r >= t.length && (r = 0);
147
+ let i = t[r];
148
+ this._activeIndex = this._options.indexOf(i), this._syncActiveOption();
149
+ }
150
+ _open(e = !1) {
151
+ this._isDisabled || this._isOpen || (this._isOpen = !0, this._dispatchOpenChange(), this._syncSelected(), e ? this._setInitialActiveOption() : this._syncActiveOption(), this._syncScrollLock(), this.portal ? requestAnimationFrame(() => {
152
+ this._isOpen && this._openOverlay(e);
153
+ }) : this._openOverlay(e));
154
+ }
155
+ _close() {
156
+ this._isOpen && (this._isOpen = !1, this._dispatchOpenChange(), this._activeIndex = -1, this._options.forEach((e) => e.removeAttribute("active")), this._syncScrollLock(!1), this._closeOverlay());
157
+ }
158
+ _dispatchOpenChange() {
159
+ this.dispatchEvent(new CustomEvent("open-change", {
160
+ detail: { open: this._isOpen },
161
+ bubbles: !0,
162
+ composed: !0
163
+ }));
164
+ }
165
+ _setInitialActiveOption() {
166
+ let e = this._options.findIndex((e) => e.value === this.value && !e.disabled), t = this._options.findIndex((e) => !e.disabled);
167
+ this._activeIndex = e >= 0 ? e : t, this._syncActiveOption();
168
+ }
169
+ _syncActiveOption() {
170
+ this._options.forEach((e, t) => e.toggleAttribute("active", t === this._activeIndex));
171
+ }
172
+ _notifyValueChange() {
173
+ this.dispatchEvent(new Event("input", {
174
+ bubbles: !0,
175
+ composed: !0
176
+ })), this.dispatchEvent(new Event("change", {
177
+ bubbles: !0,
178
+ composed: !0
179
+ }));
180
+ }
181
+ _syncScrollLock(e = this._isOpen) {
182
+ let t = e && this.lockScroll;
183
+ t !== this._hasScrollLock && (t ? s() : c(), this._hasScrollLock = t);
184
+ }
185
+ _togglePopup() {
186
+ this._isDisabled || (this._isOpen ? this._close() : this._open());
187
+ }
188
+ _initLocalOverlay() {
189
+ let e = this.shadowRoot?.querySelector(".select-trigger"), t = this.shadowRoot?.querySelector(".select-overlay");
190
+ !e || !t || (this._overlay = l.make({
191
+ anchor: e,
192
+ overlay: t,
193
+ placement: "bottom-start",
194
+ offset: 4
195
+ }));
196
+ }
197
+ _openOverlay(e = !1) {
198
+ if (this.portal) this._openPortal(e);
199
+ else {
200
+ let t = this.shadowRoot?.querySelector(".select-overlay");
201
+ t && (t.style.width = `${this._getDesiredWidth()}px`), this._overlay?.open(), t && o(t, { isInstant: e });
202
+ }
203
+ }
204
+ _getDesiredWidth() {
205
+ let e = this.shadowRoot?.querySelector(".select-trigger")?.offsetWidth || 0, t = [...this.querySelectorAll("web-ui-option")], n = 0;
206
+ return t.forEach((e) => {
207
+ let t = e.shadowRoot?.querySelector(".option-label")?.scrollWidth || e.scrollWidth || 0;
208
+ t > n && (n = t);
209
+ }), Math.max(120, e, n);
210
+ }
211
+ _openPortal(e = !1) {
212
+ if (this._portal) {
213
+ this._overlay?.open(), o(this._portal.panel, { isInstant: e });
214
+ return;
215
+ }
216
+ let n = this.shadowRoot?.querySelector(".select-trigger");
217
+ if (!n) return;
218
+ let r = this._getDesiredWidth(), a = u({
219
+ container: this.overlayContainer,
220
+ target: this,
221
+ style: `${t}\n${i}\n${d}`,
222
+ className: "wui-glass select-overlay portal wui-floating-panel"
223
+ });
224
+ a.panel.style.width = `${r}px`, a.panel.setAttribute("role", "listbox"), a.moveContent(Array.from(this.children)), this._portal = a, this._overlay = l.make({
225
+ anchor: n,
226
+ overlay: a.panel,
227
+ placement: "bottom-start",
228
+ offset: 4,
229
+ strategy: "fixed"
230
+ }), this._overlay.open(), o(a.panel, { isInstant: e });
231
+ }
232
+ async _closeOverlay() {
233
+ this._overlay?.close();
234
+ let e = this._portal?.panel ?? this.shadowRoot?.querySelector(".select-overlay");
235
+ e && !await a(e) || !this._portal || this._isOpen || (this._portal.restoreContent(), this._portal.remove(), this._portal = void 0, this._overlay = void 0);
236
+ }
237
+ _disposeOverlay() {
238
+ this._overlay?.dispose(), this._overlay = void 0, this._portal?.restoreContent(), this._portal?.remove(), this._portal = void 0;
239
+ }
240
+ _reconfigureOverlay() {
241
+ this._disposeOverlay(), this.portal || this._initLocalOverlay(), this._isOpen && this._openOverlay();
242
+ }
243
+ render() {
244
+ return p`
245
+ <div class="wui-select-inner">
246
+ <div
247
+ class="wui-glass select-trigger"
248
+ ?data-custom-trigger=${this._hasTriggerSlot}
249
+ @click=${this._togglePopup}
250
+ tabindex=${this._isDisabled ? -1 : 0}
251
+ role="combobox"
252
+ aria-expanded=${this._isOpen}
253
+ aria-haspopup="listbox"
254
+ aria-disabled=${String(this._isDisabled)}
255
+ aria-activedescendant=${this._isOpen && this._activeIndex >= 0 ? this._options[this._activeIndex]?.id : m}
256
+ >
257
+ <slot name="trigger" @slotchange=${this._onTriggerSlotChange}></slot>
258
+ ${this._hasTriggerSlot ? m : p`<span class="label">${this._selectedLabel}</span>`}
259
+ <web-ui-icon class="arrow" .icon=${n}></web-ui-icon>
260
+ </div>
261
+ <div class="wui-glass select-overlay wui-floating-panel" hidden role="listbox">
262
+ <slot @slotchange=${this._onSlotChange}></slot>
263
+ </div>
264
+ </div>
265
+ `;
266
+ }
267
+ };
268
+ e([v()], y.prototype, "_formDisabled", void 0), e([_({
269
+ type: String,
270
+ reflect: !0
271
+ })], y.prototype, "placeholder", void 0), e([_({
272
+ type: Boolean,
273
+ reflect: !0
274
+ })], y.prototype, "disabled", void 0), e([_({
275
+ type: Boolean,
276
+ reflect: !0
277
+ })], y.prototype, "required", void 0), e([_({
278
+ type: Boolean,
279
+ reflect: !0
280
+ })], y.prototype, "portal", void 0), e([_({
281
+ reflect: !0,
282
+ attribute: "lock-scroll",
283
+ converter: r
284
+ })], y.prototype, "lockScroll", void 0), e([_({ attribute: !1 })], y.prototype, "overlayContainer", void 0), e([_({
285
+ type: String,
286
+ reflect: !0
287
+ })], y.prototype, "name", void 0), e([v()], y.prototype, "_value", void 0), e([v()], y.prototype, "_isOpen", void 0), e([v()], y.prototype, "_activeIndex", void 0), e([v()], y.prototype, "_selectedLabel", void 0), e([v()], y.prototype, "_hasTriggerSlot", void 0), y = e([g("web-ui-select")], y);
288
+ //#endregion
289
+ export { y as WebUiSelect };
290
+
291
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/select/index.ts"],"sourcesContent":["import { html, LitElement, nothing, type PropertyValues, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/icon'\nimport '@/components/option'\nimport glass from '@/assets/glass.css?inline'\nimport overlayMotion from '@/assets/overlay-motion.css?inline'\nimport type { WebUiOption } from '@/components/option'\nimport { lucideChevronDown } from '@/icons'\nimport { withOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { createOverlayPortal } from '@/shared/overlay/portal'\nimport type { OverlayContainer, OverlayPortal } from '@/shared/overlay/portal'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\nimport { booleanWithFalseString } from '@/shared/property-converters/boolean-with-false-string'\nimport { lockScroll, unlockScroll } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-select')\nexport class WebUiSelect extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(overlayMotion), unsafeCSS(style)]\n\n static formAssociated = true\n\n // ElementInternals 实例,在 connectedCallback 中初始化\n private _internals?: ElementInternals\n @state() private _formDisabled = false\n\n @property({ type: String, reflect: true }) placeholder = ''\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) required = false\n @property({ type: Boolean, reflect: true }) portal = false\n @property({ reflect: true, attribute: 'lock-scroll', converter: booleanWithFalseString }) lockScroll = true\n @property({ attribute: false }) overlayContainer?: OverlayContainer\n @property({ type: String, reflect: true }) name = ''\n\n // value 使用内部状态 + 访问器模式,在变更时同步 ElementInternals\n @state() private _value = ''\n get value(): string {\n return this._value\n }\n set value(v: string) {\n const old = this._value\n this._value = v\n this._internals?.setFormValue?.(v)\n this.toggleAttribute('data-has-value', !!v)\n this.requestUpdate('value', old)\n }\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formDisabled\n }\n\n @state() private _isOpen = false\n @state() private _activeIndex = -1\n @state() private _selectedLabel = ''\n @state() private _hasTriggerSlot = false\n\n private _options: WebUiOption[] = []\n private _overlay?: OverlayApi\n private _portal?: OverlayPortal\n private _hasScrollLock = false\n\n get isOpen(): boolean {\n return this._isOpen\n }\n\n get open(): boolean {\n return this._isOpen\n }\n\n private _onClickOutside = (e: MouseEvent) => {\n if (\n this._isOpen &&\n e.target instanceof Node &&\n !this.contains(e.target) &&\n !this._portal?.panel.contains(e.target)\n ) {\n this._close()\n }\n }\n\n private _onFocusOut = () => {\n requestAnimationFrame(() => {\n if (this._isOpen && !this.matches(':focus-within') && !this._portal?.panel.matches(':focus-within')) {\n this._close()\n }\n })\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this._internals = this.attachInternals()\n // 同步 HTML 属性中预设的 value,补全访问器模式不处理 attribute 反射\n const attrValue = this.getAttribute('value')\n if (attrValue !== null) {\n this._value = attrValue\n this.toggleAttribute('data-has-value', !!attrValue)\n }\n this._internals?.setFormValue?.(this._value)\n this.addEventListener('option-register', this._onOptionRegister)\n this.addEventListener('option-unregister', this._onOptionUnregister)\n this.addEventListener('keydown', this._onKeydown)\n this.addEventListener('focusout', this._onFocusOut)\n document.addEventListener('click', this._onClickOutside)\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('option-register', this._onOptionRegister)\n this.removeEventListener('option-unregister', this._onOptionUnregister)\n this.removeEventListener('keydown', this._onKeydown)\n this.removeEventListener('focusout', this._onFocusOut)\n document.removeEventListener('click', this._onClickOutside)\n this._options.forEach(o => {\n o.removeEventListener('click', this._handleOptionClick)\n o.removeEventListener('pointerover', this._handleOptionPointerOver)\n o.removeEventListener('pointerdown', this._handleOptionPointerDown)\n o.removeEventListener('option-update', this._onOptionUpdate)\n })\n this._close()\n this._disposeOverlay()\n }\n\n override firstUpdated() {\n this._initLocalOverlay()\n requestAnimationFrame(() => {\n if (this.isConnected) this._onSlotChange()\n })\n }\n\n override willUpdate() {\n this._options = this._portal\n ? [...this._portal.panel.querySelectorAll<WebUiOption>('web-ui-option')]\n : [...this.querySelectorAll<WebUiOption>('web-ui-option')]\n this._ensureOptionIds()\n this._syncSelected()\n }\n\n override updated(changed: PropertyValues) {\n if (changed.has('portal') || changed.has('overlayContainer'))\n requestAnimationFrame(() => this._reconfigureOverlay())\n if (changed.has('lockScroll')) this._syncScrollLock()\n this._syncOpenAttribute()\n this._syncValidity()\n }\n\n formResetCallback() {\n this.value = this.getAttribute('value') || ''\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formDisabled = disabled\n }\n\n private _syncValidity() {\n if (!this._internals || typeof this._internals.setValidity !== 'function') return\n if (this._isDisabled || !this.required || this.value) this._internals.setValidity({})\n else this._internals.setValidity({ valueMissing: true }, '请选择一项')\n }\n\n private _syncOpenAttribute() {\n this.toggleAttribute('open', this._isOpen)\n }\n\n private _onTriggerSlotChange = (e: Event) => {\n const slot = e.target as HTMLSlotElement\n const hasContent = slot.assignedElements().length > 0\n if (this._hasTriggerSlot === hasContent) return\n this._hasTriggerSlot = hasContent\n this._reconfigureOverlay()\n }\n\n private _syncSelected() {\n this._options.forEach(o => {\n o.selected = o.value === this.value\n })\n if (!this.value) {\n this._selectedLabel = this.placeholder\n return\n }\n const option = this._options.find(o => o.value === this.value)\n this._selectedLabel = option?.label || this.placeholder\n }\n\n private _ensureOptionIds() {\n this._options.forEach((option, index) => {\n if (!option.id) option.id = `${this.localName}-option-${index}`\n })\n }\n\n private _onOptionRegister = (e: Event) => {\n if (!(e.target instanceof HTMLElement)) return\n const target = e.target as WebUiOption\n target.addEventListener('click', this._handleOptionClick)\n target.addEventListener('pointerover', this._handleOptionPointerOver)\n target.addEventListener('pointerdown', this._handleOptionPointerDown)\n target.addEventListener('option-update', this._onOptionUpdate)\n this._options.push(target)\n this._ensureOptionIds()\n this._syncSelected()\n }\n\n private _onOptionUnregister = (e: Event) => {\n if (!(e.target instanceof HTMLElement)) return\n const target = e.target as WebUiOption\n target.removeEventListener('click', this._handleOptionClick)\n target.removeEventListener('pointerover', this._handleOptionPointerOver)\n target.removeEventListener('pointerdown', this._handleOptionPointerDown)\n target.removeEventListener('option-update', this._onOptionUpdate)\n this._options = this._options.filter(o => o !== target)\n }\n\n private _onSlotChange = () => {\n const options = this._portal\n ? [...this._portal.panel.querySelectorAll<WebUiOption>('web-ui-option')]\n : [...this.querySelectorAll<WebUiOption>('web-ui-option')]\n this._options = options\n this._ensureOptionIds()\n this._syncSelected()\n }\n\n private _handleOptionClick = (e: Event) => {\n if (!(e.currentTarget instanceof HTMLElement)) return\n const option = e.currentTarget as WebUiOption\n if (option.disabled) return\n this.value = option.value\n this._close()\n this._notifyValueChange()\n }\n\n private _onOptionUpdate = () => {\n this._syncSelected()\n this._syncActiveOption()\n }\n\n private _handleOptionPointerOver = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return\n if (!this._isOpen || this._activeIndex < 0 || !(e.currentTarget instanceof HTMLElement)) return\n\n // 指针接管后只保留 :hover,避免键盘激活项与悬停项同时高亮。\n this._activeIndex = -1\n this._syncActiveOption()\n }\n\n private _handleOptionPointerDown = (e: PointerEvent) => {\n // 保持 trigger 焦点,避免 focusout 在 click 前关闭浮层。\n e.preventDefault()\n }\n\n private _onKeydown = (e: KeyboardEvent) => {\n if (this._isDisabled) return\n\n switch (e.key) {\n case 'Escape':\n if (this._isOpen) {\n this._close()\n e.preventDefault()\n }\n break\n case 'ArrowDown':\n e.preventDefault()\n if (!this._isOpen) {\n this._open(true)\n } else {\n this._navigateActive(1)\n }\n break\n case 'ArrowUp':\n e.preventDefault()\n if (!this._isOpen) this._open(true)\n else this._navigateActive(-1)\n break\n case 'Enter':\n if (this._isOpen && this._activeIndex >= 0) {\n const option = this._options[this._activeIndex]\n if (option && !option.disabled) {\n this.value = option.value\n this._notifyValueChange()\n }\n this._close()\n e.preventDefault()\n }\n break\n }\n }\n\n private _navigateActive(delta: number) {\n const enabled = this._options.filter(o => !o.disabled)\n if (!enabled.length) return\n\n const selectedOption = this._options.find(option => option.value === this.value && !option.disabled)\n const currentIdx =\n this._activeIndex >= 0\n ? enabled.indexOf(this._options[this._activeIndex])\n : selectedOption\n ? enabled.indexOf(selectedOption)\n : delta > 0\n ? -1\n : 0\n let nextIdx = currentIdx + delta\n if (nextIdx < 0) nextIdx = enabled.length - 1\n if (nextIdx >= enabled.length) nextIdx = 0\n\n const nextOption = enabled[nextIdx]\n this._activeIndex = this._options.indexOf(nextOption)\n\n this._syncActiveOption()\n }\n\n private _open(isKeyboardNavigation = false) {\n if (this._isDisabled || this._isOpen) return\n this._isOpen = true\n this._dispatchOpenChange()\n this._syncSelected()\n if (isKeyboardNavigation) this._setInitialActiveOption()\n else this._syncActiveOption()\n this._syncScrollLock()\n if (this.portal) {\n requestAnimationFrame(() => {\n if (this._isOpen) this._openOverlay(isKeyboardNavigation)\n })\n } else {\n this._openOverlay(isKeyboardNavigation)\n }\n }\n\n private _close() {\n if (!this._isOpen) return\n this._isOpen = false\n this._dispatchOpenChange()\n this._activeIndex = -1\n this._options.forEach(o => o.removeAttribute('active'))\n this._syncScrollLock(false)\n void this._closeOverlay()\n }\n\n private _dispatchOpenChange() {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open: this._isOpen },\n bubbles: true,\n composed: true\n })\n )\n }\n\n private _setInitialActiveOption() {\n const selectedIndex = this._options.findIndex(option => option.value === this.value && !option.disabled)\n const firstEnabledIndex = this._options.findIndex(option => !option.disabled)\n this._activeIndex = selectedIndex >= 0 ? selectedIndex : firstEnabledIndex\n this._syncActiveOption()\n }\n\n private _syncActiveOption() {\n this._options.forEach((option, index) => option.toggleAttribute('active', index === this._activeIndex))\n }\n\n private _notifyValueChange() {\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n\n private _syncScrollLock(isOpen = this._isOpen) {\n const shouldLock = isOpen && this.lockScroll\n if (shouldLock === this._hasScrollLock) return\n\n if (shouldLock) lockScroll()\n else unlockScroll()\n this._hasScrollLock = shouldLock\n }\n\n private _togglePopup() {\n if (this._isDisabled) return\n if (this._isOpen) this._close()\n else this._open()\n }\n\n private _initLocalOverlay() {\n const anchor = this.shadowRoot?.querySelector<HTMLElement>('.select-trigger')\n const panel = this.shadowRoot?.querySelector<HTMLElement>('.select-overlay')\n if (!anchor || !panel) return\n this._overlay = withOverlay.make({\n anchor,\n overlay: panel,\n placement: 'bottom-start',\n offset: 4\n })\n }\n\n private _openOverlay(isKeyboardNavigation = false) {\n if (this.portal) {\n this._openPortal(isKeyboardNavigation)\n } else {\n const panel = this.shadowRoot?.querySelector<HTMLElement>('.select-overlay')\n if (panel) panel.style.width = `${this._getDesiredWidth()}px`\n this._overlay?.open()\n if (panel) showOverlayPresence(panel, { isInstant: isKeyboardNavigation })\n }\n }\n\n private _getDesiredWidth(): number {\n const trigger = this.shadowRoot?.querySelector<HTMLElement>('.select-trigger')\n const triggerWidth = trigger?.offsetWidth || 0\n\n const options = [...this.querySelectorAll<WebUiOption>('web-ui-option')]\n let maxOptionWidth = 0\n options.forEach(opt => {\n const label = opt.shadowRoot?.querySelector<HTMLElement>('.option-label')\n const w = label?.scrollWidth || opt.scrollWidth || 0\n if (w > maxOptionWidth) maxOptionWidth = w\n })\n\n return Math.max(120, triggerWidth, maxOptionWidth)\n }\n\n private _openPortal(isKeyboardNavigation = false) {\n if (this._portal) {\n this._overlay?.open()\n showOverlayPresence(this._portal.panel, { isInstant: isKeyboardNavigation })\n return\n }\n const anchor = this.shadowRoot?.querySelector<HTMLElement>('.select-trigger')\n if (!anchor) return\n\n const desiredWidth = this._getDesiredWidth()\n\n const portal = createOverlayPortal({\n container: this.overlayContainer,\n target: this,\n style: `${glass}\\n${overlayMotion}\\n${style}`,\n className: 'wui-glass select-overlay portal wui-floating-panel'\n })\n portal.panel.style.width = `${desiredWidth}px`\n portal.panel.setAttribute('role', 'listbox')\n portal.moveContent(Array.from(this.children))\n this._portal = portal\n this._overlay = withOverlay.make({\n anchor,\n overlay: portal.panel,\n placement: 'bottom-start',\n offset: 4,\n strategy: 'fixed'\n })\n this._overlay.open()\n showOverlayPresence(portal.panel, { isInstant: isKeyboardNavigation })\n }\n\n private async _closeOverlay() {\n this._overlay?.close()\n const panel = this._portal?.panel ?? this.shadowRoot?.querySelector<HTMLElement>('.select-overlay')\n if (panel && !(await hideOverlayPresence(panel))) return\n if (!this._portal || this._isOpen) return\n this._portal.restoreContent()\n this._portal.remove()\n this._portal = undefined\n this._overlay = undefined\n }\n\n private _disposeOverlay() {\n this._overlay?.dispose()\n this._overlay = undefined\n this._portal?.restoreContent()\n this._portal?.remove()\n this._portal = undefined\n }\n\n private _reconfigureOverlay() {\n this._disposeOverlay()\n if (!this.portal) this._initLocalOverlay()\n if (this._isOpen) this._openOverlay()\n }\n\n override render() {\n return html`\n <div class=\"wui-select-inner\">\n <div\n class=\"wui-glass select-trigger\"\n ?data-custom-trigger=${this._hasTriggerSlot}\n @click=${this._togglePopup}\n tabindex=${this._isDisabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded=${this._isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled=${String(this._isDisabled)}\n aria-activedescendant=${this._isOpen && this._activeIndex >= 0\n ? this._options[this._activeIndex]?.id\n : nothing}\n >\n <slot name=\"trigger\" @slotchange=${this._onTriggerSlotChange}></slot>\n ${!this._hasTriggerSlot ? html`<span class=\"label\">${this._selectedLabel}</span>` : nothing}\n <web-ui-icon class=\"arrow\" .icon=${lucideChevronDown}></web-ui-icon>\n </div>\n <div class=\"wui-glass select-overlay wui-floating-panel\" hidden role=\"listbox\">\n <slot @slotchange=${this._onSlotChange}></slot>\n </div>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-select': WebUiSelect\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region src/components/select/style.css?inline
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:inline-block}:host([disabled]){cursor:not-allowed;opacity:.4}.wui-select-inner{flex-direction:column;display:flex;position:relative}.select-trigger{cursor:pointer;box-sizing:border-box;width:var(--wui-input-width,200px);min-width:var(--wui-button-size,40px);height:var(--wui-button-size,40px);border-radius:2147483647px;align-items:center;gap:8px;padding:0 16px;display:flex}.select-trigger:focus-visible{outline:3px solid var(--wui-focus-ring,#08f6);outline-offset:2px}.select-trigger[data-custom-trigger]{width:auto}:host([disabled]) .select-trigger{cursor:not-allowed}.label{font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}:host(:not([data-has-value])) .label{color:var(--wui-color-text-muted,#6a6a6a)}::slotted([slot=trigger]){font-size:var(--wui-font-size,14px);color:var(--wui-color-text,#1b1b1b);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.arrow{color:var(--wui-color-text-muted,#6a6a6a);flex-shrink:0}:host([open]) .arrow{transform:rotate(180deg)}.select-overlay{--wui-glass-shadow:var(--wui-shadow-pop,0 3px 9px #00000045);z-index:var(--wui-layer-local-overlay,1);box-sizing:border-box;min-width:200px;max-width:var(--wui-select-max-width,500px);background-color:var(--wui-color-surface-overlay,#f5f5f5d9);border-radius:20px;max-height:320px;padding:4px;position:absolute;overflow-y:auto}:host([portal]) .select-overlay{display:none}.select-overlay.portal{z-index:var(--wui-layer-menu,100);position:fixed}.select-overlay.hidden{display:none}";
3
+ //#endregion
4
+ export { e as default };
5
+
6
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/select/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.wui-select-inner {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.select-trigger {\n cursor: pointer;\n\n display: flex;\n gap: 8px;\n align-items: center;\n\n box-sizing: border-box;\n width: var(--wui-input-width, 200px);\n min-width: var(--wui-button-size, 40px);\n height: var(--wui-button-size, 40px);\n padding: 0 16px;\n border-radius: calc(infinity * 1px);\n\n &:focus-visible {\n outline: 3px solid var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n outline-offset: 2px;\n }\n}\n\n.select-trigger[data-custom-trigger] {\n width: auto;\n}\n\n:host([disabled]) .select-trigger {\n cursor: not-allowed;\n}\n\n.label {\n overflow: hidden;\n flex: 1;\n\n font-size: var(--wui-font-size, 14px);\n color: var(--wui-color-text, #1b1b1b);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host(:not([data-has-value])) .label {\n color: var(--wui-color-text-muted, #6a6a6a);\n}\n\n::slotted([slot='trigger']) {\n overflow: hidden;\n flex: 1;\n\n font-size: var(--wui-font-size, 14px);\n color: var(--wui-color-text, #1b1b1b);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.arrow {\n flex-shrink: 0;\n color: var(--wui-color-text-muted, #6a6a6a);\n}\n\n:host([open]) .arrow {\n transform: rotate(180deg);\n}\n\n/* ===== 浮层(glass 样式参考 dialog) ===== */\n\n.select-overlay {\n --wui-glass-shadow: var(--wui-shadow-pop, 0 3px 9px rgb(0 0 0 / 0.27));\n position: absolute;\n z-index: var(--wui-layer-local-overlay, 1);\n\n overflow-y: auto;\n\n box-sizing: border-box;\n min-width: 200px;\n max-width: var(--wui-select-max-width, 500px);\n max-height: 320px;\n padding: 4px;\n border-radius: 20px;\n\n background-color: var(--wui-color-surface-overlay, rgb(245 245 245 / 0.85));\n}\n\n:host([portal]) .select-overlay {\n display: none;\n}\n\n.select-overlay.portal {\n position: fixed;\n z-index: var(--wui-layer-menu, 100);\n}\n\n.select-overlay.hidden {\n display: none;\n}\n"],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class WebUiSlider extends LitElement {
3
+ static styles: import('lit').CSSResult[];
4
+ static formAssociated: boolean;
5
+ private _internals?;
6
+ private _formDisabled;
7
+ disabled: boolean;
8
+ marks: boolean;
9
+ vertical: boolean;
10
+ name: string;
11
+ required: boolean;
12
+ private _value;
13
+ private _initialValue;
14
+ get value(): number;
15
+ set value(v: number);
16
+ private _min;
17
+ get min(): number;
18
+ set min(v: number);
19
+ private _max;
20
+ get max(): number;
21
+ set max(v: number);
22
+ private _step;
23
+ get step(): number;
24
+ set step(v: number);
25
+ private _dragging;
26
+ private _interactionStartValue;
27
+ private get _isDisabled();
28
+ connectedCallback(): void;
29
+ willUpdate(changed: Map<string, unknown>): void;
30
+ formResetCallback(): void;
31
+ formDisabledCallback(disabled: boolean): void;
32
+ updated(): void;
33
+ /** 将焦点移至滑块,供表单或外部控制使用 */
34
+ focus(options?: FocusOptions): void;
35
+ /** 移除滑块焦点 */
36
+ blur(): void;
37
+ private get _slider();
38
+ private get _range();
39
+ private get _percent();
40
+ private get _markValues();
41
+ private get _safeStep();
42
+ private _normalizeValue;
43
+ private get _precision();
44
+ private _decimalPlaces;
45
+ private _setValue;
46
+ private _setValueFromPointer;
47
+ private _handlePointerDown;
48
+ private _handlePointerMove;
49
+ private _handlePointerUp;
50
+ private _handleKeyDown;
51
+ render(): import('lit').TemplateResult<1>;
52
+ readonly $events: {
53
+ input: Event;
54
+ change: Event;
55
+ };
56
+ }
57
+ declare global {
58
+ interface HTMLElementTagNameMap {
59
+ 'web-ui-slider': WebUiSlider;
60
+ }
61
+ }
@@ -0,0 +1,219 @@
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
2
+ import t from "../../assets/glass.js";
3
+ import { normalizeNumber as n } from "../../shared/normalize/index.js";
4
+ import r from "./style.js";
5
+ import { LitElement as i, html as a, unsafeCSS as o } from "lit";
6
+ import { customElement as s, property as c, state as l } from "lit/decorators.js";
7
+ import { classMap as u } from "lit/directives/class-map.js";
8
+ import { styleMap as d } from "lit/directives/style-map.js";
9
+ //#region src/components/slider/index.ts
10
+ var f = class extends i {
11
+ constructor(...e) {
12
+ super(...e), this._formDisabled = !1, this.disabled = !1, this.marks = !1, this.vertical = !1, this.name = "", this.required = !1, this._value = 0, this._initialValue = 0, this._min = 0, this._max = 100, this._step = 1, this._dragging = !1;
13
+ }
14
+ static {
15
+ this.styles = [o(t), o(r)];
16
+ }
17
+ static {
18
+ this.formAssociated = !0;
19
+ }
20
+ get value() {
21
+ return this._value;
22
+ }
23
+ set value(e) {
24
+ let t = n(e, -Infinity, Infinity, 0), r = this._value;
25
+ this._value = t, this._internals?.setFormValue?.(String(t)), this.requestUpdate("value", r);
26
+ }
27
+ get min() {
28
+ return this._min;
29
+ }
30
+ set min(e) {
31
+ this._min = n(e, -Infinity, Infinity, 0);
32
+ }
33
+ get max() {
34
+ return this._max;
35
+ }
36
+ set max(e) {
37
+ this._max = n(e, -Infinity, Infinity, 100);
38
+ }
39
+ get step() {
40
+ return this._step;
41
+ }
42
+ set step(e) {
43
+ this._step = n(e, -Infinity, Infinity, 1);
44
+ }
45
+ get _isDisabled() {
46
+ return this.disabled || this._formDisabled;
47
+ }
48
+ connectedCallback() {
49
+ super.connectedCallback(), this._internals = this.attachInternals(), this._initialValue = Number(this.getAttribute("value")) || 0, this._internals?.setFormValue?.(String(this._value));
50
+ }
51
+ willUpdate(e) {
52
+ if (e.has("value") || e.has("min") || e.has("max") || e.has("step")) {
53
+ let e = this._normalizeValue(this.value);
54
+ e !== this.value && (this.value = e);
55
+ }
56
+ }
57
+ formResetCallback() {
58
+ this.value = this._initialValue;
59
+ }
60
+ formDisabledCallback(e) {
61
+ this._formDisabled = e;
62
+ }
63
+ updated() {
64
+ !this._internals || typeof this._internals.setValidity != "function" || (this._isDisabled || this.required, this._internals.setValidity({}));
65
+ }
66
+ focus(e) {
67
+ this._slider?.focus(e);
68
+ }
69
+ blur() {
70
+ this._slider?.blur();
71
+ }
72
+ get _slider() {
73
+ return this.renderRoot.querySelector("[role=\"slider\"]");
74
+ }
75
+ get _range() {
76
+ return Math.max(0, this.max - this.min);
77
+ }
78
+ get _percent() {
79
+ return this._range === 0 ? 0 : (this.value - this.min) / this._range * 100;
80
+ }
81
+ get _markValues() {
82
+ if (!this.marks || this._range === 0) return [];
83
+ let e = Math.min(100, Math.floor(this._range / this._safeStep));
84
+ return Array.from({ length: e + 1 }, (e, t) => this.min + t * this._safeStep);
85
+ }
86
+ get _safeStep() {
87
+ return Number.isFinite(this.step) && this.step > 0 ? this.step : 1;
88
+ }
89
+ _normalizeValue(e) {
90
+ if (!Number.isFinite(e)) return this.min;
91
+ let t = Math.min(this.min, this.max), n = Math.max(this.min, this.max), r = Math.round((Math.min(n, Math.max(t, e)) - t) / this._safeStep);
92
+ return Number((t + r * this._safeStep).toFixed(this._precision));
93
+ }
94
+ get _precision() {
95
+ return Math.max(this._decimalPlaces(this.min), this._decimalPlaces(this.max), this._decimalPlaces(this._safeStep));
96
+ }
97
+ _decimalPlaces(e) {
98
+ let [, t = ""] = String(e).split(".");
99
+ return t.length;
100
+ }
101
+ _setValue(e) {
102
+ if (this._isDisabled) return !1;
103
+ let t = this._normalizeValue(e);
104
+ return t === this.value ? !1 : (this.value = t, this.dispatchEvent(new Event("input", {
105
+ bubbles: !0,
106
+ composed: !0
107
+ })), !0);
108
+ }
109
+ _setValueFromPointer(e) {
110
+ let t = e.currentTarget.getBoundingClientRect();
111
+ if (this.vertical) {
112
+ if (t.height <= 0) return !1;
113
+ let n = Math.min(1, Math.max(0, 1 - (e.clientY - t.top) / t.height));
114
+ return this._setValue(this.min + n * this._range);
115
+ }
116
+ if (t.width <= 0) return !1;
117
+ let n = Math.min(1, Math.max(0, (e.clientX - t.left) / t.width));
118
+ return this._setValue(this.min + n * this._range);
119
+ }
120
+ _handlePointerDown(e) {
121
+ this._isDisabled || (e.currentTarget.setPointerCapture?.(e.pointerId), this._interactionStartValue = this.value, this._dragging = !0, this._setValueFromPointer(e));
122
+ }
123
+ _handlePointerMove(e) {
124
+ this._dragging && this._setValueFromPointer(e);
125
+ }
126
+ _handlePointerUp(e) {
127
+ this._dragging && (this._setValueFromPointer(e), this._dragging = !1, this._interactionStartValue !== this.value && this.dispatchEvent(new Event("change", {
128
+ bubbles: !0,
129
+ composed: !0
130
+ })), this._interactionStartValue = void 0);
131
+ }
132
+ _handleKeyDown(e) {
133
+ if (this._isDisabled) return;
134
+ let t = this._safeStep * 10, n = {
135
+ ArrowDown: this.value - this._safeStep,
136
+ ArrowLeft: this.value - this._safeStep,
137
+ ArrowUp: this.value + this._safeStep,
138
+ ArrowRight: this.value + this._safeStep,
139
+ PageDown: this.value - t,
140
+ PageUp: this.value + t,
141
+ Home: this.min,
142
+ End: this.max
143
+ }[e.key];
144
+ n !== void 0 && (e.preventDefault(), this._setValue(n) && this.dispatchEvent(new Event("change", {
145
+ bubbles: !0,
146
+ composed: !0
147
+ })));
148
+ }
149
+ render() {
150
+ let e = u({
151
+ "wui-slider-track": !0,
152
+ "is-disabled": this._isDisabled
153
+ }), t = u({
154
+ "wui-slider-thumb": !0,
155
+ "wui-glass": !0,
156
+ "is-dragging": this._dragging
157
+ });
158
+ return a`
159
+ <div
160
+ class=${e}
161
+ style=${d({ "--percent": `${this._percent}%` })}
162
+ role="slider"
163
+ tabindex=${this._isDisabled ? -1 : 0}
164
+ aria-label="滑块"
165
+ aria-orientation=${this.vertical ? "vertical" : "horizontal"}
166
+ aria-valuemin=${this.min}
167
+ aria-valuemax=${this.max}
168
+ aria-valuenow=${this.value}
169
+ aria-disabled=${String(this._isDisabled)}
170
+ @keydown=${this._handleKeyDown}
171
+ @pointerdown=${this._handlePointerDown}
172
+ @pointermove=${this._handlePointerMove}
173
+ @pointerup=${this._handlePointerUp}
174
+ @pointercancel=${this._handlePointerUp}
175
+ >
176
+ <div class="wui-slider-progress"></div>
177
+ <div class="wui-slider-marks">
178
+ ${this._markValues.map((e) => a`<span
179
+ class="wui-slider-mark"
180
+ style=${d({ "--percent": `${(e - this.min) / this._range * 100}%` })}
181
+ ></span>`)}
182
+ </div>
183
+ <div class=${t}></div>
184
+ </div>
185
+ `;
186
+ }
187
+ };
188
+ e([l()], f.prototype, "_formDisabled", void 0), e([c({
189
+ type: Boolean,
190
+ reflect: !0
191
+ })], f.prototype, "disabled", void 0), e([c({
192
+ type: Boolean,
193
+ reflect: !0
194
+ })], f.prototype, "marks", void 0), e([c({
195
+ type: Boolean,
196
+ reflect: !0
197
+ })], f.prototype, "vertical", void 0), e([c({
198
+ type: String,
199
+ reflect: !0
200
+ })], f.prototype, "name", void 0), e([c({
201
+ type: Boolean,
202
+ reflect: !0
203
+ })], f.prototype, "required", void 0), e([c({
204
+ type: Number,
205
+ reflect: !0
206
+ })], f.prototype, "value", null), e([c({
207
+ type: Number,
208
+ reflect: !0
209
+ })], f.prototype, "min", null), e([c({
210
+ type: Number,
211
+ reflect: !0
212
+ })], f.prototype, "max", null), e([c({
213
+ type: Number,
214
+ reflect: !0
215
+ })], f.prototype, "step", null), e([l()], f.prototype, "_dragging", void 0), f = e([s("web-ui-slider")], f);
216
+ //#endregion
217
+ export { f as WebUiSlider };
218
+
219
+ //# sourceMappingURL=index.js.map