@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,27 +1,30 @@
1
- //#region src/shared/overlay/theme-overlay-scope.ts
2
- function e(e) {
3
- if (e.parentElement) return e.parentElement;
4
- let t = e.getRootNode();
5
- return t instanceof ShadowRoot ? t.host : null;
1
+ // src/shared/overlay/theme-overlay-scope.ts
2
+ /**
3
+ * Resolves the web-ui-theme element that owns the nearest scoped overlay root.
4
+ * Theme remains a public component; this module is overlay plumbing only.
5
+ */
6
+ function getParentElement(element) {
7
+ if (element.parentElement) return element.parentElement;
8
+ const root = element.getRootNode();
9
+ return root instanceof ShadowRoot ? root.host : null;
6
10
  }
7
- function t(t) {
8
- let n = t;
9
- for (; n;) {
10
- if (n instanceof HTMLElement && n.tagName === "WEB-UI-THEME") {
11
- let e = n;
12
- if (e.getOverlayRoot()) return e;
11
+ function findNearestTheme(element) {
12
+ let current = element;
13
+ while (current) {
14
+ if (current instanceof HTMLElement && current.tagName === "WEB-UI-THEME") {
15
+ const theme = current;
16
+ if (theme.getOverlayRoot()) return theme;
13
17
  }
14
- n = e(n);
18
+ current = getParentElement(current);
15
19
  }
16
20
  }
17
- function n() {
18
- return Array.from(document.querySelectorAll("web-ui-theme")).find((n) => {
19
- if (!n.getOverlayRoot()) return !1;
20
- let r = e(n);
21
- return !r || !t(r);
21
+ function findRootTheme() {
22
+ return Array.from(document.querySelectorAll("web-ui-theme")).find((theme) => {
23
+ if (!theme.getOverlayRoot()) return false;
24
+ const parent = getParentElement(theme);
25
+ return !parent || !findNearestTheme(parent);
22
26
  });
23
27
  }
24
- //#endregion
25
- export { t as findNearestTheme, n as findRootTheme };
28
+ export { findNearestTheme, findRootTheme };
26
29
 
27
30
  //# sourceMappingURL=theme-overlay-scope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-overlay-scope.js","names":[],"sources":["../../../src/shared/overlay/theme-overlay-scope.ts"],"sourcesContent":["import type { WebUiTheme } from '@/components/theme'\n\n/**\n * Resolves the web-ui-theme element that owns the nearest scoped overlay root.\n * Theme remains a public component; this module is overlay plumbing only.\n */\nfunction getParentElement(element: Element): Element | null {\n if (element.parentElement) return element.parentElement\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root.host : null\n}\n\nexport function findNearestTheme(element: Element): WebUiTheme | undefined {\n let current: Element | null = element\n while (current) {\n if (current instanceof HTMLElement && current.tagName === 'WEB-UI-THEME') {\n const theme = current as WebUiTheme\n if (theme.getOverlayRoot()) return theme\n }\n current = getParentElement(current)\n }\n return undefined\n}\n\nexport function findRootTheme(): WebUiTheme | undefined {\n return Array.from(document.querySelectorAll<WebUiTheme>('web-ui-theme')).find(theme => {\n if (!theme.getOverlayRoot()) return false\n const parent = getParentElement(theme)\n return !parent || !findNearestTheme(parent)\n })\n}\n"],"mappings":";AAMA,SAAS,EAAiB,GAAkC;CAC1D,IAAI,EAAQ,eAAe,OAAO,EAAQ;CAC1C,IAAM,IAAO,EAAQ,YAAY;CACjC,OAAO,aAAgB,aAAa,EAAK,OAAO;AAClD;AAEA,SAAgB,EAAiB,GAA0C;CACzE,IAAI,IAA0B;CAC9B,OAAO,IAAS;EACd,IAAI,aAAmB,eAAe,EAAQ,YAAY,gBAAgB;GACxE,IAAM,IAAQ;GACd,IAAI,EAAM,eAAe,GAAG,OAAO;EACrC;EACA,IAAU,EAAiB,CAAO;CACpC;AAEF;AAEA,SAAgB,IAAwC;CACtD,OAAO,MAAM,KAAK,SAAS,iBAA6B,cAAc,CAAC,CAAC,CAAC,MAAK,MAAS;EACrF,IAAI,CAAC,EAAM,eAAe,GAAG,OAAO;EACpC,IAAM,IAAS,EAAiB,CAAK;EACrC,OAAO,CAAC,KAAU,CAAC,EAAiB,CAAM;CAC5C,CAAC;AACH"}
1
+ {"version":3,"file":"theme-overlay-scope.js","names":[],"sources":["../../../src/shared/overlay/theme-overlay-scope.ts"],"sourcesContent":["import type { WebUiTheme } from '@/components/theme'\n\n/**\n * Resolves the web-ui-theme element that owns the nearest scoped overlay root.\n * Theme remains a public component; this module is overlay plumbing only.\n */\nfunction getParentElement(element: Element): Element | null {\n if (element.parentElement) return element.parentElement\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root.host : null\n}\n\nexport function findNearestTheme(element: Element): WebUiTheme | undefined {\n let current: Element | null = element\n while (current) {\n if (current instanceof HTMLElement && current.tagName === 'WEB-UI-THEME') {\n const theme = current as WebUiTheme\n if (theme.getOverlayRoot()) return theme\n }\n current = getParentElement(current)\n }\n return undefined\n}\n\nexport function findRootTheme(): WebUiTheme | undefined {\n return Array.from(document.querySelectorAll<WebUiTheme>('web-ui-theme')).find(theme => {\n if (!theme.getOverlayRoot()) return false\n const parent = getParentElement(theme)\n return !parent || !findNearestTheme(parent)\n })\n}\n"],"mappings":";;;;;AAMA,SAAS,iBAAiB,SAAkC;CAC1D,IAAI,QAAQ,eAAe,OAAO,QAAQ;CAC1C,MAAM,OAAO,QAAQ,YAAY;CACjC,OAAO,gBAAgB,aAAa,KAAK,OAAO;AAClD;AAEA,SAAgB,iBAAiB,SAA0C;CACzE,IAAI,UAA0B;CAC9B,OAAO,SAAS;EACd,IAAI,mBAAmB,eAAe,QAAQ,YAAY,gBAAgB;GACxE,MAAM,QAAQ;GACd,IAAI,MAAM,eAAe,GAAG,OAAO;EACrC;EACA,UAAU,iBAAiB,OAAO;CACpC;AAEF;AAEA,SAAgB,gBAAwC;CACtD,OAAO,MAAM,KAAK,SAAS,iBAA6B,cAAc,CAAC,CAAC,CAAC,MAAK,UAAS;EACrF,IAAI,CAAC,MAAM,eAAe,GAAG,OAAO;EACpC,MAAM,SAAS,iBAAiB,KAAK;EACrC,OAAO,CAAC,UAAU,CAAC,iBAAiB,MAAM;CAC5C,CAAC;AACH"}
@@ -1,27 +1,61 @@
1
- import { definePlugin as e } from "@greypan/js-kit";
2
- //#region src/shared/scroll-lock/scroll-lock.ts
3
- var t = 0, n = "", r = "";
4
- function i() {
5
- t === 0 && (n = document.documentElement.style.overflow, r = document.documentElement.style.overscrollBehavior, document.documentElement.style.overflow = "hidden", document.documentElement.style.overscrollBehavior = "none"), t++;
1
+ import { definePlugin } from "@greypan/js-kit";
2
+ // src/shared/scroll-lock/scroll-lock.ts
3
+ let lockCount = 0;
4
+ let savedOverflow = "";
5
+ let savedOverscroll = "";
6
+ /**
7
+ * 锁定页面滚动。支持嵌套调用(引用计数),仅在最后一个锁释放时恢复。
8
+ *
9
+ * 只改 `documentElement` 的 `overflow` 和 `overscroll-behavior`,body 始终留在文档流内。
10
+ * 改用 `body { position: fixed }` + `top: -scrollY` 会让 body 脱离文档流:
11
+ * `documentElement.scrollHeight` 随之塌缩、`window.scrollY` 被归零,
12
+ * 按窗口偏移定位的虚拟列表因此渲染出第 0 行却仍带旧的 `top` 偏移,表现为整屏空白。
13
+ *
14
+ * 阻止滚动本身(`overflow`)与抑制橡皮筋/下拉刷新(`overscroll-behavior`)是两件事:
15
+ * 拆成两个根元素属性分别覆盖。macOS 已实测
16
+ * `overscroll-behavior: none` 有效;iOS 侧尚无真机证据,属待验收项。
17
+ */
18
+ function lockScroll() {
19
+ if (lockCount === 0) {
20
+ savedOverflow = document.documentElement.style.overflow;
21
+ savedOverscroll = document.documentElement.style.overscrollBehavior;
22
+ document.documentElement.style.overflow = "hidden";
23
+ document.documentElement.style.overscrollBehavior = "none";
24
+ }
25
+ lockCount++;
6
26
  }
7
- function a() {
8
- t = Math.max(0, t - 1), t === 0 && (document.documentElement.style.overflow = n, document.documentElement.style.overscrollBehavior = r);
27
+ /**
28
+ * 解锁页面滚动。与 lockScroll 配对,引用归零时恢复。
29
+ */
30
+ function unlockScroll() {
31
+ lockCount = Math.max(0, lockCount - 1);
32
+ if (lockCount === 0) {
33
+ document.documentElement.style.overflow = savedOverflow;
34
+ document.documentElement.style.overscrollBehavior = savedOverscroll;
35
+ }
9
36
  }
10
- var o = () => e(() => {
11
- let e = !1, t = (t) => {
12
- t !== e && (t ? i() : a(), e = t);
37
+ /**
38
+ * 构建组件实例持有的滚动锁租约。每个租约仅释放自身获得的那一次锁,
39
+ * 因此卸载、属性切换和嵌套 overlay 不会互相影响。
40
+ */
41
+ const defineScrollLockLease = () => definePlugin(() => {
42
+ let isLocked = false;
43
+ const sync = (shouldLock) => {
44
+ if (shouldLock === isLocked) return;
45
+ if (shouldLock) lockScroll();
46
+ else unlockScroll();
47
+ isLocked = shouldLock;
13
48
  };
14
49
  return {
15
50
  get isLocked() {
16
- return e;
51
+ return isLocked;
17
52
  },
18
- sync: t,
53
+ sync,
19
54
  release() {
20
- t(!1);
55
+ sync(false);
21
56
  }
22
57
  };
23
58
  });
24
- //#endregion
25
- export { o as defineScrollLockLease, i as lockScroll, a as unlockScroll };
59
+ export { defineScrollLockLease, lockScroll, unlockScroll };
26
60
 
27
61
  //# sourceMappingURL=scroll-lock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-lock.js","names":[],"sources":["../../../src/shared/scroll-lock/scroll-lock.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nlet lockCount = 0\nlet savedOverflow = ''\nlet savedOverscroll = ''\n\nexport interface ScrollLockLease {\n readonly isLocked: boolean\n sync(shouldLock: boolean): void\n release(): void\n}\n\n/**\n * 锁定页面滚动。支持嵌套调用(引用计数),仅在最后一个锁释放时恢复。\n *\n * 只改 `documentElement` 的 `overflow` 和 `overscroll-behavior`,body 始终留在文档流内。\n * 改用 `body { position: fixed }` + `top: -scrollY` 会让 body 脱离文档流:\n * `documentElement.scrollHeight` 随之塌缩、`window.scrollY` 被归零,\n * 按窗口偏移定位的虚拟列表因此渲染出第 0 行却仍带旧的 `top` 偏移,表现为整屏空白。\n *\n * 阻止滚动本身(`overflow`)与抑制橡皮筋/下拉刷新(`overscroll-behavior`)是两件事:\n * 旧实现用 fixed body 同时覆盖两者,现在拆成两个根元素属性。macOS 已实测\n * `overscroll-behavior: none` 有效;iOS 侧尚无真机证据,属待验收项。\n */\nexport function lockScroll() {\n if (lockCount === 0) {\n savedOverflow = document.documentElement.style.overflow\n savedOverscroll = document.documentElement.style.overscrollBehavior\n document.documentElement.style.overflow = 'hidden'\n document.documentElement.style.overscrollBehavior = 'none'\n }\n lockCount++\n}\n\n/**\n * 解锁页面滚动。与 lockScroll 配对,引用归零时恢复。\n */\nexport function unlockScroll() {\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount === 0) {\n document.documentElement.style.overflow = savedOverflow\n document.documentElement.style.overscrollBehavior = savedOverscroll\n }\n}\n\n/**\n * 构建组件实例持有的滚动锁租约。每个租约仅释放自身获得的那一次锁,\n * 因此卸载、属性切换和嵌套 overlay 不会互相影响。\n */\nexport const defineScrollLockLease = () =>\n definePlugin<ScrollLockLease, Record<never, never>>(() => {\n let isLocked = false\n\n const sync = (shouldLock: boolean) => {\n if (shouldLock === isLocked) return\n if (shouldLock) lockScroll()\n else unlockScroll()\n isLocked = shouldLock\n }\n\n return {\n get isLocked() {\n return isLocked\n },\n\n sync,\n\n release() {\n sync(false)\n }\n }\n })\n"],"mappings":";;AAEA,IAAI,IAAY,GACZ,IAAgB,IAChB,IAAkB;AAoBtB,SAAgB,IAAa;CAO3B,AANI,MAAc,MAChB,IAAgB,SAAS,gBAAgB,MAAM,UAC/C,IAAkB,SAAS,gBAAgB,MAAM,oBACjD,SAAS,gBAAgB,MAAM,WAAW,UAC1C,SAAS,gBAAgB,MAAM,qBAAqB,SAEtD;AACF;AAKA,SAAgB,IAAe;CAE7B,AADA,IAAY,KAAK,IAAI,GAAG,IAAY,CAAC,GACjC,MAAc,MAChB,SAAS,gBAAgB,MAAM,WAAW,GAC1C,SAAS,gBAAgB,MAAM,qBAAqB;AAExD;AAMA,IAAa,UACX,QAA0D;CACxD,IAAI,IAAW,IAET,KAAQ,MAAwB;EAChC,MAAe,MACf,IAAY,EAAW,IACtB,EAAa,GAClB,IAAW;CACb;CAEA,OAAO;EACL,IAAI,WAAW;GACb,OAAO;EACT;EAEA;EAEA,UAAU;GACR,EAAK,EAAK;EACZ;CACF;AACF,CAAC"}
1
+ {"version":3,"file":"scroll-lock.js","names":[],"sources":["../../../src/shared/scroll-lock/scroll-lock.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nlet lockCount = 0\nlet savedOverflow = ''\nlet savedOverscroll = ''\n\nexport interface ScrollLockLease {\n readonly isLocked: boolean\n sync(shouldLock: boolean): void\n release(): void\n}\n\n/**\n * 锁定页面滚动。支持嵌套调用(引用计数),仅在最后一个锁释放时恢复。\n *\n * 只改 `documentElement` 的 `overflow` 和 `overscroll-behavior`,body 始终留在文档流内。\n * 改用 `body { position: fixed }` + `top: -scrollY` 会让 body 脱离文档流:\n * `documentElement.scrollHeight` 随之塌缩、`window.scrollY` 被归零,\n * 按窗口偏移定位的虚拟列表因此渲染出第 0 行却仍带旧的 `top` 偏移,表现为整屏空白。\n *\n * 阻止滚动本身(`overflow`)与抑制橡皮筋/下拉刷新(`overscroll-behavior`)是两件事:\n * 拆成两个根元素属性分别覆盖。macOS 已实测\n * `overscroll-behavior: none` 有效;iOS 侧尚无真机证据,属待验收项。\n */\nexport function lockScroll() {\n if (lockCount === 0) {\n savedOverflow = document.documentElement.style.overflow\n savedOverscroll = document.documentElement.style.overscrollBehavior\n document.documentElement.style.overflow = 'hidden'\n document.documentElement.style.overscrollBehavior = 'none'\n }\n lockCount++\n}\n\n/**\n * 解锁页面滚动。与 lockScroll 配对,引用归零时恢复。\n */\nexport function unlockScroll() {\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount === 0) {\n document.documentElement.style.overflow = savedOverflow\n document.documentElement.style.overscrollBehavior = savedOverscroll\n }\n}\n\n/**\n * 构建组件实例持有的滚动锁租约。每个租约仅释放自身获得的那一次锁,\n * 因此卸载、属性切换和嵌套 overlay 不会互相影响。\n */\nexport const defineScrollLockLease = () =>\n definePlugin<ScrollLockLease, Record<never, never>>(() => {\n let isLocked = false\n\n const sync = (shouldLock: boolean) => {\n if (shouldLock === isLocked) return\n if (shouldLock) lockScroll()\n else unlockScroll()\n isLocked = shouldLock\n }\n\n return {\n get isLocked() {\n return isLocked\n },\n\n sync,\n\n release() {\n sync(false)\n }\n }\n })\n"],"mappings":";;AAEA,IAAI,YAAY;AAChB,IAAI,gBAAgB;AACpB,IAAI,kBAAkB;;;;;;;;;;;;;AAoBtB,SAAgB,aAAa;CAC3B,IAAI,cAAc,GAAG;EACnB,gBAAgB,SAAS,gBAAgB,MAAM;EAC/C,kBAAkB,SAAS,gBAAgB,MAAM;EACjD,SAAS,gBAAgB,MAAM,WAAW;EAC1C,SAAS,gBAAgB,MAAM,qBAAqB;CACtD;CACA;AACF;;;;AAKA,SAAgB,eAAe;CAC7B,YAAY,KAAK,IAAI,GAAG,YAAY,CAAC;CACrC,IAAI,cAAc,GAAG;EACnB,SAAS,gBAAgB,MAAM,WAAW;EAC1C,SAAS,gBAAgB,MAAM,qBAAqB;CACtD;AACF;;;;;AAMA,MAAa,8BACX,mBAA0D;CACxD,IAAI,WAAW;CAEf,MAAM,QAAQ,eAAwB;EACpC,IAAI,eAAe,UAAU;EAC7B,IAAI,YAAY,WAAW;OACtB,aAAa;EAClB,WAAW;CACb;CAEA,OAAO;EACL,IAAI,WAAW;GACb,OAAO;EACT;EAEA;EAEA,UAAU;GACR,KAAK,KAAK;EACZ;CACF;AACF,CAAC"}
@@ -1,9 +1,16 @@
1
- //#region src/shared/theme/duration.ts
2
- function e(e) {
3
- let t = /^\s*([+-]?(?:\d+\.?\d*|\.\d+))(ms|s)\s*$/.exec(e);
4
- return t ? Number(t[1]) * (t[2] === "s" ? 1e3 : 1) : null;
1
+ // src/shared/theme/duration.ts
2
+ /**
3
+ * 解析单个 CSS `<time>` 字面量(`160ms` / `.16s`)为毫秒;格式不符时返回 `null`。
4
+ * 只认规范写法,不做 `parseFloat` 式的宽容解析——计算样式里的时长/延迟都带单位。
5
+ *
6
+ * 兜底与钳制留各调用方决定:theme 过渡兜底 500、checkbox 描边兜底 160 且负值钳到 0、
7
+ * overlay 生命周期把逗号列表里的解析失败项当 0。
8
+ */
9
+ function parseDuration(value) {
10
+ const match = /^\s*([+-]?(?:\d+\.?\d*|\.\d+))(ms|s)\s*$/.exec(value);
11
+ if (!match) return null;
12
+ return Number(match[1]) * (match[2] === "s" ? 1e3 : 1);
5
13
  }
6
- //#endregion
7
- export { e as parseDuration };
14
+ export { parseDuration };
8
15
 
9
16
  //# sourceMappingURL=duration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"duration.js","names":[],"sources":["../../../src/shared/theme/duration.ts"],"sourcesContent":["/**\n * 解析单个 CSS `<time>` 字面量(`160ms` / `.16s`)为毫秒;格式不符时返回 `null`。\n * 只认规范写法,不做 `parseFloat` 式的宽容解析——计算样式里的时长/延迟都带单位。\n *\n * 兜底与钳制留各调用方决定:theme 过渡兜底 500、checkbox 描边兜底 160 且负值钳到 0、\n * overlay 生命周期把逗号列表里的解析失败项当 0。\n */\nexport function parseDuration(value: string): number | null {\n const match = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+))(ms|s)\\s*$/.exec(value)\n if (!match) return null\n return Number(match[1]) * (match[2] === 's' ? 1000 : 1)\n}\n"],"mappings":";AAOA,SAAgB,EAAc,GAA8B;CAC1D,IAAM,IAAQ,2CAA2C,KAAK,CAAK;CAEnE,OADK,IACE,OAAO,EAAM,EAAE,KAAK,EAAM,OAAO,MAAM,MAAO,KADlC;AAErB"}
1
+ {"version":3,"file":"duration.js","names":[],"sources":["../../../src/shared/theme/duration.ts"],"sourcesContent":["/**\n * 解析单个 CSS `<time>` 字面量(`160ms` / `.16s`)为毫秒;格式不符时返回 `null`。\n * 只认规范写法,不做 `parseFloat` 式的宽容解析——计算样式里的时长/延迟都带单位。\n *\n * 兜底与钳制留各调用方决定:theme 过渡兜底 500、checkbox 描边兜底 160 且负值钳到 0、\n * overlay 生命周期把逗号列表里的解析失败项当 0。\n */\nexport function parseDuration(value: string): number | null {\n const match = /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+))(ms|s)\\s*$/.exec(value)\n if (!match) return null\n return Number(match[1]) * (match[2] === 's' ? 1000 : 1)\n}\n"],"mappings":";;;;;;;;AAOA,SAAgB,cAAc,OAA8B;CAC1D,MAAM,QAAQ,2CAA2C,KAAK,KAAK;CACnE,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO,OAAO,MAAM,EAAE,KAAK,MAAM,OAAO,MAAM,MAAO;AACvD"}
@@ -1,15 +1,20 @@
1
- import { findNearestTheme as e } from "../overlay/theme-overlay-scope.js";
2
- //#region src/shared/theme/reduced-motion.ts
3
- function t(t) {
4
- let n = e(t);
5
- if (n) return n.isReducedMotion();
1
+ import { findNearestTheme } from "../overlay/theme-overlay-scope.js";
2
+ // src/shared/theme/reduced-motion.ts
3
+ /**
4
+ * 元素所在主题范围是否要求减少动效:优先 `web-ui-theme` 的 motion 档位,
5
+ * 无主题范围时回退系统 `prefers-reduced-motion`。jsdom 等无 matchMedia 的环境按完整动效处理。
6
+ *
7
+ * 供「CSS 时长会被主题归零、但 JS 动画要自己决定跑不跑」的调用点共用(如 WAAPI 前置判断)。
8
+ */
9
+ function prefersReducedMotion(el) {
10
+ const theme = findNearestTheme(el);
11
+ if (theme) return theme.isReducedMotion();
6
12
  try {
7
- return typeof window.matchMedia == "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
13
+ return typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
8
14
  } catch {
9
- return !1;
15
+ return false;
10
16
  }
11
17
  }
12
- //#endregion
13
- export { t as prefersReducedMotion };
18
+ export { prefersReducedMotion };
14
19
 
15
20
  //# sourceMappingURL=reduced-motion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reduced-motion.js","names":[],"sources":["../../../src/shared/theme/reduced-motion.ts"],"sourcesContent":["import { findNearestTheme } from '@/shared/overlay/theme-overlay-scope'\n\n/**\n * 元素所在主题范围是否要求减少动效:优先 `web-ui-theme` 的 motion 档位,\n * 无主题范围时回退系统 `prefers-reduced-motion`。jsdom 等无 matchMedia 的环境按完整动效处理。\n *\n * 供「CSS 时长会被主题归零、但 JS 动画要自己决定跑不跑」的调用点共用(如 WAAPI 前置判断)。\n */\nexport function prefersReducedMotion(el: Element): boolean {\n const theme = findNearestTheme(el)\n if (theme) return theme.isReducedMotion()\n try {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n}\n"],"mappings":";;AAQA,SAAgB,EAAqB,GAAsB;CACzD,IAAM,IAAQ,EAAiB,CAAE;CACjC,IAAI,GAAO,OAAO,EAAM,gBAAgB;CACxC,IAAI;EACF,OAAO,OAAO,OAAO,cAAe,cAAc,OAAO,WAAW,kCAAkC,CAAC,CAAC;CAC1G,QAAQ;EACN,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"reduced-motion.js","names":[],"sources":["../../../src/shared/theme/reduced-motion.ts"],"sourcesContent":["import { findNearestTheme } from '@/shared/overlay/theme-overlay-scope'\n\n/**\n * 元素所在主题范围是否要求减少动效:优先 `web-ui-theme` 的 motion 档位,\n * 无主题范围时回退系统 `prefers-reduced-motion`。jsdom 等无 matchMedia 的环境按完整动效处理。\n *\n * 供「CSS 时长会被主题归零、但 JS 动画要自己决定跑不跑」的调用点共用(如 WAAPI 前置判断)。\n */\nexport function prefersReducedMotion(el: Element): boolean {\n const theme = findNearestTheme(el)\n if (theme) return theme.isReducedMotion()\n try {\n return typeof window.matchMedia === 'function' && window.matchMedia('(prefers-reduced-motion: reduce)').matches\n } catch {\n return false\n }\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,qBAAqB,IAAsB;CACzD,MAAM,QAAQ,iBAAiB,EAAE;CACjC,IAAI,OAAO,OAAO,MAAM,gBAAgB;CACxC,IAAI;EACF,OAAO,OAAO,OAAO,eAAe,cAAc,OAAO,WAAW,kCAAkC,CAAC,CAAC;CAC1G,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -1,48 +1,101 @@
1
- //#region src/shared/theme/root-sync.ts
2
- var e = "--wui-color-page", t = /* @__PURE__ */ new Set(), n, r = /* @__PURE__ */ new Set();
3
- function i(e) {
4
- return t.values().next().value === e;
1
+ // src/shared/theme/root-sync.ts
2
+ /**
3
+ * 根节点 token 同步 —— 「哪一层最外层」的唯一拥有者。
4
+ *
5
+ * macOS 橡皮筋回弹露白的成因不在 body 而在画布:body 的背景只覆盖滚动范围,回弹时被扯出来的
6
+ * 那一圈用的是 documentElement 的画布背景。而 `--wui-color-page` 定义在 `<web-ui-theme>` 的
7
+ * shadow 作用域里,自定义属性的继承链到 documentElement 就断了,所以消费方写
8
+ * `body { background: var(--wui-color-page) }` 也管不到回弹区。
9
+ *
10
+ * 原生 scrollbar 同理:`<html>` 在 theme 元素之外,拿不到它 `:host` 上的
11
+ * `--wui-scrollbar-handle`。本模块把这两个 token 一起镜像到 documentElement,消费方于是可以直接
12
+ * 写 `html { scrollbar-color: var(--wui-scrollbar-handle) transparent }`。
13
+ *
14
+ * 为什么按 connect 顺序取「第一个 active 实例」,而不是去判「DOM 上最外层的那一个」:
15
+ * 组件无法可靠地回答后者——portal、shadow host 与 slot 都会让「谁包着谁」的物理关系和主题
16
+ * 作用域不一致(`WebUiTheme._findThemeAncestor()` 正是为此单独实现了跨 shadow 边界的祖先链)。
17
+ * root 值只可能有一个来源,按 connect 顺序取第一个是唯一不需要猜树形状的判据,且与用户视角
18
+ * 一致:嵌套主题总是后 connect,先进页面那个主题范围就是盖住整页的那个。
19
+ *
20
+ * 其余取舍:
21
+ *
22
+ * - 同步权在已登记实例之间按同一顺序顺延:最外层断开时下一个已连接实例接管,不查 DOM。
23
+ * 重新挂载的实例按新的一次 connect 排到队尾——队首才是当前 outermost。
24
+ * - 写入值取该实例的**计算值**,因此消费者在 host 上覆盖 `--wui-color-page`(包括在自己的
25
+ * 媒体查询里覆盖)会被原样镜像,主题与消费者的优先级关系不因此改变。
26
+ * - 全部断开时**保留最后值**:清掉属性会让 body 背景在主题卸载/重挂的间隙闪回 UA 白底,
27
+ * 而那正是本能力要消除的观感。代价是最后一个主题卸载后 documentElement 上仍留着一个自定义
28
+ * 属性;消费者自己写 body 背景时它不产生任何影响。
29
+ * - `appearance="system"` 的 token 计算值仍由组件内部 CSS 的 `prefers-color-scheme` 决定;
30
+ * root 同步与 `resolved-appearance` 输出共用同一个 MediaQueryList 监听,翻转时一次重算。
31
+ * - 登记表强引用实例,但删除路径只有组件自己的 disconnectedCallback:自定义元素反应保证移除
32
+ * 必然触发它,不存在 open-overlay 那种「panel 被 portal 搬运」需要惰性兜底回收的形状。
33
+ */
34
+ /** 需要镜像到 documentElement 的 token:页面背景与原生 scrollbar thumb。 */
35
+ const ROOT_TOKENS = ["--wui-color-page", "--wui-scrollbar-handle"];
36
+ /** 按 connect 顺序排列的已登记 active 实例;队首持有 root 同步权。 */
37
+ const registered = /* @__PURE__ */ new Set();
38
+ let schemeQuery;
39
+ const schemeSubscribers = /* @__PURE__ */ new Set();
40
+ function isRootSyncOwner(host) {
41
+ return registered.values().next().value === host;
5
42
  }
6
- function a(t) {
7
- return getComputedStyle(t).getPropertyValue(e).trim();
8
- }
9
- function o() {
10
- let n = t.values().next().value;
11
- if (!n || !n.isConnected) return;
12
- let r = a(n);
13
- if (!r) return;
14
- let i = document.documentElement.style;
15
- i.getPropertyValue(e) !== r && i.setProperty(e, r);
43
+ function syncRootTokens() {
44
+ const owner = registered.values().next().value;
45
+ if (!owner) return;
46
+ if (!owner.isConnected) return;
47
+ const computed = getComputedStyle(owner);
48
+ const style = document.documentElement.style;
49
+ for (const token of ROOT_TOKENS) {
50
+ const value = computed.getPropertyValue(token).trim();
51
+ if (!value) continue;
52
+ if (style.getPropertyValue(token) === value) continue;
53
+ style.setProperty(token, value);
54
+ }
16
55
  }
17
- function s() {
18
- o();
19
- for (let e of r) e();
56
+ function handleSchemeChange() {
57
+ syncRootTokens();
58
+ for (const subscriber of schemeSubscribers) subscriber();
20
59
  }
21
- function c() {
22
- if (t.size > 0 || r.size > 0) {
23
- if (n) return;
60
+ function syncSchemeListener() {
61
+ if (registered.size > 0 || schemeSubscribers.size > 0) {
62
+ if (schemeQuery) return;
24
63
  try {
25
- n = window.matchMedia("(prefers-color-scheme: dark)");
64
+ schemeQuery = window.matchMedia("(prefers-color-scheme: dark)");
26
65
  } catch {
27
66
  return;
28
67
  }
29
- n.addEventListener("change", s);
68
+ schemeQuery.addEventListener("change", handleSchemeChange);
30
69
  return;
31
70
  }
32
- n &&= (n.removeEventListener("change", s), void 0);
71
+ if (!schemeQuery) return;
72
+ schemeQuery.removeEventListener("change", handleSchemeChange);
73
+ schemeQuery = void 0;
33
74
  }
34
- function l(e) {
35
- return r.add(e), c(), () => {
36
- r.delete(e) && c();
75
+ function subscribeThemeSystemAppearanceChange(listener) {
76
+ schemeSubscribers.add(listener);
77
+ syncSchemeListener();
78
+ return () => {
79
+ if (!schemeSubscribers.delete(listener)) return;
80
+ syncSchemeListener();
37
81
  };
38
82
  }
39
- function u(e) {
40
- t.add(e), c(), i(e) && o();
83
+ /**
84
+ * 登记一个 active theme。幂等,组件的 connectedCallback 与 updated() 可以无条件调用:
85
+ * 已在表中的实例重复登记保留原队序,只有队首实例会刷新 root 值。
86
+ */
87
+ function registerThemeRootSync(host) {
88
+ registered.add(host);
89
+ syncSchemeListener();
90
+ if (!isRootSyncOwner(host)) return;
91
+ syncRootTokens();
41
92
  }
42
- function d(e) {
43
- t.delete(e) && (c(), o());
93
+ /** 撤销登记。移交同步权时由新的队首实例立即接管 root 值。 */
94
+ function unregisterThemeRootSync(host) {
95
+ if (!registered.delete(host)) return;
96
+ syncSchemeListener();
97
+ syncRootTokens();
44
98
  }
45
- //#endregion
46
- export { u as registerThemeRootSync, l as subscribeThemeSystemAppearanceChange, d as unregisterThemeRootSync };
99
+ export { registerThemeRootSync, subscribeThemeSystemAppearanceChange, unregisterThemeRootSync };
47
100
 
48
101
  //# sourceMappingURL=root-sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"root-sync.js","names":[],"sources":["../../../src/shared/theme/root-sync.ts"],"sourcesContent":["/**\n * 根节点 page 色同步 —— 「哪一层最外层」的唯一拥有者。\n *\n * macOS 橡皮筋回弹露白的成因不在 body 而在画布:body 的背景只覆盖滚动范围,回弹时被扯出来的\n * 那一圈用的是 documentElement 的画布背景。而 `--wui-color-page` 定义在 `<web-ui-theme>` 的\n * shadow 作用域里,自定义属性的继承链到 documentElement 就断了,所以消费方写\n * `body { background: var(--wui-color-page) }` 也管不到回弹区。\n *\n * 本模块补上这一环:最外层 active theme 把自己计算出的 `--wui-color-page` 写到 documentElement\n * 的行内自定义属性上,消费方仍然只需要那一行 body 规则。\n *\n * 为什么按 connect 顺序取「第一个 active 实例」,而不是去判「DOM 上最外层的那一个」:\n * 组件无法可靠地回答后者——portal、shadow host 与 slot 都会让「谁包着谁」的物理关系和主题\n * 作用域不一致(`WebUiTheme._findThemeAncestor()` 正是为此单独实现了跨 shadow 边界的祖先链)。\n * root 值只可能有一个来源,按 connect 顺序取第一个是唯一不需要猜树形状的判据,且与用户视角\n * 一致:嵌套主题总是后 connect,先进页面那个主题范围就是盖住整页的那个。\n *\n * 其余取舍:\n *\n * - 同步权在已登记实例之间按同一顺序顺延:最外层断开时下一个已连接实例接管,不查 DOM。\n * 重新挂载的实例按新的一次 connect 排到队尾——队首才是当前 outermost。\n * - 写入值取该实例的**计算值**,因此消费者在 host 上覆盖 `--wui-color-page`(包括在自己的\n * 媒体查询里覆盖)会被原样镜像,主题与消费者的优先级关系不因此改变。\n * - 全部断开时**保留最后值**:清掉属性会让 body 背景在主题卸载/重挂的间隙闪回 UA 白底,\n * 而那正是本能力要消除的观感。代价是最后一个主题卸载后 documentElement 上仍留着一个自定义\n * 属性;消费者自己写 body 背景时它不产生任何影响。\n * - `appearance=\"system\"` 的 token 计算值仍由组件内部 CSS 的 `prefers-color-scheme` 决定;\n * root 同步与 `resolved-appearance` 输出共用同一个 MediaQueryList 监听,翻转时一次重算。\n * - 登记表强引用实例,但删除路径只有组件自己的 disconnectedCallback:自定义元素反应保证移除\n * 必然触发它,不存在 open-overlay 那种「panel 被 portal 搬运」需要惰性兜底回收的形状。\n */\n\nconst ROOT_PAGE_TOKEN = '--wui-color-page'\n\n/** 按 connect 顺序排列的已登记 active 实例;队首持有 root 同步权。 */\nconst registered = new Set<HTMLElement>()\n\nlet schemeQuery: MediaQueryList | undefined\nconst schemeSubscribers = new Set<() => void>()\n\n/*\n * dev 期测试钩子:登记表尺寸。\n *\n * 「组件卸载后忘了撤销登记」是这层唯一的结构性风险,而 `registered` 无法从公开面观察——\n * 调用方只看见 documentElement 上的值,看不到注册表。有了它,泄漏在测试里是一个可直接断言的\n * 数字。`import.meta.env.DEV` 是编译期常量,生产构建里整段消失。\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __webUiThemeRootSyncCount: () => number\n}\n\nif (import.meta.env.DEV) {\n globalThis.__webUiThemeRootSyncCount = () => registered.size\n}\n\nfunction isRootSyncOwner(host: HTMLElement): boolean {\n return registered.values().next().value === host\n}\n\n/** 计算值可能为空(jsdom、未激活作用域、已断开),空值不写入也不删除既有值。 */\nfunction readPageColor(host: HTMLElement): string {\n return getComputedStyle(host).getPropertyValue(ROOT_PAGE_TOKEN).trim()\n}\n\nfunction syncRootPageColor(): void {\n const owner = registered.values().next().value as HTMLElement | undefined\n if (!owner) return\n // 已断开的所有者不能再写 root:整棵子树一起卸载时,队首顺延到的实例已经不在文档里\n // (浏览器对 detached 元素取不到计算值,jsdom 却仍按选择器匹配返回旧值),\n // 不设这道坎就会在两种环境里得到不同的 root 末值。\n if (!owner.isConnected) return\n const value = readPageColor(owner)\n if (!value) return\n const style = document.documentElement.style\n // 与当前行内值比较而不是与模块记忆的上次写入比较:消费者中途覆写时,下一次同步仍然夺回\n // 归属权,而值没变时不做无谓的样式写入。\n if (style.getPropertyValue(ROOT_PAGE_TOKEN) === value) return\n style.setProperty(ROOT_PAGE_TOKEN, value)\n}\n\nfunction handleSchemeChange(): void {\n syncRootPageColor()\n for (const subscriber of schemeSubscribers) subscriber()\n}\n\nfunction syncSchemeListener(): void {\n if (registered.size > 0 || schemeSubscribers.size > 0) {\n if (schemeQuery) return\n try {\n schemeQuery = window.matchMedia('(prefers-color-scheme: dark)')\n } catch {\n // jsdom 等没有 matchMedia 的环境:system 档跟随不到系统翻转,登记与输出仍保持当前值。\n return\n }\n schemeQuery.addEventListener('change', handleSchemeChange)\n return\n }\n if (!schemeQuery) return\n schemeQuery.removeEventListener('change', handleSchemeChange)\n schemeQuery = undefined\n}\n\n/*\n * 复用 root 同步已经持有的系统 scheme 监听:resolved-appearance 只登记回调,不另建 MediaQueryList。\n * 登记先于订阅或订阅先于登记都可以;syncSchemeListener 以两者任一非空为准。\n */\nexport function subscribeThemeSystemAppearanceChange(listener: () => void): () => void {\n schemeSubscribers.add(listener)\n syncSchemeListener()\n return () => {\n if (!schemeSubscribers.delete(listener)) return\n syncSchemeListener()\n }\n}\n\n/**\n * 登记一个 active theme。幂等,组件的 connectedCallback 与 updated() 可以无条件调用:\n * 已在表中的实例重复登记保留原队序,只有队首实例会刷新 root 值。\n */\nexport function registerThemeRootSync(host: HTMLElement): void {\n registered.add(host)\n syncSchemeListener()\n // 嵌套实例的变更按契约不影响 root 值;顺延不到新实例时 root 值同样不变。\n if (!isRootSyncOwner(host)) return\n syncRootPageColor()\n}\n\n/** 撤销登记。移交同步权时由新的队首实例立即接管 root 值。 */\nexport function unregisterThemeRootSync(host: HTMLElement): void {\n if (!registered.delete(host)) return\n syncSchemeListener()\n syncRootPageColor()\n}\n"],"mappings":";AAgCA,IAAM,IAAkB,oBAGlB,oBAAa,IAAI,IAAiB,GAEpC,GACE,oBAAoB,IAAI,IAAgB;AAkB9C,SAAS,EAAgB,GAA4B;CACnD,OAAO,EAAW,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU;AAC9C;AAGA,SAAS,EAAc,GAA2B;CAChD,OAAO,iBAAiB,CAAI,CAAC,CAAC,iBAAiB,CAAe,CAAC,CAAC,KAAK;AACvE;AAEA,SAAS,IAA0B;CACjC,IAAM,IAAQ,EAAW,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;CAKzC,IAJI,CAAC,KAID,CAAC,EAAM,aAAa;CACxB,IAAM,IAAQ,EAAc,CAAK;CACjC,IAAI,CAAC,GAAO;CACZ,IAAM,IAAQ,SAAS,gBAAgB;CAGnC,EAAM,iBAAiB,CAAe,MAAM,KAChD,EAAM,YAAY,GAAiB,CAAK;AAC1C;AAEA,SAAS,IAA2B;CAClC,EAAkB;CAClB,KAAK,IAAM,KAAc,GAAmB,EAAW;AACzD;AAEA,SAAS,IAA2B;CAClC,IAAI,EAAW,OAAO,KAAK,EAAkB,OAAO,GAAG;EACrD,IAAI,GAAa;EACjB,IAAI;GACF,IAAc,OAAO,WAAW,8BAA8B;EAChE,QAAQ;GAEN;EACF;EACA,EAAY,iBAAiB,UAAU,CAAkB;EACzD;CACF;CACK,AAEL,OADA,EAAY,oBAAoB,UAAU,CAAkB,GAC9C,KAAA;AAChB;AAMA,SAAgB,EAAqC,GAAkC;CAGrF,OAFA,EAAkB,IAAI,CAAQ,GAC9B,EAAmB,SACN;EACN,EAAkB,OAAO,CAAQ,KACtC,EAAmB;CACrB;AACF;AAMA,SAAgB,EAAsB,GAAyB;CAC7D,EAAW,IAAI,CAAI,GACnB,EAAmB,GAEd,EAAgB,CAAI,KACzB,EAAkB;AACpB;AAGA,SAAgB,EAAwB,GAAyB;CAC1D,EAAW,OAAO,CAAI,MAC3B,EAAmB,GACnB,EAAkB;AACpB"}
1
+ {"version":3,"file":"root-sync.js","names":[],"sources":["../../../src/shared/theme/root-sync.ts"],"sourcesContent":["/**\n * 根节点 token 同步 —— 「哪一层最外层」的唯一拥有者。\n *\n * macOS 橡皮筋回弹露白的成因不在 body 而在画布:body 的背景只覆盖滚动范围,回弹时被扯出来的\n * 那一圈用的是 documentElement 的画布背景。而 `--wui-color-page` 定义在 `<web-ui-theme>` 的\n * shadow 作用域里,自定义属性的继承链到 documentElement 就断了,所以消费方写\n * `body { background: var(--wui-color-page) }` 也管不到回弹区。\n *\n * 原生 scrollbar 同理:`<html>` 在 theme 元素之外,拿不到它 `:host` 上的\n * `--wui-scrollbar-handle`。本模块把这两个 token 一起镜像到 documentElement,消费方于是可以直接\n * 写 `html { scrollbar-color: var(--wui-scrollbar-handle) transparent }`。\n *\n * 为什么按 connect 顺序取「第一个 active 实例」,而不是去判「DOM 上最外层的那一个」:\n * 组件无法可靠地回答后者——portal、shadow host 与 slot 都会让「谁包着谁」的物理关系和主题\n * 作用域不一致(`WebUiTheme._findThemeAncestor()` 正是为此单独实现了跨 shadow 边界的祖先链)。\n * root 值只可能有一个来源,按 connect 顺序取第一个是唯一不需要猜树形状的判据,且与用户视角\n * 一致:嵌套主题总是后 connect,先进页面那个主题范围就是盖住整页的那个。\n *\n * 其余取舍:\n *\n * - 同步权在已登记实例之间按同一顺序顺延:最外层断开时下一个已连接实例接管,不查 DOM。\n * 重新挂载的实例按新的一次 connect 排到队尾——队首才是当前 outermost。\n * - 写入值取该实例的**计算值**,因此消费者在 host 上覆盖 `--wui-color-page`(包括在自己的\n * 媒体查询里覆盖)会被原样镜像,主题与消费者的优先级关系不因此改变。\n * - 全部断开时**保留最后值**:清掉属性会让 body 背景在主题卸载/重挂的间隙闪回 UA 白底,\n * 而那正是本能力要消除的观感。代价是最后一个主题卸载后 documentElement 上仍留着一个自定义\n * 属性;消费者自己写 body 背景时它不产生任何影响。\n * - `appearance=\"system\"` 的 token 计算值仍由组件内部 CSS 的 `prefers-color-scheme` 决定;\n * root 同步与 `resolved-appearance` 输出共用同一个 MediaQueryList 监听,翻转时一次重算。\n * - 登记表强引用实例,但删除路径只有组件自己的 disconnectedCallback:自定义元素反应保证移除\n * 必然触发它,不存在 open-overlay 那种「panel 被 portal 搬运」需要惰性兜底回收的形状。\n */\n\n/** 需要镜像到 documentElement 的 token:页面背景与原生 scrollbar thumb。 */\nconst ROOT_TOKENS = ['--wui-color-page', '--wui-scrollbar-handle'] as const\n\n/** 按 connect 顺序排列的已登记 active 实例;队首持有 root 同步权。 */\nconst registered = new Set<HTMLElement>()\n\nlet schemeQuery: MediaQueryList | undefined\nconst schemeSubscribers = new Set<() => void>()\n\nfunction isRootSyncOwner(host: HTMLElement): boolean {\n return registered.values().next().value === host\n}\n\nfunction syncRootTokens(): void {\n const owner = registered.values().next().value as HTMLElement | undefined\n if (!owner) return\n // 已断开的所有者不能再写 root:整棵子树一起卸载时,队首顺延到的实例已经不在文档里\n // (浏览器对 detached 元素取不到计算值,jsdom 却仍按选择器匹配返回旧值),\n // 不设这道坎就会在两种环境里得到不同的 root 末值。\n if (!owner.isConnected) return\n const computed = getComputedStyle(owner)\n const style = document.documentElement.style\n for (const token of ROOT_TOKENS) {\n // 计算值可能为空(jsdom、未激活作用域、已断开),空值不写入也不删除既有值。\n const value = computed.getPropertyValue(token).trim()\n if (!value) continue\n // 与当前行内值比较而不是与模块记忆的上次写入比较:消费者中途覆写时,下一次同步仍然夺回\n // 归属权,而值没变时不做无谓的样式写入。\n if (style.getPropertyValue(token) === value) continue\n style.setProperty(token, value)\n }\n}\n\nfunction handleSchemeChange(): void {\n syncRootTokens()\n for (const subscriber of schemeSubscribers) subscriber()\n}\n\nfunction syncSchemeListener(): void {\n if (registered.size > 0 || schemeSubscribers.size > 0) {\n if (schemeQuery) return\n try {\n schemeQuery = window.matchMedia('(prefers-color-scheme: dark)')\n } catch {\n // jsdom 等没有 matchMedia 的环境:system 档跟随不到系统翻转,登记与输出仍保持当前值。\n return\n }\n schemeQuery.addEventListener('change', handleSchemeChange)\n return\n }\n if (!schemeQuery) return\n schemeQuery.removeEventListener('change', handleSchemeChange)\n schemeQuery = undefined\n}\n\n/*\n * 复用 root 同步已经持有的系统 scheme 监听:resolved-appearance 只登记回调,不另建 MediaQueryList。\n * 登记先于订阅或订阅先于登记都可以;syncSchemeListener 以两者任一非空为准。\n */\nexport function subscribeThemeSystemAppearanceChange(listener: () => void): () => void {\n schemeSubscribers.add(listener)\n syncSchemeListener()\n return () => {\n if (!schemeSubscribers.delete(listener)) return\n syncSchemeListener()\n }\n}\n\n/**\n * 登记一个 active theme。幂等,组件的 connectedCallback 与 updated() 可以无条件调用:\n * 已在表中的实例重复登记保留原队序,只有队首实例会刷新 root 值。\n */\nexport function registerThemeRootSync(host: HTMLElement): void {\n registered.add(host)\n syncSchemeListener()\n // 嵌套实例的变更按契约不影响 root 值;顺延不到新实例时 root 值同样不变。\n if (!isRootSyncOwner(host)) return\n syncRootTokens()\n}\n\n/** 撤销登记。移交同步权时由新的队首实例立即接管 root 值。 */\nexport function unregisterThemeRootSync(host: HTMLElement): void {\n if (!registered.delete(host)) return\n syncSchemeListener()\n syncRootTokens()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,cAAc,CAAC,oBAAoB,wBAAwB;;AAGjE,MAAM,6BAAa,IAAI,IAAiB;AAExC,IAAI;AACJ,MAAM,oCAAoB,IAAI,IAAgB;AAE9C,SAAS,gBAAgB,MAA4B;CACnD,OAAO,WAAW,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU;AAC9C;AAEA,SAAS,iBAAuB;CAC9B,MAAM,QAAQ,WAAW,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;CACzC,IAAI,CAAC,OAAO;CAIZ,IAAI,CAAC,MAAM,aAAa;CACxB,MAAM,WAAW,iBAAiB,KAAK;CACvC,MAAM,QAAQ,SAAS,gBAAgB;CACvC,KAAK,MAAM,SAAS,aAAa;EAE/B,MAAM,QAAQ,SAAS,iBAAiB,KAAK,CAAC,CAAC,KAAK;EACpD,IAAI,CAAC,OAAO;EAGZ,IAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO;EAC7C,MAAM,YAAY,OAAO,KAAK;CAChC;AACF;AAEA,SAAS,qBAA2B;CAClC,eAAe;CACf,KAAK,MAAM,cAAc,mBAAmB,WAAW;AACzD;AAEA,SAAS,qBAA2B;CAClC,IAAI,WAAW,OAAO,KAAK,kBAAkB,OAAO,GAAG;EACrD,IAAI,aAAa;EACjB,IAAI;GACF,cAAc,OAAO,WAAW,8BAA8B;EAChE,QAAQ;GAEN;EACF;EACA,YAAY,iBAAiB,UAAU,kBAAkB;EACzD;CACF;CACA,IAAI,CAAC,aAAa;CAClB,YAAY,oBAAoB,UAAU,kBAAkB;CAC5D,cAAc,KAAA;AAChB;AAMA,SAAgB,qCAAqC,UAAkC;CACrF,kBAAkB,IAAI,QAAQ;CAC9B,mBAAmB;CACnB,aAAa;EACX,IAAI,CAAC,kBAAkB,OAAO,QAAQ,GAAG;EACzC,mBAAmB;CACrB;AACF;;;;;AAMA,SAAgB,sBAAsB,MAAyB;CAC7D,WAAW,IAAI,IAAI;CACnB,mBAAmB;CAEnB,IAAI,CAAC,gBAAgB,IAAI,GAAG;CAC5B,eAAe;AACjB;;AAGA,SAAgB,wBAAwB,MAAyB;CAC/D,IAAI,CAAC,WAAW,OAAO,IAAI,GAAG;CAC9B,mBAAmB;CACnB,eAAe;AACjB"}
@@ -1,6 +1,6 @@
1
- import { definePlugin as e } from "@greypan/js-kit";
2
- //#region src/shared/visible-area/index.ts
3
- var t = {
1
+ import { definePlugin } from "@greypan/js-kit";
2
+ // src/shared/visible-area/index.ts
3
+ const emptyVisibleArea = {
4
4
  top: 0,
5
5
  right: 0,
6
6
  bottom: 0,
@@ -8,53 +8,98 @@ var t = {
8
8
  width: 0,
9
9
  height: 0
10
10
  };
11
- function n(e) {
12
- if (!e) return t;
13
- let n = e.getBoundingClientRect(), r = Math.max(0, n.left), i = Math.max(0, n.top), a = Math.min(window.innerWidth, n.right), o = Math.min(window.innerHeight, n.bottom);
14
- return a <= r || o <= i ? t : {
15
- top: i,
16
- right: a,
17
- bottom: o,
18
- left: r,
19
- width: a - r,
20
- height: o - i
11
+ function getVisibleArea(target) {
12
+ if (!target) return emptyVisibleArea;
13
+ const rect = target.getBoundingClientRect();
14
+ const left = Math.max(0, rect.left);
15
+ const top = Math.max(0, rect.top);
16
+ const right = Math.min(window.innerWidth, rect.right);
17
+ const bottom = Math.min(window.innerHeight, rect.bottom);
18
+ if (right <= left || bottom <= top) return emptyVisibleArea;
19
+ return {
20
+ top,
21
+ right,
22
+ bottom,
23
+ left,
24
+ width: right - left,
25
+ height: bottom - top
21
26
  };
22
27
  }
23
- function r(e, t) {
24
- return e?.top === t.top && e.right === t.right && e.bottom === t.bottom && e.left === t.left && e.width === t.width && e.height === t.height;
28
+ function visibleAreasEqual(a, b) {
29
+ return a?.top === b.top && a.right === b.right && a.bottom === b.bottom && a.left === b.left && a.width === b.width && a.height === b.height;
25
30
  }
26
- function i(t) {
27
- return e(() => {
28
- let e = null, i, a, o = !1, s, c = () => {
29
- if (a = void 0, !o) return;
30
- let i = n(e);
31
- r(s, i) || (s = i, t.onVisibleAreaChange(i));
32
- }, l = () => {
33
- o && a === void 0 && (a = requestAnimationFrame(c));
34
- }, u = () => {
35
- i?.disconnect(), i = void 0, !(!e || typeof ResizeObserver > "u") && (i = new ResizeObserver(l), i.observe(e));
31
+ /**
32
+ * 追踪单个元素与浏览器 viewport 的交集区域。
33
+ *
34
+ * 模块统一持有 ResizeObserver、viewport 监听器和 rAF 合帧;
35
+ * 使用方只需管理 target 并响应可见区域变化。
36
+ */
37
+ function defineVisibleAreaTracker(options) {
38
+ return definePlugin(() => {
39
+ let target = null;
40
+ let observer;
41
+ let frame;
42
+ let connected = false;
43
+ let previousArea;
44
+ const report = () => {
45
+ frame = void 0;
46
+ if (!connected) return;
47
+ const nextArea = getVisibleArea(target);
48
+ if (visibleAreasEqual(previousArea, nextArea)) return;
49
+ previousArea = nextArea;
50
+ options.onVisibleAreaChange(nextArea);
51
+ };
52
+ const refresh = () => {
53
+ if (!connected || frame !== void 0) return;
54
+ frame = requestAnimationFrame(report);
55
+ };
56
+ const observeTarget = () => {
57
+ observer?.disconnect();
58
+ observer = void 0;
59
+ if (!target || typeof ResizeObserver === "undefined") return;
60
+ observer = new ResizeObserver(refresh);
61
+ observer.observe(target);
36
62
  };
37
63
  return {
38
- setTarget(t) {
39
- if (e === t) {
40
- l();
64
+ setTarget(nextTarget) {
65
+ if (target === nextTarget) {
66
+ refresh();
41
67
  return;
42
68
  }
43
- e = t, s = void 0, o && (u(), l());
69
+ target = nextTarget;
70
+ previousArea = void 0;
71
+ if (!connected) return;
72
+ observeTarget();
73
+ refresh();
44
74
  },
45
- refresh: l,
75
+ refresh,
46
76
  connect() {
47
- o || (o = !0, window.addEventListener("scroll", l, { passive: !0 }), window.addEventListener("resize", l, { passive: !0 }), u(), l());
77
+ if (connected) return;
78
+ connected = true;
79
+ window.addEventListener("scroll", refresh, { passive: true });
80
+ window.addEventListener("resize", refresh, { passive: true });
81
+ observeTarget();
82
+ refresh();
48
83
  },
49
84
  disconnect() {
50
- o && (o = !1, window.removeEventListener("scroll", l), window.removeEventListener("resize", l), i?.disconnect(), i = void 0, s = void 0, a !== void 0 && cancelAnimationFrame(a), a = void 0);
85
+ if (!connected) return;
86
+ connected = false;
87
+ window.removeEventListener("scroll", refresh);
88
+ window.removeEventListener("resize", refresh);
89
+ observer?.disconnect();
90
+ observer = void 0;
91
+ previousArea = void 0;
92
+ if (frame !== void 0) cancelAnimationFrame(frame);
93
+ frame = void 0;
51
94
  }
52
95
  };
53
96
  });
54
97
  }
55
- var a = class {
56
- constructor(e, t) {
57
- this.tracker = t, e.addController(this);
98
+ /** 将内部可见区域追踪器接入 Lit host 生命周期。 */
99
+ var VisibleAreaController = class {
100
+ constructor(host, tracker) {
101
+ this.tracker = tracker;
102
+ host.addController(this);
58
103
  }
59
104
  hostConnected() {
60
105
  this.tracker.connect();
@@ -63,7 +108,6 @@ var a = class {
63
108
  this.tracker.disconnect();
64
109
  }
65
110
  };
66
- //#endregion
67
- export { a as VisibleAreaController, i as defineVisibleAreaTracker };
111
+ export { VisibleAreaController, defineVisibleAreaTracker };
68
112
 
69
113
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/visible-area/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\nexport interface VisibleArea {\n readonly top: number\n readonly right: number\n readonly bottom: number\n readonly left: number\n readonly width: number\n readonly height: number\n}\n\nexport interface VisibleAreaTracker {\n setTarget(target: Element | null): void\n refresh(): void\n connect(): void\n disconnect(): void\n}\n\nconst emptyVisibleArea: VisibleArea = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0\n}\n\nfunction getVisibleArea(target: Element | null): VisibleArea {\n if (!target) return emptyVisibleArea\n\n const rect = target.getBoundingClientRect()\n const left = Math.max(0, rect.left)\n const top = Math.max(0, rect.top)\n const right = Math.min(window.innerWidth, rect.right)\n const bottom = Math.min(window.innerHeight, rect.bottom)\n\n if (right <= left || bottom <= top) return emptyVisibleArea\n\n return {\n top,\n right,\n bottom,\n left,\n width: right - left,\n height: bottom - top\n }\n}\n\nfunction visibleAreasEqual(a: VisibleArea | undefined, b: VisibleArea): boolean {\n return (\n a?.top === b.top &&\n a.right === b.right &&\n a.bottom === b.bottom &&\n a.left === b.left &&\n a.width === b.width &&\n a.height === b.height\n )\n}\n\n/**\n * 追踪单个元素与浏览器 viewport 的交集区域。\n *\n * 模块统一持有 ResizeObserver、viewport 监听器和 rAF 合帧;\n * 使用方只需管理 target 并响应可见区域变化。\n */\nexport function defineVisibleAreaTracker(options: { readonly onVisibleAreaChange: (area: VisibleArea) => void }) {\n return definePlugin<VisibleAreaTracker, Record<never, never>>(() => {\n let target: Element | null = null\n let observer: ResizeObserver | undefined\n let frame: number | undefined\n let connected = false\n let previousArea: VisibleArea | undefined\n\n const report = () => {\n frame = undefined\n if (!connected) return\n\n const nextArea = getVisibleArea(target)\n if (visibleAreasEqual(previousArea, nextArea)) return\n\n previousArea = nextArea\n options.onVisibleAreaChange(nextArea)\n }\n\n const refresh = () => {\n if (!connected || frame !== undefined) return\n frame = requestAnimationFrame(report)\n }\n\n const observeTarget = () => {\n observer?.disconnect()\n observer = undefined\n\n if (!target || typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(refresh)\n observer.observe(target)\n }\n\n return {\n setTarget(nextTarget) {\n if (target === nextTarget) {\n refresh()\n return\n }\n\n target = nextTarget\n previousArea = undefined\n if (!connected) return\n\n observeTarget()\n refresh()\n },\n\n refresh,\n\n connect() {\n if (connected) return\n\n connected = true\n window.addEventListener('scroll', refresh, { passive: true })\n window.addEventListener('resize', refresh, { passive: true })\n observeTarget()\n refresh()\n },\n\n disconnect() {\n if (!connected) return\n\n connected = false\n window.removeEventListener('scroll', refresh)\n window.removeEventListener('resize', refresh)\n observer?.disconnect()\n observer = undefined\n previousArea = undefined\n\n if (frame !== undefined) cancelAnimationFrame(frame)\n frame = undefined\n }\n }\n })\n}\n\n/** 将内部可见区域追踪器接入 Lit host 生命周期。 */\nexport class VisibleAreaController implements ReactiveController {\n constructor(\n host: ReactiveControllerHost,\n private readonly tracker: VisibleAreaTracker\n ) {\n host.addController(this)\n }\n\n hostConnected() {\n this.tracker.connect()\n }\n\n hostDisconnected() {\n this.tracker.disconnect()\n }\n}\n"],"mappings":";;AAmBA,IAAM,IAAgC;CACpC,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,EAAe,GAAqC;CAC3D,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAO,EAAO,sBAAsB,GACpC,IAAO,KAAK,IAAI,GAAG,EAAK,IAAI,GAC5B,IAAM,KAAK,IAAI,GAAG,EAAK,GAAG,GAC1B,IAAQ,KAAK,IAAI,OAAO,YAAY,EAAK,KAAK,GAC9C,IAAS,KAAK,IAAI,OAAO,aAAa,EAAK,MAAM;CAIvD,OAFI,KAAS,KAAQ,KAAU,IAAY,IAEpC;EACL;EACA;EACA;EACA;EACA,OAAO,IAAQ;EACf,QAAQ,IAAS;CACnB;AACF;AAEA,SAAS,EAAkB,GAA4B,GAAyB;CAC9E,OACE,GAAG,QAAQ,EAAE,OACb,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE,UACf,EAAE,SAAS,EAAE,QACb,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE;AAEnB;AAQA,SAAgB,EAAyB,GAAwE;CAC/G,OAAO,QAA6D;EAClE,IAAI,IAAyB,MACzB,GACA,GACA,IAAY,IACZ,GAEE,UAAe;GAEnB,IADA,IAAQ,KAAA,GACJ,CAAC,GAAW;GAEhB,IAAM,IAAW,EAAe,CAAM;GAClC,EAAkB,GAAc,CAAQ,MAE5C,IAAe,GACf,EAAQ,oBAAoB,CAAQ;EACtC,GAEM,UAAgB;GAChB,AAAC,KAAa,MAAU,KAAA,MAC5B,IAAQ,sBAAsB,CAAM;EACtC,GAEM,UAAsB;GAC1B,GAAU,WAAW,GACrB,IAAW,KAAA,GAEP,GAAC,KAAU,OAAO,iBAAmB,SAEzC,IAAW,IAAI,eAAe,CAAO,GACrC,EAAS,QAAQ,CAAM;EACzB;EAEA,OAAO;GACL,UAAU,GAAY;IACpB,IAAI,MAAW,GAAY;KACzB,EAAQ;KACR;IACF;IAEA,IAAS,GACT,IAAe,KAAA,GACV,MAEL,EAAc,GACd,EAAQ;GACV;GAEA;GAEA,UAAU;IACJ,MAEJ,IAAY,IACZ,OAAO,iBAAiB,UAAU,GAAS,EAAE,SAAS,GAAK,CAAC,GAC5D,OAAO,iBAAiB,UAAU,GAAS,EAAE,SAAS,GAAK,CAAC,GAC5D,EAAc,GACd,EAAQ;GACV;GAEA,aAAa;IACN,MAEL,IAAY,IACZ,OAAO,oBAAoB,UAAU,CAAO,GAC5C,OAAO,oBAAoB,UAAU,CAAO,GAC5C,GAAU,WAAW,GACrB,IAAW,KAAA,GACX,IAAe,KAAA,GAEX,MAAU,KAAA,KAAW,qBAAqB,CAAK,GACnD,IAAQ,KAAA;GACV;EACF;CACF,CAAC;AACH;AAGA,IAAa,IAAb,MAAiE;CAC/D,YACE,GACA,GACA;EACA,AAFiB,KAAA,UAAA,GAEjB,EAAK,cAAc,IAAI;CACzB;CAEA,gBAAgB;EACd,KAAK,QAAQ,QAAQ;CACvB;CAEA,mBAAmB;EACjB,KAAK,QAAQ,WAAW;CAC1B;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/visible-area/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\nexport interface VisibleArea {\n readonly top: number\n readonly right: number\n readonly bottom: number\n readonly left: number\n readonly width: number\n readonly height: number\n}\n\nexport interface VisibleAreaTracker {\n setTarget(target: Element | null): void\n refresh(): void\n connect(): void\n disconnect(): void\n}\n\nconst emptyVisibleArea: VisibleArea = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0\n}\n\nfunction getVisibleArea(target: Element | null): VisibleArea {\n if (!target) return emptyVisibleArea\n\n const rect = target.getBoundingClientRect()\n const left = Math.max(0, rect.left)\n const top = Math.max(0, rect.top)\n const right = Math.min(window.innerWidth, rect.right)\n const bottom = Math.min(window.innerHeight, rect.bottom)\n\n if (right <= left || bottom <= top) return emptyVisibleArea\n\n return {\n top,\n right,\n bottom,\n left,\n width: right - left,\n height: bottom - top\n }\n}\n\nfunction visibleAreasEqual(a: VisibleArea | undefined, b: VisibleArea): boolean {\n return (\n a?.top === b.top &&\n a.right === b.right &&\n a.bottom === b.bottom &&\n a.left === b.left &&\n a.width === b.width &&\n a.height === b.height\n )\n}\n\n/**\n * 追踪单个元素与浏览器 viewport 的交集区域。\n *\n * 模块统一持有 ResizeObserver、viewport 监听器和 rAF 合帧;\n * 使用方只需管理 target 并响应可见区域变化。\n */\nexport function defineVisibleAreaTracker(options: { readonly onVisibleAreaChange: (area: VisibleArea) => void }) {\n return definePlugin<VisibleAreaTracker, Record<never, never>>(() => {\n let target: Element | null = null\n let observer: ResizeObserver | undefined\n let frame: number | undefined\n let connected = false\n let previousArea: VisibleArea | undefined\n\n const report = () => {\n frame = undefined\n if (!connected) return\n\n const nextArea = getVisibleArea(target)\n if (visibleAreasEqual(previousArea, nextArea)) return\n\n previousArea = nextArea\n options.onVisibleAreaChange(nextArea)\n }\n\n const refresh = () => {\n if (!connected || frame !== undefined) return\n frame = requestAnimationFrame(report)\n }\n\n const observeTarget = () => {\n observer?.disconnect()\n observer = undefined\n\n if (!target || typeof ResizeObserver === 'undefined') return\n\n observer = new ResizeObserver(refresh)\n observer.observe(target)\n }\n\n return {\n setTarget(nextTarget) {\n if (target === nextTarget) {\n refresh()\n return\n }\n\n target = nextTarget\n previousArea = undefined\n if (!connected) return\n\n observeTarget()\n refresh()\n },\n\n refresh,\n\n connect() {\n if (connected) return\n\n connected = true\n window.addEventListener('scroll', refresh, { passive: true })\n window.addEventListener('resize', refresh, { passive: true })\n observeTarget()\n refresh()\n },\n\n disconnect() {\n if (!connected) return\n\n connected = false\n window.removeEventListener('scroll', refresh)\n window.removeEventListener('resize', refresh)\n observer?.disconnect()\n observer = undefined\n previousArea = undefined\n\n if (frame !== undefined) cancelAnimationFrame(frame)\n frame = undefined\n }\n }\n })\n}\n\n/** 将内部可见区域追踪器接入 Lit host 生命周期。 */\nexport class VisibleAreaController implements ReactiveController {\n constructor(\n host: ReactiveControllerHost,\n private readonly tracker: VisibleAreaTracker\n ) {\n host.addController(this)\n }\n\n hostConnected() {\n this.tracker.connect()\n }\n\n hostDisconnected() {\n this.tracker.disconnect()\n }\n}\n"],"mappings":";;AAmBA,MAAM,mBAAgC;CACpC,KAAK;CACL,OAAO;CACP,QAAQ;CACR,MAAM;CACN,OAAO;CACP,QAAQ;AACV;AAEA,SAAS,eAAe,QAAqC;CAC3D,IAAI,CAAC,QAAQ,OAAO;CAEpB,MAAM,OAAO,OAAO,sBAAsB;CAC1C,MAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI;CAClC,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,GAAG;CAChC,MAAM,QAAQ,KAAK,IAAI,OAAO,YAAY,KAAK,KAAK;CACpD,MAAM,SAAS,KAAK,IAAI,OAAO,aAAa,KAAK,MAAM;CAEvD,IAAI,SAAS,QAAQ,UAAU,KAAK,OAAO;CAE3C,OAAO;EACL;EACA;EACA;EACA;EACA,OAAO,QAAQ;EACf,QAAQ,SAAS;CACnB;AACF;AAEA,SAAS,kBAAkB,GAA4B,GAAyB;CAC9E,OACE,GAAG,QAAQ,EAAE,OACb,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE,UACf,EAAE,SAAS,EAAE,QACb,EAAE,UAAU,EAAE,SACd,EAAE,WAAW,EAAE;AAEnB;;;;;;;AAQA,SAAgB,yBAAyB,SAAwE;CAC/G,OAAO,mBAA6D;EAClE,IAAI,SAAyB;EAC7B,IAAI;EACJ,IAAI;EACJ,IAAI,YAAY;EAChB,IAAI;EAEJ,MAAM,eAAe;GACnB,QAAQ,KAAA;GACR,IAAI,CAAC,WAAW;GAEhB,MAAM,WAAW,eAAe,MAAM;GACtC,IAAI,kBAAkB,cAAc,QAAQ,GAAG;GAE/C,eAAe;GACf,QAAQ,oBAAoB,QAAQ;EACtC;EAEA,MAAM,gBAAgB;GACpB,IAAI,CAAC,aAAa,UAAU,KAAA,GAAW;GACvC,QAAQ,sBAAsB,MAAM;EACtC;EAEA,MAAM,sBAAsB;GAC1B,UAAU,WAAW;GACrB,WAAW,KAAA;GAEX,IAAI,CAAC,UAAU,OAAO,mBAAmB,aAAa;GAEtD,WAAW,IAAI,eAAe,OAAO;GACrC,SAAS,QAAQ,MAAM;EACzB;EAEA,OAAO;GACL,UAAU,YAAY;IACpB,IAAI,WAAW,YAAY;KACzB,QAAQ;KACR;IACF;IAEA,SAAS;IACT,eAAe,KAAA;IACf,IAAI,CAAC,WAAW;IAEhB,cAAc;IACd,QAAQ;GACV;GAEA;GAEA,UAAU;IACR,IAAI,WAAW;IAEf,YAAY;IACZ,OAAO,iBAAiB,UAAU,SAAS,EAAE,SAAS,KAAK,CAAC;IAC5D,OAAO,iBAAiB,UAAU,SAAS,EAAE,SAAS,KAAK,CAAC;IAC5D,cAAc;IACd,QAAQ;GACV;GAEA,aAAa;IACX,IAAI,CAAC,WAAW;IAEhB,YAAY;IACZ,OAAO,oBAAoB,UAAU,OAAO;IAC5C,OAAO,oBAAoB,UAAU,OAAO;IAC5C,UAAU,WAAW;IACrB,WAAW,KAAA;IACX,eAAe,KAAA;IAEf,IAAI,UAAU,KAAA,GAAW,qBAAqB,KAAK;IACnD,QAAQ,KAAA;GACV;EACF;CACF,CAAC;AACH;;AAGA,IAAa,wBAAb,MAAiE;CAC/D,YACE,MACA,SACA;EADiB,KAAA,UAAA;EAEjB,KAAK,cAAc,IAAI;CACzB;CAEA,gBAAgB;EACd,KAAK,QAAQ,QAAQ;CACvB;CAEA,mBAAmB;EACjB,KAAK,QAAQ,WAAW;CAC1B;AACF"}
@@ -1 +1 @@
1
- export type * from '@iconify/types';
1
+ export type * from "@iconify/types";
File without changes