@greypan/web-ui 11.1.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 -391
  45. package/dist/components/button/index.d.ts.map +1 -0
  46. package/dist/components/button/index.js +109 -79
  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 +82 -75
  69. package/dist/components/collapse/index.d.ts.map +1 -0
  70. package/dist/components/collapse/index.js +228 -135
  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 +26 -36
  125. package/dist/components/empty/index.d.ts.map +1 -0
  126. package/dist/components/empty/index.js +73 -60
  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 +7 -0
  280. package/dist/icons/generated/andrsrxn-inbox.d.ts.map +1 -0
  281. package/dist/icons/generated/andrsrxn-inbox.js +9 -0
  282. package/dist/icons/generated/andrsrxn-inbox.js.map +1 -0
  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 -73
  568. package/dist/icons/index.js +75 -74
  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 +11 -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,39 +1,65 @@
1
- //#region src/shared/focus/pointer-focus.ts
2
- var e = !1, t = 0, n = !1;
3
- function r() {
4
- n = !0, t = Date.now();
1
+ // src/shared/focus/pointer-focus.ts
2
+ /**
3
+ * 指针输入期间的 focus ring 抑制。
4
+ *
5
+ * Safari 等浏览器在 pointer 点击后仍可能让 `:focus-visible` 命中新聚焦元素,
6
+ * 导致点击打开 drawer/dialog 时内部 button 自动出现 focus ring。这里记录最近一次
7
+ * 指针输入,并在 focusin 时给聚焦元素打 `data-wui-pointer-focus` 标记;组件样式
8
+ * 用该标记将 focus ring 透明化,键盘导航(Tab/方向键等)会清除标记并恢复可见。
9
+ */
10
+ const POINTER_FOCUS_WINDOW_MS = 1e3;
11
+ let installed = false;
12
+ let lastPointerAt = 0;
13
+ let pointerActive = false;
14
+ function markPointer() {
15
+ pointerActive = true;
16
+ lastPointerAt = Date.now();
5
17
  }
6
- function i() {
7
- n = !1, t = 0;
18
+ function markKeyboard() {
19
+ pointerActive = false;
20
+ lastPointerAt = 0;
8
21
  }
9
- function a() {
10
- r();
22
+ function onPointerDown() {
23
+ markPointer();
11
24
  }
12
- function o(e) {
13
- if (!e) return;
14
- e.removeAttribute("data-wui-pointer-focus");
15
- let t = e.getRootNode();
16
- t instanceof ShadowRoot && t.host instanceof HTMLElement && t.host.removeAttribute("data-wui-pointer-focus");
25
+ function clearPointerFocusMark(target) {
26
+ if (!target) return;
27
+ target.removeAttribute("data-wui-pointer-focus");
28
+ const root = target.getRootNode();
29
+ if (root instanceof ShadowRoot && root.host instanceof HTMLElement) root.host.removeAttribute("data-wui-pointer-focus");
17
30
  }
18
- function s(e) {
19
- (e.key === "Tab" || e.key.startsWith("Arrow") || e.key === "Enter" || e.key === " " || e.key === "Home" || e.key === "End" || e.key === "PageUp" || e.key === "PageDown") && (i(), o(document.activeElement));
20
- }
21
- function c(e) {
22
- let r = e.target;
23
- if (r instanceof HTMLElement) {
24
- if (n && Date.now() - t <= 1e3) {
25
- r.dataset.wuiPointerFocus = "true";
26
- let e = r.getRootNode();
27
- e instanceof ShadowRoot && e.host instanceof HTMLElement && (e.host.dataset.wuiPointerFocus = "true");
28
- } else o(r);
31
+ function onKeyDown(event) {
32
+ if (event.key === "Tab" || event.key.startsWith("Arrow") || event.key === "Enter" || event.key === " " || event.key === "Home" || event.key === "End" || event.key === "PageUp" || event.key === "PageDown") {
33
+ markKeyboard();
34
+ clearPointerFocusMark(document.activeElement);
29
35
  }
30
36
  }
31
- function l() {
32
- return typeof window > "u" || typeof document > "u" || e ? () => {} : (e = !0, document.addEventListener("pointerdown", a, !0), document.addEventListener("keydown", s, !0), document.addEventListener("focusin", c, !0), () => {
33
- e = !1, document.removeEventListener("pointerdown", a, !0), document.removeEventListener("keydown", s, !0), document.removeEventListener("focusin", c, !0);
34
- });
37
+ function onFocusIn(event) {
38
+ const target = event.target;
39
+ if (!(target instanceof HTMLElement)) return;
40
+ if (pointerActive && Date.now() - lastPointerAt <= POINTER_FOCUS_WINDOW_MS) {
41
+ target.dataset.wuiPointerFocus = "true";
42
+ const root = target.getRootNode();
43
+ if (root instanceof ShadowRoot && root.host instanceof HTMLElement) root.host.dataset.wuiPointerFocus = "true";
44
+ } else clearPointerFocusMark(target);
45
+ }
46
+ /**
47
+ * 安装一次全局 pointer/keyboard/focus 监听。重复调用幂等。
48
+ */
49
+ function installPointerFocusSuppression() {
50
+ if (typeof window === "undefined" || typeof document === "undefined") return () => {};
51
+ if (installed) return () => {};
52
+ installed = true;
53
+ document.addEventListener("pointerdown", onPointerDown, true);
54
+ document.addEventListener("keydown", onKeyDown, true);
55
+ document.addEventListener("focusin", onFocusIn, true);
56
+ return () => {
57
+ installed = false;
58
+ document.removeEventListener("pointerdown", onPointerDown, true);
59
+ document.removeEventListener("keydown", onKeyDown, true);
60
+ document.removeEventListener("focusin", onFocusIn, true);
61
+ };
35
62
  }
36
- //#endregion
37
- export { l as installPointerFocusSuppression };
63
+ export { installPointerFocusSuppression };
38
64
 
39
65
  //# sourceMappingURL=pointer-focus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-focus.js","names":[],"sources":["../../../src/shared/focus/pointer-focus.ts"],"sourcesContent":["/**\n * 指针输入期间的 focus ring 抑制。\n *\n * Safari 等浏览器在 pointer 点击后仍可能让 `:focus-visible` 命中新聚焦元素,\n * 导致点击打开 drawer/dialog 时内部 button 自动出现 focus ring。这里记录最近一次\n * 指针输入,并在 focusin 时给聚焦元素打 `data-wui-pointer-focus` 标记;组件样式\n * 用该标记将 focus ring 透明化,键盘导航(Tab/方向键等)会清除标记并恢复可见。\n */\n\nconst POINTER_FOCUS_WINDOW_MS = 1000\n\nlet installed = false\nlet lastPointerAt = 0\nlet pointerActive = false\n\nfunction markPointer() {\n pointerActive = true\n lastPointerAt = Date.now()\n}\n\nfunction markKeyboard() {\n pointerActive = false\n lastPointerAt = 0\n}\n\nfunction onPointerDown() {\n markPointer()\n}\n\nfunction clearPointerFocusMark(target: Element | null) {\n if (!target) return\n\n target.removeAttribute('data-wui-pointer-focus')\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.removeAttribute('data-wui-pointer-focus')\n }\n}\n\nfunction onKeyDown(event: KeyboardEvent) {\n if (\n event.key === 'Tab' ||\n event.key.startsWith('Arrow') ||\n event.key === 'Enter' ||\n event.key === ' ' ||\n event.key === 'Home' ||\n event.key === 'End' ||\n event.key === 'PageUp' ||\n event.key === 'PageDown'\n ) {\n markKeyboard()\n clearPointerFocusMark(document.activeElement)\n }\n}\n\nfunction onFocusIn(event: FocusEvent) {\n const target = event.target\n if (!(target instanceof HTMLElement)) return\n\n if (pointerActive && Date.now() - lastPointerAt <= POINTER_FOCUS_WINDOW_MS) {\n target.dataset.wuiPointerFocus = 'true'\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.dataset.wuiPointerFocus = 'true'\n }\n } else {\n clearPointerFocusMark(target)\n }\n}\n\n/**\n * 安装一次全局 pointer/keyboard/focus 监听。重复调用幂等。\n */\nexport function installPointerFocusSuppression(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n if (installed) return () => {}\n installed = true\n\n // 只用 document 一份 capture 监听:shadow DOM 内的 pointerdown/keydown/focusin\n // 都会 composed 冒泡到 document,避免 window/document 双份导致同一事件处理两次。\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown, true)\n document.addEventListener('focusin', onFocusIn, true)\n\n return () => {\n installed = false\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown, true)\n document.removeEventListener('focusin', onFocusIn, true)\n }\n}\n\n/**\n * 测试辅助:清除指针输入状态,避免用例间泄漏。\n */\nexport function resetPointerFocusState(): void {\n markKeyboard()\n}\n"],"mappings":";AASA,IAEI,IAAY,IACZ,IAAgB,GAChB,IAAgB;AAEpB,SAAS,IAAc;CAErB,AADA,IAAgB,IAChB,IAAgB,KAAK,IAAI;AAC3B;AAEA,SAAS,IAAe;CAEtB,AADA,IAAgB,IAChB,IAAgB;AAClB;AAEA,SAAS,IAAgB;CACvB,EAAY;AACd;AAEA,SAAS,EAAsB,GAAwB;CACrD,IAAI,CAAC,GAAQ;CAEb,EAAO,gBAAgB,wBAAwB;CAC/C,IAAM,IAAO,EAAO,YAAY;CAChC,AAAI,aAAgB,cAAc,EAAK,gBAAgB,eACrD,EAAK,KAAK,gBAAgB,wBAAwB;AAEtD;AAEA,SAAS,EAAU,GAAsB;CACvC,CACE,EAAM,QAAQ,SACd,EAAM,IAAI,WAAW,OAAO,KAC5B,EAAM,QAAQ,WACd,EAAM,QAAQ,OACd,EAAM,QAAQ,UACd,EAAM,QAAQ,SACd,EAAM,QAAQ,YACd,EAAM,QAAQ,gBAEd,EAAa,GACb,EAAsB,SAAS,aAAa;AAEhD;AAEA,SAAS,EAAU,GAAmB;CACpC,IAAM,IAAS,EAAM;CACf,iBAAkB,aAExB;MAAI,KAAiB,KAAK,IAAI,IAAI,KAAiB,KAAyB;GAC1E,EAAO,QAAQ,kBAAkB;GACjC,IAAM,IAAO,EAAO,YAAY;GAChC,AAAI,aAAgB,cAAc,EAAK,gBAAgB,gBACrD,EAAK,KAAK,QAAQ,kBAAkB;EAExC,OACE,EAAsB,CAAM;CAAA;AAEhC;AAKA,SAAgB,IAA6C;CAW3D,OAVI,OAAO,SAAW,OAAe,OAAO,WAAa,OACrD,UAAwB,CAAC,KAC7B,IAAY,IAIZ,SAAS,iBAAiB,eAAe,GAAe,EAAI,GAC5D,SAAS,iBAAiB,WAAW,GAAW,EAAI,GACpD,SAAS,iBAAiB,WAAW,GAAW,EAAI,SAEvC;EAIX,AAHA,IAAY,IACZ,SAAS,oBAAoB,eAAe,GAAe,EAAI,GAC/D,SAAS,oBAAoB,WAAW,GAAW,EAAI,GACvD,SAAS,oBAAoB,WAAW,GAAW,EAAI;CACzD;AACF"}
1
+ {"version":3,"file":"pointer-focus.js","names":[],"sources":["../../../src/shared/focus/pointer-focus.ts"],"sourcesContent":["/**\n * 指针输入期间的 focus ring 抑制。\n *\n * Safari 等浏览器在 pointer 点击后仍可能让 `:focus-visible` 命中新聚焦元素,\n * 导致点击打开 drawer/dialog 时内部 button 自动出现 focus ring。这里记录最近一次\n * 指针输入,并在 focusin 时给聚焦元素打 `data-wui-pointer-focus` 标记;组件样式\n * 用该标记将 focus ring 透明化,键盘导航(Tab/方向键等)会清除标记并恢复可见。\n */\n\nconst POINTER_FOCUS_WINDOW_MS = 1000\n\nlet installed = false\nlet lastPointerAt = 0\nlet pointerActive = false\n\nfunction markPointer() {\n pointerActive = true\n lastPointerAt = Date.now()\n}\n\nfunction markKeyboard() {\n pointerActive = false\n lastPointerAt = 0\n}\n\nfunction onPointerDown() {\n markPointer()\n}\n\nfunction clearPointerFocusMark(target: Element | null) {\n if (!target) return\n\n target.removeAttribute('data-wui-pointer-focus')\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.removeAttribute('data-wui-pointer-focus')\n }\n}\n\nfunction onKeyDown(event: KeyboardEvent) {\n if (\n event.key === 'Tab' ||\n event.key.startsWith('Arrow') ||\n event.key === 'Enter' ||\n event.key === ' ' ||\n event.key === 'Home' ||\n event.key === 'End' ||\n event.key === 'PageUp' ||\n event.key === 'PageDown'\n ) {\n markKeyboard()\n clearPointerFocusMark(document.activeElement)\n }\n}\n\nfunction onFocusIn(event: FocusEvent) {\n const target = event.target\n if (!(target instanceof HTMLElement)) return\n\n if (pointerActive && Date.now() - lastPointerAt <= POINTER_FOCUS_WINDOW_MS) {\n target.dataset.wuiPointerFocus = 'true'\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.dataset.wuiPointerFocus = 'true'\n }\n } else {\n clearPointerFocusMark(target)\n }\n}\n\n/**\n * 安装一次全局 pointer/keyboard/focus 监听。重复调用幂等。\n */\nexport function installPointerFocusSuppression(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n if (installed) return () => {}\n installed = true\n\n // 只用 document 一份 capture 监听:shadow DOM 内的 pointerdown/keydown/focusin\n // 都会 composed 冒泡到 document,避免 window/document 双份导致同一事件处理两次。\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown, true)\n document.addEventListener('focusin', onFocusIn, true)\n\n return () => {\n installed = false\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown, true)\n document.removeEventListener('focusin', onFocusIn, true)\n }\n}\n\n/**\n * 测试辅助:清除指针输入状态,避免用例间泄漏。\n */\nexport function resetPointerFocusState(): void {\n markKeyboard()\n}\n"],"mappings":";;;;;;;;;AASA,MAAM,0BAA0B;AAEhC,IAAI,YAAY;AAChB,IAAI,gBAAgB;AACpB,IAAI,gBAAgB;AAEpB,SAAS,cAAc;CACrB,gBAAgB;CAChB,gBAAgB,KAAK,IAAI;AAC3B;AAEA,SAAS,eAAe;CACtB,gBAAgB;CAChB,gBAAgB;AAClB;AAEA,SAAS,gBAAgB;CACvB,YAAY;AACd;AAEA,SAAS,sBAAsB,QAAwB;CACrD,IAAI,CAAC,QAAQ;CAEb,OAAO,gBAAgB,wBAAwB;CAC/C,MAAM,OAAO,OAAO,YAAY;CAChC,IAAI,gBAAgB,cAAc,KAAK,gBAAgB,aACrD,KAAK,KAAK,gBAAgB,wBAAwB;AAEtD;AAEA,SAAS,UAAU,OAAsB;CACvC,IACE,MAAM,QAAQ,SACd,MAAM,IAAI,WAAW,OAAO,KAC5B,MAAM,QAAQ,WACd,MAAM,QAAQ,OACd,MAAM,QAAQ,UACd,MAAM,QAAQ,SACd,MAAM,QAAQ,YACd,MAAM,QAAQ,YACd;EACA,aAAa;EACb,sBAAsB,SAAS,aAAa;CAC9C;AACF;AAEA,SAAS,UAAU,OAAmB;CACpC,MAAM,SAAS,MAAM;CACrB,IAAI,EAAE,kBAAkB,cAAc;CAEtC,IAAI,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,yBAAyB;EAC1E,OAAO,QAAQ,kBAAkB;EACjC,MAAM,OAAO,OAAO,YAAY;EAChC,IAAI,gBAAgB,cAAc,KAAK,gBAAgB,aACrD,KAAK,KAAK,QAAQ,kBAAkB;CAExC,OACE,sBAAsB,MAAM;AAEhC;;;;AAKA,SAAgB,iCAA6C;CAC3D,IAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa,aAAa,CAAC;CACpF,IAAI,WAAW,aAAa,CAAC;CAC7B,YAAY;CAIZ,SAAS,iBAAiB,eAAe,eAAe,IAAI;CAC5D,SAAS,iBAAiB,WAAW,WAAW,IAAI;CACpD,SAAS,iBAAiB,WAAW,WAAW,IAAI;CAEpD,aAAa;EACX,YAAY;EACZ,SAAS,oBAAoB,eAAe,eAAe,IAAI;EAC/D,SAAS,oBAAoB,WAAW,WAAW,IAAI;EACvD,SAAS,oBAAoB,WAAW,WAAW,IAAI;CACzD;AACF"}
@@ -0,0 +1,96 @@
1
+ // src/shared/focus/tabbable.ts
2
+ [
3
+ "a[href]",
4
+ "area[href]",
5
+ "button",
6
+ "input:not([type=\"hidden\"])",
7
+ "select",
8
+ "textarea",
9
+ "iframe",
10
+ "summary",
11
+ "audio[controls]",
12
+ "video[controls]",
13
+ "[contenteditable]:not([contenteditable=\"false\"])",
14
+ "[tabindex]"
15
+ ].join(",");
16
+ function isInert(element) {
17
+ let current = element;
18
+ while (current) {
19
+ if (current.hasAttribute("inert")) return true;
20
+ const root = current.getRootNode();
21
+ current = current.parentElement ?? (root instanceof ShadowRoot ? root.host : null);
22
+ }
23
+ return false;
24
+ }
25
+ function isTabbable(element) {
26
+ if (element.tabIndex < 0) return false;
27
+ if (element.matches(":disabled")) return false;
28
+ if (element.hidden) return false;
29
+ if (isInert(element)) return false;
30
+ if (element.closest("details:not([open])") && element.tagName !== "SUMMARY") return false;
31
+ const style = getComputedStyle(element);
32
+ return style.display !== "none" && style.visibility !== "hidden";
33
+ }
34
+ /**
35
+ * 按 flat tree(含 slot 分配与 open shadow root)收集可 Tab 聚焦元素。
36
+ * 自定义元素宿主本身通常不可聚焦,真正进入 Tab 序的是其 shadow 内的原生控件。
37
+ */
38
+ function getTabbables(root) {
39
+ const tabbables = [];
40
+ const visitChildren = (parent) => {
41
+ for (const child of parent.children) {
42
+ if (typeof HTMLSlotElement !== "undefined" && child instanceof HTMLSlotElement) {
43
+ const assigned = child.assignedElements({ flatten: true });
44
+ if (assigned.length > 0) for (const element of assigned) visitElement(element);
45
+ else visitChildren(child);
46
+ continue;
47
+ }
48
+ visitElement(child);
49
+ }
50
+ };
51
+ const visitElement = (element) => {
52
+ if (!(element instanceof HTMLElement)) return;
53
+ if (isTabbable(element)) tabbables.push(element);
54
+ visitChildren(element.shadowRoot ?? element);
55
+ };
56
+ visitChildren(root);
57
+ return tabbables;
58
+ }
59
+ /** 深入 open shadow root,返回实际持有焦点的元素(document.activeElement 会重定向到宿主)。 */
60
+ function getDeepActiveElement(root) {
61
+ let active = root.ownerDocument?.activeElement ?? null;
62
+ while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
63
+ return active;
64
+ }
65
+ /**
66
+ * 原生 modal dialog 在 Chromium 里从末项 Tab 时会先落到 body。这里在首尾边界显式回卷,
67
+ * 保证焦点始终停在浮层内。
68
+ */
69
+ function trapTabKey(event, root) {
70
+ if (event.key !== "Tab" || event.defaultPrevented) return;
71
+ const tabbables = getTabbables(root);
72
+ if (tabbables.length === 0) {
73
+ event.preventDefault();
74
+ return;
75
+ }
76
+ const active = getDeepActiveElement(root);
77
+ if (!active || !tabbables.includes(active)) return;
78
+ const first = tabbables[0];
79
+ const last = tabbables[tabbables.length - 1];
80
+ if (event.shiftKey && active === first) {
81
+ event.preventDefault();
82
+ last.focus();
83
+ } else if (!event.shiftKey && active === last) {
84
+ event.preventDefault();
85
+ first.focus();
86
+ }
87
+ }
88
+ /** 找到 trigger 内真正接收焦点的元素;trigger 本身可聚焦时就是它。 */
89
+ function findFocusTarget(trigger) {
90
+ if (trigger instanceof HTMLElement && isTabbable(trigger)) return trigger;
91
+ if (trigger.shadowRoot) return getTabbables(trigger.shadowRoot)[0] ?? null;
92
+ return null;
93
+ }
94
+ export { findFocusTarget, getDeepActiveElement, getTabbables, trapTabKey };
95
+
96
+ //# sourceMappingURL=tabbable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabbable.js","names":[],"sources":["../../../src/shared/focus/tabbable.ts"],"sourcesContent":["const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button',\n 'input:not([type=\"hidden\"])',\n 'select',\n 'textarea',\n 'iframe',\n 'summary',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]'\n].join(',')\n\nfunction isInert(element: Element): boolean {\n let current: Element | null = element\n while (current) {\n if (current.hasAttribute('inert')) return true\n const root = current.getRootNode()\n current = current.parentElement ?? (root instanceof ShadowRoot ? root.host : null)\n }\n return false\n}\n\nfunction isTabbable(element: HTMLElement): boolean {\n if (element.tabIndex < 0) return false\n if (element.matches(':disabled')) return false\n if (element.hidden) return false\n if (isInert(element)) return false\n if (element.closest('details:not([open])') && element.tagName !== 'SUMMARY') return false\n const style = getComputedStyle(element)\n return style.display !== 'none' && style.visibility !== 'hidden'\n}\n\n/**\n * 按 flat tree(含 slot 分配与 open shadow root)收集可 Tab 聚焦元素。\n * 自定义元素宿主本身通常不可聚焦,真正进入 Tab 序的是其 shadow 内的原生控件。\n */\nexport function getTabbables(root: ParentNode): HTMLElement[] {\n const tabbables: HTMLElement[] = []\n\n const visitChildren = (parent: ParentNode) => {\n for (const child of parent.children) {\n if (typeof HTMLSlotElement !== 'undefined' && child instanceof HTMLSlotElement) {\n const assigned = child.assignedElements({ flatten: true })\n if (assigned.length > 0) {\n for (const element of assigned) visitElement(element)\n } else {\n visitChildren(child)\n }\n continue\n }\n visitElement(child)\n }\n }\n\n const visitElement = (element: Element) => {\n if (!(element instanceof HTMLElement)) return\n if (isTabbable(element)) tabbables.push(element)\n visitChildren(element.shadowRoot ?? element)\n }\n\n visitChildren(root)\n return tabbables\n}\n\n/** 深入 open shadow root,返回实际持有焦点的元素(document.activeElement 会重定向到宿主)。 */\nexport function getDeepActiveElement(root: HTMLElement): Element | null {\n let active: Element | null = root.ownerDocument?.activeElement ?? null\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement\n return active\n}\n\n/**\n * 原生 modal dialog 在 Chromium 里从末项 Tab 时会先落到 body。这里在首尾边界显式回卷,\n * 保证焦点始终停在浮层内。\n */\nexport function trapTabKey(event: KeyboardEvent, root: HTMLElement): void {\n if (event.key !== 'Tab' || event.defaultPrevented) return\n\n const tabbables = getTabbables(root)\n if (tabbables.length === 0) {\n event.preventDefault()\n return\n }\n\n const active = getDeepActiveElement(root)\n if (!active || !tabbables.includes(active as HTMLElement)) return\n\n const first = tabbables[0]\n const last = tabbables[tabbables.length - 1]\n if (event.shiftKey && active === first) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && active === last) {\n event.preventDefault()\n first.focus()\n }\n}\n\n/** 找到 trigger 内真正接收焦点的元素;trigger 本身可聚焦时就是它。 */\nexport function findFocusTarget(trigger: Element): HTMLElement | null {\n if (trigger instanceof HTMLElement && isTabbable(trigger)) return trigger\n if (trigger.shadowRoot) return getTabbables(trigger.shadowRoot)[0] ?? null\n return null\n}\n"],"mappings":";AAA2B;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,KAAK,GAAG;AAEV,SAAS,QAAQ,SAA2B;CAC1C,IAAI,UAA0B;CAC9B,OAAO,SAAS;EACd,IAAI,QAAQ,aAAa,OAAO,GAAG,OAAO;EAC1C,MAAM,OAAO,QAAQ,YAAY;EACjC,UAAU,QAAQ,kBAAkB,gBAAgB,aAAa,KAAK,OAAO;CAC/E;CACA,OAAO;AACT;AAEA,SAAS,WAAW,SAA+B;CACjD,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,IAAI,QAAQ,QAAQ,WAAW,GAAG,OAAO;CACzC,IAAI,QAAQ,QAAQ,OAAO;CAC3B,IAAI,QAAQ,OAAO,GAAG,OAAO;CAC7B,IAAI,QAAQ,QAAQ,qBAAqB,KAAK,QAAQ,YAAY,WAAW,OAAO;CACpF,MAAM,QAAQ,iBAAiB,OAAO;CACtC,OAAO,MAAM,YAAY,UAAU,MAAM,eAAe;AAC1D;;;;;AAMA,SAAgB,aAAa,MAAiC;CAC5D,MAAM,YAA2B,CAAC;CAElC,MAAM,iBAAiB,WAAuB;EAC5C,KAAK,MAAM,SAAS,OAAO,UAAU;GACnC,IAAI,OAAO,oBAAoB,eAAe,iBAAiB,iBAAiB;IAC9E,MAAM,WAAW,MAAM,iBAAiB,EAAE,SAAS,KAAK,CAAC;IACzD,IAAI,SAAS,SAAS,GACpB,KAAK,MAAM,WAAW,UAAU,aAAa,OAAO;SAEpD,cAAc,KAAK;IAErB;GACF;GACA,aAAa,KAAK;EACpB;CACF;CAEA,MAAM,gBAAgB,YAAqB;EACzC,IAAI,EAAE,mBAAmB,cAAc;EACvC,IAAI,WAAW,OAAO,GAAG,UAAU,KAAK,OAAO;EAC/C,cAAc,QAAQ,cAAc,OAAO;CAC7C;CAEA,cAAc,IAAI;CAClB,OAAO;AACT;;AAGA,SAAgB,qBAAqB,MAAmC;CACtE,IAAI,SAAyB,KAAK,eAAe,iBAAiB;CAClE,OAAO,QAAQ,YAAY,eAAe,SAAS,OAAO,WAAW;CACrE,OAAO;AACT;;;;;AAMA,SAAgB,WAAW,OAAsB,MAAyB;CACxE,IAAI,MAAM,QAAQ,SAAS,MAAM,kBAAkB;CAEnD,MAAM,YAAY,aAAa,IAAI;CACnC,IAAI,UAAU,WAAW,GAAG;EAC1B,MAAM,eAAe;EACrB;CACF;CAEA,MAAM,SAAS,qBAAqB,IAAI;CACxC,IAAI,CAAC,UAAU,CAAC,UAAU,SAAS,MAAqB,GAAG;CAE3D,MAAM,QAAQ,UAAU;CACxB,MAAM,OAAO,UAAU,UAAU,SAAS;CAC1C,IAAI,MAAM,YAAY,WAAW,OAAO;EACtC,MAAM,eAAe;EACrB,KAAK,MAAM;CACb,OAAO,IAAI,CAAC,MAAM,YAAY,WAAW,MAAM;EAC7C,MAAM,eAAe;EACrB,MAAM,MAAM;CACd;AACF;;AAGA,SAAgB,gBAAgB,SAAsC;CACpE,IAAI,mBAAmB,eAAe,WAAW,OAAO,GAAG,OAAO;CAClE,IAAI,QAAQ,YAAY,OAAO,aAAa,QAAQ,UAAU,CAAC,CAAC,MAAM;CACtE,OAAO;AACT"}
@@ -1,9 +1,16 @@
1
- //#region src/shared/form-association/field-id.ts
2
- var e = 0;
3
- function t(t) {
4
- return e += 1, `${t}-${e}`;
1
+ // src/shared/form-association/field-id.ts
2
+ let nextFieldId = 0;
3
+ /**
4
+ * 为 shadow 内原生表单控件生成实例级稳定 id。
5
+ *
6
+ * Chrome 的表单 a11y 审计要求 input / textarea 至少有 id 或 name;
7
+ * 生成 id 让消费者无需显式传 host 属性也始终满足该契约。
8
+ * id 在组件构造时生成一次,后续重渲染复用,避免 aria 引用与焦点时序抖动。
9
+ */
10
+ function createFieldId(prefix) {
11
+ nextFieldId += 1;
12
+ return `${prefix}-${nextFieldId}`;
5
13
  }
6
- //#endregion
7
- export { t as createFieldId };
14
+ export { createFieldId };
8
15
 
9
16
  //# sourceMappingURL=field-id.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-id.js","names":[],"sources":["../../../src/shared/form-association/field-id.ts"],"sourcesContent":["let nextFieldId = 0\n\n/**\n * 为 shadow 内原生表单控件生成实例级稳定 id。\n *\n * Chrome 的表单 a11y 审计要求 input / textarea 至少有 id 或 name;\n * 生成 id 让消费者无需显式传 host 属性也始终满足该契约。\n * id 在组件构造时生成一次,后续重渲染复用,避免 aria 引用与焦点时序抖动。\n */\nexport function createFieldId(prefix: string): string {\n nextFieldId += 1\n return `${prefix}-${nextFieldId}`\n}\n"],"mappings":";AAAA,IAAI,IAAc;AASlB,SAAgB,EAAc,GAAwB;CAEpD,OADA,KAAe,GACR,GAAG,EAAO,GAAG;AACtB"}
1
+ {"version":3,"file":"field-id.js","names":[],"sources":["../../../src/shared/form-association/field-id.ts"],"sourcesContent":["let nextFieldId = 0\n\n/**\n * 为 shadow 内原生表单控件生成实例级稳定 id。\n *\n * Chrome 的表单 a11y 审计要求 input / textarea 至少有 id 或 name;\n * 生成 id 让消费者无需显式传 host 属性也始终满足该契约。\n * id 在组件构造时生成一次,后续重渲染复用,避免 aria 引用与焦点时序抖动。\n */\nexport function createFieldId(prefix: string): string {\n nextFieldId += 1\n return `${prefix}-${nextFieldId}`\n}\n"],"mappings":";AAAA,IAAI,cAAc;;;;;;;;AASlB,SAAgB,cAAc,QAAwB;CACpD,eAAe;CACf,OAAO,GAAG,OAAO,GAAG;AACtB"}
@@ -1,67 +1,101 @@
1
- import { definePlugin as e } from "@greypan/js-kit";
2
- //#region src/shared/form-association/index.ts
3
- function t(e, t, n, r = !1) {
4
- if (typeof e.setValidity != "function") return;
5
- if (r || t.validity.valid) {
6
- e.setValidity({});
1
+ import { definePlugin } from "@greypan/js-kit";
2
+ // src/shared/form-association/index.ts
3
+ /**
4
+ * 把原生 input 的 ValidityState 转发为 ElementInternals 的校验状态。
5
+ * flagNames 是控件自己声明的校验契约(input 转发文本类 5 项、input-number
6
+ * 转发范围类 4 项),这里只收敛 guard / valid 判定 / setValidity 接线。
7
+ * disabled 元素被约束验证豁免,必须上报干净状态;isDisabled 传入控件的
8
+ * 组合禁用态(含 formDisabled),因为 formDisabledCallback 触发时原生
9
+ * input 的 disabled 属性可能尚未重渲染,不能依赖 input.validity.valid。
10
+ */
11
+ function forwardInputValidity(internals, input, flagNames, isDisabled = false) {
12
+ if (typeof internals.setValidity !== "function") return;
13
+ if (isDisabled || input.validity.valid) {
14
+ internals.setValidity({});
7
15
  return;
8
16
  }
9
- let i = {};
10
- for (let e of n) t.validity[e] && (i[e] = !0);
11
- e.setValidity(i, t.validationMessage, t);
17
+ const flags = {};
18
+ for (const name of flagNames) if (input.validity[name]) flags[name] = true;
19
+ internals.setValidity(flags, input.validationMessage, input);
12
20
  }
13
- function n(t) {
14
- return e(() => {
15
- let e, n, r = !1, i = !1, a = t.copyState ?? ((e) => e), o = () => {
16
- e && (e.setFormValue?.(t.getFormValue(), t.getFormState()), t.syncValidity?.(e));
21
+ /**
22
+ * 承接原生 custom element 表单生命周期,值序列化与校验语义仍由各控件组件自己表达。
23
+ */
24
+ function defineFormAssociation(options) {
25
+ return definePlugin(() => {
26
+ let internals;
27
+ let initialState;
28
+ let initialized = false;
29
+ let formDisabled = false;
30
+ const copyState = options.copyState ?? ((state) => state);
31
+ const sync = () => {
32
+ if (!internals) return;
33
+ internals.setFormValue?.(options.getFormValue(), options.getFormState());
34
+ options.syncValidity?.(internals);
17
35
  };
18
36
  return {
19
37
  connect() {
20
- e ||= t.host.attachInternals(), r ||= (t.initialize?.(), n = a(t.getState()), !0), o();
38
+ if (!internals) internals = options.host.attachInternals();
39
+ if (!initialized) {
40
+ options.initialize?.();
41
+ initialState = copyState(options.getState());
42
+ initialized = true;
43
+ }
44
+ sync();
21
45
  },
22
- sync: o,
46
+ sync,
23
47
  reset() {
24
- r && !t.isStateManaged?.() && (t.setState(a(n)), o());
48
+ if (!initialized || options.isStateManaged?.()) return;
49
+ options.setState(copyState(initialState));
50
+ sync();
25
51
  },
26
- restore(e) {
27
- t.isStateManaged?.() || (t.restoreState(e), o());
52
+ restore(state) {
53
+ if (options.isStateManaged?.()) return;
54
+ options.restoreState(state);
55
+ sync();
28
56
  },
29
- setDisabled(e) {
30
- if (i !== e) {
31
- if (i = e, o(), t.host.isUpdatePending) {
32
- queueMicrotask(() => {
33
- t.host.requestUpdate(), o();
34
- });
35
- return;
36
- }
37
- t.host.requestUpdate();
57
+ setDisabled(disabled) {
58
+ if (formDisabled === disabled) return;
59
+ formDisabled = disabled;
60
+ sync();
61
+ if (options.host.isUpdatePending) {
62
+ queueMicrotask(() => {
63
+ options.host.requestUpdate();
64
+ sync();
65
+ });
66
+ return;
38
67
  }
68
+ options.host.requestUpdate();
39
69
  },
40
- isFormDisabled: () => i,
41
- getInternals: () => e
70
+ isFormDisabled: () => formDisabled,
71
+ getInternals: () => internals
42
72
  };
43
73
  });
44
74
  }
45
- function r(e) {
46
- class t extends e {
75
+ function FormAssociated(superClass) {
76
+ class FormAssociatedElement extends superClass {
47
77
  static {
48
- this.formAssociated = !0;
78
+ this.formAssociated = true;
49
79
  }
50
80
  formResetCallback() {
51
81
  this.__formLifecycleProvider?.().reset();
52
82
  }
53
- formDisabledCallback(e) {
54
- this.__formLifecycleProvider?.().setDisabled(e);
83
+ formDisabledCallback(disabled) {
84
+ this.__formLifecycleProvider?.().setDisabled(disabled);
55
85
  }
56
- formStateRestoreCallback(e) {
57
- this.__formLifecycleProvider?.().restore(e);
86
+ formStateRestoreCallback(state) {
87
+ this.__formLifecycleProvider?.().restore(state);
58
88
  }
59
89
  }
60
- return t;
90
+ return FormAssociatedElement;
61
91
  }
62
- var i = class {
63
- constructor(e, t) {
64
- this.host = e, this.lifecycle = t, e.addController(this), e.__formLifecycleProvider = () => t;
92
+ /** 把表单生命周期插件接入宿主(回调接线经 FormAssociated mixin,无需共享基类)。 */
93
+ var FormAssociationController = class {
94
+ constructor(host, lifecycle) {
95
+ this.host = host;
96
+ this.lifecycle = lifecycle;
97
+ host.addController(this);
98
+ host.__formLifecycleProvider = () => lifecycle;
65
99
  }
66
100
  hostConnected() {
67
101
  this.lifecycle.connect();
@@ -70,7 +104,6 @@ var i = class {
70
104
  this.lifecycle.sync();
71
105
  }
72
106
  };
73
- //#endregion
74
- export { r as FormAssociated, i as FormAssociationController, n as defineFormAssociation, t as forwardInputValidity };
107
+ export { FormAssociated, FormAssociationController, defineFormAssociation, forwardInputValidity };
75
108
 
76
109
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/form-association/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\n// Lit 官方 mixin 签名需要构造器接受任意参数(paramCount 各异的子类构造器都要能赋给\n// 基座);never[] 变体在 extends 链上会丢失 Lit 静态侧类型。any 收敛在这个类型别名内。\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = object> = new (...args: any[]) => T\n\ntype FormSubmissionValue = File | FormData | string | null\ntype FormStateValue = File | FormData | string | null\n\ninterface FormAssociationHost extends HTMLElement, ReactiveControllerHost {\n /** Lit 的更新窗口判据:反射属性触发的回调落在本轮 performUpdate 之内时为 true。 */\n isUpdatePending: boolean\n}\n\nexport interface FormAssociationOptions<State> {\n readonly host: FormAssociationHost\n readonly initialize?: () => void\n readonly getState: () => State\n readonly setState: (state: State) => void\n readonly copyState?: (state: State) => State\n readonly getFormValue: () => FormSubmissionValue\n readonly getFormState: () => FormStateValue\n readonly restoreState: (state: FormStateValue) => void\n readonly isStateManaged?: () => boolean\n readonly syncValidity?: (internals: ElementInternals) => void\n}\n\nexport interface FormAssociationLifecycle {\n connect(): void\n sync(): void\n reset(): void\n restore(state: FormStateValue): void\n setDisabled(disabled: boolean): void\n isFormDisabled(): boolean\n getInternals(): ElementInternals | undefined\n}\n\n/**\n * 把原生 input 的 ValidityState 转发为 ElementInternals 的校验状态。\n * flagNames 是控件自己声明的校验契约(input 转发文本类 5 项、input-number\n * 转发范围类 4 项),这里只收敛 guard / valid 判定 / setValidity 接线。\n * disabled 元素被约束验证豁免,必须上报干净状态;isDisabled 传入控件的\n * 组合禁用态(含 formDisabled),因为 formDisabledCallback 触发时原生\n * input 的 disabled 属性可能尚未重渲染,不能依赖 input.validity.valid。\n */\nexport function forwardInputValidity(\n internals: ElementInternals,\n input: HTMLInputElement | HTMLTextAreaElement,\n flagNames: readonly (keyof ValidityStateFlags)[],\n isDisabled = false\n): void {\n if (typeof internals.setValidity !== 'function') return\n if (isDisabled || input.validity.valid) {\n internals.setValidity({})\n return\n }\n const flags: ValidityStateFlags = {}\n for (const name of flagNames) {\n if (input.validity[name]) flags[name] = true\n }\n internals.setValidity(flags, input.validationMessage, input)\n}\n\n/**\n * 承接原生 custom element 表单生命周期,值序列化与校验语义仍由各控件组件自己表达。\n */\nexport function defineFormAssociation<State>(options: FormAssociationOptions<State>) {\n return definePlugin((): FormAssociationLifecycle => {\n let internals: ElementInternals | undefined\n let initialState: State | undefined\n let initialized = false\n let formDisabled = false\n const copyState = options.copyState ?? (state => state)\n\n const sync = () => {\n if (!internals) return\n internals.setFormValue?.(options.getFormValue(), options.getFormState())\n options.syncValidity?.(internals)\n }\n\n return {\n connect() {\n if (!internals) internals = options.host.attachInternals()\n if (!initialized) {\n options.initialize?.()\n initialState = copyState(options.getState())\n initialized = true\n }\n sync()\n },\n sync,\n reset() {\n if (!initialized || options.isStateManaged?.()) return\n options.setState(copyState(initialState as State))\n sync()\n },\n restore(state) {\n if (options.isStateManaged?.()) return\n options.restoreState(state)\n sync()\n },\n setDisabled(disabled) {\n if (formDisabled === disabled) return\n formDisabled = disabled\n sync()\n if (options.host.isUpdatePending) {\n /*\n * 宿主 disabled 的反射会同步触发 formDisabledCallback,那一轮 render 已经读过旧值;\n * 而 Lit 在 isUpdatePending 为 true 时会丢掉 requestUpdate()(reactive-element 2.1.2\n * 的 requestUpdate 尾部判据),控件就会停在旧禁用态且再无渲染。等本轮更新结束再排一次。\n */\n queueMicrotask(() => {\n options.host.requestUpdate()\n sync()\n })\n return\n }\n options.host.requestUpdate()\n },\n isFormDisabled: () => formDisabled,\n getInternals: () => internals\n }\n })\n}\n\n/**\n * 表单关联元素 mixin:安装 `formAssociated` 与三个生命周期回调。\n *\n * 生命周期实现仍由 defineFormAssociation 表达;FormAssociationController\n * 在构造时把 lifecycle 注册到实例的 provider,回调经它转发。组件可继续\n * 覆写单个回调注入自己的额外逻辑(如 autocomplete 的禁用收口)。\n * 这是字段组合(mixin),不是共享基类:除回调接线外不继承任何实现。\n */\nexport interface FormAssociatedLifecycleProvider {\n __formLifecycleProvider?: () => FormAssociationLifecycle\n}\n\nexport function FormAssociated<T extends Constructor<HTMLElement>>(superClass: T) {\n class FormAssociatedElement extends superClass {\n static formAssociated = true\n\n formResetCallback(): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().reset()\n }\n\n formDisabledCallback(disabled: boolean): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().setDisabled(disabled)\n }\n\n formStateRestoreCallback(state: File | FormData | string | null): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().restore(state)\n }\n }\n return FormAssociatedElement\n}\n\n/** 把表单生命周期插件接入宿主(回调接线经 FormAssociated mixin,无需共享基类)。 */\nexport class FormAssociationController implements ReactiveController {\n constructor(\n private readonly host: FormAssociationHost,\n private readonly lifecycle: FormAssociationLifecycle\n ) {\n host.addController(this)\n ;(host as FormAssociationHost & FormAssociatedLifecycleProvider).__formLifecycleProvider = () => lifecycle\n }\n\n hostConnected() {\n this.lifecycle.connect()\n }\n\n hostUpdated() {\n this.lifecycle.sync()\n }\n}\n"],"mappings":";;AA+CA,SAAgB,EACd,GACA,GACA,GACA,IAAa,IACP;CACN,IAAI,OAAO,EAAU,eAAgB,YAAY;CACjD,IAAI,KAAc,EAAM,SAAS,OAAO;EACtC,EAAU,YAAY,CAAC,CAAC;EACxB;CACF;CACA,IAAM,IAA4B,CAAC;CACnC,KAAK,IAAM,KAAQ,GACjB,AAAI,EAAM,SAAS,OAAO,EAAM,KAAQ;CAE1C,EAAU,YAAY,GAAO,EAAM,mBAAmB,CAAK;AAC7D;AAKA,SAAgB,EAA6B,GAAwC;CACnF,OAAO,QAA6C;EAClD,IAAI,GACA,GACA,IAAc,IACd,IAAe,IACb,IAAY,EAAQ,eAAc,MAAS,IAE3C,UAAa;GACZ,MACL,EAAU,eAAe,EAAQ,aAAa,GAAG,EAAQ,aAAa,CAAC,GACvE,EAAQ,eAAe,CAAS;EAClC;EAEA,OAAO;GACL,UAAU;IAOR,AANA,AAAgB,MAAY,EAAQ,KAAK,gBAAgB,GACzD,AAGE,OAFA,EAAQ,aAAa,GACrB,IAAe,EAAU,EAAQ,SAAS,CAAC,GAC7B,KAEhB,EAAK;GACP;GACA;GACA,QAAQ;IACF,AAAC,KAAe,GAAQ,iBAAiB,MAC7C,EAAQ,SAAS,EAAU,CAAqB,CAAC,GACjD,EAAK;GACP;GACA,QAAQ,GAAO;IACT,EAAQ,iBAAiB,MAC7B,EAAQ,aAAa,CAAK,GAC1B,EAAK;GACP;GACA,YAAY,GAAU;IAChB,UAAiB,GAGrB;SAFA,IAAe,GACf,EAAK,GACD,EAAQ,KAAK,iBAAiB;MAMhC,qBAAqB;OAEnB,AADA,EAAQ,KAAK,cAAc,GAC3B,EAAK;MACP,CAAC;MACD;KACF;KACA,EAAQ,KAAK,cAAc;IAD3B;GAEF;GACA,sBAAsB;GACtB,oBAAoB;EACtB;CACF,CAAC;AACH;AAcA,SAAgB,EAAmD,GAAe;CAChF,MAAM,UAA8B,EAAW;;GACrB,KAAA,iBAAA;;EAExB,oBAA0B;GACvB,KAA0C,0BAA0B,CAAC,CAAC,MAAM;EAC/E;EAEA,qBAAqB,GAAyB;GAC3C,KAA0C,0BAA0B,CAAC,CAAC,YAAY,CAAQ;EAC7F;EAEA,yBAAyB,GAA8C;GACpE,KAA0C,0BAA0B,CAAC,CAAC,QAAQ,CAAK;EACtF;CACF;CACA,OAAO;AACT;AAGA,IAAa,IAAb,MAAqE;CACnE,YACE,GACA,GACA;EAEC,AAJgB,KAAA,OAAA,GACA,KAAA,YAAA,GAEjB,EAAK,cAAc,IAAI,GACtB,EAAgE,gCAAgC;CACnG;CAEA,gBAAgB;EACd,KAAK,UAAU,QAAQ;CACzB;CAEA,cAAc;EACZ,KAAK,UAAU,KAAK;CACtB;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/form-association/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\n// Lit 官方 mixin 签名需要构造器接受任意参数(paramCount 各异的子类构造器都要能赋给\n// 基座);never[] 变体在 extends 链上会丢失 Lit 静态侧类型。any 收敛在这个类型别名内。\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = object> = new (...args: any[]) => T\n\ntype FormSubmissionValue = File | FormData | string | null\ntype FormStateValue = File | FormData | string | null\n\ninterface FormAssociationHost extends HTMLElement, ReactiveControllerHost {\n /** Lit 的更新窗口判据:反射属性触发的回调落在本轮 performUpdate 之内时为 true。 */\n isUpdatePending: boolean\n}\n\nexport interface FormAssociationOptions<State> {\n readonly host: FormAssociationHost\n readonly initialize?: () => void\n readonly getState: () => State\n readonly setState: (state: State) => void\n readonly copyState?: (state: State) => State\n readonly getFormValue: () => FormSubmissionValue\n readonly getFormState: () => FormStateValue\n readonly restoreState: (state: FormStateValue) => void\n readonly isStateManaged?: () => boolean\n readonly syncValidity?: (internals: ElementInternals) => void\n}\n\nexport interface FormAssociationLifecycle {\n connect(): void\n sync(): void\n reset(): void\n restore(state: FormStateValue): void\n setDisabled(disabled: boolean): void\n isFormDisabled(): boolean\n getInternals(): ElementInternals | undefined\n}\n\n/**\n * 把原生 input 的 ValidityState 转发为 ElementInternals 的校验状态。\n * flagNames 是控件自己声明的校验契约(input 转发文本类 5 项、input-number\n * 转发范围类 4 项),这里只收敛 guard / valid 判定 / setValidity 接线。\n * disabled 元素被约束验证豁免,必须上报干净状态;isDisabled 传入控件的\n * 组合禁用态(含 formDisabled),因为 formDisabledCallback 触发时原生\n * input 的 disabled 属性可能尚未重渲染,不能依赖 input.validity.valid。\n */\nexport function forwardInputValidity(\n internals: ElementInternals,\n input: HTMLInputElement | HTMLTextAreaElement,\n flagNames: readonly (keyof ValidityStateFlags)[],\n isDisabled = false\n): void {\n if (typeof internals.setValidity !== 'function') return\n if (isDisabled || input.validity.valid) {\n internals.setValidity({})\n return\n }\n const flags: ValidityStateFlags = {}\n for (const name of flagNames) {\n if (input.validity[name]) flags[name] = true\n }\n internals.setValidity(flags, input.validationMessage, input)\n}\n\n/**\n * 承接原生 custom element 表单生命周期,值序列化与校验语义仍由各控件组件自己表达。\n */\nexport function defineFormAssociation<State>(options: FormAssociationOptions<State>) {\n return definePlugin((): FormAssociationLifecycle => {\n let internals: ElementInternals | undefined\n let initialState: State | undefined\n let initialized = false\n let formDisabled = false\n const copyState = options.copyState ?? (state => state)\n\n const sync = () => {\n if (!internals) return\n internals.setFormValue?.(options.getFormValue(), options.getFormState())\n options.syncValidity?.(internals)\n }\n\n return {\n connect() {\n if (!internals) internals = options.host.attachInternals()\n if (!initialized) {\n options.initialize?.()\n initialState = copyState(options.getState())\n initialized = true\n }\n sync()\n },\n sync,\n reset() {\n if (!initialized || options.isStateManaged?.()) return\n options.setState(copyState(initialState as State))\n sync()\n },\n restore(state) {\n if (options.isStateManaged?.()) return\n options.restoreState(state)\n sync()\n },\n setDisabled(disabled) {\n if (formDisabled === disabled) return\n formDisabled = disabled\n sync()\n if (options.host.isUpdatePending) {\n /*\n * 宿主 disabled 的反射会同步触发 formDisabledCallback,那一轮 render 已经读过旧值;\n * 而 Lit 在 isUpdatePending 为 true 时会丢掉 requestUpdate()(reactive-element 2.1.2\n * 的 requestUpdate 尾部判据),控件就会停在旧禁用态且再无渲染。等本轮更新结束再排一次。\n */\n queueMicrotask(() => {\n options.host.requestUpdate()\n sync()\n })\n return\n }\n options.host.requestUpdate()\n },\n isFormDisabled: () => formDisabled,\n getInternals: () => internals\n }\n })\n}\n\n/**\n * 表单关联元素 mixin:安装 `formAssociated` 与三个生命周期回调。\n *\n * 生命周期实现仍由 defineFormAssociation 表达;FormAssociationController\n * 在构造时把 lifecycle 注册到实例的 provider,回调经它转发。组件可继续\n * 覆写单个回调注入自己的额外逻辑(如 autocomplete 的禁用收口)。\n * 这是字段组合(mixin),不是共享基类:除回调接线外不继承任何实现。\n */\nexport interface FormAssociatedLifecycleProvider {\n __formLifecycleProvider?: () => FormAssociationLifecycle\n}\n\nexport function FormAssociated<T extends Constructor<HTMLElement>>(superClass: T) {\n class FormAssociatedElement extends superClass {\n static formAssociated = true\n\n formResetCallback(): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().reset()\n }\n\n formDisabledCallback(disabled: boolean): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().setDisabled(disabled)\n }\n\n formStateRestoreCallback(state: File | FormData | string | null): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().restore(state)\n }\n }\n return FormAssociatedElement\n}\n\n/** 把表单生命周期插件接入宿主(回调接线经 FormAssociated mixin,无需共享基类)。 */\nexport class FormAssociationController implements ReactiveController {\n constructor(\n private readonly host: FormAssociationHost,\n private readonly lifecycle: FormAssociationLifecycle\n ) {\n host.addController(this)\n ;(host as FormAssociationHost & FormAssociatedLifecycleProvider).__formLifecycleProvider = () => lifecycle\n }\n\n hostConnected() {\n this.lifecycle.connect()\n }\n\n hostUpdated() {\n this.lifecycle.sync()\n }\n}\n"],"mappings":";;;;;;;;;;AA+CA,SAAgB,qBACd,WACA,OACA,WACA,aAAa,OACP;CACN,IAAI,OAAO,UAAU,gBAAgB,YAAY;CACjD,IAAI,cAAc,MAAM,SAAS,OAAO;EACtC,UAAU,YAAY,CAAC,CAAC;EACxB;CACF;CACA,MAAM,QAA4B,CAAC;CACnC,KAAK,MAAM,QAAQ,WACjB,IAAI,MAAM,SAAS,OAAO,MAAM,QAAQ;CAE1C,UAAU,YAAY,OAAO,MAAM,mBAAmB,KAAK;AAC7D;;;;AAKA,SAAgB,sBAA6B,SAAwC;CACnF,OAAO,mBAA6C;EAClD,IAAI;EACJ,IAAI;EACJ,IAAI,cAAc;EAClB,IAAI,eAAe;EACnB,MAAM,YAAY,QAAQ,eAAc,UAAS;EAEjD,MAAM,aAAa;GACjB,IAAI,CAAC,WAAW;GAChB,UAAU,eAAe,QAAQ,aAAa,GAAG,QAAQ,aAAa,CAAC;GACvE,QAAQ,eAAe,SAAS;EAClC;EAEA,OAAO;GACL,UAAU;IACR,IAAI,CAAC,WAAW,YAAY,QAAQ,KAAK,gBAAgB;IACzD,IAAI,CAAC,aAAa;KAChB,QAAQ,aAAa;KACrB,eAAe,UAAU,QAAQ,SAAS,CAAC;KAC3C,cAAc;IAChB;IACA,KAAK;GACP;GACA;GACA,QAAQ;IACN,IAAI,CAAC,eAAe,QAAQ,iBAAiB,GAAG;IAChD,QAAQ,SAAS,UAAU,YAAqB,CAAC;IACjD,KAAK;GACP;GACA,QAAQ,OAAO;IACb,IAAI,QAAQ,iBAAiB,GAAG;IAChC,QAAQ,aAAa,KAAK;IAC1B,KAAK;GACP;GACA,YAAY,UAAU;IACpB,IAAI,iBAAiB,UAAU;IAC/B,eAAe;IACf,KAAK;IACL,IAAI,QAAQ,KAAK,iBAAiB;KAMhC,qBAAqB;MACnB,QAAQ,KAAK,cAAc;MAC3B,KAAK;KACP,CAAC;KACD;IACF;IACA,QAAQ,KAAK,cAAc;GAC7B;GACA,sBAAsB;GACtB,oBAAoB;EACtB;CACF,CAAC;AACH;AAcA,SAAgB,eAAmD,YAAe;CAChF,MAAM,8BAA8B,WAAW;;GACrB,KAAA,iBAAA;;EAExB,oBAA0B;GACvB,KAA0C,0BAA0B,CAAC,CAAC,MAAM;EAC/E;EAEA,qBAAqB,UAAyB;GAC3C,KAA0C,0BAA0B,CAAC,CAAC,YAAY,QAAQ;EAC7F;EAEA,yBAAyB,OAA8C;GACpE,KAA0C,0BAA0B,CAAC,CAAC,QAAQ,KAAK;EACtF;CACF;CACA,OAAO;AACT;;AAGA,IAAa,4BAAb,MAAqE;CACnE,YACE,MACA,WACA;EAFiB,KAAA,OAAA;EACA,KAAA,YAAA;EAEjB,KAAK,cAAc,IAAI;EACtB,KAAgE,gCAAgC;CACnG;CAEA,gBAAgB;EACd,KAAK,UAAU,QAAQ;CACzB;CAEA,cAAc;EACZ,KAAK,UAAU,KAAK;CACtB;AACF"}