@greypan/web-ui 11.2.0 → 12.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 (667) hide show
  1. package/README.CN.md +79 -68
  2. package/README.md +81 -72
  3. package/dist/_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js +8 -0
  4. package/dist/assets/menu-portal.js +3 -4
  5. package/dist/assets/menu-portal.js.map +1 -1
  6. package/dist/assets/modal-surface.js +3 -4
  7. package/dist/assets/modal-surface.js.map +1 -1
  8. package/dist/assets/overlay-motion.js +3 -4
  9. package/dist/assets/overlay-motion.js.map +1 -1
  10. package/dist/assets/scrollbar.js +5 -0
  11. package/dist/assets/scrollbar.js.map +1 -0
  12. package/dist/assets/selection-control.js +3 -4
  13. package/dist/assets/selection-control.js.map +1 -1
  14. package/dist/assets/toast-containers.js +3 -4
  15. package/dist/assets/toast-containers.js.map +1 -1
  16. package/dist/classes/glass.js +3 -4
  17. package/dist/classes/glass.js.map +1 -1
  18. package/dist/classes/glow.js +3 -4
  19. package/dist/classes/glow.js.map +1 -1
  20. package/dist/components/autocomplete/index.d.ts +485 -483
  21. package/dist/components/autocomplete/index.d.ts.map +1 -0
  22. package/dist/components/autocomplete/index.js +475 -267
  23. package/dist/components/autocomplete/index.js.map +1 -1
  24. package/dist/components/autocomplete/style.js +3 -4
  25. package/dist/components/autocomplete/style.js.map +1 -1
  26. package/dist/components/avatar/index.d.ts +26 -24
  27. package/dist/components/avatar/index.d.ts.map +1 -0
  28. package/dist/components/avatar/index.js +72 -52
  29. package/dist/components/avatar/index.js.map +1 -1
  30. package/dist/components/avatar/style.js +3 -4
  31. package/dist/components/avatar/style.js.map +1 -1
  32. package/dist/components/back-top/index.d.ts +30 -27
  33. package/dist/components/back-top/index.d.ts.map +1 -0
  34. package/dist/components/back-top/index.js +96 -62
  35. package/dist/components/back-top/index.js.map +1 -1
  36. package/dist/components/back-top/style.js +3 -4
  37. package/dist/components/back-top/style.js.map +1 -1
  38. package/dist/components/badge/index.d.ts +32 -26
  39. package/dist/components/badge/index.d.ts.map +1 -0
  40. package/dist/components/badge/index.js +116 -74
  41. package/dist/components/badge/index.js.map +1 -1
  42. package/dist/components/badge/style.js +3 -4
  43. package/dist/components/badge/style.js.map +1 -1
  44. package/dist/components/button/index.d.ts +392 -390
  45. package/dist/components/button/index.d.ts.map +1 -0
  46. package/dist/components/button/index.js +108 -74
  47. package/dist/components/button/index.js.map +1 -1
  48. package/dist/components/button/style.js +3 -4
  49. package/dist/components/button/style.js.map +1 -1
  50. package/dist/components/button-group/index.d.ts +14 -13
  51. package/dist/components/button-group/index.d.ts.map +1 -0
  52. package/dist/components/button-group/index.js +43 -33
  53. package/dist/components/button-group/index.js.map +1 -1
  54. package/dist/components/button-group/style.js +3 -4
  55. package/dist/components/button-group/style.js.map +1 -1
  56. package/dist/components/checkbox/index.d.ts +399 -397
  57. package/dist/components/checkbox/index.d.ts.map +1 -0
  58. package/dist/components/checkbox/index.js +103 -74
  59. package/dist/components/checkbox/index.js.map +1 -1
  60. package/dist/components/checkbox/style.js +3 -4
  61. package/dist/components/checkbox/style.js.map +1 -1
  62. package/dist/components/checkbox-group/index.d.ts +397 -396
  63. package/dist/components/checkbox-group/index.d.ts.map +1 -0
  64. package/dist/components/checkbox-group/index.js +92 -70
  65. package/dist/components/checkbox-group/index.js.map +1 -1
  66. package/dist/components/checkbox-group/style.js +3 -4
  67. package/dist/components/checkbox-group/style.js.map +1 -1
  68. package/dist/components/collapse/index.d.ts +72 -71
  69. package/dist/components/collapse/index.d.ts.map +1 -0
  70. package/dist/components/collapse/index.js +225 -130
  71. package/dist/components/collapse/index.js.map +1 -1
  72. package/dist/components/collapse/style.js +3 -4
  73. package/dist/components/collapse/style.js.map +1 -1
  74. package/dist/components/context-menu/index.d.ts +307 -310
  75. package/dist/components/context-menu/index.d.ts.map +1 -0
  76. package/dist/components/context-menu/index.js +685 -270
  77. package/dist/components/context-menu/index.js.map +1 -1
  78. package/dist/components/context-menu/scrim.js +3 -4
  79. package/dist/components/context-menu/scrim.js.map +1 -1
  80. package/dist/components/context-menu/style.js +3 -4
  81. package/dist/components/context-menu/style.js.map +1 -1
  82. package/dist/components/dialog/index.d.ts +87 -78
  83. package/dist/components/dialog/index.d.ts.map +1 -0
  84. package/dist/components/dialog/index.js +183 -88
  85. package/dist/components/dialog/index.js.map +1 -1
  86. package/dist/components/dialog/style.js +3 -4
  87. package/dist/components/dialog/style.js.map +1 -1
  88. package/dist/components/drawer/index.d.ts +159 -150
  89. package/dist/components/drawer/index.d.ts.map +1 -0
  90. package/dist/components/drawer/index.js +503 -242
  91. package/dist/components/drawer/index.js.map +1 -1
  92. package/dist/components/drawer/style.js +3 -4
  93. package/dist/components/drawer/style.js.map +1 -1
  94. package/dist/components/dropdown/index.d.ts +125 -124
  95. package/dist/components/dropdown/index.d.ts.map +1 -0
  96. package/dist/components/dropdown/index.js +556 -328
  97. package/dist/components/dropdown/index.js.map +1 -1
  98. package/dist/components/dropdown/style.js +3 -4
  99. package/dist/components/dropdown/style.js.map +1 -1
  100. package/dist/components/dropdown-divider/index.d.ts +7 -6
  101. package/dist/components/dropdown-divider/index.d.ts.map +1 -0
  102. package/dist/components/dropdown-divider/index.js +10 -11
  103. package/dist/components/dropdown-divider/index.js.map +1 -1
  104. package/dist/components/dropdown-divider/style.js +3 -4
  105. package/dist/components/dropdown-divider/style.js.map +1 -1
  106. package/dist/components/dropdown-header/index.d.ts +7 -6
  107. package/dist/components/dropdown-header/index.d.ts.map +1 -0
  108. package/dist/components/dropdown-header/index.js +10 -11
  109. package/dist/components/dropdown-header/index.js.map +1 -1
  110. package/dist/components/dropdown-header/style.js +3 -4
  111. package/dist/components/dropdown-header/style.js.map +1 -1
  112. package/dist/components/dropdown-item/index.d.ts +13 -11
  113. package/dist/components/dropdown-item/index.d.ts.map +1 -0
  114. package/dist/components/dropdown-item/index.js +32 -25
  115. package/dist/components/dropdown-item/index.js.map +1 -1
  116. package/dist/components/dropdown-item/style.js +3 -4
  117. package/dist/components/dropdown-item/style.js.map +1 -1
  118. package/dist/components/editable-text/index.d.ts +506 -505
  119. package/dist/components/editable-text/index.d.ts.map +1 -0
  120. package/dist/components/editable-text/index.js +281 -127
  121. package/dist/components/editable-text/index.js.map +1 -1
  122. package/dist/components/editable-text/style.js +3 -4
  123. package/dist/components/editable-text/style.js.map +1 -1
  124. package/dist/components/empty/index.d.ts +17 -15
  125. package/dist/components/empty/index.d.ts.map +1 -0
  126. package/dist/components/empty/index.js +66 -37
  127. package/dist/components/empty/index.js.map +1 -1
  128. package/dist/components/empty/style.js +3 -4
  129. package/dist/components/empty/style.js.map +1 -1
  130. package/dist/components/icon/index.d.ts +12 -11
  131. package/dist/components/icon/index.d.ts.map +1 -0
  132. package/dist/components/icon/index.js +34 -27
  133. package/dist/components/icon/index.js.map +1 -1
  134. package/dist/components/icon/style.js +3 -4
  135. package/dist/components/icon/style.js.map +1 -1
  136. package/dist/components/image-preview/index.d.ts +58 -44
  137. package/dist/components/image-preview/index.d.ts.map +1 -0
  138. package/dist/components/image-preview/index.js +536 -265
  139. package/dist/components/image-preview/index.js.map +1 -1
  140. package/dist/components/image-preview/style.js +3 -4
  141. package/dist/components/image-preview/style.js.map +1 -1
  142. package/dist/components/index.d.ts +46 -43
  143. package/dist/components/index.d.ts.map +1 -0
  144. package/dist/components/index.js +41 -41
  145. package/dist/components/input/index.d.ts +418 -413
  146. package/dist/components/input/index.d.ts.map +1 -0
  147. package/dist/components/input/index.js +148 -84
  148. package/dist/components/input/index.js.map +1 -1
  149. package/dist/components/input/style.js +3 -4
  150. package/dist/components/input/style.js.map +1 -1
  151. package/dist/components/input-number/index.d.ts +453 -447
  152. package/dist/components/input-number/index.d.ts.map +1 -0
  153. package/dist/components/input-number/index.js +484 -292
  154. package/dist/components/input-number/index.js.map +1 -1
  155. package/dist/components/input-number/style.js +3 -4
  156. package/dist/components/input-number/style.js.map +1 -1
  157. package/dist/components/layout/index.d.ts +110 -87
  158. package/dist/components/layout/index.d.ts.map +1 -0
  159. package/dist/components/layout/index.js +238 -144
  160. package/dist/components/layout/index.js.map +1 -1
  161. package/dist/components/layout/style.js +3 -4
  162. package/dist/components/layout/style.js.map +1 -1
  163. package/dist/components/middle-ellipsis/index.d.ts +93 -92
  164. package/dist/components/middle-ellipsis/index.d.ts.map +1 -0
  165. package/dist/components/middle-ellipsis/index.js +261 -107
  166. package/dist/components/middle-ellipsis/index.js.map +1 -1
  167. package/dist/components/middle-ellipsis/style.js +3 -4
  168. package/dist/components/middle-ellipsis/style.js.map +1 -1
  169. package/dist/components/middle-ellipsis/truncate.js +60 -30
  170. package/dist/components/middle-ellipsis/truncate.js.map +1 -1
  171. package/dist/components/option/index.d.ts +20 -18
  172. package/dist/components/option/index.d.ts.map +1 -0
  173. package/dist/components/option/index.js +53 -40
  174. package/dist/components/option/index.js.map +1 -1
  175. package/dist/components/option/style.js +3 -4
  176. package/dist/components/option/style.js.map +1 -1
  177. package/dist/components/popover/index.d.ts +69 -68
  178. package/dist/components/popover/index.d.ts.map +1 -0
  179. package/dist/components/popover/index.js +221 -104
  180. package/dist/components/popover/index.js.map +1 -1
  181. package/dist/components/popover/style.js +3 -4
  182. package/dist/components/popover/style.js.map +1 -1
  183. package/dist/components/radio/index.d.ts +396 -395
  184. package/dist/components/radio/index.d.ts.map +1 -0
  185. package/dist/components/radio/index.js +91 -62
  186. package/dist/components/radio/index.js.map +1 -1
  187. package/dist/components/radio/interaction.js +10 -11
  188. package/dist/components/radio/interaction.js.map +1 -1
  189. package/dist/components/radio/style.js +3 -4
  190. package/dist/components/radio/style.js.map +1 -1
  191. package/dist/components/radio-group/index.d.ts +417 -416
  192. package/dist/components/radio-group/index.d.ts.map +1 -0
  193. package/dist/components/radio-group/index.js +307 -207
  194. package/dist/components/radio-group/index.js.map +1 -1
  195. package/dist/components/radio-group/style.js +3 -4
  196. package/dist/components/radio-group/style.js.map +1 -1
  197. package/dist/components/segmented/index.d.ts +408 -402
  198. package/dist/components/segmented/index.d.ts.map +1 -0
  199. package/dist/components/segmented/index.js +267 -158
  200. package/dist/components/segmented/index.js.map +1 -1
  201. package/dist/components/segmented/style.js +3 -4
  202. package/dist/components/segmented/style.js.map +1 -1
  203. package/dist/components/segmented-trigger/index.d.ts +18 -17
  204. package/dist/components/segmented-trigger/index.d.ts.map +1 -0
  205. package/dist/components/segmented-trigger/index.js +45 -36
  206. package/dist/components/segmented-trigger/index.js.map +1 -1
  207. package/dist/components/segmented-trigger/style.js +3 -4
  208. package/dist/components/segmented-trigger/style.js.map +1 -1
  209. package/dist/components/select/index.d.ts +450 -448
  210. package/dist/components/select/index.d.ts.map +1 -0
  211. package/dist/components/select/index.js +342 -188
  212. package/dist/components/select/index.js.map +1 -1
  213. package/dist/components/select/style.js +3 -4
  214. package/dist/components/select/style.js.map +1 -1
  215. package/dist/components/slider/index.d.ts +428 -427
  216. package/dist/components/slider/index.d.ts.map +1 -0
  217. package/dist/components/slider/index.js +308 -216
  218. package/dist/components/slider/index.js.map +1 -1
  219. package/dist/components/slider/style.js +3 -4
  220. package/dist/components/slider/style.js.map +1 -1
  221. package/dist/components/spinner/index.d.ts +39 -38
  222. package/dist/components/spinner/index.d.ts.map +1 -0
  223. package/dist/components/spinner/index.js +118 -65
  224. package/dist/components/spinner/index.js.map +1 -1
  225. package/dist/components/spinner/style.js +3 -4
  226. package/dist/components/spinner/style.js.map +1 -1
  227. package/dist/components/svg-draw-lines/index.d.ts +40 -39
  228. package/dist/components/svg-draw-lines/index.d.ts.map +1 -0
  229. package/dist/components/svg-draw-lines/index.js +189 -106
  230. package/dist/components/svg-draw-lines/index.js.map +1 -1
  231. package/dist/components/svg-draw-lines/style.js +3 -4
  232. package/dist/components/svg-draw-lines/style.js.map +1 -1
  233. package/dist/components/switch/index.d.ts +411 -409
  234. package/dist/components/switch/index.d.ts.map +1 -0
  235. package/dist/components/switch/index.js +193 -106
  236. package/dist/components/switch/index.js.map +1 -1
  237. package/dist/components/switch/style.js +3 -4
  238. package/dist/components/switch/style.js.map +1 -1
  239. package/dist/components/textarea/index.d.ts +430 -425
  240. package/dist/components/textarea/index.d.ts.map +1 -0
  241. package/dist/components/textarea/index.js +187 -100
  242. package/dist/components/textarea/index.js.map +1 -1
  243. package/dist/components/textarea/style.js +3 -4
  244. package/dist/components/textarea/style.js.map +1 -1
  245. package/dist/components/theme/index.d.ts +45 -44
  246. package/dist/components/theme/index.d.ts.map +1 -0
  247. package/dist/components/theme/index.js +268 -161
  248. package/dist/components/theme/index.js.map +1 -1
  249. package/dist/components/theme/style.js +3 -4
  250. package/dist/components/theme/style.js.map +1 -1
  251. package/dist/components/toast/index.d.ts +4 -3
  252. package/dist/components/toast/index.js +3 -3
  253. package/dist/components/toast/manager.d.ts +9 -8
  254. package/dist/components/toast/manager.d.ts.map +1 -0
  255. package/dist/components/toast/manager.js +215 -119
  256. package/dist/components/toast/manager.js.map +1 -1
  257. package/dist/components/toast/style.js +3 -4
  258. package/dist/components/toast/style.js.map +1 -1
  259. package/dist/components/toast/toast.d.ts +75 -71
  260. package/dist/components/toast/toast.d.ts.map +1 -0
  261. package/dist/components/toast/toast.js +203 -96
  262. package/dist/components/toast/toast.js.map +1 -1
  263. package/dist/components/toast/types.d.ts +10 -9
  264. package/dist/components/toast/types.d.ts.map +1 -0
  265. package/dist/components/tooltip/index.d.ts +72 -62
  266. package/dist/components/tooltip/index.d.ts.map +1 -0
  267. package/dist/components/tooltip/index.js +251 -93
  268. package/dist/components/tooltip/index.js.map +1 -1
  269. package/dist/components/tooltip/style.js +3 -4
  270. package/dist/components/tooltip/style.js.map +1 -1
  271. package/dist/icons/generated/akar-icons-check.d.ts +5 -4
  272. package/dist/icons/generated/akar-icons-check.d.ts.map +1 -0
  273. package/dist/icons/generated/akar-icons-check.js +3 -4
  274. package/dist/icons/generated/akar-icons-check.js.map +1 -1
  275. package/dist/icons/generated/akar-icons-circle-check.d.ts +5 -4
  276. package/dist/icons/generated/akar-icons-circle-check.d.ts.map +1 -0
  277. package/dist/icons/generated/akar-icons-circle-check.js +3 -4
  278. package/dist/icons/generated/akar-icons-circle-check.js.map +1 -1
  279. package/dist/icons/generated/andrsrxn-inbox.d.ts +5 -4
  280. package/dist/icons/generated/andrsrxn-inbox.d.ts.map +1 -0
  281. package/dist/icons/generated/andrsrxn-inbox.js +3 -4
  282. package/dist/icons/generated/andrsrxn-inbox.js.map +1 -1
  283. package/dist/icons/generated/bi-check-lg.d.ts +5 -4
  284. package/dist/icons/generated/bi-check-lg.d.ts.map +1 -0
  285. package/dist/icons/generated/bi-check-lg.js +3 -4
  286. package/dist/icons/generated/bi-check-lg.js.map +1 -1
  287. package/dist/icons/generated/bi-check.d.ts +5 -4
  288. package/dist/icons/generated/bi-check.d.ts.map +1 -0
  289. package/dist/icons/generated/bi-check.js +3 -4
  290. package/dist/icons/generated/bi-check.js.map +1 -1
  291. package/dist/icons/generated/fluent-tag-search-24-regular.d.ts +5 -4
  292. package/dist/icons/generated/fluent-tag-search-24-regular.d.ts.map +1 -0
  293. package/dist/icons/generated/fluent-tag-search-24-regular.js +3 -4
  294. package/dist/icons/generated/fluent-tag-search-24-regular.js.map +1 -1
  295. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts +5 -4
  296. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.d.ts.map +1 -0
  297. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js +3 -4
  298. package/dist/icons/generated/heroicons-bars-arrow-down-16-solid.js.map +1 -1
  299. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts +5 -4
  300. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.d.ts.map +1 -0
  301. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js +3 -4
  302. package/dist/icons/generated/heroicons-bars-arrow-up-16-solid.js.map +1 -1
  303. package/dist/icons/generated/heroicons-check-16-solid.d.ts +5 -4
  304. package/dist/icons/generated/heroicons-check-16-solid.d.ts.map +1 -0
  305. package/dist/icons/generated/heroicons-check-16-solid.js +3 -4
  306. package/dist/icons/generated/heroicons-check-16-solid.js.map +1 -1
  307. package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts +5 -4
  308. package/dist/icons/generated/heroicons-x-mark-16-solid.d.ts.map +1 -0
  309. package/dist/icons/generated/heroicons-x-mark-16-solid.js +3 -4
  310. package/dist/icons/generated/heroicons-x-mark-16-solid.js.map +1 -1
  311. package/dist/icons/generated/jam-close-circle-f.d.ts +7 -6
  312. package/dist/icons/generated/jam-close-circle-f.d.ts.map +1 -0
  313. package/dist/icons/generated/jam-close-circle-f.js +3 -4
  314. package/dist/icons/generated/jam-close-circle-f.js.map +1 -1
  315. package/dist/icons/generated/lucide-arrow-down-to-line.d.ts +5 -4
  316. package/dist/icons/generated/lucide-arrow-down-to-line.d.ts.map +1 -0
  317. package/dist/icons/generated/lucide-arrow-down-to-line.js +3 -4
  318. package/dist/icons/generated/lucide-arrow-down-to-line.js.map +1 -1
  319. package/dist/icons/generated/lucide-arrow-up-to-line.d.ts +5 -4
  320. package/dist/icons/generated/lucide-arrow-up-to-line.d.ts.map +1 -0
  321. package/dist/icons/generated/lucide-arrow-up-to-line.js +3 -4
  322. package/dist/icons/generated/lucide-arrow-up-to-line.js.map +1 -1
  323. package/dist/icons/generated/lucide-bell.d.ts +5 -4
  324. package/dist/icons/generated/lucide-bell.d.ts.map +1 -0
  325. package/dist/icons/generated/lucide-bell.js +3 -4
  326. package/dist/icons/generated/lucide-bell.js.map +1 -1
  327. package/dist/icons/generated/lucide-check.d.ts +5 -4
  328. package/dist/icons/generated/lucide-check.d.ts.map +1 -0
  329. package/dist/icons/generated/lucide-check.js +3 -4
  330. package/dist/icons/generated/lucide-check.js.map +1 -1
  331. package/dist/icons/generated/lucide-chevron-down.d.ts +5 -4
  332. package/dist/icons/generated/lucide-chevron-down.d.ts.map +1 -0
  333. package/dist/icons/generated/lucide-chevron-down.js +3 -4
  334. package/dist/icons/generated/lucide-chevron-down.js.map +1 -1
  335. package/dist/icons/generated/lucide-chevron-left.d.ts +5 -4
  336. package/dist/icons/generated/lucide-chevron-left.d.ts.map +1 -0
  337. package/dist/icons/generated/lucide-chevron-left.js +3 -4
  338. package/dist/icons/generated/lucide-chevron-left.js.map +1 -1
  339. package/dist/icons/generated/lucide-chevron-right.d.ts +5 -4
  340. package/dist/icons/generated/lucide-chevron-right.d.ts.map +1 -0
  341. package/dist/icons/generated/lucide-chevron-right.js +3 -4
  342. package/dist/icons/generated/lucide-chevron-right.js.map +1 -1
  343. package/dist/icons/generated/lucide-chevron-up.d.ts +5 -4
  344. package/dist/icons/generated/lucide-chevron-up.d.ts.map +1 -0
  345. package/dist/icons/generated/lucide-chevron-up.js +3 -4
  346. package/dist/icons/generated/lucide-chevron-up.js.map +1 -1
  347. package/dist/icons/generated/lucide-circle-alert.d.ts +5 -4
  348. package/dist/icons/generated/lucide-circle-alert.d.ts.map +1 -0
  349. package/dist/icons/generated/lucide-circle-alert.js +3 -4
  350. package/dist/icons/generated/lucide-circle-alert.js.map +1 -1
  351. package/dist/icons/generated/lucide-clapperboard.d.ts +5 -4
  352. package/dist/icons/generated/lucide-clapperboard.d.ts.map +1 -0
  353. package/dist/icons/generated/lucide-clapperboard.js +3 -4
  354. package/dist/icons/generated/lucide-clapperboard.js.map +1 -1
  355. package/dist/icons/generated/lucide-clipboard-paste.d.ts +5 -4
  356. package/dist/icons/generated/lucide-clipboard-paste.d.ts.map +1 -0
  357. package/dist/icons/generated/lucide-clipboard-paste.js +3 -4
  358. package/dist/icons/generated/lucide-clipboard-paste.js.map +1 -1
  359. package/dist/icons/generated/lucide-code.d.ts +5 -4
  360. package/dist/icons/generated/lucide-code.d.ts.map +1 -0
  361. package/dist/icons/generated/lucide-code.js +3 -4
  362. package/dist/icons/generated/lucide-code.js.map +1 -1
  363. package/dist/icons/generated/lucide-copy.d.ts +5 -4
  364. package/dist/icons/generated/lucide-copy.d.ts.map +1 -0
  365. package/dist/icons/generated/lucide-copy.js +3 -4
  366. package/dist/icons/generated/lucide-copy.js.map +1 -1
  367. package/dist/icons/generated/lucide-download.d.ts +5 -4
  368. package/dist/icons/generated/lucide-download.d.ts.map +1 -0
  369. package/dist/icons/generated/lucide-download.js +3 -4
  370. package/dist/icons/generated/lucide-download.js.map +1 -1
  371. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts +5 -4
  372. package/dist/icons/generated/lucide-ellipsis-vertical.d.ts.map +1 -0
  373. package/dist/icons/generated/lucide-ellipsis-vertical.js +3 -4
  374. package/dist/icons/generated/lucide-ellipsis-vertical.js.map +1 -1
  375. package/dist/icons/generated/lucide-external-link.d.ts +5 -4
  376. package/dist/icons/generated/lucide-external-link.d.ts.map +1 -0
  377. package/dist/icons/generated/lucide-external-link.js +3 -4
  378. package/dist/icons/generated/lucide-external-link.js.map +1 -1
  379. package/dist/icons/generated/lucide-eye.d.ts +5 -4
  380. package/dist/icons/generated/lucide-eye.d.ts.map +1 -0
  381. package/dist/icons/generated/lucide-eye.js +3 -4
  382. package/dist/icons/generated/lucide-eye.js.map +1 -1
  383. package/dist/icons/generated/lucide-file-text.d.ts +5 -4
  384. package/dist/icons/generated/lucide-file-text.d.ts.map +1 -0
  385. package/dist/icons/generated/lucide-file-text.js +3 -4
  386. package/dist/icons/generated/lucide-file-text.js.map +1 -1
  387. package/dist/icons/generated/lucide-file.d.ts +5 -4
  388. package/dist/icons/generated/lucide-file.d.ts.map +1 -0
  389. package/dist/icons/generated/lucide-file.js +3 -4
  390. package/dist/icons/generated/lucide-file.js.map +1 -1
  391. package/dist/icons/generated/lucide-film.d.ts +5 -4
  392. package/dist/icons/generated/lucide-film.d.ts.map +1 -0
  393. package/dist/icons/generated/lucide-film.js +3 -4
  394. package/dist/icons/generated/lucide-film.js.map +1 -1
  395. package/dist/icons/generated/lucide-folder-open.d.ts +5 -4
  396. package/dist/icons/generated/lucide-folder-open.d.ts.map +1 -0
  397. package/dist/icons/generated/lucide-folder-open.js +3 -4
  398. package/dist/icons/generated/lucide-folder-open.js.map +1 -1
  399. package/dist/icons/generated/lucide-folder.d.ts +5 -4
  400. package/dist/icons/generated/lucide-folder.d.ts.map +1 -0
  401. package/dist/icons/generated/lucide-folder.js +3 -4
  402. package/dist/icons/generated/lucide-folder.js.map +1 -1
  403. package/dist/icons/generated/lucide-globe.d.ts +5 -4
  404. package/dist/icons/generated/lucide-globe.d.ts.map +1 -0
  405. package/dist/icons/generated/lucide-globe.js +3 -4
  406. package/dist/icons/generated/lucide-globe.js.map +1 -1
  407. package/dist/icons/generated/lucide-headphones.d.ts +5 -4
  408. package/dist/icons/generated/lucide-headphones.d.ts.map +1 -0
  409. package/dist/icons/generated/lucide-headphones.js +3 -4
  410. package/dist/icons/generated/lucide-headphones.js.map +1 -1
  411. package/dist/icons/generated/lucide-heart.d.ts +5 -4
  412. package/dist/icons/generated/lucide-heart.d.ts.map +1 -0
  413. package/dist/icons/generated/lucide-heart.js +3 -4
  414. package/dist/icons/generated/lucide-heart.js.map +1 -1
  415. package/dist/icons/generated/lucide-image.d.ts +5 -4
  416. package/dist/icons/generated/lucide-image.d.ts.map +1 -0
  417. package/dist/icons/generated/lucide-image.js +3 -4
  418. package/dist/icons/generated/lucide-image.js.map +1 -1
  419. package/dist/icons/generated/lucide-inbox.d.ts +5 -4
  420. package/dist/icons/generated/lucide-inbox.d.ts.map +1 -0
  421. package/dist/icons/generated/lucide-inbox.js +3 -4
  422. package/dist/icons/generated/lucide-inbox.js.map +1 -1
  423. package/dist/icons/generated/lucide-info.d.ts +5 -4
  424. package/dist/icons/generated/lucide-info.d.ts.map +1 -0
  425. package/dist/icons/generated/lucide-info.js +3 -4
  426. package/dist/icons/generated/lucide-info.js.map +1 -1
  427. package/dist/icons/generated/lucide-layout-grid.d.ts +5 -4
  428. package/dist/icons/generated/lucide-layout-grid.d.ts.map +1 -0
  429. package/dist/icons/generated/lucide-layout-grid.js +3 -4
  430. package/dist/icons/generated/lucide-layout-grid.js.map +1 -1
  431. package/dist/icons/generated/lucide-link.d.ts +5 -4
  432. package/dist/icons/generated/lucide-link.d.ts.map +1 -0
  433. package/dist/icons/generated/lucide-link.js +3 -4
  434. package/dist/icons/generated/lucide-link.js.map +1 -1
  435. package/dist/icons/generated/lucide-list-filter.d.ts +5 -4
  436. package/dist/icons/generated/lucide-list-filter.d.ts.map +1 -0
  437. package/dist/icons/generated/lucide-list-filter.js +3 -4
  438. package/dist/icons/generated/lucide-list-filter.js.map +1 -1
  439. package/dist/icons/generated/lucide-list-restart.d.ts +5 -4
  440. package/dist/icons/generated/lucide-list-restart.d.ts.map +1 -0
  441. package/dist/icons/generated/lucide-list-restart.js +3 -4
  442. package/dist/icons/generated/lucide-list-restart.js.map +1 -1
  443. package/dist/icons/generated/lucide-loader-circle.d.ts +5 -4
  444. package/dist/icons/generated/lucide-loader-circle.d.ts.map +1 -0
  445. package/dist/icons/generated/lucide-loader-circle.js +3 -4
  446. package/dist/icons/generated/lucide-loader-circle.js.map +1 -1
  447. package/dist/icons/generated/lucide-mail.d.ts +5 -4
  448. package/dist/icons/generated/lucide-mail.d.ts.map +1 -0
  449. package/dist/icons/generated/lucide-mail.js +3 -4
  450. package/dist/icons/generated/lucide-mail.js.map +1 -1
  451. package/dist/icons/generated/lucide-minus.d.ts +5 -4
  452. package/dist/icons/generated/lucide-minus.d.ts.map +1 -0
  453. package/dist/icons/generated/lucide-minus.js +3 -4
  454. package/dist/icons/generated/lucide-minus.js.map +1 -1
  455. package/dist/icons/generated/lucide-music.d.ts +5 -4
  456. package/dist/icons/generated/lucide-music.d.ts.map +1 -0
  457. package/dist/icons/generated/lucide-music.js +3 -4
  458. package/dist/icons/generated/lucide-music.js.map +1 -1
  459. package/dist/icons/generated/lucide-package.d.ts +5 -4
  460. package/dist/icons/generated/lucide-package.d.ts.map +1 -0
  461. package/dist/icons/generated/lucide-package.js +3 -4
  462. package/dist/icons/generated/lucide-package.js.map +1 -1
  463. package/dist/icons/generated/lucide-pen-line.d.ts +5 -4
  464. package/dist/icons/generated/lucide-pen-line.d.ts.map +1 -0
  465. package/dist/icons/generated/lucide-pen-line.js +3 -4
  466. package/dist/icons/generated/lucide-pen-line.js.map +1 -1
  467. package/dist/icons/generated/lucide-pencil.d.ts +5 -4
  468. package/dist/icons/generated/lucide-pencil.d.ts.map +1 -0
  469. package/dist/icons/generated/lucide-pencil.js +3 -4
  470. package/dist/icons/generated/lucide-pencil.js.map +1 -1
  471. package/dist/icons/generated/lucide-play.d.ts +5 -4
  472. package/dist/icons/generated/lucide-play.d.ts.map +1 -0
  473. package/dist/icons/generated/lucide-play.js +3 -4
  474. package/dist/icons/generated/lucide-play.js.map +1 -1
  475. package/dist/icons/generated/lucide-plus.d.ts +5 -4
  476. package/dist/icons/generated/lucide-plus.d.ts.map +1 -0
  477. package/dist/icons/generated/lucide-plus.js +3 -4
  478. package/dist/icons/generated/lucide-plus.js.map +1 -1
  479. package/dist/icons/generated/lucide-printer.d.ts +5 -4
  480. package/dist/icons/generated/lucide-printer.d.ts.map +1 -0
  481. package/dist/icons/generated/lucide-printer.js +3 -4
  482. package/dist/icons/generated/lucide-printer.js.map +1 -1
  483. package/dist/icons/generated/lucide-redo-2.d.ts +5 -4
  484. package/dist/icons/generated/lucide-redo-2.d.ts.map +1 -0
  485. package/dist/icons/generated/lucide-redo-2.js +3 -4
  486. package/dist/icons/generated/lucide-redo-2.js.map +1 -1
  487. package/dist/icons/generated/lucide-refresh-cw.d.ts +5 -4
  488. package/dist/icons/generated/lucide-refresh-cw.d.ts.map +1 -0
  489. package/dist/icons/generated/lucide-refresh-cw.js +3 -4
  490. package/dist/icons/generated/lucide-refresh-cw.js.map +1 -1
  491. package/dist/icons/generated/lucide-scissors.d.ts +5 -4
  492. package/dist/icons/generated/lucide-scissors.d.ts.map +1 -0
  493. package/dist/icons/generated/lucide-scissors.js +3 -4
  494. package/dist/icons/generated/lucide-scissors.js.map +1 -1
  495. package/dist/icons/generated/lucide-search.d.ts +5 -4
  496. package/dist/icons/generated/lucide-search.d.ts.map +1 -0
  497. package/dist/icons/generated/lucide-search.js +3 -4
  498. package/dist/icons/generated/lucide-search.js.map +1 -1
  499. package/dist/icons/generated/lucide-settings.d.ts +5 -4
  500. package/dist/icons/generated/lucide-settings.d.ts.map +1 -0
  501. package/dist/icons/generated/lucide-settings.js +3 -4
  502. package/dist/icons/generated/lucide-settings.js.map +1 -1
  503. package/dist/icons/generated/lucide-sliders-horizontal.d.ts +5 -4
  504. package/dist/icons/generated/lucide-sliders-horizontal.d.ts.map +1 -0
  505. package/dist/icons/generated/lucide-sliders-horizontal.js +3 -4
  506. package/dist/icons/generated/lucide-sliders-horizontal.js.map +1 -1
  507. package/dist/icons/generated/lucide-star.d.ts +5 -4
  508. package/dist/icons/generated/lucide-star.d.ts.map +1 -0
  509. package/dist/icons/generated/lucide-star.js +3 -4
  510. package/dist/icons/generated/lucide-star.js.map +1 -1
  511. package/dist/icons/generated/lucide-tag.d.ts +5 -4
  512. package/dist/icons/generated/lucide-tag.d.ts.map +1 -0
  513. package/dist/icons/generated/lucide-tag.js +3 -4
  514. package/dist/icons/generated/lucide-tag.js.map +1 -1
  515. package/dist/icons/generated/lucide-tags.d.ts +5 -4
  516. package/dist/icons/generated/lucide-tags.d.ts.map +1 -0
  517. package/dist/icons/generated/lucide-tags.js +3 -4
  518. package/dist/icons/generated/lucide-tags.js.map +1 -1
  519. package/dist/icons/generated/lucide-trash-2.d.ts +5 -4
  520. package/dist/icons/generated/lucide-trash-2.d.ts.map +1 -0
  521. package/dist/icons/generated/lucide-trash-2.js +3 -4
  522. package/dist/icons/generated/lucide-trash-2.js.map +1 -1
  523. package/dist/icons/generated/lucide-triangle-alert.d.ts +5 -4
  524. package/dist/icons/generated/lucide-triangle-alert.d.ts.map +1 -0
  525. package/dist/icons/generated/lucide-triangle-alert.js +3 -4
  526. package/dist/icons/generated/lucide-triangle-alert.js.map +1 -1
  527. package/dist/icons/generated/lucide-undo-2.d.ts +5 -4
  528. package/dist/icons/generated/lucide-undo-2.d.ts.map +1 -0
  529. package/dist/icons/generated/lucide-undo-2.js +3 -4
  530. package/dist/icons/generated/lucide-undo-2.js.map +1 -1
  531. package/dist/icons/generated/lucide-upload.d.ts +5 -4
  532. package/dist/icons/generated/lucide-upload.d.ts.map +1 -0
  533. package/dist/icons/generated/lucide-upload.js +3 -4
  534. package/dist/icons/generated/lucide-upload.js.map +1 -1
  535. package/dist/icons/generated/lucide-user.d.ts +5 -4
  536. package/dist/icons/generated/lucide-user.d.ts.map +1 -0
  537. package/dist/icons/generated/lucide-user.js +3 -4
  538. package/dist/icons/generated/lucide-user.js.map +1 -1
  539. package/dist/icons/generated/lucide-wrench.d.ts +5 -4
  540. package/dist/icons/generated/lucide-wrench.d.ts.map +1 -0
  541. package/dist/icons/generated/lucide-wrench.js +3 -4
  542. package/dist/icons/generated/lucide-wrench.js.map +1 -1
  543. package/dist/icons/generated/lucide-x.d.ts +5 -4
  544. package/dist/icons/generated/lucide-x.d.ts.map +1 -0
  545. package/dist/icons/generated/lucide-x.js +3 -4
  546. package/dist/icons/generated/lucide-x.js.map +1 -1
  547. package/dist/icons/generated/mdi-tag-search-outline.d.ts +5 -4
  548. package/dist/icons/generated/mdi-tag-search-outline.d.ts.map +1 -0
  549. package/dist/icons/generated/mdi-tag-search-outline.js +3 -4
  550. package/dist/icons/generated/mdi-tag-search-outline.js.map +1 -1
  551. package/dist/icons/generated/ooui-close.d.ts +5 -4
  552. package/dist/icons/generated/ooui-close.d.ts.map +1 -0
  553. package/dist/icons/generated/ooui-close.js +3 -4
  554. package/dist/icons/generated/ooui-close.js.map +1 -1
  555. package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts +5 -4
  556. package/dist/icons/generated/radix-icons-panel-left-minimized.d.ts.map +1 -0
  557. package/dist/icons/generated/radix-icons-panel-left-minimized.js +3 -4
  558. package/dist/icons/generated/radix-icons-panel-left-minimized.js.map +1 -1
  559. package/dist/icons/generated/radix-icons-reset.d.ts +5 -4
  560. package/dist/icons/generated/radix-icons-reset.d.ts.map +1 -0
  561. package/dist/icons/generated/radix-icons-reset.js +3 -4
  562. package/dist/icons/generated/radix-icons-reset.js.map +1 -1
  563. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts +5 -4
  564. package/dist/icons/generated/tabler-sort-ascending-letters.d.ts.map +1 -0
  565. package/dist/icons/generated/tabler-sort-ascending-letters.js +3 -4
  566. package/dist/icons/generated/tabler-sort-ascending-letters.js.map +1 -1
  567. package/dist/icons/index.d.ts +75 -74
  568. package/dist/icons/index.js +75 -75
  569. package/dist/shared/element-height/index.js +51 -25
  570. package/dist/shared/element-height/index.js.map +1 -1
  571. package/dist/shared/element-width/index.js +39 -24
  572. package/dist/shared/element-width/index.js.map +1 -1
  573. package/dist/shared/events/user-change.js +14 -8
  574. package/dist/shared/events/user-change.js.map +1 -1
  575. package/dist/shared/focus/pointer-focus.js +56 -30
  576. package/dist/shared/focus/pointer-focus.js.map +1 -1
  577. package/dist/shared/focus/tabbable.js +96 -0
  578. package/dist/shared/focus/tabbable.js.map +1 -0
  579. package/dist/shared/form-association/field-id.js +13 -6
  580. package/dist/shared/form-association/field-id.js.map +1 -1
  581. package/dist/shared/form-association/index.js +75 -42
  582. package/dist/shared/form-association/index.js.map +1 -1
  583. package/dist/shared/gesture/drag-gesture.js +239 -99
  584. package/dist/shared/gesture/drag-gesture.js.map +1 -1
  585. package/dist/shared/gesture/physics.js +49 -16
  586. package/dist/shared/gesture/physics.js.map +1 -1
  587. package/dist/shared/gesture/pinch-gesture.js +111 -60
  588. package/dist/shared/gesture/pinch-gesture.js.map +1 -1
  589. package/dist/shared/group-management/index.js +181 -84
  590. package/dist/shared/group-management/index.js.map +1 -1
  591. package/dist/shared/label-emptiness/index.js +45 -26
  592. package/dist/shared/label-emptiness/index.js.map +1 -1
  593. package/dist/shared/locale/builtin-labels.js +38 -0
  594. package/dist/shared/locale/builtin-labels.js.map +1 -0
  595. package/dist/shared/menu-behavior/index.js +113 -60
  596. package/dist/shared/menu-behavior/index.js.map +1 -1
  597. package/dist/shared/menu-portal/menu-portal.js +47 -26
  598. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  599. package/dist/shared/menu-portal/menu-tree.js +132 -75
  600. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  601. package/dist/shared/normalize/index.js +16 -7
  602. package/dist/shared/normalize/index.js.map +1 -1
  603. package/dist/shared/open-state/index.js +7 -8
  604. package/dist/shared/open-state/index.js.map +1 -1
  605. package/dist/shared/option-portal/combobox-shell.js +121 -56
  606. package/dist/shared/option-portal/combobox-shell.js.map +1 -1
  607. package/dist/shared/option-portal/index.js +65 -44
  608. package/dist/shared/option-portal/index.js.map +1 -1
  609. package/dist/shared/overlay/anchored-panel.js +75 -40
  610. package/dist/shared/overlay/anchored-panel.js.map +1 -1
  611. package/dist/shared/overlay/native-dialog-presence.js +116 -52
  612. package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
  613. package/dist/shared/overlay/nested-drawer-layers.js +76 -46
  614. package/dist/shared/overlay/nested-drawer-layers.js.map +1 -1
  615. package/dist/shared/overlay/open-overlay.js +240 -136
  616. package/dist/shared/overlay/open-overlay.js.map +1 -1
  617. package/dist/shared/overlay/overlay-root.js +33 -24
  618. package/dist/shared/overlay/overlay-root.js.map +1 -1
  619. package/dist/shared/overlay/overlay.js +109 -66
  620. package/dist/shared/overlay/overlay.js.map +1 -1
  621. package/dist/shared/overlay/placement-props.js +9 -4
  622. package/dist/shared/overlay/placement-props.js.map +1 -1
  623. package/dist/shared/overlay/portal.d.ts +2 -0
  624. package/dist/shared/overlay/portal.d.ts.map +1 -0
  625. package/dist/shared/overlay/portal.js +202 -117
  626. package/dist/shared/overlay/portal.js.map +1 -1
  627. package/dist/shared/overlay/positioning-generation.js +9 -10
  628. package/dist/shared/overlay/positioning-generation.js.map +1 -1
  629. package/dist/shared/overlay/presence.js +43 -21
  630. package/dist/shared/overlay/presence.js.map +1 -1
  631. package/dist/shared/overlay/theme-overlay-scope.js +22 -19
  632. package/dist/shared/overlay/theme-overlay-scope.js.map +1 -1
  633. package/dist/shared/scroll-lock/scroll-lock.js +49 -15
  634. package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
  635. package/dist/shared/theme/duration.js +13 -6
  636. package/dist/shared/theme/duration.js.map +1 -1
  637. package/dist/shared/theme/reduced-motion.js +14 -9
  638. package/dist/shared/theme/reduced-motion.js.map +1 -1
  639. package/dist/shared/theme/root-sync.js +85 -32
  640. package/dist/shared/theme/root-sync.js.map +1 -1
  641. package/dist/shared/visible-area/index.js +81 -37
  642. package/dist/shared/visible-area/index.js.map +1 -1
  643. package/dist/types/iconify.d.ts +1 -1
  644. package/dist/types/iconify.js +0 -0
  645. package/dist/types/react.d.ts +8 -10
  646. package/dist/types/react.d.ts.map +1 -0
  647. package/dist/types/react.js +0 -0
  648. package/dist/types/utils.d.ts +8 -13
  649. package/dist/types/utils.d.ts.map +1 -0
  650. package/dist/types/utils.js +0 -0
  651. package/dist/types/vue.d.ts +9 -13
  652. package/dist/types/vue.d.ts.map +1 -0
  653. package/dist/types/vue.js +0 -0
  654. package/dist/vite/index.d.ts +1 -0
  655. package/dist/vite/index.d.ts.map +1 -0
  656. package/dist/vite/index.js +30 -4
  657. package/dist/vite/index.js.map +1 -1
  658. package/package.json +10 -23
  659. package/dist/_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js +0 -9
  660. package/dist/components/middle-ellipsis/truncate.d.ts +0 -62
  661. package/dist/components/radio/interaction.d.ts +0 -4
  662. package/dist/scrollbars/index.d.ts +0 -33
  663. package/dist/scrollbars/index.js +0 -18
  664. package/dist/scrollbars/index.js.map +0 -1
  665. package/dist/scrollbars/internal.js +0 -6
  666. package/dist/scrollbars/internal.js.map +0 -1
  667. package/dist/scrollbars/style.css +0 -10
@@ -1,45 +1,46 @@
1
- import { LitElement } from 'lit';
1
+ import { LitElement } from "lit";
2
2
  export interface ReplayOptions {
3
- /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */
4
- reverse?: boolean;
3
+ /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */
4
+ reverse?: boolean;
5
5
  }
6
6
  export declare class WebUiSvgDrawLines extends LitElement {
7
- static styles: import('lit').CSSResult;
8
- get duration(): number;
9
- set duration(v: number);
10
- private _duration;
11
- easing: string;
12
- /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */
13
- noAutoplay: boolean;
14
- private _activeRun;
15
- private _hasAutoPlayed;
16
- private readonly _authoredDash;
17
- /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */
18
- private readonly _stickyBlank;
19
- /**
20
- * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
21
- * 所有元素同时开始并行的 stroke-dashoffset 动画。
22
- * options.reverse 为 true 时沿原路径收回。
23
- * 无目标或当前主题范围启用 reduced motion 时立即 resolve。
24
- */
25
- replay(options?: ReplayOptions): Promise<void>;
26
- private cancelAll;
27
- private finishRun;
28
- /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */
29
- private clearStickyBlank;
30
- /**
31
- * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
32
- * 收集所有 SVGGeometryElement。closed shadow root 跳过。
33
- */
34
- private collectGeometryElements;
35
- private animateElement;
36
- private fixPathGap;
37
- private handleSlotChange;
38
- disconnectedCallback(): void;
39
- render(): import('lit').TemplateResult<1>;
7
+ static styles: import("lit").CSSResult;
8
+ get duration(): number;
9
+ set duration(v: number);
10
+ private _duration;
11
+ easing: string;
12
+ /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */
13
+ noAutoplay: boolean;
14
+ private _activeRun;
15
+ private _hasAutoPlayed;
16
+ private readonly _authoredDash;
17
+ /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */
18
+ private readonly _stickyBlank;
19
+ /**
20
+ * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
21
+ * 所有元素同时开始并行的 stroke-dashoffset 动画。
22
+ * options.reverse 为 true 时沿原路径收回。
23
+ * 无目标或当前主题范围启用 reduced motion 时立即 resolve。
24
+ */
25
+ replay(options?: ReplayOptions): Promise<void>;
26
+ private cancelAll;
27
+ private finishRun;
28
+ /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */
29
+ private clearStickyBlank;
30
+ /**
31
+ * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
32
+ * 收集所有 SVGGeometryElement。closed shadow root 跳过。
33
+ */
34
+ private collectGeometryElements;
35
+ private animateElement;
36
+ private fixPathGap;
37
+ private handleSlotChange;
38
+ disconnectedCallback(): void;
39
+ render(): import("lit").TemplateResult<1>;
40
40
  }
41
41
  declare global {
42
- interface HTMLElementTagNameMap {
43
- 'web-ui-svg-draw-lines': WebUiSvgDrawLines;
44
- }
42
+ interface HTMLElementTagNameMap {
43
+ 'web-ui-svg-draw-lines': WebUiSvgDrawLines;
44
+ }
45
45
  }
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/svg-draw-lines/index.ts"],"mappings":";iBAqFiB;;EAEf;;qBAIW,0BAA0B;SACrB,sBAAM;MAGlB;MAGA,SAAS;UAKL;EAEmC;;EAG2B;UAE9D;UACA;mBAKS;;mBAEA;;;;;;;EAQX,OAAO,UAAS,gBAAqB;UAgCnC;UAUA;;UA2BA;;;;;UAmBA;UA8BA;UAyDA;UAQA;EAMC;EAKA,wBAAM;;QAKT;YACI;IACR,yBAAyB"}
@@ -1,160 +1,243 @@
1
- import e from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
2
- import { normalizeNumber as t } from "../../shared/normalize/index.js";
3
- import { prefersReducedMotion as n } from "../../shared/theme/reduced-motion.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";
7
- //#region src/components/svg-draw-lines/index.ts
8
- var l = "path, rect, circle, line, polyline, polygon, ellipse", u = "--wui-svg-draw-lines-offset", d, f;
9
- function p(e) {
10
- return typeof DOMException < "u" && e instanceof DOMException && e.name === "InvalidModificationError";
1
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
2
+ import { normalizeNumber } from "../../shared/normalize/index.js";
3
+ import { prefersReducedMotion } from "../../shared/theme/reduced-motion.js";
4
+ import style_default from "./style.js";
5
+ import { LitElement, html, unsafeCSS } from "lit";
6
+ import { customElement, property } from "lit/decorators.js";
7
+ // src/components/svg-draw-lines/index.ts
8
+ const GEOMETRY_SELECTOR = "path, rect, circle, line, polyline, polygon, ellipse";
9
+ const DASH_OFFSET_PROPERTY = "--wui-svg-draw-lines-offset";
10
+ let dashOffsetRegistrationApi;
11
+ let dashOffsetInterpolationSupported;
12
+ function isAlreadyRegistered(error) {
13
+ return typeof DOMException !== "undefined" && error instanceof DOMException && error.name === "InvalidModificationError";
11
14
  }
12
- function m() {
13
- let e = document.createElement("span"), t;
15
+ function supportsDashOffsetInterpolation() {
16
+ const probe = document.createElement("span");
17
+ let animation;
14
18
  try {
15
- e.style.setProperty(u, "0px"), document.documentElement.append(e), t = e.animate([{ [u]: "0px" }, { [u]: "100px" }], {
19
+ probe.style.setProperty(DASH_OFFSET_PROPERTY, "0px");
20
+ document.documentElement.append(probe);
21
+ animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: "0px" }, { [DASH_OFFSET_PROPERTY]: "100px" }], {
16
22
  duration: 1e3,
17
23
  easing: "linear",
18
24
  fill: "both"
19
- }), t.pause(), t.currentTime = 250;
20
- let n = Number.parseFloat(getComputedStyle(e).getPropertyValue(u));
21
- return Number.isFinite(n) && Math.abs(n - 25) < .1;
22
- } catch (e) {
23
- return console.warn("web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.", e), !1;
25
+ });
26
+ animation.pause();
27
+ animation.currentTime = 250;
28
+ const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY));
29
+ return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < .1;
30
+ } catch (error) {
31
+ console.warn("web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.", error);
32
+ return false;
24
33
  } finally {
25
- t?.cancel(), e.remove();
34
+ animation?.cancel();
35
+ probe.remove();
26
36
  }
27
37
  }
28
- function h() {
29
- if (typeof CSS > "u" || typeof CSS.registerProperty != "function" || typeof document > "u") return !1;
30
- let e = CSS.registerProperty;
31
- if (d !== e && (d = e, f = void 0), f !== void 0) return f;
38
+ function registerDashOffsetProperty() {
39
+ if (typeof CSS === "undefined" || typeof CSS.registerProperty !== "function" || typeof document === "undefined") return false;
40
+ const registerProperty = CSS.registerProperty;
41
+ if (dashOffsetRegistrationApi !== registerProperty) {
42
+ dashOffsetRegistrationApi = registerProperty;
43
+ dashOffsetInterpolationSupported = void 0;
44
+ }
45
+ if (dashOffsetInterpolationSupported !== void 0) return dashOffsetInterpolationSupported;
32
46
  try {
33
47
  CSS.registerProperty({
34
- name: u,
48
+ name: DASH_OFFSET_PROPERTY,
35
49
  syntax: "<length>",
36
- inherits: !1,
50
+ inherits: false,
37
51
  initialValue: "0px"
38
52
  });
39
- } catch (e) {
40
- if (!p(e)) return console.warn("web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.", e), f = !1, !1;
53
+ } catch (error) {
54
+ if (!isAlreadyRegistered(error)) {
55
+ console.warn("web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.", error);
56
+ dashOffsetInterpolationSupported = false;
57
+ return false;
58
+ }
41
59
  }
42
- return f = m(), f;
60
+ dashOffsetInterpolationSupported = supportsDashOffsetInterpolation();
61
+ return dashOffsetInterpolationSupported;
43
62
  }
44
- var g = class extends i {
45
- constructor(...e) {
46
- super(...e), this._duration = 1e3, this.easing = "linear", this.noAutoplay = !1, this._hasAutoPlayed = !1, this._authoredDash = /* @__PURE__ */ new WeakMap(), this._stickyBlank = /* @__PURE__ */ new WeakMap();
63
+ let WebUiSvgDrawLines = class WebUiSvgDrawLines extends LitElement {
64
+ constructor(..._args) {
65
+ super(..._args);
66
+ this._duration = 1e3;
67
+ this.easing = "linear";
68
+ this.noAutoplay = false;
69
+ this._hasAutoPlayed = false;
70
+ this._authoredDash = /* @__PURE__ */ new WeakMap();
71
+ this._stickyBlank = /* @__PURE__ */ new WeakMap();
47
72
  }
48
73
  static {
49
- this.styles = o(r);
74
+ this.styles = unsafeCSS(style_default);
50
75
  }
51
76
  get duration() {
52
77
  return this._duration;
53
78
  }
54
- set duration(e) {
55
- let n = this._duration;
56
- this._duration = t(e, 0, 3e4, 1e3), this.requestUpdate("duration", n);
57
- }
58
- async replay(e = {}) {
59
- let t = e.reverse === !0;
79
+ set duration(v) {
80
+ const old = this._duration;
81
+ this._duration = normalizeNumber(v, 0, 3e4, 1e3);
82
+ this.requestUpdate("duration", old);
83
+ }
84
+ /**
85
+ * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。
86
+ * 所有元素同时开始并行的 stroke-dashoffset 动画。
87
+ * options.reverse 为 true 时沿原路径收回。
88
+ * 无目标或当前主题范围启用 reduced motion 时立即 resolve。
89
+ */
90
+ async replay(options = {}) {
91
+ const reverse = options.reverse === true;
60
92
  this.cancelAll();
61
- let r = this.collectGeometryElements();
62
- if (n(this)) {
63
- for (let e of r) this.clearStickyBlank(e);
93
+ const targets = this.collectGeometryElements();
94
+ if (prefersReducedMotion(this)) {
95
+ for (const el of targets) this.clearStickyBlank(el);
64
96
  return;
65
97
  }
66
- if (r.length === 0) return;
67
- let i = {
68
- reverse: t,
98
+ if (targets.length === 0) return;
99
+ const run = {
100
+ reverse,
69
101
  animations: [],
70
102
  blankByElement: /* @__PURE__ */ new Map(),
71
103
  patchedD: /* @__PURE__ */ new Map()
72
104
  };
73
- this._activeRun = i, await Promise.all(r.map((e) => this.animateElement(e, i, t))), this._activeRun === i && this.finishRun(i);
105
+ this._activeRun = run;
106
+ await Promise.all(targets.map((el) => this.animateElement(el, run, reverse)));
107
+ if (this._activeRun !== run) return;
108
+ this.finishRun(run);
74
109
  }
75
110
  cancelAll() {
76
- this._activeRun && this.finishRun(this._activeRun);
77
- }
78
- finishRun(e) {
79
- e.animations.forEach((e) => e.cancel());
80
- for (let [t, n] of e.patchedD) t.setAttribute("d", n);
81
- for (let [t, n] of e.blankByElement) {
82
- let r = this._authoredDash.get(t);
83
- e.reverse ? (t.style.strokeDasharray = n, t.style.strokeDashoffset = n, this._stickyBlank.set(t, {
84
- dasharray: t.style.strokeDasharray,
85
- dashoffset: t.style.strokeDashoffset
86
- })) : (t.style.strokeDasharray = r?.dasharray ?? "", t.style.strokeDashoffset = r?.dashoffset ?? "", this._stickyBlank.delete(t)), t.style.removeProperty(u);
111
+ if (this._activeRun) this.finishRun(this._activeRun);
112
+ }
113
+ finishRun(run) {
114
+ run.animations.forEach((anim) => anim.cancel());
115
+ for (const [el, d] of run.patchedD) el.setAttribute("d", d);
116
+ for (const [el, blank] of run.blankByElement) {
117
+ const authored = this._authoredDash.get(el);
118
+ if (run.reverse) {
119
+ el.style.strokeDasharray = blank;
120
+ el.style.strokeDashoffset = blank;
121
+ this._stickyBlank.set(el, {
122
+ dasharray: el.style.strokeDasharray,
123
+ dashoffset: el.style.strokeDashoffset
124
+ });
125
+ } else {
126
+ el.style.strokeDasharray = authored?.dasharray ?? "";
127
+ el.style.strokeDashoffset = authored?.dashoffset ?? "";
128
+ this._stickyBlank.delete(el);
129
+ }
130
+ el.style.removeProperty(DASH_OFFSET_PROPERTY);
87
131
  }
88
- this._activeRun === e && (this._activeRun = void 0);
89
- }
90
- clearStickyBlank(e) {
91
- let t = this._stickyBlank.get(e);
92
- if (t === void 0 || e.style.strokeDasharray !== t.dasharray || e.style.strokeDashoffset !== t.dashoffset) return;
93
- let n = this._authoredDash.get(e);
94
- e.style.strokeDasharray = n?.dasharray ?? "", e.style.strokeDashoffset = n?.dashoffset ?? "", this._stickyBlank.delete(e);
95
- }
132
+ if (this._activeRun === run) this._activeRun = void 0;
133
+ }
134
+ /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */
135
+ clearStickyBlank(el) {
136
+ const blank = this._stickyBlank.get(el);
137
+ if (blank === void 0 || el.style.strokeDasharray !== blank.dasharray || el.style.strokeDashoffset !== blank.dashoffset) return;
138
+ const authored = this._authoredDash.get(el);
139
+ el.style.strokeDasharray = authored?.dasharray ?? "";
140
+ el.style.strokeDashoffset = authored?.dashoffset ?? "";
141
+ this._stickyBlank.delete(el);
142
+ }
143
+ /**
144
+ * 深度遍历组件的 light DOM 子节点与开放 Shadow Root,
145
+ * 收集所有 SVGGeometryElement。closed shadow root 跳过。
146
+ */
96
147
  collectGeometryElements() {
97
- let e = [], t = /* @__PURE__ */ new Set(), n = (r) => {
98
- if ((r instanceof Element || r instanceof DocumentFragment) && r.querySelectorAll(l).forEach((n) => {
99
- typeof n.getTotalLength == "function" && !t.has(n) && (t.add(n), e.push(n));
100
- }), r instanceof Element) {
101
- for (let e of r.children) n(e);
102
- r.shadowRoot && n(r.shadowRoot);
103
- } else if (r instanceof ShadowRoot) for (let e of r.children) n(e);
148
+ const elements = [];
149
+ const seen = /* @__PURE__ */ new Set();
150
+ const walk = (root) => {
151
+ if (root instanceof Element || root instanceof DocumentFragment) root.querySelectorAll(GEOMETRY_SELECTOR).forEach((el) => {
152
+ if (typeof el.getTotalLength === "function" && !seen.has(el)) {
153
+ seen.add(el);
154
+ elements.push(el);
155
+ }
156
+ });
157
+ if (root instanceof Element) {
158
+ for (const child of root.children) walk(child);
159
+ if (root.shadowRoot) walk(root.shadowRoot);
160
+ } else if (root instanceof ShadowRoot) for (const child of root.children) walk(child);
104
161
  };
105
- for (let e of this.children) n(e);
106
- return e;
107
- }
108
- animateElement(e, t, n) {
109
- return new Promise((r) => {
110
- if (this._authoredDash.has(e) || this._authoredDash.set(e, {
111
- dasharray: e.style.strokeDasharray,
112
- dashoffset: e.style.strokeDashoffset
113
- }), e.tagName === "path") {
114
- let n = e.getAttribute("d");
115
- n && /[Zz]\s*$/.test(n) && !t.patchedD.has(e) && (t.patchedD.set(e, n), e.setAttribute("d", this.fixPathGap(e, n)));
162
+ for (const child of this.children) walk(child);
163
+ return elements;
164
+ }
165
+ animateElement(el, run, reverse) {
166
+ return new Promise((resolve) => {
167
+ if (!this._authoredDash.has(el)) this._authoredDash.set(el, {
168
+ dasharray: el.style.strokeDasharray,
169
+ dashoffset: el.style.strokeDashoffset
170
+ });
171
+ if (el.tagName === "path") {
172
+ const d = el.getAttribute("d");
173
+ if (d && /[Zz]\s*$/.test(d) && !run.patchedD.has(el)) {
174
+ run.patchedD.set(el, d);
175
+ el.setAttribute("d", this.fixPathGap(el, d));
176
+ }
177
+ }
178
+ const strokeWidth = parseFloat(getComputedStyle(el).strokeWidth) || 0;
179
+ const len = el.getTotalLength() + strokeWidth;
180
+ const blank = `${len}`;
181
+ const from = reverse ? 0 : len;
182
+ const to = reverse ? len : 0;
183
+ const canClampOvershoot = registerDashOffsetProperty();
184
+ el.style.strokeDasharray = blank;
185
+ if (canClampOvershoot) {
186
+ el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`);
187
+ el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`;
188
+ } else {
189
+ el.style.removeProperty(DASH_OFFSET_PROPERTY);
190
+ el.style.strokeDashoffset = `${from}px`;
116
191
  }
117
- let i = parseFloat(getComputedStyle(e).strokeWidth) || 0, a = e.getTotalLength() + i, o = `${a}`, s = n ? 0 : a, c = n ? a : 0, l = h();
118
- e.style.strokeDasharray = o, l ? (e.style.setProperty(u, `${s}px`), e.style.strokeDashoffset = `clamp(0px, var(${u}), ${o}px)`) : (e.style.removeProperty(u), e.style.strokeDashoffset = `${s}px`), t.blankByElement.set(e, o);
119
- let d = l ? u : "strokeDashoffset", f = e.animate([{ [d]: `${s}px` }, { [d]: `${c}px` }], {
192
+ run.blankByElement.set(el, blank);
193
+ const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : "strokeDashoffset";
194
+ const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {
120
195
  duration: this.duration,
121
- easing: l ? this.easing : "linear",
196
+ easing: canClampOvershoot ? this.easing : "linear",
122
197
  fill: "forwards"
123
198
  });
124
- t.animations.push(f), f.onfinish = () => {
125
- r();
126
- }, f.oncancel = () => {
127
- r();
199
+ run.animations.push(anim);
200
+ anim.onfinish = () => {
201
+ resolve();
202
+ };
203
+ anim.oncancel = () => {
204
+ resolve();
128
205
  };
129
206
  });
130
207
  }
131
- fixPathGap(e, t) {
132
- e.setAttribute("d", t);
133
- let n = e.getPointAtLength(0), r = e.getPointAtLength(.1);
134
- return t.replace(/[Zz]\s*$/, `L${n.x.toFixed(3)} ${n.y.toFixed(3)} L${r.x.toFixed(3)} ${r.y.toFixed(3)}`);
208
+ fixPathGap(pathEl, d) {
209
+ pathEl.setAttribute("d", d);
210
+ const p0 = pathEl.getPointAtLength(0);
211
+ const p1 = pathEl.getPointAtLength(.1);
212
+ return d.replace(/[Zz]\s*$/, `L${p0.x.toFixed(3)} ${p0.y.toFixed(3)} L${p1.x.toFixed(3)} ${p1.y.toFixed(3)}`);
135
213
  }
136
214
  handleSlotChange() {
137
- this.noAutoplay || this._hasAutoPlayed || (this._hasAutoPlayed = !0, this.replay());
215
+ if (this.noAutoplay || this._hasAutoPlayed) return;
216
+ this._hasAutoPlayed = true;
217
+ this.replay();
138
218
  }
139
219
  disconnectedCallback() {
140
- this.cancelAll(), super.disconnectedCallback();
220
+ this.cancelAll();
221
+ super.disconnectedCallback();
141
222
  }
142
223
  render() {
143
- return a`<slot @slotchange=${this.handleSlotChange}></slot>`;
224
+ return html`<slot @slotchange=${this.handleSlotChange}></slot>`;
144
225
  }
145
226
  };
146
- e([c({
227
+ __decorate([property({
147
228
  type: Number,
148
- reflect: !0
149
- })], g.prototype, "duration", null), e([c({
229
+ reflect: true
230
+ })], WebUiSvgDrawLines.prototype, "duration", null);
231
+ __decorate([property({
150
232
  type: String,
151
- reflect: !0
152
- })], g.prototype, "easing", void 0), e([c({
233
+ reflect: true
234
+ })], WebUiSvgDrawLines.prototype, "easing", void 0);
235
+ __decorate([property({
153
236
  type: Boolean,
154
- reflect: !0,
237
+ reflect: true,
155
238
  attribute: "no-autoplay"
156
- })], g.prototype, "noAutoplay", void 0), g = e([s("web-ui-svg-draw-lines")], g);
157
- //#endregion
158
- export { g as WebUiSvgDrawLines };
239
+ })], WebUiSvgDrawLines.prototype, "noAutoplay", void 0);
240
+ WebUiSvgDrawLines = __decorate([customElement("web-ui-svg-draw-lines")], WebUiSvgDrawLines);
241
+ export { WebUiSvgDrawLines };
159
242
 
160
243
  //# 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 } from 'lit/decorators.js'\n\nimport { normalizeNumber } from '@/shared/normalize'\nimport { prefersReducedMotion } from '@/shared/theme/reduced-motion'\n\nimport style from './style.css?inline'\n\nconst GEOMETRY_SELECTOR = 'path, rect, circle, line, polyline, polygon, ellipse'\n// Animate a registered length, then clamp it before using it as a dash offset.\nconst DASH_OFFSET_PROPERTY = '--wui-svg-draw-lines-offset'\n\nlet dashOffsetRegistrationApi: typeof CSS.registerProperty | undefined\nlet dashOffsetInterpolationSupported: boolean | undefined\n\nfunction isAlreadyRegistered(error: unknown): boolean {\n return (\n typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'InvalidModificationError'\n )\n}\n\nfunction supportsDashOffsetInterpolation(): boolean {\n const probe = document.createElement('span')\n let animation: Animation | undefined\n try {\n probe.style.setProperty(DASH_OFFSET_PROPERTY, '0px')\n document.documentElement.append(probe)\n animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: '0px' }, { [DASH_OFFSET_PROPERTY]: '100px' }], {\n duration: 1000,\n easing: 'linear',\n fill: 'both'\n })\n animation.pause()\n animation.currentTime = 250\n\n const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY))\n return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < 0.1\n } catch (error) {\n console.warn('web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.', error)\n return false\n } finally {\n animation?.cancel()\n probe.remove()\n }\n}\n\nfunction registerDashOffsetProperty(): boolean {\n if (typeof CSS === 'undefined' || typeof CSS.registerProperty !== 'function' || typeof document === 'undefined')\n return false\n\n const registerProperty = CSS.registerProperty\n if (dashOffsetRegistrationApi !== registerProperty) {\n // Capability is cached only for the registration implementation that passed the probe.\n dashOffsetRegistrationApi = registerProperty\n dashOffsetInterpolationSupported = undefined\n }\n if (dashOffsetInterpolationSupported !== undefined) return dashOffsetInterpolationSupported\n\n try {\n CSS.registerProperty({\n name: DASH_OFFSET_PROPERTY,\n syntax: '<length>',\n inherits: false,\n initialValue: '0px'\n })\n } catch (error) {\n if (!isAlreadyRegistered(error)) {\n console.warn('web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.', error)\n dashOffsetInterpolationSupported = false\n return false\n }\n }\n\n dashOffsetInterpolationSupported = supportsDashOffsetInterpolation()\n return dashOffsetInterpolationSupported\n}\n\ninterface AnimationRun {\n reverse: boolean\n animations: Animation[]\n /** 本次运行写过的「空白」dash 值,按元素记;收回收尾要把它留在 DOM 上。 */\n blankByElement: Map<SVGGeometryElement, string>\n patchedD: Map<SVGGeometryElement, string>\n}\n\nexport interface ReplayOptions {\n /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */\n reverse?: boolean\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 /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */\n @property({ type: Boolean, reflect: true, attribute: 'no-autoplay' }) noAutoplay = false\n\n private _activeRun: AnimationRun | undefined\n private _hasAutoPlayed = false\n /*\n * 消费者自己写在目标元素上的 dash 值,只在第一次碰到该元素时取一次。运行会把这两个属性改成\n * 自己的空白值,所以不能从「上一次运行之后」的状态重新取,否则画入收尾会把空白当成原值。\n */\n private readonly _authoredDash = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */\n private readonly _stickyBlank = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n\n /**\n * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。\n * 所有元素同时开始并行的 stroke-dashoffset 动画。\n * options.reverse 为 true 时沿原路径收回。\n * 无目标或当前主题范围启用 reduced motion 时立即 resolve。\n */\n async replay(options: ReplayOptions = {}): Promise<void> {\n const reverse = options.reverse === true\n\n this.cancelAll()\n\n const targets = this.collectGeometryElements()\n\n if (prefersReducedMotion(this)) {\n // 不播,但上一次收回提交的空白要清掉:reduced motion 下可见性完全交给消费者的 opacity,\n // 留着空白就会出现「aria-checked=true 却看不见勾」,而之后每次 replay 都会同样早退、无法自愈。\n for (const el of targets) this.clearStickyBlank(el)\n return\n }\n\n if (targets.length === 0) return\n\n const run: AnimationRun = {\n reverse,\n animations: [],\n blankByElement: new Map(),\n patchedD: new Map()\n }\n this._activeRun = run\n\n await Promise.all(targets.map(el => this.animateElement(el, run, reverse)))\n\n // A later replay owns the current DOM state and must not be cleaned up here.\n if (this._activeRun !== run) return\n\n this.finishRun(run)\n }\n\n private cancelAll() {\n if (this._activeRun) this.finishRun(this._activeRun)\n }\n\n /*\n * 收尾分两个方向:画线还原消费者自己写的 dash(描边完整可见),收回把空白留在内联样式上\n * (整条路径落进 dash 间隙,看不见)。收回末态必须是 DOM 状态,不能是「一条还活着的\n * fill:forwards 动画」——元素被摘走再挂回(列表 key 重排、teleport)时,还原成完整描边的\n * 那份内联值会让勾当场复现,而控件已经是未勾选。\n */\n private finishRun(run: AnimationRun) {\n run.animations.forEach(anim => anim.cancel())\n\n for (const [el, d] of run.patchedD) {\n el.setAttribute('d', d)\n }\n\n for (const [el, blank] of run.blankByElement) {\n const authored = this._authoredDash.get(el)\n if (run.reverse) {\n el.style.strokeDasharray = blank\n el.style.strokeDashoffset = blank\n // 存回读值而不是写入值:CSSOM 会按自己的精度序列化,撤销时要按同一份文本比对。\n this._stickyBlank.set(el, { dasharray: el.style.strokeDasharray, dashoffset: el.style.strokeDashoffset })\n } else {\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n }\n\n if (this._activeRun === run) this._activeRun = undefined\n }\n\n /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */\n private clearStickyBlank(el: SVGGeometryElement) {\n const blank = this._stickyBlank.get(el)\n if (\n blank === undefined ||\n el.style.strokeDasharray !== blank.dasharray ||\n el.style.strokeDashoffset !== blank.dashoffset\n )\n return\n\n const authored = this._authoredDash.get(el)\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\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 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 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, reverse: boolean): Promise<void> {\n return new Promise(resolve => {\n if (!this._authoredDash.has(el)) {\n this._authoredDash.set(el, {\n dasharray: el.style.strokeDasharray,\n dashoffset: el.style.strokeDashoffset\n })\n }\n\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 // 空白 = 整条路径落在 dash 间隙里;满 = 偏移归零。两个方向只是这两端换先后。\n const blank = `${len}`\n const from = reverse ? 0 : len\n const to = reverse ? len : 0\n\n const canClampOvershoot = registerDashOffsetProperty()\n el.style.strokeDasharray = blank\n if (canClampOvershoot) {\n el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`)\n el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`\n } else {\n // Older engines cannot interpolate the registered helper property. Animate the real offset\n // with a bounded easing so replay still works without letting an overshoot crop the path.\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n el.style.strokeDashoffset = `${from}px`\n }\n run.blankByElement.set(el, blank)\n\n const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : 'strokeDashoffset'\n const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {\n duration: this.duration,\n easing: canClampOvershoot ? this.easing : 'linear',\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 内容稳定后自动播放一次;no-autoplay 下这一步交给调用方的 replay()。\n private handleSlotChange() {\n if (this.noAutoplay || 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\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-svg-draw-lines': WebUiSvgDrawLines\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["style"],"sources":["../../../src/components/svg-draw-lines/index.ts"],"sourcesContent":["import { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { normalizeNumber } from '@/shared/normalize'\nimport { prefersReducedMotion } from '@/shared/theme/reduced-motion'\n\nimport style from './style.css?inline'\n\nconst GEOMETRY_SELECTOR = 'path, rect, circle, line, polyline, polygon, ellipse'\n// Animate a registered length, then clamp it before using it as a dash offset.\nconst DASH_OFFSET_PROPERTY = '--wui-svg-draw-lines-offset'\n\nlet dashOffsetRegistrationApi: typeof CSS.registerProperty | undefined\nlet dashOffsetInterpolationSupported: boolean | undefined\n\nfunction isAlreadyRegistered(error: unknown): boolean {\n return (\n typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'InvalidModificationError'\n )\n}\n\nfunction supportsDashOffsetInterpolation(): boolean {\n const probe = document.createElement('span')\n let animation: Animation | undefined\n try {\n probe.style.setProperty(DASH_OFFSET_PROPERTY, '0px')\n document.documentElement.append(probe)\n animation = probe.animate([{ [DASH_OFFSET_PROPERTY]: '0px' }, { [DASH_OFFSET_PROPERTY]: '100px' }], {\n duration: 1000,\n easing: 'linear',\n fill: 'both'\n })\n animation.pause()\n animation.currentTime = 250\n\n const interpolated = Number.parseFloat(getComputedStyle(probe).getPropertyValue(DASH_OFFSET_PROPERTY))\n return Number.isFinite(interpolated) && Math.abs(interpolated - 25) < 0.1\n } catch (error) {\n console.warn('web-ui-svg-draw-lines could not verify typed offset interpolation. Using linear easing.', error)\n return false\n } finally {\n animation?.cancel()\n probe.remove()\n }\n}\n\nfunction registerDashOffsetProperty(): boolean {\n if (typeof CSS === 'undefined' || typeof CSS.registerProperty !== 'function' || typeof document === 'undefined')\n return false\n\n const registerProperty = CSS.registerProperty\n if (dashOffsetRegistrationApi !== registerProperty) {\n // Capability is cached only for the registration implementation that passed the probe.\n dashOffsetRegistrationApi = registerProperty\n dashOffsetInterpolationSupported = undefined\n }\n if (dashOffsetInterpolationSupported !== undefined) return dashOffsetInterpolationSupported\n\n try {\n CSS.registerProperty({\n name: DASH_OFFSET_PROPERTY,\n syntax: '<length>',\n inherits: false,\n initialValue: '0px'\n })\n } catch (error) {\n if (!isAlreadyRegistered(error)) {\n console.warn('web-ui-svg-draw-lines could not register its typed offset property. Using linear easing.', error)\n dashOffsetInterpolationSupported = false\n return false\n }\n }\n\n dashOffsetInterpolationSupported = supportsDashOffsetInterpolation()\n return dashOffsetInterpolationSupported\n}\n\ninterface AnimationRun {\n reverse: boolean\n animations: Animation[]\n /** 本次运行写过的「空白」dash 值,按元素记;收回收尾要把它留在 DOM 上。 */\n blankByElement: Map<SVGGeometryElement, string>\n patchedD: Map<SVGGeometryElement, string>\n}\n\nexport interface ReplayOptions {\n /** 沿原路径收回(从完整描边画回空白),默认 false 即揭示方向。 */\n reverse?: boolean\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 /** 关掉「首次内容稳定时自动播放一次」,交给调用方用 replay() 决定何时播。 */\n @property({ type: Boolean, reflect: true, attribute: 'no-autoplay' }) noAutoplay = false\n\n private _activeRun: AnimationRun | undefined\n private _hasAutoPlayed = false\n /*\n * 消费者自己写在目标元素上的 dash 值,只在第一次碰到该元素时取一次。运行会把这两个属性改成\n * 自己的空白值,所以不能从「上一次运行之后」的状态重新取,否则画入收尾会把空白当成原值。\n */\n private readonly _authoredDash = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n /** 收回留在元素上的「空白」,只有内联那两个值都还是我们自己写的那一份时才算数。 */\n private readonly _stickyBlank = new WeakMap<SVGGeometryElement, { dasharray: string; dashoffset: string }>()\n\n /**\n * 停止当前播放并重新开始。每次调用重新收集子树中的几何元素。\n * 所有元素同时开始并行的 stroke-dashoffset 动画。\n * options.reverse 为 true 时沿原路径收回。\n * 无目标或当前主题范围启用 reduced motion 时立即 resolve。\n */\n async replay(options: ReplayOptions = {}): Promise<void> {\n const reverse = options.reverse === true\n\n this.cancelAll()\n\n const targets = this.collectGeometryElements()\n\n if (prefersReducedMotion(this)) {\n // 不播,但上一次收回提交的空白要清掉:reduced motion 下可见性完全交给消费者的 opacity,\n // 留着空白就会出现「aria-checked=true 却看不见勾」,而之后每次 replay 都会同样早退、无法自愈。\n for (const el of targets) this.clearStickyBlank(el)\n return\n }\n\n if (targets.length === 0) return\n\n const run: AnimationRun = {\n reverse,\n animations: [],\n blankByElement: new Map(),\n patchedD: new Map()\n }\n this._activeRun = run\n\n await Promise.all(targets.map(el => this.animateElement(el, run, reverse)))\n\n // A later replay owns the current DOM state and must not be cleaned up here.\n if (this._activeRun !== run) return\n\n this.finishRun(run)\n }\n\n private cancelAll() {\n if (this._activeRun) this.finishRun(this._activeRun)\n }\n\n /*\n * 收尾分两个方向:画线还原消费者自己写的 dash(描边完整可见),收回把空白留在内联样式上\n * (整条路径落进 dash 间隙,看不见)。收回末态必须是 DOM 状态,不能是「一条还活着的\n * fill:forwards 动画」——元素被摘走再挂回(列表 key 重排、teleport)时,还原成完整描边的\n * 那份内联值会让勾当场复现,而控件已经是未勾选。\n */\n private finishRun(run: AnimationRun) {\n run.animations.forEach(anim => anim.cancel())\n\n for (const [el, d] of run.patchedD) {\n el.setAttribute('d', d)\n }\n\n for (const [el, blank] of run.blankByElement) {\n const authored = this._authoredDash.get(el)\n if (run.reverse) {\n el.style.strokeDasharray = blank\n el.style.strokeDashoffset = blank\n // 存回读值而不是写入值:CSSOM 会按自己的精度序列化,撤销时要按同一份文本比对。\n this._stickyBlank.set(el, { dasharray: el.style.strokeDasharray, dashoffset: el.style.strokeDashoffset })\n } else {\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\n }\n\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n }\n\n if (this._activeRun === run) this._activeRun = undefined\n }\n\n /** 只撤销我们自己写进去的那一份空白;消费者后来动过内联的任一个值就不碰。 */\n private clearStickyBlank(el: SVGGeometryElement) {\n const blank = this._stickyBlank.get(el)\n if (\n blank === undefined ||\n el.style.strokeDasharray !== blank.dasharray ||\n el.style.strokeDashoffset !== blank.dashoffset\n )\n return\n\n const authored = this._authoredDash.get(el)\n el.style.strokeDasharray = authored?.dasharray ?? ''\n el.style.strokeDashoffset = authored?.dashoffset ?? ''\n this._stickyBlank.delete(el)\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 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 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, reverse: boolean): Promise<void> {\n return new Promise(resolve => {\n if (!this._authoredDash.has(el)) {\n this._authoredDash.set(el, {\n dasharray: el.style.strokeDasharray,\n dashoffset: el.style.strokeDashoffset\n })\n }\n\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 // 空白 = 整条路径落在 dash 间隙里;满 = 偏移归零。两个方向只是这两端换先后。\n const blank = `${len}`\n const from = reverse ? 0 : len\n const to = reverse ? len : 0\n\n const canClampOvershoot = registerDashOffsetProperty()\n el.style.strokeDasharray = blank\n if (canClampOvershoot) {\n el.style.setProperty(DASH_OFFSET_PROPERTY, `${from}px`)\n el.style.strokeDashoffset = `clamp(0px, var(${DASH_OFFSET_PROPERTY}), ${blank}px)`\n } else {\n // Older engines cannot interpolate the registered helper property. Animate the real offset\n // with a bounded easing so replay still works without letting an overshoot crop the path.\n el.style.removeProperty(DASH_OFFSET_PROPERTY)\n el.style.strokeDashoffset = `${from}px`\n }\n run.blankByElement.set(el, blank)\n\n const property = canClampOvershoot ? DASH_OFFSET_PROPERTY : 'strokeDashoffset'\n const anim = el.animate([{ [property]: `${from}px` }, { [property]: `${to}px` }], {\n duration: this.duration,\n easing: canClampOvershoot ? this.easing : 'linear',\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 内容稳定后自动播放一次;no-autoplay 下这一步交给调用方的 replay()。\n private handleSlotChange() {\n if (this.noAutoplay || 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\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-svg-draw-lines': WebUiSvgDrawLines\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
- //#region src/components/svg-draw-lines/style.css?inline
2
- var e = "*,:before,:after{box-sizing:border-box}:host{-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;line-height:0;display:inline-flex}";
3
- //#endregion
4
- export { e as default };
1
+ // src/components/svg-draw-lines/style.css?inline
2
+ var style_default = "*,:before,:after{box-sizing:border-box}:host{-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;line-height:0;display:inline-flex}\n";
3
+ export { style_default as default };
5
4
 
6
5
  //# sourceMappingURL=style.js.map
@@ -1 +1 @@
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/* 行为型包裹器:inline-flex + line-height:0 使宿主盒高收缩到被包裹内容(不引入\n inline-block 的行盒导致 24px 抬升),同时宿主仍是可 transform 的盒子——interweave\n prototype 依赖对宿主的 scale 动画(#126)。 */\n:host {\n user-select: none;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n line-height: 0;\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/* 行为型包裹器:inline-flex + line-height:0 使宿主盒高收缩到被包裹内容(不引入\n inline-block 的行盒导致 24px 抬升),同时宿主仍是可 transform 的盒子——interweave\n prototype 依赖对宿主的 scale 动画(#126)。 */\n:host {\n user-select: none;\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n line-height: 0;\n}\n"],"mappings":";AAAA,IAAA,gBAAA"}