@greypan/web-ui 1.4.1 → 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 +675 -233
  2. package/README.md +684 -238
  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 +30 -14
  342. package/dist/index.d.ts +0 -4
  343. package/dist/index.js +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/slider/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'\nimport { styleMap } from 'lit/directives/style-map.js'\n\nimport glass from '@/assets/glass.css?inline'\nimport { normalizeNumber } from '@/shared/normalize'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-slider')\nexport class WebUiSlider extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(style)]\n\n static formAssociated = true\n\n // ElementInternals 实例,在 connectedCallback 中初始化\n private _internals?: ElementInternals\n @state() private _formDisabled = false\n\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true }) marks = false\n @property({ type: Boolean, reflect: true }) vertical = false\n @property({ type: String, reflect: true }) name = ''\n @property({ type: Boolean, reflect: true }) required = false\n\n // value 使用访问器模式同步 ElementInternals\n private _value = 0\n private _initialValue = 0\n @property({ type: Number, reflect: true })\n get value(): number {\n return this._value\n }\n set value(v: number) {\n const normalized = normalizeNumber(v, -Infinity, Infinity, 0)\n const old = this._value\n this._value = normalized\n this._internals?.setFormValue?.(String(normalized))\n this.requestUpdate('value', old)\n }\n\n private _min = 0\n @property({ type: Number, reflect: true })\n get min(): number {\n return this._min\n }\n set min(v: number) {\n this._min = normalizeNumber(v, -Infinity, Infinity, 0)\n }\n\n private _max = 100\n @property({ type: Number, reflect: true })\n get max(): number {\n return this._max\n }\n set max(v: number) {\n this._max = normalizeNumber(v, -Infinity, Infinity, 100)\n }\n\n private _step = 1\n @property({ type: Number, reflect: true })\n get step(): number {\n return this._step\n }\n set step(v: number) {\n this._step = normalizeNumber(v, -Infinity, Infinity, 1)\n }\n\n @state() private _dragging = false\n // 避免未改变数值的点击被误认为一次表单提交\n private _interactionStartValue: number | undefined\n\n private get _isDisabled(): boolean {\n return this.disabled || this._formDisabled\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this._internals = this.attachInternals()\n this._initialValue = Number(this.getAttribute('value')) || 0\n this._internals?.setFormValue?.(String(this._value))\n }\n\n override willUpdate(changed: Map<string, unknown>) {\n if (changed.has('value') || changed.has('min') || changed.has('max') || changed.has('step')) {\n const normalizedValue = this._normalizeValue(this.value)\n if (normalizedValue !== this.value) this.value = normalizedValue\n }\n }\n\n formResetCallback() {\n this.value = this._initialValue\n }\n\n formDisabledCallback(disabled: boolean) {\n this._formDisabled = disabled\n }\n\n override updated() {\n if (!this._internals || typeof this._internals.setValidity !== 'function') return\n if (this._isDisabled || !this.required) this._internals.setValidity({})\n else this._internals.setValidity({})\n }\n\n /** 将焦点移至滑块,供表单或外部控制使用 */\n override focus(options?: FocusOptions) {\n this._slider?.focus(options)\n }\n\n /** 移除滑块焦点 */\n override blur() {\n this._slider?.blur()\n }\n\n private get _slider(): HTMLDivElement | null {\n return this.renderRoot.querySelector<HTMLDivElement>('[role=\"slider\"]')\n }\n\n private get _range(): number {\n return Math.max(0, this.max - this.min)\n }\n\n private get _percent(): number {\n return this._range === 0 ? 0 : ((this.value - this.min) / this._range) * 100\n }\n\n private get _markValues(): number[] {\n if (!this.marks || this._range === 0) return []\n const count = Math.min(100, Math.floor(this._range / this._safeStep))\n return Array.from({ length: count + 1 }, (_, index) => this.min + index * this._safeStep)\n }\n\n private get _safeStep(): number {\n return Number.isFinite(this.step) && this.step > 0 ? this.step : 1\n }\n\n private _normalizeValue(value: number): number {\n if (!Number.isFinite(value)) return this.min\n const lower = Math.min(this.min, this.max)\n const upper = Math.max(this.min, this.max)\n const clamped = Math.min(upper, Math.max(lower, value))\n const steps = Math.round((clamped - lower) / this._safeStep)\n return Number((lower + steps * this._safeStep).toFixed(this._precision))\n }\n\n private get _precision(): number {\n return Math.max(this._decimalPlaces(this.min), this._decimalPlaces(this.max), this._decimalPlaces(this._safeStep))\n }\n\n private _decimalPlaces(value: number): number {\n const [, decimal = ''] = String(value).split('.')\n return decimal.length\n }\n\n private _setValue(value: number): boolean {\n if (this._isDisabled) return false\n const nextValue = this._normalizeValue(value)\n if (nextValue === this.value) return false\n this.value = nextValue\n this.dispatchEvent(new Event('input', { bubbles: true, composed: true }))\n return true\n }\n\n private _setValueFromPointer(event: PointerEvent): boolean {\n const track = event.currentTarget as HTMLElement\n const rect = track.getBoundingClientRect()\n if (this.vertical) {\n if (rect.height <= 0) return false\n // 视觉上的数值从下往上增长,与坐标系相反。\n const ratio = Math.min(1, Math.max(0, 1 - (event.clientY - rect.top) / rect.height))\n return this._setValue(this.min + ratio * this._range)\n }\n if (rect.width <= 0) return false\n const ratio = Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width))\n return this._setValue(this.min + ratio * this._range)\n }\n\n private _handlePointerDown(event: PointerEvent) {\n if (this._isDisabled) return\n const track = event.currentTarget as HTMLElement\n track.setPointerCapture?.(event.pointerId)\n this._interactionStartValue = this.value\n this._dragging = true\n this._setValueFromPointer(event)\n }\n\n private _handlePointerMove(event: PointerEvent) {\n if (!this._dragging) return\n this._setValueFromPointer(event)\n }\n\n private _handlePointerUp(event: PointerEvent) {\n if (!this._dragging) return\n this._setValueFromPointer(event)\n this._dragging = false\n if (this._interactionStartValue !== this.value) {\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n this._interactionStartValue = undefined\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n if (this._isDisabled) return\n const pageStep = this._safeStep * 10\n const keyValues: Record<string, number> = {\n ArrowDown: this.value - this._safeStep,\n ArrowLeft: this.value - this._safeStep,\n ArrowUp: this.value + this._safeStep,\n ArrowRight: this.value + this._safeStep,\n PageDown: this.value - pageStep,\n PageUp: this.value + pageStep,\n Home: this.min,\n End: this.max\n }\n const nextValue = keyValues[event.key]\n if (nextValue === undefined) return\n event.preventDefault()\n if (this._setValue(nextValue)) this.dispatchEvent(new Event('change', { bubbles: true, composed: true }))\n }\n\n override render() {\n const trackClass = classMap({\n 'wui-slider-track': true,\n 'is-disabled': this._isDisabled\n })\n const thumbClass = classMap({\n 'wui-slider-thumb': true,\n 'wui-glass': true,\n 'is-dragging': this._dragging\n })\n const trackStyle = styleMap({ '--percent': `${this._percent}%` })\n\n return html`\n <div\n class=${trackClass}\n style=${trackStyle}\n role=\"slider\"\n tabindex=${this._isDisabled ? -1 : 0}\n aria-label=\"滑块\"\n aria-orientation=${this.vertical ? 'vertical' : 'horizontal'}\n aria-valuemin=${this.min}\n aria-valuemax=${this.max}\n aria-valuenow=${this.value}\n aria-disabled=${String(this._isDisabled)}\n @keydown=${this._handleKeyDown}\n @pointerdown=${this._handlePointerDown}\n @pointermove=${this._handlePointerMove}\n @pointerup=${this._handlePointerUp}\n @pointercancel=${this._handlePointerUp}\n >\n <div class=\"wui-slider-progress\"></div>\n <div class=\"wui-slider-marks\">\n ${this._markValues.map(\n mark =>\n html`<span\n class=\"wui-slider-mark\"\n style=${styleMap({ '--percent': `${((mark - this.min) / this._range) * 100}%` })}\n ></span>`\n )}\n </div>\n <div class=${thumbClass}></div>\n </div>\n `\n }\n\n declare readonly $events: {\n input: Event\n change: Event\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-slider': WebUiSlider\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ //#region src/components/slider/style.css?inline
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{width:var(--wui-slider-width,200px);display:inline-block}:host([vertical]){width:auto;height:var(--wui-slider-vertical-height,200px)}:host([disabled]){cursor:not-allowed}.wui-slider-track{cursor:pointer;-webkit-user-select:none;user-select:none;width:100%;height:var(--wui-slider-height,var(--wui-slider-track-size,6px));background-color:var(--wui-color-surface-raised-deep,#e5e5ea);border-radius:2147483647px;position:relative}.wui-slider-track:focus-visible{outline-color:var(--wui-focus-ring,#08f6)}.wui-slider-track.is-disabled{cursor:not-allowed;opacity:.38}:host([vertical]) .wui-slider-track{width:var(--wui-slider-height,var(--wui-slider-track-size,6px));height:100%}.wui-slider-progress{z-index:1;width:var(--percent);border-radius:inherit;background-color:var(--wui-color-accent,#08f);position:absolute;top:0;bottom:0;left:0}:host([vertical]) .wui-slider-progress{width:100%;height:var(--percent);top:auto;bottom:0}.wui-slider-marks{pointer-events:none;z-index:2;top:calc(100% + 4px);right:var(--wui-slider-marks-inset,0);left:var(--wui-slider-marks-inset,0);height:4px;margin-left:2px;margin-right:2px;position:absolute}:host([vertical]) .wui-slider-marks{top:var(--wui-slider-marks-inset,0);right:auto;bottom:var(--wui-slider-marks-inset,0);width:4px;height:auto;margin:2px 0;left:calc(100% + 4px)}.wui-slider-mark{top:0;left:var(--percent);background-color:var(--wui-color-surface-raised-deep,#e5e5ea);border-radius:2147483647px;width:4px;height:4px;position:absolute;transform:translate(-50%)}:host([vertical]) .wui-slider-mark{top:auto;bottom:var(--percent);left:50%;transform:translate(-50%,50%)}.wui-slider-thumb{cursor:inherit;z-index:3;top:50%;left:var(--percent);width:var(--wui-slider-thumb-height,32px);height:var(--wui-slider-thumb-width,24px);border-radius:2147483647px;position:absolute;transform:translate(-50%,-50%)}.wui-slider-thumb:not(.is-dragging){background-color:var(--wui-color-surface,#fff)}:host([vertical]) .wui-slider-thumb{top:auto;bottom:var(--percent);left:50%;transform:translate(-50%,50%)}";
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/slider/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n width: var(--wui-slider-width, 200px);\n}\n\n:host([vertical]) {\n width: auto;\n height: var(--wui-slider-vertical-height, 200px);\n}\n\n:host([disabled]) {\n cursor: not-allowed;\n}\n\n.wui-slider-track {\n cursor: pointer;\n user-select: none;\n\n position: relative;\n\n width: 100%;\n height: var(--wui-slider-height, var(--wui-slider-track-size, 6px));\n border-radius: calc(infinity * 1px);\n\n background-color: var(--wui-color-surface-raised-deep, #e5e5ea);\n\n &:focus-visible {\n outline-color: var(--wui-focus-ring, rgb(0 136 255 / 0.4));\n }\n\n &.is-disabled {\n cursor: not-allowed;\n opacity: 0.38;\n }\n}\n\n:host([vertical]) .wui-slider-track {\n width: var(--wui-slider-height, var(--wui-slider-track-size, 6px));\n height: 100%;\n}\n\n.wui-slider-progress {\n position: absolute;\n z-index: 1;\n top: 0;\n bottom: 0;\n left: 0;\n\n width: var(--percent);\n border-radius: inherit;\n\n background-color: var(--wui-color-accent, #08f);\n}\n\n:host([vertical]) .wui-slider-progress {\n top: auto;\n bottom: 0;\n width: 100%;\n height: var(--percent);\n}\n\n.wui-slider-marks {\n pointer-events: none;\n\n position: absolute;\n z-index: 2;\n top: calc(100% + 4px);\n right: var(--wui-slider-marks-inset, 0);\n left: var(--wui-slider-marks-inset, 0);\n\n height: 4px;\n margin-right: 2px;\n margin-left: 2px;\n}\n\n:host([vertical]) .wui-slider-marks {\n top: var(--wui-slider-marks-inset, 0);\n right: auto;\n bottom: var(--wui-slider-marks-inset, 0);\n left: calc(100% + 4px);\n\n width: 4px;\n height: auto;\n margin: 2px 0;\n}\n\n.wui-slider-mark {\n position: absolute;\n top: 0;\n left: var(--percent);\n transform: translateX(-50%);\n\n width: 4px;\n height: 4px;\n border-radius: calc(infinity * 1px);\n\n background-color: var(--wui-color-surface-raised-deep, #e5e5ea);\n}\n\n:host([vertical]) .wui-slider-mark {\n top: auto;\n bottom: var(--percent);\n left: 50%;\n transform: translate(-50%, 50%);\n}\n\n.wui-slider-thumb {\n cursor: inherit;\n\n position: absolute;\n z-index: 3;\n top: 50%;\n left: var(--percent);\n transform: translate(-50%, -50%);\n\n width: var(--wui-slider-thumb-height, 32px);\n height: var(--wui-slider-thumb-width, 24px);\n border-radius: calc(infinity * 1px);\n\n &:not(.is-dragging) {\n background-color: var(--wui-color-surface, #fff);\n }\n}\n\n:host([vertical]) .wui-slider-thumb {\n top: auto;\n bottom: var(--percent);\n left: 50%;\n transform: translate(-50%, 50%);\n}\n"],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import { LitElement, PropertyValues } from 'lit';
2
+ export declare class WebUiSpinner extends LitElement {
3
+ static styles: import('lit').CSSResult;
4
+ size: number;
5
+ description: string;
6
+ /** 显示全屏居中 spinner(自动创建并挂载) */
7
+ static show(options?: {
8
+ size?: number;
9
+ duration?: number;
10
+ description?: string;
11
+ }): WebUiSpinner;
12
+ /** 隐藏并销毁全屏 spinner */
13
+ static hide(): void;
14
+ /** @internal 当前命令式实例 */
15
+ static _current?: WebUiSpinner;
16
+ /** @internal */
17
+ _imperative: boolean;
18
+ /** @internal */
19
+ _timer?: ReturnType<typeof setTimeout>;
20
+ connectedCallback(): void;
21
+ disconnectedCallback(): void;
22
+ protected updated(props: PropertyValues): void;
23
+ render(): import('lit').TemplateResult<1>;
24
+ readonly $events: Record<string, never>;
25
+ }
26
+ export declare class WebUiSpinnerElement extends WebUiSpinner {
27
+ }
28
+ declare global {
29
+ interface HTMLElementTagNameMap {
30
+ 'web-ui-spinner': WebUiSpinner;
31
+ }
32
+ }
@@ -0,0 +1,52 @@
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
2
+ import t from "./style.js";
3
+ import { LitElement as n, html as r, nothing as i, unsafeCSS as a } from "lit";
4
+ import { customElement as o, property as s } from "lit/decorators.js";
5
+ import { repeat as c } from "lit/directives/repeat.js";
6
+ //#region src/components/spinner/index.ts
7
+ var l = 8, u = class e extends n {
8
+ constructor(...e) {
9
+ super(...e), this.size = 24, this.description = "", this._imperative = !1;
10
+ }
11
+ static {
12
+ this.styles = a(t);
13
+ }
14
+ static show(t) {
15
+ let n = document.createElement("web-ui-spinner");
16
+ return n._imperative = !0, t?.size && (n.size = t.size), t?.description && (n.description = t.description), document.body.appendChild(n), t?.duration && t.duration > 0 && (n._timer = window.setTimeout(() => e.hide(), t.duration)), n;
17
+ }
18
+ static hide() {
19
+ e._current?._timer && (clearTimeout(e._current._timer), e._current._timer = void 0), e._current?.remove(), e._current = void 0;
20
+ }
21
+ connectedCallback() {
22
+ super.connectedCallback(), this.hasAttribute("role") || this.setAttribute("role", "status"), this.hasAttribute("aria-label") || this.setAttribute("aria-label", "加载中"), this._imperative && (e._current?.remove(), e._current = this, this.classList.add("wui-spinner-overlay"));
23
+ }
24
+ disconnectedCallback() {
25
+ super.disconnectedCallback(), this._timer &&= (clearTimeout(this._timer), void 0);
26
+ }
27
+ updated(e) {
28
+ super.updated(e), e.has("size") && this.style.setProperty("--wui-spinner-size", `${this.size}px`);
29
+ }
30
+ render() {
31
+ let e = r`
32
+ <div class="wui-spinner">
33
+ ${c(Array.from({ length: l }, (e, t) => t), (e) => r`<span
34
+ style="transform:rotate(${e * 45}deg);animation-delay:calc(-${l - e} / ${l} * 0.8s)"
35
+ ></span>`)}
36
+ </div>
37
+ ${this.description ? r`<div class="spinner-description">${this.description}</div>` : i}
38
+ <slot name="description"></slot>
39
+ `;
40
+ return this._imperative ? r`<div class="wui-spinner-overlay">${e}</div>` : e;
41
+ }
42
+ };
43
+ e([s({
44
+ type: Number,
45
+ reflect: !0
46
+ })], u.prototype, "size", void 0), e([s({ type: String })], u.prototype, "description", void 0);
47
+ var d = class extends u {};
48
+ d = e([o("web-ui-spinner")], d);
49
+ //#endregion
50
+ export { u as WebUiSpinner, d as WebUiSpinnerElement };
51
+
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/spinner/index.ts"],"sourcesContent":["import { html, LitElement, nothing, type PropertyValues, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\n\nimport style from './style.css?inline'\n\nconst LEAF_COUNT = 8\n\nexport class WebUiSpinner extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Number, reflect: true }) size = 24\n @property({ type: String }) description = ''\n\n /** 显示全屏居中 spinner(自动创建并挂载) */\n static show(options?: { size?: number; duration?: number; description?: string }): WebUiSpinner {\n const el = document.createElement('web-ui-spinner')\n el._imperative = true\n if (options?.size) el.size = options.size\n if (options?.description) el.description = options.description\n document.body.appendChild(el)\n if (options?.duration && options.duration > 0) {\n el._timer = window.setTimeout(() => WebUiSpinner.hide(), options.duration)\n }\n return el\n }\n\n /** 隐藏并销毁全屏 spinner */\n static hide() {\n if (WebUiSpinner._current?._timer) {\n clearTimeout(WebUiSpinner._current._timer)\n WebUiSpinner._current._timer = undefined\n }\n WebUiSpinner._current?.remove()\n WebUiSpinner._current = undefined\n }\n\n /** @internal 当前命令式实例 */\n static _current?: WebUiSpinner\n\n /** @internal */\n _imperative = false\n /** @internal */\n _timer?: ReturnType<typeof setTimeout>\n\n override connectedCallback() {\n super.connectedCallback()\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'status')\n }\n if (!this.hasAttribute('aria-label')) {\n this.setAttribute('aria-label', '加载中')\n }\n if (this._imperative) {\n WebUiSpinner._current?.remove()\n WebUiSpinner._current = this\n this.classList.add('wui-spinner-overlay')\n }\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n if (this._timer) {\n clearTimeout(this._timer)\n this._timer = undefined\n }\n }\n\n protected override updated(props: PropertyValues) {\n super.updated(props)\n if (props.has('size')) {\n this.style.setProperty('--wui-spinner-size', `${this.size}px`)\n }\n }\n\n override render() {\n const spinner = html`\n <div class=\"wui-spinner\">\n ${repeat(\n Array.from({ length: LEAF_COUNT }, (_, i) => i),\n i =>\n html`<span\n style=\"transform:rotate(${i * 45}deg);animation-delay:calc(-${LEAF_COUNT - i} / ${LEAF_COUNT} * 0.8s)\"\n ></span>`\n )}\n </div>\n ${this.description ? html`<div class=\"spinner-description\">${this.description}</div>` : nothing}\n <slot name=\"description\"></slot>\n `\n return this._imperative ? html`<div class=\"wui-spinner-overlay\">${spinner}</div>` : spinner\n }\n\n declare readonly $events: Record<string, never>\n}\n\n@customElement('web-ui-spinner')\nexport class WebUiSpinnerElement extends WebUiSpinner {}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-spinner': WebUiSpinner\n }\n}\n"],"mappings":";;;;;;AAMA,IAAM,IAAa,GAEN,IAAb,MAAa,UAAqB,EAAW;;EAiC7B,aA9BoC,KAAA,OAAA,IACR,KAAA,cAAA,IA6B5B,KAAA,cAAA;;;EAhCW,KAAA,SAAA,EAAU,CAAK;;CAMxC,OAAO,KAAK,GAAoF;EAC9F,IAAM,IAAK,SAAS,cAAc,gBAAgB;EAQlD,OAPA,EAAG,cAAc,IACb,GAAS,SAAM,EAAG,OAAO,EAAQ,OACjC,GAAS,gBAAa,EAAG,cAAc,EAAQ,cACnD,SAAS,KAAK,YAAY,CAAE,GACxB,GAAS,YAAY,EAAQ,WAAW,MAC1C,EAAG,SAAS,OAAO,iBAAiB,EAAa,KAAK,GAAG,EAAQ,QAAQ,IAEpE;CACT;CAGA,OAAO,OAAO;EAMZ,AALI,EAAa,UAAU,WACzB,aAAa,EAAa,SAAS,MAAM,GACzC,EAAa,SAAS,SAAS,KAAA,IAEjC,EAAa,UAAU,OAAO,GAC9B,EAAa,WAAW,KAAA;CAC1B;CAUA,oBAA6B;EAQ3B,AAPA,MAAM,kBAAkB,GACnB,KAAK,aAAa,MAAM,KAC3B,KAAK,aAAa,QAAQ,QAAQ,GAE/B,KAAK,aAAa,YAAY,KACjC,KAAK,aAAa,cAAc,KAAK,GAEnC,KAAK,gBACP,EAAa,UAAU,OAAO,GAC9B,EAAa,WAAW,MACxB,KAAK,UAAU,IAAI,qBAAqB;CAE5C;CAEA,uBAAgC;EAE9B,AADA,MAAM,qBAAqB,GAC3B,AAEE,KAAK,YADL,aAAa,KAAK,MAAM,GACV,KAAA;CAElB;CAEA,QAA2B,GAAuB;EAEhD,AADA,MAAM,QAAQ,CAAK,GACf,EAAM,IAAI,MAAM,KAClB,KAAK,MAAM,YAAY,sBAAsB,GAAG,KAAK,KAAK,GAAG;CAEjE;CAEA,SAAkB;EAChB,IAAM,IAAU,CAAI;;UAEd,EACA,MAAM,KAAK,EAAE,QAAQ,EAAW,IAAI,GAAG,MAAM,CAAC,IAC9C,MACE,CAAI;wCACwB,IAAI,GAAG,6BAA6B,IAAa,EAAE,KAAK,EAAW;qBAEnG,EAAE;;QAEF,KAAK,cAAc,CAAI,oCAAoC,KAAK,YAAY,UAAU,EAAQ;;;EAGlG,OAAO,KAAK,cAAc,CAAI,oCAAoC,EAAQ,UAAU;CACtF;AAGF;AAlFG,EAAA,CAAA,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAA,EAAA,WAAA,QAAA,KAAA,CAAA,GACxC,EAAA,CAAA,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA,EAAA,WAAA,eAAA,KAAA,CAAA;AAoFrB,IAAM,IAAN,cAAkC,EAAa,CAAC;AADtD,IAAA,EAAA,CAAA,EAAc,gBAAgB,CAAA,GAAA,CAAA"}
@@ -0,0 +1,6 @@
1
+ //#region src/components/spinner/style.css?inline
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{justify-content:center;align-items:center;display:inline-flex}:host(.wui-spinner-overlay){display:contents}.wui-spinner{width:var(--wui-spinner-size,24px);height:var(--wui-spinner-size,24px);color:#666;position:relative}.wui-spinner span{transform-origin:50%;width:10%;height:100%;animation:.8s linear infinite wui-spinner-leaf-fade;position:absolute;top:0;left:50%}.wui-spinner span:before{content:\"\";background-color:currentColor;border-radius:2147483647px;width:100%;height:30%;margin-top:12%;display:block}.wui-spinner-overlay{pointer-events:none;z-index:var(--wui-layer-loading,300);flex-direction:column;justify-content:center;align-items:center;gap:8px;display:flex;position:fixed;inset:0}.wui-spinner-overlay .wui-spinner{pointer-events:auto}.spinner-description{pointer-events:auto;max-width:240px;font-size:var(--wui-font-size,14px);color:var(--wui-color-text-muted,#6a6a6a);text-align:center;line-height:1.5}@keyframes wui-spinner-leaf-fade{0%{opacity:1}to{opacity:0}}";
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/spinner/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n:host(.wui-spinner-overlay) {\n display: contents;\n}\n\n.wui-spinner {\n position: relative;\n width: var(--wui-spinner-size, 24px);\n height: var(--wui-spinner-size, 24px);\n color: #666;\n\n span {\n position: absolute;\n top: 0;\n left: 50%;\n transform-origin: center center;\n\n width: 10%;\n height: 100%;\n\n animation: wui-spinner-leaf-fade 0.8s linear infinite;\n\n &::before {\n content: '';\n\n display: block;\n\n width: 100%;\n height: 30%;\n margin-top: 12%;\n border-radius: calc(infinity * 1px);\n\n background-color: currentcolor;\n }\n }\n}\n\n.wui-spinner-overlay {\n pointer-events: none;\n\n position: fixed;\n z-index: var(--wui-layer-loading, 300);\n inset: 0;\n\n display: flex;\n flex-direction: column;\n gap: 8px;\n align-items: center;\n justify-content: center;\n\n .wui-spinner {\n pointer-events: auto;\n }\n}\n\n.spinner-description {\n pointer-events: auto;\n\n max-width: 240px;\n\n font-size: var(--wui-font-size, 14px);\n line-height: 1.5;\n color: var(--wui-color-text-muted, #6a6a6a);\n text-align: center;\n}\n\n@keyframes wui-spinner-leaf-fade {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n"],"mappings":""}
@@ -1,16 +1,37 @@
1
1
  import { LitElement } from 'lit';
2
2
  export declare class WebUiSvgDrawLines extends LitElement {
3
3
  static styles: import('lit').CSSResult;
4
- duration: number;
4
+ get duration(): number;
5
+ set duration(v: number);
6
+ private _duration;
5
7
  easing: string;
6
- private isAnimating;
7
- private svgClone;
8
- private slotEl;
9
- private handleSlotChange;
10
- private cloneOriginalSvg;
11
- private startAnimation;
8
+ private _activeRun;
9
+ private _hasAutoPlayed;
10
+ /**
11
+ * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
12
+ * 所有元素同时开始并行的 stroke-dashoffset 动画。
13
+ * 无目标或当前主题范围启用 reduced motion 时立即 resolve。
14
+ */
15
+ replay(): Promise<void>;
16
+ private cancelAll;
17
+ private _isReducedMotion;
18
+ private finishRun;
19
+ /**
20
+ * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
21
+ * 收集所有 SVGGeometryElement。closed shadow root 跳过。
22
+ */
23
+ private collectGeometryElements;
24
+ private animateElement;
25
+ /** Z → explicit line back to start + 0.1px extra, forcing render of the closing segment */
12
26
  private fixPathGap;
13
- private drawLine;
14
- private stopAnimation;
27
+ /** 首次 slot 内容稳定后自动播放一次 */
28
+ private handleSlotChange;
29
+ disconnectedCallback(): void;
15
30
  render(): import('lit').TemplateResult<1>;
31
+ readonly $events: Record<string, never>;
32
+ }
33
+ declare global {
34
+ interface HTMLElementTagNameMap {
35
+ 'web-ui-svg-draw-lines': WebUiSvgDrawLines;
36
+ }
16
37
  }
@@ -1,86 +1,111 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/decorate.js";
2
- import t from "./style.js";
3
- import { LitElement as n, html as r, unsafeCSS as i } from "lit";
4
- import { customElement as a, property as o, query as s, state as c } from "lit/decorators.js";
1
+ import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
2
+ import { normalizeNumber as t } from "../../shared/normalize/index.js";
3
+ import { findNearestTheme as n } from "../../shared/theme/theme-scope.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 } from "lit/decorators.js";
5
7
  //#region src/components/svg-draw-lines/index.ts
6
- var l = class extends n {
8
+ var l = "path, rect, circle, line, polyline, polygon, ellipse", u = class extends i {
7
9
  constructor(...e) {
8
- super(...e), this.duration = 1e3, this.easing = "linear", this.isAnimating = !1, this.svgClone = null;
10
+ super(...e), this._duration = 1e3, this.easing = "linear", this._hasAutoPlayed = !1;
9
11
  }
10
12
  static {
11
- this.styles = i(t);
13
+ this.styles = o(r);
12
14
  }
13
- handleSlotChange() {
14
- this.isAnimating || (this.cloneOriginalSvg(), this.isAnimating = !0, this.startAnimation());
15
+ get duration() {
16
+ return this._duration;
15
17
  }
16
- cloneOriginalSvg() {
17
- let e = this.slotEl.assignedElements({ flatten: !0 })[0];
18
- if (!(e instanceof SVGSVGElement)) return;
19
- let t = e.cloneNode(!0);
20
- t.classList.add("svg-clone"), this.svgClone = t;
18
+ set duration(e) {
19
+ let n = this._duration;
20
+ this._duration = t(e, 0, 3e4, 1e3), this.requestUpdate("duration", n);
21
21
  }
22
- async startAnimation() {
23
- if (!this.svgClone) return;
24
- await this.updateComplete;
25
- let e = Array.from(this.svgClone.querySelectorAll("path, rect, circle, line, polyline, polygon, ellipse")), t = [], n = {
26
- x: 0,
27
- y: 0
22
+ async replay() {
23
+ if (this.cancelAll(), this._isReducedMotion()) return;
24
+ let e = this.collectGeometryElements();
25
+ if (e.length === 0) return;
26
+ let t = {
27
+ animations: [],
28
+ restoreQueue: /* @__PURE__ */ new Map(),
29
+ patchedD: /* @__PURE__ */ new Map()
28
30
  };
29
- if (e.forEach((e) => {
30
- if (e instanceof SVGPathElement) {
31
- let r = (e.getAttribute("d") || "").split(/(?=[Mm])/).filter((e) => e.trim());
32
- r.forEach((i) => {
33
- let a = r.length > 1 ? e.cloneNode() : e, o = i.startsWith("m") ? `M${n.x} ${n.y}${i}` : i;
34
- o = this.fixPathGap(a, o), a.setAttribute("d", o), r.length > 1 && e.parentNode?.insertBefore(a, e), t.push(a);
35
- let s = a.getPointAtLength(a.getTotalLength());
36
- n = {
37
- x: s.x,
38
- y: s.y
39
- };
40
- }), r.length > 1 && e.remove();
41
- } else t.push(e);
42
- }), t.length === 0) return this.stopAnimation();
43
- let r = t.map((e, t) => new Promise((n) => {
44
- this.drawLine(e, t, n);
45
- }));
46
- await Promise.all(r), this.stopAnimation();
31
+ this._activeRun = t, await Promise.all(e.map((e) => this.animateElement(e, t))), this._activeRun === t && this.finishRun(t);
47
32
  }
48
- fixPathGap(e, t) {
49
- if (/[Zz]\s*$/.test(t)) {
50
- e.setAttribute("d", t);
51
- let n = e.getPointAtLength(0), r = e.getPointAtLength(.1);
52
- return t.replace(/[Zz]\s*$/, `L${n.x.toFixed(3)} ${n.y.toFixed(3)} L${r.x.toFixed(3)} ${r.y.toFixed(3)}`);
33
+ cancelAll() {
34
+ this._activeRun && this.finishRun(this._activeRun);
35
+ }
36
+ _isReducedMotion() {
37
+ let e = n(this);
38
+ if (e) return e.isReducedMotion();
39
+ try {
40
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
41
+ } catch {
42
+ return !1;
53
43
  }
54
- return t;
55
44
  }
56
- drawLine(e, t, n) {
57
- let r = parseFloat(getComputedStyle(e).strokeWidth) || 0, i = e.getTotalLength() + r;
58
- e.style.strokeDasharray = `${i}`, e.style.strokeDashoffset = `${i}`;
59
- let a = e.animate([{ strokeDashoffset: `${i}` }, { strokeDashoffset: "0" }], {
60
- duration: this.duration,
61
- easing: this.easing,
62
- fill: "forwards"
45
+ finishRun(e) {
46
+ e.animations.forEach((e) => e.cancel());
47
+ for (let [t, n] of e.restoreQueue) t.style.strokeDasharray = n.dasharray ?? "", t.style.strokeDashoffset = n.dashoffset ?? "";
48
+ for (let [t, n] of e.patchedD) t.setAttribute("d", n);
49
+ this._activeRun === e && (this._activeRun = void 0);
50
+ }
51
+ collectGeometryElements() {
52
+ let e = [], t = /* @__PURE__ */ new Set(), n = (r) => {
53
+ if ((r instanceof Element || r instanceof DocumentFragment) && r.querySelectorAll(l).forEach((n) => {
54
+ typeof n.getTotalLength == "function" && !t.has(n) && (t.add(n), e.push(n));
55
+ }), r instanceof Element) {
56
+ for (let e of r.children) n(e);
57
+ r.shadowRoot && n(r.shadowRoot);
58
+ } else if (r instanceof ShadowRoot) for (let e of r.children) n(e);
59
+ };
60
+ for (let e of this.children) n(e);
61
+ return e;
62
+ }
63
+ animateElement(e, t) {
64
+ return new Promise((n) => {
65
+ if (t.restoreQueue.has(e) || t.restoreQueue.set(e, {
66
+ dasharray: e.style.strokeDasharray,
67
+ dashoffset: e.style.strokeDashoffset
68
+ }), e.tagName === "path") {
69
+ let n = e.getAttribute("d");
70
+ n && /[Zz]\s*$/.test(n) && !t.patchedD.has(e) && (t.patchedD.set(e, n), e.setAttribute("d", this.fixPathGap(e, n)));
71
+ }
72
+ let r = parseFloat(getComputedStyle(e).strokeWidth) || 0, i = e.getTotalLength() + r;
73
+ e.style.strokeDasharray = `${i}`, e.style.strokeDashoffset = `${i}`;
74
+ let a = e.animate([{ strokeDashoffset: `${i}` }, { strokeDashoffset: "0" }], {
75
+ duration: this.duration,
76
+ easing: this.easing,
77
+ fill: "forwards"
78
+ });
79
+ t.animations.push(a), a.onfinish = () => {
80
+ n();
81
+ }, a.oncancel = () => {
82
+ n();
83
+ };
63
84
  });
64
- a.onfinish = n;
65
85
  }
66
- stopAnimation() {
67
- this.isAnimating = !1, this.svgClone = null;
86
+ fixPathGap(e, t) {
87
+ e.setAttribute("d", t);
88
+ let n = e.getPointAtLength(0), r = e.getPointAtLength(.1);
89
+ return t.replace(/[Zz]\s*$/, `L${n.x.toFixed(3)} ${n.y.toFixed(3)} L${r.x.toFixed(3)} ${r.y.toFixed(3)}`);
90
+ }
91
+ handleSlotChange() {
92
+ this._hasAutoPlayed || (this._hasAutoPlayed = !0, this.replay());
93
+ }
94
+ disconnectedCallback() {
95
+ this.cancelAll(), super.disconnectedCallback();
68
96
  }
69
97
  render() {
70
- return r`
71
- <slot ?hidden="${this.isAnimating}" @slotchange="${this.handleSlotChange}"></slot>
72
- ${this.isAnimating ? this.svgClone : ""}
73
- `;
98
+ return a`<slot @slotchange=${this.handleSlotChange}></slot>`;
74
99
  }
75
100
  };
76
- e([o({
101
+ e([c({
77
102
  type: Number,
78
103
  reflect: !0
79
- })], l.prototype, "duration", void 0), e([o({
104
+ })], u.prototype, "duration", null), e([c({
80
105
  type: String,
81
106
  reflect: !0
82
- })], l.prototype, "easing", void 0), e([c()], l.prototype, "isAnimating", void 0), e([c()], l.prototype, "svgClone", void 0), e([s("slot")], l.prototype, "slotEl", void 0), l = e([a("web-ui-svg-draw-lines")], l);
107
+ })], u.prototype, "easing", void 0), u = e([s("web-ui-svg-draw-lines")], u);
83
108
  //#endregion
84
- export { l as WebUiSvgDrawLines };
109
+ export { u as WebUiSvgDrawLines };
85
110
 
86
111
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/svg-draw-lines/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport style from './style.css?inline'\n\n@customElement('web-ui-svg-draw-lines')\nexport class WebUiSvgDrawLines extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Number, reflect: true }) duration = 1000\n @property({ type: String, reflect: true }) easing = 'linear'\n\n @state() private isAnimating = false\n @state() private svgClone: SVGSVGElement | null = null\n @query('slot') private slotEl!: HTMLSlotElement\n\n private handleSlotChange() {\n if (this.isAnimating) return\n\n this.cloneOriginalSvg()\n\n this.isAnimating = true\n void this.startAnimation()\n }\n\n private cloneOriginalSvg() {\n const original = this.slotEl.assignedElements({ flatten: true })[0]\n if (!(original instanceof SVGSVGElement)) return\n\n const svgClone = original.cloneNode(true) as SVGSVGElement\n svgClone.classList.add('svg-clone')\n this.svgClone = svgClone\n }\n\n private async startAnimation() {\n if (!this.svgClone) return\n await this.updateComplete\n\n const selectors = 'path, rect, circle, line, polyline, polygon, ellipse'\n const elements = Array.from(this.svgClone.querySelectorAll(selectors)) as SVGGeometryElement[]\n\n const animTasks: SVGGeometryElement[] = []\n let cursor = { x: 0, y: 0 }\n\n // 除 path 外其余几何图形无需额外处理\n // 将绘制多段路径的单 path 先拆分为多 path 并重新插入 dom\n // 再分别计算每个 path 的 total length\n elements.forEach(el => {\n if (el instanceof SVGPathElement) {\n const d = el.getAttribute('d') || ''\n const segments = d.split(/(?=[Mm])/).filter(s => s.trim())\n\n // 无论是一段还是多段,统一处理\n segments.forEach(seg => {\n const pathPart = segments.length > 1 ? (el.cloneNode() as SVGPathElement) : el\n let finalD = seg.startsWith('m') ? `M${cursor.x} ${cursor.y}${seg}` : seg\n\n finalD = this.fixPathGap(pathPart, finalD)\n pathPart.setAttribute('d', finalD)\n\n if (segments.length > 1) el.parentNode?.insertBefore(pathPart, el)\n\n animTasks.push(pathPart)\n\n const end = pathPart.getPointAtLength(pathPart.getTotalLength())\n cursor = { x: end.x, y: end.y }\n })\n\n if (segments.length > 1) el.remove()\n } else {\n animTasks.push(el)\n }\n })\n\n if (animTasks.length === 0) return this.stopAnimation()\n\n const promises = animTasks.map((el, i) => {\n return new Promise<void>(resolve => {\n this.drawLine(el, i, resolve)\n })\n })\n\n await Promise.all(promises)\n this.stopAnimation()\n }\n\n // 缺口修复逻辑\n // 多走 0.1px 触发渲染闭合和确定起始矢量方向\n private fixPathGap(pathEl: SVGPathElement, d: string): string {\n if (/[Zz]\\s*$/.test(d)) {\n pathEl.setAttribute('d', d)\n const p0 = pathEl.getPointAtLength(0)\n const p1 = pathEl.getPointAtLength(0.1)\n\n // 将 Z 替换为回到起点并多走 0.1px 的路径\n return d.replace(/[Zz]\\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`)\n }\n return d\n }\n\n private drawLine(el: SVGGeometryElement, index: number, onFinish: () => void) {\n const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0\n const len = el.getTotalLength() + strokeWidth\n\n el.style.strokeDasharray = `${len}`\n el.style.strokeDashoffset = `${len}`\n\n const anim = el.animate([{ strokeDashoffset: `${len}` }, { strokeDashoffset: '0' }], {\n duration: this.duration,\n easing: this.easing,\n fill: 'forwards'\n })\n anim.onfinish = onFinish\n }\n\n private stopAnimation() {\n this.isAnimating = false\n this.svgClone = null\n }\n\n override render() {\n return html`\n <slot ?hidden=\"${this.isAnimating}\" @slotchange=\"${this.handleSlotChange}\"></slot>\n ${this.isAnimating ? this.svgClone : ''}\n `\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/svg-draw-lines/index.ts"],"sourcesContent":["import { html, LitElement, nothing, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { normalizeNumber } from '@/shared/normalize'\nimport { findNearestTheme } from '@/shared/theme/theme-scope'\n\nimport style from './style.css?inline'\n\nconst GEOMETRY_SELECTOR = 'path, rect, circle, line, polyline, polygon, ellipse'\n\ninterface AnimationRun {\n animations: Animation[]\n restoreQueue: Map<SVGGeometryElement, { dasharray: string | null; dashoffset: string | null }>\n patchedD: Map<SVGGeometryElement, string>\n}\n\n@customElement('web-ui-svg-draw-lines')\nexport class WebUiSvgDrawLines extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Number, reflect: true })\n get duration(): number {\n return this._duration\n }\n set duration(v: number) {\n const old = this._duration\n this._duration = normalizeNumber(v, 0, 30000, 1000)\n this.requestUpdate('duration', old)\n }\n private _duration = 1000\n\n @property({ type: String, reflect: true }) easing = 'linear'\n\n private _activeRun: AnimationRun | undefined\n private _hasAutoPlayed = false\n /**\n * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。\n * 所有元素同时开始并行的 stroke-dashoffset 动画。\n * 无目标或当前主题范围启用 reduced motion 时立即 resolve。\n */\n async replay(): Promise<void> {\n this.cancelAll()\n\n if (this._isReducedMotion()) return\n\n const targets = this.collectGeometryElements()\n if (targets.length === 0) return\n\n const run: AnimationRun = {\n animations: [],\n restoreQueue: new Map(),\n patchedD: new Map()\n }\n this._activeRun = run\n\n await Promise.all(targets.map(el => this.animateElement(el, run)))\n\n // A later replay owns the current DOM state and must not be cleaned up here.\n if (this._activeRun === run) this.finishRun(run)\n }\n\n private cancelAll() {\n if (this._activeRun) this.finishRun(this._activeRun)\n }\n\n private _isReducedMotion(): boolean {\n const theme = findNearestTheme(this)\n if (theme) return theme.isReducedMotion()\n\n try {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n }\n\n private finishRun(run: AnimationRun) {\n run.animations.forEach(anim => anim.cancel())\n\n // The animation temporarily mutates consumer-owned SVG nodes, so always restore them.\n for (const [el, cached] of run.restoreQueue) {\n el.style.strokeDasharray = cached.dasharray ?? ''\n el.style.strokeDashoffset = cached.dashoffset ?? ''\n }\n\n for (const [el, d] of run.patchedD) {\n el.setAttribute('d', d)\n }\n\n if (this._activeRun === run) this._activeRun = undefined\n }\n\n /**\n * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,\n * 收集所有 SVGGeometryElement。closed shadow root 跳过。\n */\n private collectGeometryElements(): SVGGeometryElement[] {\n const elements: SVGGeometryElement[] = []\n const seen = new Set<SVGGeometryElement>()\n\n const walk = (root: Node) => {\n // Collect SVG geometry from this subtree\n if (root instanceof Element || root instanceof DocumentFragment) {\n root.querySelectorAll(GEOMETRY_SELECTOR).forEach(el => {\n // instanceof SVGGeometryElement 在 jsdom 中未定义,使用 duck-type 检查\n if (\n typeof (el as unknown as Record<string, unknown>).getTotalLength === 'function' &&\n !seen.has(el as unknown as SVGGeometryElement)\n ) {\n seen.add(el as unknown as SVGGeometryElement)\n elements.push(el as unknown as SVGGeometryElement)\n }\n })\n }\n\n // Recurse into children and open shadow roots\n if (root instanceof Element) {\n for (const child of root.children) walk(child)\n if (root.shadowRoot) walk(root.shadowRoot)\n } else if (root instanceof ShadowRoot) {\n for (const child of root.children) walk(child)\n }\n }\n\n for (const child of this.children) walk(child)\n return elements\n }\n\n private animateElement(el: SVGGeometryElement, run: AnimationRun): Promise<void> {\n return new Promise(resolve => {\n // Save inline styles once per animation cycle\n if (!run.restoreQueue.has(el)) {\n run.restoreQueue.set(el, {\n dasharray: el.style.strokeDasharray,\n dashoffset: el.style.strokeDashoffset\n })\n }\n\n // Gap fix for paths ending with Z/z\n if (el.tagName === 'path') {\n const d = el.getAttribute('d')\n if (d && /[Zz]\\s*$/.test(d) && !run.patchedD.has(el)) {\n run.patchedD.set(el, d)\n el.setAttribute('d', this.fixPathGap(el, d))\n }\n }\n\n const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0\n const len = el.getTotalLength() + strokeWidth\n\n el.style.strokeDasharray = `${len}`\n el.style.strokeDashoffset = `${len}`\n\n const anim = el.animate([{ strokeDashoffset: `${len}` }, { strokeDashoffset: '0' }], {\n duration: this.duration,\n easing: this.easing,\n fill: 'forwards'\n })\n\n run.animations.push(anim)\n\n anim.onfinish = () => {\n resolve()\n }\n\n anim.oncancel = () => {\n resolve()\n }\n })\n }\n\n /** Z → explicit line back to start + 0.1px extra, forcing render of the closing segment */\n private fixPathGap(pathEl: SVGPathElement, d: string): string {\n pathEl.setAttribute('d', d)\n const p0 = pathEl.getPointAtLength(0)\n const p1 = pathEl.getPointAtLength(0.1)\n return d.replace(/[Zz]\\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`)\n }\n\n /** 首次 slot 内容稳定后自动播放一次 */\n private handleSlotChange() {\n if (this._hasAutoPlayed) return\n this._hasAutoPlayed = true\n void this.replay()\n }\n\n override disconnectedCallback() {\n this.cancelAll()\n super.disconnectedCallback()\n }\n\n override render() {\n return html`<slot @slotchange=${this.handleSlotChange}></slot>`\n }\n\n declare readonly $events: Record<string, never>\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-svg-draw-lines': WebUiSvgDrawLines\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/svg-draw-lines/style.css?inline
2
- var e = ":host{vertical-align:middle;display:inline-block;position:relative}:host .svg-clone{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}:host slot[hidden]{visibility:hidden;display:contents}";
2
+ var e = "*,:before,:after{box-sizing:border-box}:host{display:inline-block}";
3
3
  //#endregion
4
4
  export { e as default };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/svg-draw-lines/style.css?inline"],"sourcesContent":[":host {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n\n .svg-clone {\n pointer-events: none;\n\n position: absolute;\n top: 0;\n left: 0;\n\n width: 100%;\n height: 100%;\n }\n\n slot[hidden] {\n display: contents;\n visibility: hidden;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"style.js","names":[],"sources":["../../../src/components/svg-draw-lines/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-block;\n}\n"],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class WebUiSwitch extends LitElement {
3
+ static styles: import('lit').CSSResult[];
4
+ static formAssociated: boolean;
5
+ private _internals?;
6
+ private _formDisabled;
7
+ private _checked;
8
+ get checked(): boolean;
9
+ set checked(v: boolean);
10
+ name: string;
11
+ value: string;
12
+ disabled: boolean;
13
+ required: boolean;
14
+ loading: boolean;
15
+ private pressed;
16
+ private get _isDisabled();
17
+ connectedCallback(): void;
18
+ formResetCallback(): void;
19
+ formDisabledCallback(disabled: boolean): void;
20
+ updated(): void;
21
+ private _syncFormValue;
22
+ /** 用户点击切换开关状态,阻止 label 默认行为避免原生 checkbox 重复触发 */
23
+ private handleClick;
24
+ private handlePointerDown;
25
+ private handlePointerUp;
26
+ private handlePointerLeave;
27
+ render(): import('lit').TemplateResult<1>;
28
+ readonly $events: {
29
+ input: Event;
30
+ change: Event;
31
+ };
32
+ }
33
+ declare global {
34
+ interface HTMLElementTagNameMap {
35
+ 'web-ui-switch': WebUiSwitch;
36
+ }
37
+ }
@@ -0,0 +1,117 @@
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-loader-circle.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";
9
+ //#region src/components/switch/index.ts
10
+ var d = class extends i {
11
+ constructor(...e) {
12
+ super(...e), this._formDisabled = !1, this._checked = !1, this.name = "", this.value = "", this.disabled = !1, this.required = !1, this.loading = !1, this.pressed = !1;
13
+ }
14
+ static {
15
+ this.styles = [o(t), o(r)];
16
+ }
17
+ static {
18
+ this.formAssociated = !0;
19
+ }
20
+ get checked() {
21
+ return this._checked;
22
+ }
23
+ set checked(e) {
24
+ let t = this._checked;
25
+ this._checked = e, this._syncFormValue(), this.requestUpdate("checked", t);
26
+ }
27
+ get _isDisabled() {
28
+ return this.disabled || this._formDisabled;
29
+ }
30
+ connectedCallback() {
31
+ super.connectedCallback(), !this._internals && (this._internals = this.attachInternals(), this.hasAttribute("checked") && (this._checked = !0), this._syncFormValue());
32
+ }
33
+ formResetCallback() {
34
+ this.checked = this.hasAttribute("checked");
35
+ }
36
+ formDisabledCallback(e) {
37
+ this._formDisabled = e;
38
+ }
39
+ updated() {
40
+ this._syncFormValue(), !(!this._internals || typeof this._internals.setValidity != "function") && (this._isDisabled || !this.required || this._checked ? this._internals.setValidity({}) : this._internals.setValidity({ valueMissing: !0 }, "请启用此项"));
41
+ }
42
+ _syncFormValue() {
43
+ this._internals?.setFormValue?.(this._checked ? this.value || "on" : null);
44
+ }
45
+ handleClick(e) {
46
+ if (e.preventDefault(), this._isDisabled || this.loading) return;
47
+ let t = this._checked;
48
+ this._checked = !t, this._syncFormValue(), this.requestUpdate("checked", t), this.dispatchEvent(new Event("input", {
49
+ bubbles: !0,
50
+ composed: !0
51
+ })), this.dispatchEvent(new Event("change", {
52
+ bubbles: !0,
53
+ composed: !0
54
+ }));
55
+ }
56
+ handlePointerDown() {
57
+ this._isDisabled || this.loading || (this.pressed = !0);
58
+ }
59
+ handlePointerUp() {
60
+ this.pressed = !1;
61
+ }
62
+ handlePointerLeave() {
63
+ this.pressed = !1;
64
+ }
65
+ render() {
66
+ let e = {
67
+ "wui-switch-track": !0,
68
+ "is-open": this._checked,
69
+ "is-disabled": this._isDisabled || this.loading
70
+ }, t = {
71
+ "wui-switch-thumb": !0,
72
+ "wui-glass": this.pressed,
73
+ "is-pressed": this.pressed
74
+ };
75
+ return a`
76
+ <label
77
+ class=${u(e)}
78
+ role="switch"
79
+ aria-checked=${String(this._checked)}
80
+ @click=${this.handleClick}
81
+ @pointerdown=${this.handlePointerDown}
82
+ @pointerup=${this.handlePointerUp}
83
+ @pointercancel=${this.handlePointerUp}
84
+ @pointerleave=${this.handlePointerLeave}
85
+ >
86
+ <input
87
+ type="checkbox"
88
+ .checked=${this._checked}
89
+ ?disabled=${this._isDisabled || this.loading}
90
+ class="sr-only"
91
+ />
92
+ <div class=${u(t)}>
93
+ ${this.loading ? a`<div class="wui-switch-loading">
94
+ <web-ui-icon .icon=${n} size="14" color="#08f" spin></web-ui-icon>
95
+ </div>` : ""}
96
+ </div>
97
+ </label>
98
+ `;
99
+ }
100
+ };
101
+ e([l()], d.prototype, "_formDisabled", void 0), e([l()], d.prototype, "_checked", void 0), e([c({
102
+ type: String,
103
+ reflect: !0
104
+ })], d.prototype, "name", void 0), e([c({ type: String })], d.prototype, "value", void 0), e([c({
105
+ type: Boolean,
106
+ reflect: !0
107
+ })], d.prototype, "disabled", void 0), e([c({
108
+ type: Boolean,
109
+ reflect: !0
110
+ })], d.prototype, "required", void 0), e([c({
111
+ type: Boolean,
112
+ reflect: !0
113
+ })], d.prototype, "loading", void 0), e([l()], d.prototype, "pressed", void 0), d = e([s("web-ui-switch")], d);
114
+ //#endregion
115
+ export { d as WebUiSwitch };
116
+
117
+ //# sourceMappingURL=index.js.map