@qw-ui/core 0.3.0-next.8 → 0.3.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 (415) hide show
  1. package/README.md +21 -37
  2. package/dist/action-sheet/action-sheet.d.ts +110 -0
  3. package/dist/action-sheet/index.d.ts +2 -0
  4. package/dist/action-sheet/index.js +2 -0
  5. package/dist/action-sheet-Cvcr1S_m.js +183 -0
  6. package/dist/action-sheet-Cvcr1S_m.js.map +1 -0
  7. package/dist/area-picker/area-picker.d.ts +113 -0
  8. package/dist/area-picker/index.d.ts +1 -0
  9. package/dist/area-picker/index.js +348 -0
  10. package/dist/area-picker/index.js.map +1 -0
  11. package/dist/aria-description-CimD2M_C.js +13 -0
  12. package/dist/aria-description-CimD2M_C.js.map +1 -0
  13. package/dist/aria-description.d.ts +2 -0
  14. package/dist/avatar/avatar-load.d.ts +76 -0
  15. package/dist/avatar/avatar.d.ts +22 -5
  16. package/dist/avatar/index.d.ts +1 -0
  17. package/dist/avatar/index.js +57 -18
  18. package/dist/avatar/index.js.map +1 -1
  19. package/dist/avatar-load-w9dq05oV.js +139 -0
  20. package/dist/avatar-load-w9dq05oV.js.map +1 -0
  21. package/dist/back-top/back-top.d.ts +77 -0
  22. package/dist/back-top/index.d.ts +1 -0
  23. package/dist/back-top/index.js +189 -0
  24. package/dist/back-top/index.js.map +1 -0
  25. package/dist/badge/badge.d.ts +85 -0
  26. package/dist/badge/index.d.ts +1 -0
  27. package/dist/badge/index.js +88 -0
  28. package/dist/badge/index.js.map +1 -0
  29. package/dist/button/button.d.ts +13 -0
  30. package/dist/button/index.js +3 -5
  31. package/dist/button/index.js.map +1 -1
  32. package/dist/calendar/calendar.d.ts +100 -0
  33. package/dist/calendar/index.d.ts +1 -0
  34. package/dist/calendar/index.js +2 -0
  35. package/dist/calendar-CmpK3stz.js +363 -0
  36. package/dist/calendar-CmpK3stz.js.map +1 -0
  37. package/dist/card/card.d.ts +68 -0
  38. package/dist/card/index.d.ts +2 -0
  39. package/dist/card/index.js +2 -0
  40. package/dist/card-DRtWa6Cr.js +107 -0
  41. package/dist/card-DRtWa6Cr.js.map +1 -0
  42. package/dist/cascader/cascader.d.ts +115 -0
  43. package/dist/cascader/index.d.ts +1 -0
  44. package/dist/cascader/index.js +2 -0
  45. package/dist/cascader-D-xMjs7P.js +333 -0
  46. package/dist/cascader-D-xMjs7P.js.map +1 -0
  47. package/dist/cell/cell.d.ts +41 -0
  48. package/dist/cell/index.d.ts +1 -0
  49. package/dist/cell/index.js +43 -0
  50. package/dist/cell/index.js.map +1 -0
  51. package/dist/check-list/check-list.d.ts +78 -0
  52. package/dist/check-list/index.d.ts +2 -0
  53. package/dist/check-list/index.js +2 -0
  54. package/dist/check-list-BvZHQt5w.js +60 -0
  55. package/dist/check-list-BvZHQt5w.js.map +1 -0
  56. package/dist/checkbox/checkbox.d.ts +59 -0
  57. package/dist/checkbox/index.d.ts +2 -0
  58. package/dist/checkbox/index.js +2 -0
  59. package/dist/checkbox-BlndJrz5.js +127 -0
  60. package/dist/checkbox-BlndJrz5.js.map +1 -0
  61. package/dist/checkbox-group/checkbox-group.d.ts +86 -0
  62. package/dist/checkbox-group/index.d.ts +3 -0
  63. package/dist/checkbox-group/index.js +2 -0
  64. package/dist/checkbox-group-gGfsTv-e.js +223 -0
  65. package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
  66. package/dist/choice-group-C4c9m0qe.js +373 -0
  67. package/dist/choice-group-C4c9m0qe.js.map +1 -0
  68. package/dist/circle/circle.d.ts +97 -0
  69. package/dist/circle/index.d.ts +1 -0
  70. package/dist/circle/index.js +119 -0
  71. package/dist/circle/index.js.map +1 -0
  72. package/dist/collapse/collapse.d.ts +98 -0
  73. package/dist/collapse/index.d.ts +2 -0
  74. package/dist/collapse/index.js +2 -0
  75. package/dist/collapse-B969h7-H.js +226 -0
  76. package/dist/collapse-B969h7-H.js.map +1 -0
  77. package/dist/countdown/countdown.d.ts +114 -0
  78. package/dist/countdown/index.d.ts +1 -0
  79. package/dist/countdown/index.js +309 -0
  80. package/dist/countdown/index.js.map +1 -0
  81. package/dist/date-picker/date-picker.d.ts +168 -0
  82. package/dist/date-picker/index.d.ts +1 -0
  83. package/dist/date-picker/index.js +401 -0
  84. package/dist/date-picker/index.js.map +1 -0
  85. package/dist/descriptions/descriptions.d.ts +69 -0
  86. package/dist/descriptions/index.d.ts +1 -0
  87. package/dist/descriptions/index.js +86 -0
  88. package/dist/descriptions/index.js.map +1 -0
  89. package/dist/dialog/dialog.d.ts +61 -43
  90. package/dist/dialog/index.js +73 -19
  91. package/dist/dialog/index.js.map +1 -1
  92. package/dist/divider/divider.d.ts +18 -2
  93. package/dist/divider/index.js +20 -2
  94. package/dist/divider/index.js.map +1 -1
  95. package/dist/dropdown/dropdown.d.ts +172 -0
  96. package/dist/dropdown/index.d.ts +2 -0
  97. package/dist/dropdown/index.js +467 -0
  98. package/dist/dropdown/index.js.map +1 -0
  99. package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
  100. package/dist/ellipsis/ellipsis.d.ts +88 -0
  101. package/dist/ellipsis/index.d.ts +2 -0
  102. package/dist/ellipsis/index.js +320 -0
  103. package/dist/ellipsis/index.js.map +1 -0
  104. package/dist/empty/empty-illustration.d.ts +3 -0
  105. package/dist/empty/empty.d.ts +43 -1
  106. package/dist/empty/index.js +2 -21
  107. package/dist/empty-CAgyvhUI.js +166 -0
  108. package/dist/empty-CAgyvhUI.js.map +1 -0
  109. package/dist/field/field.d.ts +95 -0
  110. package/dist/field/index.d.ts +2 -0
  111. package/dist/field/index.js +2 -0
  112. package/dist/field-DMHGIMZF.js +241 -0
  113. package/dist/field-DMHGIMZF.js.map +1 -0
  114. package/dist/floating-bubble/floating-bubble.d.ts +116 -0
  115. package/dist/floating-bubble/index.d.ts +1 -0
  116. package/dist/floating-bubble/index.js +333 -0
  117. package/dist/floating-bubble/index.js.map +1 -0
  118. package/dist/floating-panel/floating-panel.d.ts +80 -0
  119. package/dist/floating-panel/index.d.ts +2 -0
  120. package/dist/floating-panel/index.js +2 -0
  121. package/dist/floating-panel-Cbm5njBJ.js +363 -0
  122. package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
  123. package/dist/footer/footer.d.ts +94 -0
  124. package/dist/footer/index.d.ts +1 -0
  125. package/dist/footer/index.js +154 -0
  126. package/dist/footer/index.js.map +1 -0
  127. package/dist/form/connect.d.ts +6 -0
  128. package/dist/form/form.d.ts +100 -0
  129. package/dist/form/ids.d.ts +14 -0
  130. package/dist/form/index.d.ts +13 -0
  131. package/dist/form/index.js +3 -0
  132. package/dist/form/methods.d.ts +5 -0
  133. package/dist/form/model.d.ts +24 -0
  134. package/dist/form/native.d.ts +25 -0
  135. package/dist/form/rules.d.ts +40 -0
  136. package/dist/form/ssr.d.ts +7 -0
  137. package/dist/form/types.d.ts +150 -0
  138. package/dist/form-BAGkIEMY.js +1354 -0
  139. package/dist/form-BAGkIEMY.js.map +1 -0
  140. package/dist/format-BDUY0C_c.js +89 -0
  141. package/dist/format-BDUY0C_c.js.map +1 -0
  142. package/dist/gesture-_SRHIvBm.js +30 -0
  143. package/dist/gesture-_SRHIvBm.js.map +1 -0
  144. package/dist/grid/grid-item.d.ts +22 -0
  145. package/dist/grid/grid.d.ts +42 -0
  146. package/dist/grid/index.d.ts +2 -0
  147. package/dist/grid/index.js +73 -0
  148. package/dist/grid/index.js.map +1 -0
  149. package/dist/icon/icon.d.ts +37 -1
  150. package/dist/icon/identity.d.ts +3 -0
  151. package/dist/icon/index.js +2 -20
  152. package/dist/icon-Cgdbnk1u.js +77 -0
  153. package/dist/icon-Cgdbnk1u.js.map +1 -0
  154. package/dist/image/image-load.d.ts +24 -0
  155. package/dist/image/image.d.ts +45 -8
  156. package/dist/image/index.d.ts +1 -0
  157. package/dist/image/index.js +116 -14
  158. package/dist/image/index.js.map +1 -1
  159. package/dist/image-preview/image-preview.d.ts +124 -0
  160. package/dist/image-preview/index.d.ts +1 -0
  161. package/dist/image-preview/index.js +450 -0
  162. package/dist/image-preview/index.js.map +1 -0
  163. package/dist/index-bar/index-bar.d.ts +121 -0
  164. package/dist/index-bar/index.d.ts +1 -0
  165. package/dist/index-bar/index.js +386 -0
  166. package/dist/index-bar/index.js.map +1 -0
  167. package/dist/index.d.ts +115 -10
  168. package/dist/index.js +151 -11
  169. package/dist/index.js.map +1 -0
  170. package/dist/infinite-scroll/index.d.ts +1 -0
  171. package/dist/infinite-scroll/index.js +248 -0
  172. package/dist/infinite-scroll/index.js.map +1 -0
  173. package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
  174. package/dist/input/index.js +181 -22
  175. package/dist/input/index.js.map +1 -1
  176. package/dist/input/input.d.ts +44 -1
  177. package/dist/layer-IpFrl5--.js +414 -0
  178. package/dist/layer-IpFrl5--.js.map +1 -0
  179. package/dist/layout-BRSqi4AQ.js +43 -0
  180. package/dist/layout-BRSqi4AQ.js.map +1 -0
  181. package/dist/layout.d.ts +13 -0
  182. package/dist/list/index.d.ts +2 -0
  183. package/dist/list/index.js +2 -0
  184. package/dist/list/list.d.ts +30 -0
  185. package/dist/list-6-iz-Irh.js +28 -0
  186. package/dist/list-6-iz-Irh.js.map +1 -0
  187. package/dist/loading/index.js +45 -2
  188. package/dist/loading/index.js.map +1 -1
  189. package/dist/loading/loading.d.ts +45 -2
  190. package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
  191. package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
  192. package/dist/modal-dialog-machine.d.ts +21 -0
  193. package/dist/modal-dismissable-lifetime.d.ts +21 -0
  194. package/dist/modal-registry.d.ts +24 -0
  195. package/dist/modal-render-hydration.d.ts +35 -0
  196. package/dist/modal-render-runtime.d.ts +19 -0
  197. package/dist/modal-render-scope.d.ts +63 -0
  198. package/dist/nav-bar/index.d.ts +1 -0
  199. package/dist/nav-bar/index.js +115 -0
  200. package/dist/nav-bar/index.js.map +1 -0
  201. package/dist/nav-bar/nav-bar.d.ts +76 -0
  202. package/dist/notice-bar/index.d.ts +2 -0
  203. package/dist/notice-bar/index.js +2 -0
  204. package/dist/notice-bar/notice-bar.d.ts +103 -0
  205. package/dist/notice-bar-DMpwLvRb.js +231 -0
  206. package/dist/notice-bar-DMpwLvRb.js.map +1 -0
  207. package/dist/notify/index.d.ts +1 -0
  208. package/dist/notify/index.js +251 -0
  209. package/dist/notify/index.js.map +1 -0
  210. package/dist/notify/notify.d.ts +123 -0
  211. package/dist/number-keyboard/index.d.ts +1 -0
  212. package/dist/number-keyboard/index.js +333 -0
  213. package/dist/number-keyboard/index.js.map +1 -0
  214. package/dist/number-keyboard/number-keyboard.d.ts +141 -0
  215. package/dist/overlay-panel/index.d.ts +2 -0
  216. package/dist/overlay-panel/index.js +2 -0
  217. package/dist/overlay-panel/overlay-panel.d.ts +20 -0
  218. package/dist/overlay-panel-Z_qdKeBj.js +26 -0
  219. package/dist/overlay-panel-Z_qdKeBj.js.map +1 -0
  220. package/dist/page-indicator/index.d.ts +1 -0
  221. package/dist/page-indicator/index.js +138 -0
  222. package/dist/page-indicator/index.js.map +1 -0
  223. package/dist/page-indicator/page-indicator.d.ts +93 -0
  224. package/dist/pagination/index.d.ts +1 -0
  225. package/dist/pagination/index.js +198 -0
  226. package/dist/pagination/index.js.map +1 -0
  227. package/dist/pagination/pagination.d.ts +125 -0
  228. package/dist/password-input/index.d.ts +1 -0
  229. package/dist/password-input/index.js +317 -0
  230. package/dist/password-input/index.js.map +1 -0
  231. package/dist/password-input/password-input.d.ts +144 -0
  232. package/dist/picker/index.d.ts +8 -0
  233. package/dist/picker/index.js +2 -0
  234. package/dist/picker/picker-machine.d.ts +80 -0
  235. package/dist/picker/picker.d.ts +121 -0
  236. package/dist/picker/platform.d.ts +84 -0
  237. package/dist/picker/selection-connect.d.ts +90 -0
  238. package/dist/picker/selection-model.d.ts +211 -0
  239. package/dist/picker-BykFntQN.js +1675 -0
  240. package/dist/picker-BykFntQN.js.map +1 -0
  241. package/dist/popover/index.d.ts +3 -0
  242. package/dist/popover/index.js +253 -0
  243. package/dist/popover/index.js.map +1 -0
  244. package/dist/popover/layer.d.ts +44 -0
  245. package/dist/popover/popover.d.ts +104 -0
  246. package/dist/popover/positioning.d.ts +132 -0
  247. package/dist/popup/index.d.ts +2 -0
  248. package/dist/popup/index.js +2 -0
  249. package/dist/popup/popup.d.ts +60 -0
  250. package/dist/popup-z5d8IYCt.js +576 -0
  251. package/dist/popup-z5d8IYCt.js.map +1 -0
  252. package/dist/portal-BHCNTWhg.js +78 -0
  253. package/dist/portal-BHCNTWhg.js.map +1 -0
  254. package/dist/portal.d.ts +61 -0
  255. package/dist/price/format.d.ts +19 -0
  256. package/dist/price/index.d.ts +1 -0
  257. package/dist/price/index.js +154 -0
  258. package/dist/price/index.js.map +1 -0
  259. package/dist/price/price.d.ts +88 -0
  260. package/dist/progress/index.d.ts +1 -0
  261. package/dist/progress/index.js +2 -0
  262. package/dist/progress/progress.d.ts +32 -0
  263. package/dist/progress-f3iYEfdA.js +37 -0
  264. package/dist/progress-f3iYEfdA.js.map +1 -0
  265. package/dist/pull-refresh/index.d.ts +1 -0
  266. package/dist/pull-refresh/index.js +414 -0
  267. package/dist/pull-refresh/index.js.map +1 -0
  268. package/dist/pull-refresh/pull-refresh.d.ts +118 -0
  269. package/dist/radio-group/index.d.ts +3 -0
  270. package/dist/radio-group/index.js +2 -0
  271. package/dist/radio-group/radio-group.d.ts +78 -0
  272. package/dist/radio-group-BOIMuqnS.js +230 -0
  273. package/dist/radio-group-BOIMuqnS.js.map +1 -0
  274. package/dist/rate/index.d.ts +1 -0
  275. package/dist/rate/index.js +2 -0
  276. package/dist/rate/rate-form.d.ts +28 -0
  277. package/dist/rate/rate.d.ts +144 -0
  278. package/dist/rate-5XsU2QkY.js +631 -0
  279. package/dist/rate-5XsU2QkY.js.map +1 -0
  280. package/dist/reorder/index.d.ts +1 -0
  281. package/dist/reorder/index.js +720 -0
  282. package/dist/reorder/index.js.map +1 -0
  283. package/dist/reorder/reorder.d.ts +190 -0
  284. package/dist/result/index.d.ts +1 -0
  285. package/dist/result/index.js +123 -0
  286. package/dist/result/index.js.map +1 -0
  287. package/dist/result/result.d.ts +88 -0
  288. package/dist/safe-area/index.d.ts +1 -0
  289. package/dist/safe-area/index.js +42 -0
  290. package/dist/safe-area/index.js.map +1 -0
  291. package/dist/safe-area/safe-area.d.ts +28 -0
  292. package/dist/search-bar/index.js +4 -2
  293. package/dist/search-bar/index.js.map +1 -1
  294. package/dist/search-bar/search-bar.d.ts +6 -0
  295. package/dist/segmented/index.d.ts +2 -0
  296. package/dist/segmented/index.js +2 -0
  297. package/dist/segmented/segmented.d.ts +127 -0
  298. package/dist/segmented-BaU38_L4.js +367 -0
  299. package/dist/segmented-BaU38_L4.js.map +1 -0
  300. package/dist/selection-form-BOM_odUk.js +88 -0
  301. package/dist/selection-form-BOM_odUk.js.map +1 -0
  302. package/dist/selection-form.d.ts +27 -0
  303. package/dist/selection-ivXqO1eu.js +55 -0
  304. package/dist/selection-ivXqO1eu.js.map +1 -0
  305. package/dist/selection.d.ts +29 -0
  306. package/dist/selector/choice-group.d.ts +114 -0
  307. package/dist/selector/index.d.ts +2 -0
  308. package/dist/selector/index.js +2 -0
  309. package/dist/selector/selector.d.ts +90 -0
  310. package/dist/selector-BU2MMJ4N.js +93 -0
  311. package/dist/selector-BU2MMJ4N.js.map +1 -0
  312. package/dist/share-sheet/index.d.ts +1 -0
  313. package/dist/share-sheet/index.js +138 -0
  314. package/dist/share-sheet/index.js.map +1 -0
  315. package/dist/share-sheet/share-sheet.d.ts +139 -0
  316. package/dist/side-nav/index.d.ts +1 -0
  317. package/dist/side-nav/index.js +99 -0
  318. package/dist/side-nav/index.js.map +1 -0
  319. package/dist/side-nav/side-nav.d.ts +94 -0
  320. package/dist/skeleton/index.js +51 -2
  321. package/dist/skeleton/index.js.map +1 -1
  322. package/dist/skeleton/skeleton.d.ts +34 -3
  323. package/dist/slider/index.d.ts +1 -0
  324. package/dist/slider/index.js +482 -0
  325. package/dist/slider/index.js.map +1 -0
  326. package/dist/slider/slider.d.ts +174 -0
  327. package/dist/space/index.d.ts +1 -0
  328. package/dist/space/index.js +52 -0
  329. package/dist/space/index.js.map +1 -0
  330. package/dist/space/space.d.ts +46 -0
  331. package/dist/statistic/index.d.ts +1 -0
  332. package/dist/statistic/index.js +152 -0
  333. package/dist/statistic/index.js.map +1 -0
  334. package/dist/statistic/statistic.d.ts +101 -0
  335. package/dist/stepper/index.d.ts +1 -0
  336. package/dist/stepper/index.js +172 -0
  337. package/dist/stepper/index.js.map +1 -0
  338. package/dist/stepper/stepper.d.ts +161 -0
  339. package/dist/steps/index.d.ts +1 -0
  340. package/dist/steps/index.js +72 -0
  341. package/dist/steps/index.js.map +1 -0
  342. package/dist/steps/steps.d.ts +67 -0
  343. package/dist/sticky/index.d.ts +1 -0
  344. package/dist/sticky/index.js +145 -0
  345. package/dist/sticky/index.js.map +1 -0
  346. package/dist/sticky/sticky.d.ts +70 -0
  347. package/dist/swipe-action/index.d.ts +1 -0
  348. package/dist/swipe-action/index.js +417 -0
  349. package/dist/swipe-action/index.js.map +1 -0
  350. package/dist/swipe-action/swipe-action.d.ts +148 -0
  351. package/dist/swiper/gesture.d.ts +32 -0
  352. package/dist/swiper/index.d.ts +1 -0
  353. package/dist/swiper/index.js +2 -0
  354. package/dist/swiper/swiper.d.ts +177 -0
  355. package/dist/swiper-BKivDkHp.js +550 -0
  356. package/dist/swiper-BKivDkHp.js.map +1 -0
  357. package/dist/switch/index.d.ts +1 -0
  358. package/dist/switch/index.js +168 -0
  359. package/dist/switch/index.js.map +1 -0
  360. package/dist/switch/switch.d.ts +142 -0
  361. package/dist/tabbar/index.d.ts +1 -0
  362. package/dist/tabbar/index.js +95 -0
  363. package/dist/tabbar/index.js.map +1 -0
  364. package/dist/tabbar/tabbar.d.ts +119 -0
  365. package/dist/tabs/index.js +22 -1
  366. package/dist/tabs/index.js.map +1 -1
  367. package/dist/tabs/tabs.d.ts +12 -8
  368. package/dist/tag/index.js +123 -2
  369. package/dist/tag/index.js.map +1 -1
  370. package/dist/tag/tag.d.ts +67 -1
  371. package/dist/textarea/index.d.ts +2 -0
  372. package/dist/textarea/index.js +2 -242
  373. package/dist/textarea/platform.d.ts +22 -0
  374. package/dist/textarea/textarea.d.ts +169 -46
  375. package/dist/textarea-qbnruDUG.js +775 -0
  376. package/dist/textarea-qbnruDUG.js.map +1 -0
  377. package/dist/time-picker/index.d.ts +1 -0
  378. package/dist/time-picker/index.js +228 -0
  379. package/dist/time-picker/index.js.map +1 -0
  380. package/dist/time-picker/time-picker.d.ts +83 -0
  381. package/dist/timeline/index.d.ts +1 -0
  382. package/dist/timeline/index.js +131 -0
  383. package/dist/timeline/index.js.map +1 -0
  384. package/dist/timeline/timeline.d.ts +79 -0
  385. package/dist/toast/index.js +47 -4
  386. package/dist/toast/index.js.map +1 -1
  387. package/dist/toast/toast.d.ts +26 -3
  388. package/dist/top-bar/index.js +16 -2
  389. package/dist/top-bar/index.js.map +1 -1
  390. package/dist/top-bar/top-bar.d.ts +13 -2
  391. package/dist/tree-select/index.d.ts +1 -0
  392. package/dist/tree-select/index.js +512 -0
  393. package/dist/tree-select/index.js.map +1 -0
  394. package/dist/tree-select/tree-select.d.ts +215 -0
  395. package/dist/typography/index.d.ts +1 -0
  396. package/dist/typography/index.js +82 -0
  397. package/dist/typography/index.js.map +1 -0
  398. package/dist/typography/typography.d.ts +54 -0
  399. package/dist/upload/index.d.ts +1 -0
  400. package/dist/upload/index.js +458 -0
  401. package/dist/upload/index.js.map +1 -0
  402. package/dist/upload/upload.d.ts +172 -0
  403. package/dist/virtual-list/index.d.ts +1 -0
  404. package/dist/virtual-list/index.js +445 -0
  405. package/dist/virtual-list/index.js.map +1 -0
  406. package/dist/virtual-list/virtual-list.d.ts +160 -0
  407. package/dist/visual-manifest.d.ts +27 -0
  408. package/dist/watermark/index.d.ts +1 -0
  409. package/dist/watermark/index.js +260 -0
  410. package/dist/watermark/index.js.map +1 -0
  411. package/dist/watermark/watermark.d.ts +106 -0
  412. package/package.json +417 -44
  413. package/dist/empty/index.js.map +0 -1
  414. package/dist/icon/index.js.map +0 -1
  415. package/dist/textarea/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/virtual-list/virtual-list.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\n\n/** Stable DOM parts shared by every adapter. */\nexport const VIRTUAL_LIST_PARTS = [\"root\", \"list\", \"item\", \"empty\"] as const;\n/** scrollToIndex alignment vocabulary; any other value is treated as auto. */\nexport const VIRTUAL_LIST_ALIGNS = [\"auto\", \"start\", \"center\", \"end\"] as const;\nexport type VirtualListAlign = (typeof VIRTUAL_LIST_ALIGNS)[number];\n/** Fixed row height in CSS pixels used when itemHeight is missing or invalid. */\nexport const VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT = 48;\n/** Rows rendered before and after the visible rows. */\nexport const VIRTUAL_LIST_DEFAULT_OVERSCAN = 3;\n/** Rows assumed visible before the viewport has been measured (SSR, hidden containers). */\nexport const VIRTUAL_LIST_DEFAULT_INITIAL_COUNT = 10;\n\n/** Field name, or a function returning a unique nonempty string / finite number. Omitted: the index. */\nexport type VirtualListItemKey<T = unknown> = string | ((item: T, index: number) => string | number);\n/** Field name, or a function returning the row text. Omitted: string/number items are their own text. */\nexport type VirtualListItemText<T = unknown> = string | ((item: T, index: number) => string);\n/** Rendered window [start, end) and visible rows [visibleStart, visibleEnd), all zero-based and end-exclusive. */\nexport interface VirtualListRange { start: number; end: number; visibleStart: number; visibleEnd: number; count: number }\nexport type VirtualListRangeChangeDetails = VirtualListRange;\n/** One rendered row. pinned marks the focused row kept outside the window. */\nexport interface VirtualListRow<T = unknown> { key: string; index: number; item: T; text: string; pinned: boolean }\n/** Row that currently contains DOM focus. */\nexport interface VirtualListFocus { key: string; index: number }\n\nexport interface QwVirtualListProps<T = unknown> {\n /** Page-unique instance identity; adapters generate one when omitted. */\n id?: string;\n /** Caller-owned data; never mutated. Owner updates (add/remove/replace) re-window immediately. */\n items?: readonly T[];\n /** Fixed height of every row in CSS pixels; defaults to 48. Variable row heights are not supported. */\n itemHeight?: number;\n /** Stable row identity; see VirtualListItemKey. Without it rows are keyed by index. */\n itemKey?: VirtualListItemKey<T>;\n /** Default row text (and the WC row content); see VirtualListItemText. */\n itemText?: VirtualListItemText<T>;\n /** Extra rows before and after the visible rows; defaults to 3. Keep at least 1 for sequential Tab navigation. */\n overscan?: number;\n /** Element id of an external scroll container. Omitted: the list scrolls itself. An unresolved id falls back to the page viewport. */\n target?: string;\n /** Rows assumed visible before measurement (SSR, hidden containers); defaults to 10. */\n initialVisibleCount?: number;\n /** Accessible name of the list group; defaults to 列表. */\n label?: string;\n /** Text shown and politely announced when items is empty; defaults to 暂无数据. */\n emptyText?: string;\n /** The rendered window changed after mount (scroll, resize, data change or scrollToIndex). */\n onRangeChange?: (details: VirtualListRangeChangeDetails) => void;\n}\nexport interface ResolvedVirtualListState<T = unknown> {\n items: readonly T[]; count: number; itemHeight: number; overscan: number; initialVisibleCount: number;\n target: string | undefined; label: string; emptyText: string;\n itemKey: VirtualListItemKey<T> | undefined; itemText: VirtualListItemText<T> | undefined;\n}\nconst text = (value: unknown, fallback: string): string => typeof value === \"string\" && value.trim() ? value : fallback;\nconst positive = (value: unknown, fallback: number): number => typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : fallback;\nconst whole = (value: unknown, fallback: number): number => typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : fallback;\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\nconst field = (item: unknown, name: string): unknown => item !== null && typeof item === \"object\" ? (item as Record<string, unknown>)[name] : undefined;\nconst accessor = <F>(value: unknown): F | undefined => typeof value === \"function\" || (typeof value === \"string\" && value.trim()) ? value as F : undefined;\n\n/** O(1): items are referenced, never copied or scanned. */\nexport function resolveVirtualListState<T>(props: QwVirtualListProps<T> = {}): ResolvedVirtualListState<T> {\n const items: readonly T[] = Array.isArray(props.items) ? props.items : [];\n return {\n items, count: items.length, itemHeight: positive(props.itemHeight, VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT),\n overscan: whole(props.overscan, VIRTUAL_LIST_DEFAULT_OVERSCAN), initialVisibleCount: whole(props.initialVisibleCount, VIRTUAL_LIST_DEFAULT_INITIAL_COUNT),\n target: typeof props.target === \"string\" && props.target.trim() ? props.target : undefined,\n label: text(props.label, \"列表\"), emptyText: text(props.emptyText, \"暂无数据\"),\n itemKey: accessor<VirtualListItemKey<T>>(props.itemKey), itemText: accessor<VirtualListItemText<T>>(props.itemText),\n };\n}\n/** Unique row identity. Missing, empty or non-finite keys throw: a silent fallback would break row identity. */\nexport function resolveVirtualListKey<T>(item: T, index: number, itemKey?: VirtualListItemKey<T>): string {\n const raw = itemKey === undefined ? index : typeof itemKey === \"function\" ? itemKey(item, index) : field(item, itemKey);\n if (typeof raw === \"string\" && raw.length) return raw;\n if (typeof raw === \"number\" && Number.isFinite(raw)) return String(raw);\n throw new TypeError(`VirtualList item ${index} requires a nonempty string or finite number key`);\n}\n/** Default text: never throws; anything other than a string or finite number renders as an empty string. */\nexport function resolveVirtualListText<T>(item: T, index: number, itemText?: VirtualListItemText<T>): string {\n const raw = typeof itemText === \"function\" ? itemText(item, index) : typeof itemText === \"string\" ? field(item, itemText) : item;\n return typeof raw === \"string\" ? raw : typeof raw === \"number\" && Number.isFinite(raw) ? String(raw) : \"\";\n}\n\nexport interface VirtualListWindowInput { count: number; itemHeight: number; viewport: number; scrollTop: number; overscan: number }\n/**\n * Fixed-height window. scrollTop is the list-relative offset: an offset beyond the last full viewport is clamped\n * (stale offsets stay valid after the data shrinks); a negative offset means the list starts below an external viewport's top.\n */\nexport function getVirtualListRange(input: VirtualListWindowInput): VirtualListRange {\n const count = Math.max(0, Math.floor(input.count) || 0), height = positive(input.itemHeight, VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT);\n const viewport = Number.isFinite(input.viewport) ? Math.max(0, input.viewport) : 0, overscan = whole(input.overscan, 0);\n if (!count) return { start: 0, end: 0, visibleStart: 0, visibleEnd: 0, count: 0 };\n const top = Math.min(Number.isFinite(input.scrollTop) ? input.scrollTop : 0, Math.max(0, count * height - viewport));\n const visibleStart = clamp(Math.floor(top / height), 0, count);\n const visibleEnd = clamp(Math.ceil((top + viewport) / height), visibleStart, count);\n return { start: Math.max(0, visibleStart - overscan), end: Math.min(count, visibleEnd + overscan), visibleStart, visibleEnd, count };\n}\n/** Upper bound of windowed rows for any offset: ceil(viewport / itemHeight) + 1 partial row + 2 × overscan (a focused pinned row adds at most 1). */\nexport function getVirtualListRenderLimit(viewport: number, itemHeight: number, overscan: number): number {\n return Math.ceil(Math.max(0, viewport) / positive(itemHeight, VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT)) + 1 + 2 * whole(overscan, 0);\n}\nexport interface VirtualListScrollInput { index: number; align?: string; count: number; itemHeight: number; viewport: number; scrollTop: number }\n/** List-relative offset that brings index into view, or null when nothing should scroll. The index is clamped into [0, count - 1]. */\nexport function getVirtualListScrollTop(input: VirtualListScrollInput): number | null {\n const count = Math.max(0, Math.floor(input.count) || 0), height = positive(input.itemHeight, VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT);\n if (!count || !Number.isFinite(input.index)) return null;\n const viewport = Number.isFinite(input.viewport) ? Math.max(0, input.viewport) : 0, current = Number.isFinite(input.scrollTop) ? input.scrollTop : 0;\n const index = clamp(Math.floor(input.index), 0, count - 1), top = index * height, bottom = top + height;\n const align = (VIRTUAL_LIST_ALIGNS as readonly string[]).includes(input.align ?? \"\") ? input.align as VirtualListAlign : \"auto\";\n let next: number;\n if (align === \"start\") next = top;\n else if (align === \"end\") next = bottom - viewport;\n else if (align === \"center\") next = top - (viewport - height) / 2;\n else if (top >= current && bottom <= current + viewport) return null;\n else next = top < current || height >= viewport ? top : bottom - viewport;\n return clamp(next, 0, Math.max(0, count * height - viewport));\n}\n/** Row index currently holding focus: O(1) when unchanged, otherwise one scan by key; -1 when the row is gone. */\nexport function findVirtualListFocus<T>(state: ResolvedVirtualListState<T>, focus: VirtualListFocus | null): number {\n if (!focus) return -1;\n const keyAt = (index: number) => { try { return resolveVirtualListKey(state.items[index] as T, index, state.itemKey); } catch { return undefined; } };\n if (focus.index >= 0 && focus.index < state.count && keyAt(focus.index) === focus.key) return focus.index;\n for (let index = 0; index < state.count; index++) if (keyAt(index) === focus.key) return index;\n return -1;\n}\nexport function createVirtualListProps<T>(props: QwVirtualListProps<T> = {}): QwVirtualListProps {\n if (props.id !== undefined && (typeof props.id !== \"string\" || !props.id.trim())) throw new TypeError(\"VirtualList requires a nonempty instance id when provided\");\n return { ...props } as QwVirtualListProps;\n}\n\nexport interface QwVirtualListSchema {\n props: QwVirtualListProps;\n context: { scrollTop: number; viewport: number; focus: VirtualListFocus | null };\n refs: { rebind: (() => void) | null; restore: (() => void) | null };\n state: \"ready\";\n action: \"measure\" | \"setFocus\" | \"clearFocus\" | \"scrollToIndex\" | \"rebind\" | \"reconcile\" | \"notifyRange\";\n effect: \"trackViewport\";\n event:\n | { type: \"MEASURE\"; scrollTop: number; viewport: number }\n | { type: \"FOCUS.SET\"; key: string; index: number }\n | { type: \"FOCUS.CLEAR\" }\n | { type: \"SCROLL.TO\"; index: number; align?: VirtualListAlign };\n}\nexport type QwVirtualListMachine = Machine<QwVirtualListSchema>;\nexport type QwVirtualListService = Service<QwVirtualListSchema>;\ntype Scope = QwVirtualListService[\"scope\"];\ntype ContextReader = { get<K extends keyof QwVirtualListSchema[\"context\"]>(key: K): QwVirtualListSchema[\"context\"][K] };\nconst ids = (scope: Scope) => { const base = `virtual-list:${scope.id}`; return { root: base, list: `${base}:list` }; };\nconst live = (service: Pick<QwVirtualListService, \"prop\">) => resolveVirtualListState({\n items: service.prop(\"items\"), itemHeight: service.prop(\"itemHeight\"), itemKey: service.prop(\"itemKey\"), itemText: service.prop(\"itemText\"), overscan: service.prop(\"overscan\"),\n target: service.prop(\"target\"), initialVisibleCount: service.prop(\"initialVisibleCount\"), label: service.prop(\"label\"), emptyText: service.prop(\"emptyText\"),\n});\n/** A zero measurement (SSR, jsdom, display:none) keeps the initialVisibleCount fallback instead of collapsing the window. */\nconst viewportOf = (state: ResolvedVirtualListState, measured: number) => measured > 0 ? measured : state.initialVisibleCount * state.itemHeight;\nconst rangeOf = (state: ResolvedVirtualListState, context: ContextReader) => getVirtualListRange({\n count: state.count, itemHeight: state.itemHeight, viewport: viewportOf(state, context.get(\"viewport\")), scrollTop: context.get(\"scrollTop\"), overscan: state.overscan,\n});\n/** Primitive identity per items array: zag tracks primitives, and comparing 10k rows by value on every publish would be O(n). */\nconst identities = new WeakMap<object, number>();\nlet nextIdentity = 0;\nfunction identityOf(value: unknown): number {\n if (!value || typeof value !== \"object\") return 0;\n let identity = identities.get(value);\n if (identity === undefined) { identity = ++nextIdentity; identities.set(value, identity); }\n return identity;\n}\nconst rangeKey = (range: VirtualListRange) => `${range.start}:${range.end}:${range.visibleStart}:${range.visibleEnd}:${range.count}`;\n\n/** Platform boundary: self, the target element in the root's own tree, or null for the page viewport. */\nfunction resolveScroller(root: HTMLElement, target: string | undefined): HTMLElement | null {\n if (!target) return root;\n const owner = root.getRootNode() as Document | ShadowRoot;\n return (owner.getElementById?.(target) ?? root.ownerDocument.getElementById(target)) as HTMLElement | null;\n}\n/** List-relative offset and viewport size of the resolved scroller. */\nfunction readViewport(root: HTMLElement, list: HTMLElement | null, scroller: HTMLElement | null): { scrollTop: number; viewport: number } {\n if (scroller === root) return { scrollTop: root.scrollTop, viewport: root.clientHeight };\n const listTop = (list ?? root).getBoundingClientRect().top;\n if (scroller) return { scrollTop: scroller.getBoundingClientRect().top + scroller.clientTop - listTop, viewport: scroller.clientHeight };\n return { scrollTop: -listTop, viewport: root.ownerDocument.defaultView?.innerHeight ?? 0 };\n}\n/** The row element of this list containing node; nested lists inside a row are ignored. */\nfunction rowOf(root: HTMLElement, list: HTMLElement | null, node: Node | null): HTMLElement | null {\n for (let current = node; list && current && current !== root; current = current.parentNode) {\n if (current.parentNode === list && (current as Element).getAttribute?.(\"data-part\") === \"item\") return current as HTMLElement;\n }\n return null;\n}\n\n/** Core owns measurement, windowing, the focused-row pin, scrollToIndex, range notifications and cleanup. */\nexport const virtualListMachine: QwVirtualListMachine = createMachine<QwVirtualListSchema>({\n props: ({ props }) => createVirtualListProps(props), initialState: () => \"ready\", states: { ready: {} },\n context: ({ bindable }) => ({\n scrollTop: bindable(() => ({ defaultValue: 0 })), viewport: bindable(() => ({ defaultValue: 0 })),\n focus: bindable<VirtualListFocus | null>(() => ({ defaultValue: null, hash: (value) => value ? `${value.index}\\u0000${value.key}` : \"\" })),\n }),\n refs: () => ({ rebind: null, restore: null }),\n watch({ track, prop, context, action }) {\n track([() => prop(\"target\")], () => action([\"rebind\"]));\n // Identity (immutable updates) and length (in-place framework mutations) both re-resolve the focused row.\n track([() => identityOf(prop(\"items\")), () => prop(\"items\")?.length], () => action([\"reconcile\"]));\n track([() => rangeKey(rangeOf(live({ prop }), context))], () => action([\"notifyRange\"]));\n },\n on: { MEASURE: { actions: [\"measure\"] }, \"FOCUS.SET\": { actions: [\"setFocus\"] }, \"FOCUS.CLEAR\": { actions: [\"clearFocus\"] }, \"SCROLL.TO\": { actions: [\"scrollToIndex\"] } },\n effects: [\"trackViewport\"],\n implementations: {\n actions: {\n measure({ event, context }) {\n if (event.type !== \"MEASURE\") return;\n if (event.scrollTop !== context.get(\"scrollTop\")) context.set(\"scrollTop\", event.scrollTop);\n if (event.viewport !== context.get(\"viewport\")) context.set(\"viewport\", event.viewport);\n },\n setFocus({ event, context }) { if (event.type === \"FOCUS.SET\") context.set(\"focus\", { key: event.key, index: event.index }); },\n clearFocus({ context }) { if (context.get(\"focus\")) context.set(\"focus\", null); },\n rebind({ refs }) { refs.get(\"rebind\")?.(); },\n reconcile({ context, prop, refs }) {\n const focus = context.get(\"focus\");\n if (!focus) return;\n const index = findVirtualListFocus(live({ prop }), focus);\n if (index === -1) { context.set(\"focus\", null); refs.get(\"restore\")?.(); }\n else if (index !== focus.index) context.set(\"focus\", { key: focus.key, index });\n },\n notifyRange({ prop, context }) { prop(\"onRangeChange\")?.(rangeOf(live({ prop }), context)); },\n scrollToIndex({ event, context, prop, scope }) {\n if (event.type !== \"SCROLL.TO\") return;\n const state = live({ prop }), id = ids(scope), root = scope.getById<HTMLElement>(id.root);\n const scroller = root ? resolveScroller(root, state.target) : undefined;\n const current = root ? readViewport(root, scope.getById<HTMLElement>(id.list), scroller ?? null) : { scrollTop: context.get(\"scrollTop\"), viewport: context.get(\"viewport\") };\n const next = getVirtualListScrollTop({ index: event.index, align: event.align, count: state.count, itemHeight: state.itemHeight, viewport: viewportOf(state, current.viewport), scrollTop: current.scrollTop });\n if (next === null) return;\n if (root) {\n const win = root.ownerDocument.defaultView;\n if (scroller === root) root.scrollTop = next;\n else if (scroller) scroller.scrollTop += next - current.scrollTop;\n else win?.scrollTo(win.scrollX, win.scrollY + next - current.scrollTop);\n }\n // Optimistic: the target rows render now; the scroll event re-measures the real offset.\n context.set(\"scrollTop\", next);\n },\n },\n effects: {\n trackViewport({ scope, prop, context, send, refs }) {\n const id = ids(scope), root = scope.getById<HTMLElement>(id.root), doc = root?.ownerDocument, win = doc?.defaultView;\n if (!root || !doc || !win) return;\n let frame = 0, disposed = false, scroller: HTMLElement | null = root, events: EventTarget | null = null, observer: ResizeObserver | null = null;\n const pending = new Set<number>();\n const measure = () => {\n frame = 0;\n if (disposed) return;\n const next = readViewport(root, scope.getById<HTMLElement>(id.list), scroller);\n if (next.scrollTop !== context.get(\"scrollTop\") || next.viewport !== context.get(\"viewport\")) send({ type: \"MEASURE\", ...next });\n };\n const schedule = () => { if (!disposed && !frame) frame = win.requestAnimationFrame(measure); };\n const later = (run: () => void) => { const handle = win.requestAnimationFrame(() => { pending.delete(handle); if (!disposed) run(); }); pending.add(handle); };\n const bind = () => {\n if (disposed) return;\n events?.removeEventListener(\"scroll\", schedule); observer?.disconnect(); observer = null;\n scroller = resolveScroller(root, live({ prop }).target); events = scroller ?? win;\n events.addEventListener(\"scroll\", schedule, { passive: true });\n const Observer = win.ResizeObserver;\n if (Observer && scroller) { observer = new Observer(schedule); observer.observe(scroller); }\n measure();\n };\n // A removed focused row would drop focus to <body>; hand it to the list root instead.\n const restore = () => later(() => { const active = doc.activeElement; if (!active || active === doc.body) root.focus({ preventScroll: true }); });\n const onFocusIn = (event: FocusEvent) => {\n const row = rowOf(root, scope.getById<HTMLElement>(id.list), event.target as Node | null), key = row?.getAttribute(\"data-key\"), index = Number(row?.getAttribute(\"data-index\"));\n const current = context.get(\"focus\");\n if (row && key != null && Number.isInteger(index)) { if (current?.key !== key || current.index !== index) send({ type: \"FOCUS.SET\", key, index }); }\n else if (current) send({ type: \"FOCUS.CLEAR\" });\n };\n const onFocusOut = () => later(() => {\n const active = doc.activeElement, focus = context.get(\"focus\");\n if (active && root.contains(active)) return; // moved within the list, or the window itself lost focus\n if (focus && (!active || active === doc.body) && findVirtualListFocus(live({ prop }), focus) === -1) { root.focus({ preventScroll: true }); return; }\n send({ type: \"FOCUS.CLEAR\" });\n });\n refs.set(\"rebind\", bind); refs.set(\"restore\", restore);\n win.addEventListener(\"resize\", schedule);\n root.addEventListener(\"focusin\", onFocusIn); root.addEventListener(\"focusout\", onFocusOut);\n bind();\n return () => {\n disposed = true; refs.set(\"rebind\", null); refs.set(\"restore\", null);\n if (frame) win.cancelAnimationFrame(frame);\n for (const handle of pending) win.cancelAnimationFrame(handle);\n pending.clear(); events?.removeEventListener(\"scroll\", schedule); observer?.disconnect(); win.removeEventListener(\"resize\", schedule);\n root.removeEventListener(\"focusin\", onFocusIn); root.removeEventListener(\"focusout\", onFocusOut);\n };\n },\n },\n },\n});\n\nexport interface QwVirtualListApi<T extends PropTypes = PropTypes, I = unknown> {\n /** Rendered rows in index order: the window plus, when needed, the pinned focused row. */\n rows: VirtualListRow<I>[];\n count: number; empty: boolean; range: VirtualListRange; itemHeight: number; totalHeight: number; label: string; emptyText: string;\n /** Scroll the resolved container so the clamped index is in view; align defaults to auto (minimal scroll, none when fully visible). */\n scrollToIndex(index: number, align?: VirtualListAlign): void;\n getRootProps(): T[\"element\"];\n getListProps(): T[\"element\"];\n getItemProps(row: VirtualListRow<I>): T[\"element\"];\n getEmptyProps(): T[\"element\"];\n}\nexport function connectVirtualList<T extends PropTypes, I = unknown>(service: QwVirtualListService, normalize: NormalizeProps<T>): QwVirtualListApi<T, I> {\n const base = live(service), state = base as ResolvedVirtualListState<I>, id = ids(service.scope), range = rangeOf(base, service.context);\n const row = (index: number, pinned: boolean): VirtualListRow<I> => {\n const item = state.items[index] as I;\n return { key: resolveVirtualListKey(item, index, state.itemKey), index, item, text: resolveVirtualListText(item, index, state.itemText), pinned };\n };\n const rows: VirtualListRow<I>[] = [];\n for (let index = range.start; index < range.end; index++) rows.push(row(index, false));\n const focused = findVirtualListFocus(base, service.context.get(\"focus\"));\n if (focused !== -1 && (focused < range.start || focused >= range.end)) { if (focused < range.start) rows.unshift(row(focused, true)); else rows.push(row(focused, true)); }\n const seen = new Set<string>();\n for (const entry of rows) { if (seen.has(entry.key)) throw new TypeError(`VirtualList item keys must be unique: ${entry.key}`); seen.add(entry.key); }\n const empty = state.count === 0, self = state.target === undefined, totalHeight = state.count * state.itemHeight;\n const part = (name: string) => ({ \"data-scope\": \"virtual-list\", \"data-part\": name });\n return {\n rows, count: state.count, empty, range, itemHeight: state.itemHeight, totalHeight, label: state.label, emptyText: state.emptyText,\n scrollToIndex: (index, align) => service.send({ type: \"SCROLL.TO\", index, align }),\n getRootProps: () => normalize.element({ ...part(\"root\"), id: id.root, role: \"group\", \"aria-label\": state.label, tabIndex: self ? 0 : -1,\n \"data-scroller\": self ? \"self\" : \"target\", \"data-empty\": empty ? \"true\" : undefined }),\n getListProps: () => normalize.element({ ...part(\"list\"), id: id.list, role: \"list\", hidden: empty || undefined, style: { position: \"relative\", blockSize: `${totalHeight}px` } }),\n getItemProps: (entry) => normalize.element({ ...part(\"item\"), role: \"listitem\", \"aria-setsize\": state.count, \"aria-posinset\": entry.index + 1,\n \"data-index\": entry.index, \"data-key\": entry.key, \"data-pinned\": entry.pinned ? \"true\" : undefined,\n style: { position: \"absolute\", insetInlineStart: \"0\", insetInlineEnd: \"0\", insetBlockStart: `${entry.index * state.itemHeight}px`, blockSize: `${state.itemHeight}px` } }),\n getEmptyProps: () => normalize.element({ ...part(\"empty\"), role: \"status\", hidden: !empty || undefined }),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { type Machine, type Service } from "@zag-js/core";
2
+ import type { NormalizeProps, PropTypes } from "@zag-js/types";
3
+ /** Stable DOM parts shared by every adapter. */
4
+ export declare const VIRTUAL_LIST_PARTS: readonly ["root", "list", "item", "empty"];
5
+ /** scrollToIndex alignment vocabulary; any other value is treated as auto. */
6
+ export declare const VIRTUAL_LIST_ALIGNS: readonly ["auto", "start", "center", "end"];
7
+ export type VirtualListAlign = (typeof VIRTUAL_LIST_ALIGNS)[number];
8
+ /** Fixed row height in CSS pixels used when itemHeight is missing or invalid. */
9
+ export declare const VIRTUAL_LIST_DEFAULT_ITEM_HEIGHT = 48;
10
+ /** Rows rendered before and after the visible rows. */
11
+ export declare const VIRTUAL_LIST_DEFAULT_OVERSCAN = 3;
12
+ /** Rows assumed visible before the viewport has been measured (SSR, hidden containers). */
13
+ export declare const VIRTUAL_LIST_DEFAULT_INITIAL_COUNT = 10;
14
+ /** Field name, or a function returning a unique nonempty string / finite number. Omitted: the index. */
15
+ export type VirtualListItemKey<T = unknown> = string | ((item: T, index: number) => string | number);
16
+ /** Field name, or a function returning the row text. Omitted: string/number items are their own text. */
17
+ export type VirtualListItemText<T = unknown> = string | ((item: T, index: number) => string);
18
+ /** Rendered window [start, end) and visible rows [visibleStart, visibleEnd), all zero-based and end-exclusive. */
19
+ export interface VirtualListRange {
20
+ start: number;
21
+ end: number;
22
+ visibleStart: number;
23
+ visibleEnd: number;
24
+ count: number;
25
+ }
26
+ export type VirtualListRangeChangeDetails = VirtualListRange;
27
+ /** One rendered row. pinned marks the focused row kept outside the window. */
28
+ export interface VirtualListRow<T = unknown> {
29
+ key: string;
30
+ index: number;
31
+ item: T;
32
+ text: string;
33
+ pinned: boolean;
34
+ }
35
+ /** Row that currently contains DOM focus. */
36
+ export interface VirtualListFocus {
37
+ key: string;
38
+ index: number;
39
+ }
40
+ export interface QwVirtualListProps<T = unknown> {
41
+ /** Page-unique instance identity; adapters generate one when omitted. */
42
+ id?: string;
43
+ /** Caller-owned data; never mutated. Owner updates (add/remove/replace) re-window immediately. */
44
+ items?: readonly T[];
45
+ /** Fixed height of every row in CSS pixels; defaults to 48. Variable row heights are not supported. */
46
+ itemHeight?: number;
47
+ /** Stable row identity; see VirtualListItemKey. Without it rows are keyed by index. */
48
+ itemKey?: VirtualListItemKey<T>;
49
+ /** Default row text (and the WC row content); see VirtualListItemText. */
50
+ itemText?: VirtualListItemText<T>;
51
+ /** Extra rows before and after the visible rows; defaults to 3. Keep at least 1 for sequential Tab navigation. */
52
+ overscan?: number;
53
+ /** Element id of an external scroll container. Omitted: the list scrolls itself. An unresolved id falls back to the page viewport. */
54
+ target?: string;
55
+ /** Rows assumed visible before measurement (SSR, hidden containers); defaults to 10. */
56
+ initialVisibleCount?: number;
57
+ /** Accessible name of the list group; defaults to 列表. */
58
+ label?: string;
59
+ /** Text shown and politely announced when items is empty; defaults to 暂无数据. */
60
+ emptyText?: string;
61
+ /** The rendered window changed after mount (scroll, resize, data change or scrollToIndex). */
62
+ onRangeChange?: (details: VirtualListRangeChangeDetails) => void;
63
+ }
64
+ export interface ResolvedVirtualListState<T = unknown> {
65
+ items: readonly T[];
66
+ count: number;
67
+ itemHeight: number;
68
+ overscan: number;
69
+ initialVisibleCount: number;
70
+ target: string | undefined;
71
+ label: string;
72
+ emptyText: string;
73
+ itemKey: VirtualListItemKey<T> | undefined;
74
+ itemText: VirtualListItemText<T> | undefined;
75
+ }
76
+ /** O(1): items are referenced, never copied or scanned. */
77
+ export declare function resolveVirtualListState<T>(props?: QwVirtualListProps<T>): ResolvedVirtualListState<T>;
78
+ /** Unique row identity. Missing, empty or non-finite keys throw: a silent fallback would break row identity. */
79
+ export declare function resolveVirtualListKey<T>(item: T, index: number, itemKey?: VirtualListItemKey<T>): string;
80
+ /** Default text: never throws; anything other than a string or finite number renders as an empty string. */
81
+ export declare function resolveVirtualListText<T>(item: T, index: number, itemText?: VirtualListItemText<T>): string;
82
+ export interface VirtualListWindowInput {
83
+ count: number;
84
+ itemHeight: number;
85
+ viewport: number;
86
+ scrollTop: number;
87
+ overscan: number;
88
+ }
89
+ /**
90
+ * Fixed-height window. scrollTop is the list-relative offset: an offset beyond the last full viewport is clamped
91
+ * (stale offsets stay valid after the data shrinks); a negative offset means the list starts below an external viewport's top.
92
+ */
93
+ export declare function getVirtualListRange(input: VirtualListWindowInput): VirtualListRange;
94
+ /** Upper bound of windowed rows for any offset: ceil(viewport / itemHeight) + 1 partial row + 2 × overscan (a focused pinned row adds at most 1). */
95
+ export declare function getVirtualListRenderLimit(viewport: number, itemHeight: number, overscan: number): number;
96
+ export interface VirtualListScrollInput {
97
+ index: number;
98
+ align?: string;
99
+ count: number;
100
+ itemHeight: number;
101
+ viewport: number;
102
+ scrollTop: number;
103
+ }
104
+ /** List-relative offset that brings index into view, or null when nothing should scroll. The index is clamped into [0, count - 1]. */
105
+ export declare function getVirtualListScrollTop(input: VirtualListScrollInput): number | null;
106
+ /** Row index currently holding focus: O(1) when unchanged, otherwise one scan by key; -1 when the row is gone. */
107
+ export declare function findVirtualListFocus<T>(state: ResolvedVirtualListState<T>, focus: VirtualListFocus | null): number;
108
+ export declare function createVirtualListProps<T>(props?: QwVirtualListProps<T>): QwVirtualListProps;
109
+ export interface QwVirtualListSchema {
110
+ props: QwVirtualListProps;
111
+ context: {
112
+ scrollTop: number;
113
+ viewport: number;
114
+ focus: VirtualListFocus | null;
115
+ };
116
+ refs: {
117
+ rebind: (() => void) | null;
118
+ restore: (() => void) | null;
119
+ };
120
+ state: "ready";
121
+ action: "measure" | "setFocus" | "clearFocus" | "scrollToIndex" | "rebind" | "reconcile" | "notifyRange";
122
+ effect: "trackViewport";
123
+ event: {
124
+ type: "MEASURE";
125
+ scrollTop: number;
126
+ viewport: number;
127
+ } | {
128
+ type: "FOCUS.SET";
129
+ key: string;
130
+ index: number;
131
+ } | {
132
+ type: "FOCUS.CLEAR";
133
+ } | {
134
+ type: "SCROLL.TO";
135
+ index: number;
136
+ align?: VirtualListAlign;
137
+ };
138
+ }
139
+ export type QwVirtualListMachine = Machine<QwVirtualListSchema>;
140
+ export type QwVirtualListService = Service<QwVirtualListSchema>;
141
+ /** Core owns measurement, windowing, the focused-row pin, scrollToIndex, range notifications and cleanup. */
142
+ export declare const virtualListMachine: QwVirtualListMachine;
143
+ export interface QwVirtualListApi<T extends PropTypes = PropTypes, I = unknown> {
144
+ /** Rendered rows in index order: the window plus, when needed, the pinned focused row. */
145
+ rows: VirtualListRow<I>[];
146
+ count: number;
147
+ empty: boolean;
148
+ range: VirtualListRange;
149
+ itemHeight: number;
150
+ totalHeight: number;
151
+ label: string;
152
+ emptyText: string;
153
+ /** Scroll the resolved container so the clamped index is in view; align defaults to auto (minimal scroll, none when fully visible). */
154
+ scrollToIndex(index: number, align?: VirtualListAlign): void;
155
+ getRootProps(): T["element"];
156
+ getListProps(): T["element"];
157
+ getItemProps(row: VirtualListRow<I>): T["element"];
158
+ getEmptyProps(): T["element"];
159
+ }
160
+ export declare function connectVirtualList<T extends PropTypes, I = unknown>(service: QwVirtualListService, normalize: NormalizeProps<T>): QwVirtualListApi<T, I>;
@@ -16,6 +16,8 @@ export type QwVisualState = "default" | "hover" | "active" | "focus-visible" | "
16
16
  export type QwVisualTheme = "light" | "dark";
17
17
  /** 框架轴。 */
18
18
  export type QwVisualFramework = "react" | "vue";
19
+ /** visual target 的查找作用域;省略时先查 demo canvas,再回退到整页。 */
20
+ export type QwVisualTargetScope = "canvas" | "page";
19
21
  /** 视口配置(预留扩展;默认 mobile = 390×844 @2x,与 G3 一致)。 */
20
22
  export type QwVisualViewport = "mobile";
21
23
  /**
@@ -34,6 +36,12 @@ export type QwVisualAction = {
34
36
  } | {
35
37
  action: "tab-to";
36
38
  target: string;
39
+ }
40
+ /** 把 target 元素滚动到 scrollTop=top(如滚动后才出现的 BackTop),并等待两帧渲染。 */
41
+ | {
42
+ action: "scroll";
43
+ target: string;
44
+ top: number;
37
45
  } | {
38
46
  action: "click-role";
39
47
  role: string;
@@ -69,6 +77,15 @@ export type QwGeometryRelation = {
69
77
  /** T3 token 短名,如 "size-control-height-m";运行时从 tokens.json 解析 */
70
78
  token: string;
71
79
  };
80
+ /** 真实浏览器 computed style 的精确期望。 */
81
+ export interface QwVisualStyleExpectation {
82
+ target: string;
83
+ /** 期望生效的场景状态;省略时为 default。 */
84
+ state?: QwVisualState;
85
+ /** kebab-case CSS 属性名,如 `padding-inline-start`。 */
86
+ property: string;
87
+ value: string;
88
+ }
72
89
  /** 场景级可选强契约;省略时仍享有零声明基础保障。 */
73
90
  export interface QwVisualExpect {
74
91
  /** 覆盖库级默认通道(极少用,如某状态刻意不改 fill)。 */
@@ -78,6 +95,8 @@ export interface QwVisualExpect {
78
95
  * key = "state.property"(state 可省略,默认 default),value = token 短名(如 "border-focus")。
79
96
  */
80
97
  tokens?: Record<string, string>;
98
+ /** 精确 computed style;用于无法仅以 token 绑定表达的确定性尺寸契约。 */
99
+ styles?: QwVisualStyleExpectation[];
81
100
  /** 几何关系谓词。 */
82
101
  geometry?: QwGeometryRelation[];
83
102
  /** 该场景颜色随主题不变,显式豁免主题 delta 检查。 */
@@ -86,6 +105,12 @@ export interface QwVisualExpect {
86
105
  motion?: {
87
106
  /** data-visual-target 或 data-part 选择器别名;解析为动画宿主 */
88
107
  animatedPart: string;
108
+ /** animatedPart 内部的 data-part;省略时直接检查 animatedPart。 */
109
+ part?: string;
110
+ /** 浏览器解析后的精确 animation-duration。 */
111
+ duration?: string;
112
+ /** 浏览器解析后的精确 animation-timing-function。 */
113
+ timingFunction?: string;
89
114
  respectsReducedMotion?: boolean;
90
115
  };
91
116
  /** Icon 等:双栈 SVG 结构归一化哈希一致。 */
@@ -101,6 +126,8 @@ export interface QwVisualScenario {
101
126
  demo: string;
102
127
  /** 对应 demo 中 `data-visual-target` 的值。 */
103
128
  target: string;
129
+ /** Portal 等已知整页目标可声明 page,避免先等待 canvas 查找超时。 */
130
+ targetScope?: QwVisualTargetScope;
104
131
  /** 本场景要验证的视觉状态列表。 */
105
132
  states: QwVisualState[];
106
133
  /** 主题列表,默认 light + dark(主题 delta 使用;parity 仍跑双主题)。 */
@@ -0,0 +1 @@
1
+ export * from "./watermark.js";
@@ -0,0 +1,260 @@
1
+ import { createMachine } from "@zag-js/core";
2
+ //#region src/watermark/watermark.ts
3
+ /** Stable DOM parts shared by every adapter. */
4
+ const WATERMARK_PARTS = ["root", "layer"];
5
+ /** What the layer currently paints. */
6
+ const WATERMARK_LAYER_STATES = [
7
+ "text",
8
+ "image",
9
+ "none"
10
+ ];
11
+ const WATERMARK_DEFAULTS = {
12
+ width: 120,
13
+ height: 64,
14
+ gapX: 24,
15
+ gapY: 48,
16
+ rotate: -22,
17
+ fontSize: 14
18
+ };
19
+ const MAX_LINES = 20;
20
+ const MAX_EDGE = 2e3;
21
+ const positive = (value, fallback) => typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.min(MAX_EDGE, value) : fallback;
22
+ const gap = (value, fallback) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.min(MAX_EDGE, value) : fallback;
23
+ /** Any finite angle maps onto [-180, 180); nonfinite uses the default. */
24
+ function normalizeWatermarkRotate(value) {
25
+ if (typeof value !== "number" || !Number.isFinite(value)) return WATERMARK_DEFAULTS.rotate;
26
+ const turned = (value % 360 + 540) % 360 - 180;
27
+ return Object.is(turned, -0) ? 0 : turned;
28
+ }
29
+ function lines(content) {
30
+ return (typeof content === "string" ? content.split(/\r?\n/) : Array.isArray(content) ? content.filter((line) => typeof line === "string") : []).map((line) => line.trim()).filter(Boolean).slice(0, MAX_LINES);
31
+ }
32
+ function resolveWatermarkState(props = {}) {
33
+ return {
34
+ lines: lines(props.content),
35
+ image: typeof props.image === "string" && props.image.trim() ? props.image.trim() : void 0,
36
+ width: positive(props.width, WATERMARK_DEFAULTS.width),
37
+ height: positive(props.height, WATERMARK_DEFAULTS.height),
38
+ gapX: gap(props.gapX, WATERMARK_DEFAULTS.gapX),
39
+ gapY: gap(props.gapY, WATERMARK_DEFAULTS.gapY),
40
+ rotate: normalizeWatermarkRotate(props.rotate),
41
+ fontSize: positive(props.fontSize, WATERMARK_DEFAULTS.fontSize),
42
+ fullPage: !!props.fullPage
43
+ };
44
+ }
45
+ /** XML text/attribute escaping for the SVG tile. */
46
+ function escapeWatermarkXml(value) {
47
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
48
+ }
49
+ const round = (value) => Math.round(value * 100) / 100;
50
+ /**
51
+ * SSR-safe SVG tile used as a CSS mask. Only the alpha channel matters, so the glyph paint is
52
+ * `currentColor`; the visible colour is the T3 token painted behind the mask by styles-core.
53
+ */
54
+ function buildWatermarkTextTile(state) {
55
+ if (!state.lines.length) return void 0;
56
+ const tileW = round(state.width + state.gapX), tileH = round(state.height + state.gapY), cx = round(state.width / 2), cy = round(state.height / 2);
57
+ const lineHeight = state.fontSize * 1.4, first = cy - (state.lines.length - 1) * lineHeight / 2;
58
+ const spans = state.lines.map((line, index) => `<tspan x="${cx}" y="${round(first + index * lineHeight)}">${escapeWatermarkXml(line)}</tspan>`).join("");
59
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${tileW}" height="${tileH}" viewBox="0 0 ${tileW} ${tileH}"><text transform="rotate(${state.rotate} ${cx} ${cy})" fill="currentColor" font-family="sans-serif" font-size="${round(state.fontSize)}" text-anchor="middle" dominant-baseline="central">${spans}</text></svg>`;
60
+ }
61
+ const cssUrl = (url) => `url("${url.replace(/["\\\n\r]/g, (c) => encodeURIComponent(c))}")`;
62
+ function watermarkTextTileUrl(state) {
63
+ const svg = buildWatermarkTextTile(state);
64
+ return svg ? cssUrl(`data:image/svg+xml,${encodeURIComponent(svg)}`) : void 0;
65
+ }
66
+ /** Image tiles depend on the source and geometry; a change re-rasterizes. */
67
+ function watermarkImageKey(state) {
68
+ return state.image ? JSON.stringify([
69
+ state.image,
70
+ state.width,
71
+ state.height,
72
+ state.gapX,
73
+ state.gapY,
74
+ state.rotate
75
+ ]) : void 0;
76
+ }
77
+ /** Pure layer decision used by connect and tests. */
78
+ function resolveWatermarkLayer(state, image) {
79
+ if (state.image && image && image.src === state.image) return "image";
80
+ return state.lines.length ? "text" : "none";
81
+ }
82
+ function createWatermarkProps(props = {}) {
83
+ if (props.id !== void 0 && (typeof props.id !== "string" || !props.id.trim())) throw new TypeError("Watermark requires a nonempty instance id when provided");
84
+ return { ...props };
85
+ }
86
+ const rootId = (scope) => `watermark:${scope.id}`;
87
+ const live = (service) => resolveWatermarkState({
88
+ content: service.prop("content"),
89
+ image: service.prop("image"),
90
+ width: service.prop("width"),
91
+ height: service.prop("height"),
92
+ gapX: service.prop("gapX"),
93
+ gapY: service.prop("gapY"),
94
+ rotate: service.prop("rotate"),
95
+ fontSize: service.prop("fontSize"),
96
+ fullPage: service.prop("fullPage")
97
+ });
98
+ /** Platform boundary: rotate and tile a decoded image on a canvas. Null when canvas is unavailable or tainted. */
99
+ function rasterize(doc, img, state) {
100
+ const ratio = Math.max(1, Math.min(3, doc.defaultView?.devicePixelRatio || 1));
101
+ const canvas = doc.createElement("canvas");
102
+ canvas.width = Math.ceil((state.width + state.gapX) * ratio);
103
+ canvas.height = Math.ceil((state.height + state.gapY) * ratio);
104
+ try {
105
+ const ctx = canvas.getContext("2d");
106
+ if (!ctx) return null;
107
+ ctx.scale(ratio, ratio);
108
+ ctx.translate(state.width / 2, state.height / 2);
109
+ ctx.rotate(state.rotate * Math.PI / 180);
110
+ ctx.drawImage(img, -state.width / 2, -state.height / 2, state.width, state.height);
111
+ return canvas.toDataURL("image/png");
112
+ } catch {
113
+ return null;
114
+ }
115
+ }
116
+ /** Core owns preloading, fallback, once-per-source error notification and cleanup. */
117
+ const watermarkMachine = createMachine({
118
+ props: ({ props }) => createWatermarkProps(props),
119
+ initialState: () => "ready",
120
+ states: { ready: {} },
121
+ context: ({ bindable }) => ({ image: bindable(() => ({
122
+ defaultValue: null,
123
+ isEqual: (a, b) => a?.key === b?.key && a?.url === b?.url
124
+ })) }),
125
+ refs: () => ({
126
+ load: null,
127
+ reported: /* @__PURE__ */ new Set()
128
+ }),
129
+ watch({ track, prop, action }) {
130
+ track([
131
+ () => prop("image"),
132
+ () => prop("width"),
133
+ () => prop("height"),
134
+ () => prop("gapX"),
135
+ () => prop("gapY"),
136
+ () => prop("rotate")
137
+ ], () => action(["reload"]));
138
+ },
139
+ on: {
140
+ "IMAGE.LOADED": { actions: ["setImage"] },
141
+ "IMAGE.ERROR": { actions: ["reportError"] }
142
+ },
143
+ effects: ["loadImage"],
144
+ implementations: {
145
+ actions: {
146
+ setImage(params) {
147
+ if (params.event.type === "IMAGE.LOADED") params.context.set("image", params.event.result);
148
+ },
149
+ reportError({ event, context, refs, prop }) {
150
+ if (event.type !== "IMAGE.ERROR") return;
151
+ if (context.get("image")?.src === event.src) context.set("image", null);
152
+ const reported = refs.get("reported");
153
+ if (reported.has(event.src)) return;
154
+ reported.add(event.src);
155
+ prop("onImageError")?.({ image: event.src });
156
+ },
157
+ reload(params) {
158
+ params.refs.get("load")?.();
159
+ }
160
+ },
161
+ effects: { loadImage({ scope, prop, send, context, refs }) {
162
+ const doc = scope.getDoc(), win = doc?.defaultView;
163
+ if (!doc || !win || typeof win.Image !== "function") return;
164
+ let img = null, pending, disposed = false;
165
+ const cancel = () => {
166
+ if (!img) return;
167
+ img.onload = null;
168
+ img.onerror = null;
169
+ img.removeAttribute("src");
170
+ img = null;
171
+ pending = void 0;
172
+ };
173
+ const load = () => {
174
+ if (disposed) return;
175
+ const state = live({ prop }), key = watermarkImageKey(state);
176
+ if (!key || !state.image) {
177
+ cancel();
178
+ if (context.get("image")) context.set("image", null);
179
+ return;
180
+ }
181
+ if (context.get("image")?.key === key || pending === key) return;
182
+ cancel();
183
+ const src = state.image, next = new win.Image();
184
+ next.crossOrigin = "anonymous";
185
+ next.referrerPolicy = "no-referrer";
186
+ next.decoding = "async";
187
+ next.onload = () => {
188
+ if (disposed || img !== next) return;
189
+ const current = live({ prop }), url = watermarkImageKey(current) === key ? rasterize(doc, next, current) : null;
190
+ img = null;
191
+ pending = void 0;
192
+ if (url) send({
193
+ type: "IMAGE.LOADED",
194
+ result: {
195
+ src,
196
+ key,
197
+ url
198
+ }
199
+ });
200
+ else send({
201
+ type: "IMAGE.ERROR",
202
+ src
203
+ });
204
+ };
205
+ next.onerror = () => {
206
+ if (disposed || img !== next) return;
207
+ img = null;
208
+ pending = void 0;
209
+ send({
210
+ type: "IMAGE.ERROR",
211
+ src
212
+ });
213
+ };
214
+ img = next;
215
+ pending = key;
216
+ next.src = src;
217
+ };
218
+ refs.set("load", load);
219
+ load();
220
+ return () => {
221
+ disposed = true;
222
+ refs.set("load", null);
223
+ cancel();
224
+ };
225
+ } }
226
+ }
227
+ });
228
+ function connectWatermark(service, normalize) {
229
+ const state = live(service), image = service.context.get("image"), layer = resolveWatermarkLayer(state, image);
230
+ const size = `${round(state.width + state.gapX)}px ${round(state.height + state.gapY)}px`;
231
+ const style = layer === "image" && image ? {
232
+ "--qw-watermark-image": cssUrl(image.url),
233
+ "--qw-watermark-size": size
234
+ } : layer === "text" ? {
235
+ "--qw-watermark-tile": watermarkTextTileUrl(state),
236
+ "--qw-watermark-size": size
237
+ } : {};
238
+ return {
239
+ layer,
240
+ fullPage: state.fullPage,
241
+ getRootProps: () => normalize.element({
242
+ "data-scope": "watermark",
243
+ "data-part": "root",
244
+ id: rootId(service.scope),
245
+ "data-full-page": state.fullPage ? "true" : void 0
246
+ }),
247
+ getLayerProps: () => normalize.element({
248
+ "data-scope": "watermark",
249
+ "data-part": "layer",
250
+ "aria-hidden": true,
251
+ "data-state": layer,
252
+ hidden: layer === "none" || void 0,
253
+ style
254
+ })
255
+ };
256
+ }
257
+ //#endregion
258
+ export { WATERMARK_DEFAULTS, WATERMARK_LAYER_STATES, WATERMARK_PARTS, buildWatermarkTextTile, connectWatermark, createWatermarkProps, escapeWatermarkXml, normalizeWatermarkRotate, resolveWatermarkLayer, resolveWatermarkState, watermarkImageKey, watermarkMachine, watermarkTextTileUrl };
259
+
260
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/watermark/watermark.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\n\n/** Stable DOM parts shared by every adapter. */\nexport const WATERMARK_PARTS = [\"root\", \"layer\"] as const;\n/** What the layer currently paints. */\nexport const WATERMARK_LAYER_STATES = [\"text\", \"image\", \"none\"] as const;\nexport type WatermarkLayerState = (typeof WATERMARK_LAYER_STATES)[number];\nexport interface WatermarkImageErrorDetails { image: string }\n/** SSR-safe input shared by all adapters (API follows antd-mobile Watermark; canvas text is replaced by an SVG mask). */\nexport interface QwWatermarkProps {\n /** Page-unique instance identity; adapters generate one when omitted. */\n id?: string;\n /** Text lines. A string is split on line breaks; empty lines are dropped. */\n content?: string | readonly string[];\n /** Image URL. Preloaded on the client; on failure the text tile (if any) is used. */\n image?: string;\n /** Mark box width in CSS px (default 120). */\n width?: number;\n /** Mark box height in CSS px (default 64). */\n height?: number;\n /** Horizontal gap between marks in CSS px (default 24). */\n gapX?: number;\n /** Vertical gap between marks in CSS px (default 48). */\n gapY?: number;\n /** Rotation in degrees, normalized to [-180, 180) (default -22). */\n rotate?: number;\n /** Text size in CSS px (default 14). */\n fontSize?: number;\n /** Cover the viewport with a fixed layer instead of the component box. */\n fullPage?: boolean;\n /** Called once per failing image source. */\n onImageError?: (details: WatermarkImageErrorDetails) => void;\n}\nexport interface ResolvedWatermarkState {\n lines: string[]; image: string | undefined; width: number; height: number; gapX: number; gapY: number; rotate: number; fontSize: number; fullPage: boolean;\n}\nexport const WATERMARK_DEFAULTS = { width: 120, height: 64, gapX: 24, gapY: 48, rotate: -22, fontSize: 14 } as const;\nconst MAX_LINES = 20, MAX_EDGE = 2000;\nconst positive = (value: number | undefined, fallback: number) => typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.min(MAX_EDGE, value) : fallback;\nconst gap = (value: number | undefined, fallback: number) => typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.min(MAX_EDGE, value) : fallback;\n/** Any finite angle maps onto [-180, 180); nonfinite uses the default. */\nexport function normalizeWatermarkRotate(value: number | undefined): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return WATERMARK_DEFAULTS.rotate;\n const turned = ((value % 360) + 540) % 360 - 180;\n return Object.is(turned, -0) ? 0 : turned;\n}\nfunction lines(content: QwWatermarkProps[\"content\"]): string[] {\n const source = typeof content === \"string\" ? content.split(/\\r?\\n/) : Array.isArray(content) ? content.filter((line): line is string => typeof line === \"string\") : [];\n return source.map((line) => line.trim()).filter(Boolean).slice(0, MAX_LINES);\n}\nexport function resolveWatermarkState(props: QwWatermarkProps = {}): ResolvedWatermarkState {\n return {\n lines: lines(props.content), image: typeof props.image === \"string\" && props.image.trim() ? props.image.trim() : undefined,\n width: positive(props.width, WATERMARK_DEFAULTS.width), height: positive(props.height, WATERMARK_DEFAULTS.height),\n gapX: gap(props.gapX, WATERMARK_DEFAULTS.gapX), gapY: gap(props.gapY, WATERMARK_DEFAULTS.gapY),\n rotate: normalizeWatermarkRotate(props.rotate), fontSize: positive(props.fontSize, WATERMARK_DEFAULTS.fontSize), fullPage: !!props.fullPage,\n };\n}\n/** XML text/attribute escaping for the SVG tile. */\nexport function escapeWatermarkXml(value: string): string {\n return value.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\").replace(/'/g, \"&apos;\");\n}\nconst round = (value: number) => Math.round(value * 100) / 100;\n/**\n * SSR-safe SVG tile used as a CSS mask. Only the alpha channel matters, so the glyph paint is\n * `currentColor`; the visible colour is the T3 token painted behind the mask by styles-core.\n */\nexport function buildWatermarkTextTile(state: ResolvedWatermarkState): string | undefined {\n if (!state.lines.length) return undefined;\n const tileW = round(state.width + state.gapX), tileH = round(state.height + state.gapY), cx = round(state.width / 2), cy = round(state.height / 2);\n const lineHeight = state.fontSize * 1.4, first = cy - ((state.lines.length - 1) * lineHeight) / 2;\n const spans = state.lines.map((line, index) => `<tspan x=\"${cx}\" y=\"${round(first + index * lineHeight)}\">${escapeWatermarkXml(line)}</tspan>`).join(\"\");\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${tileW}\" height=\"${tileH}\" viewBox=\"0 0 ${tileW} ${tileH}\">`\n + `<text transform=\"rotate(${state.rotate} ${cx} ${cy})\" fill=\"currentColor\" font-family=\"sans-serif\" font-size=\"${round(state.fontSize)}\" text-anchor=\"middle\" dominant-baseline=\"central\">${spans}</text></svg>`;\n}\nconst cssUrl = (url: string) => `url(\"${url.replace(/[\"\\\\\\n\\r]/g, (c) => encodeURIComponent(c))}\")`;\nexport function watermarkTextTileUrl(state: ResolvedWatermarkState): string | undefined {\n const svg = buildWatermarkTextTile(state);\n return svg ? cssUrl(`data:image/svg+xml,${encodeURIComponent(svg)}`) : undefined;\n}\n/** Image tiles depend on the source and geometry; a change re-rasterizes. */\nexport function watermarkImageKey(state: ResolvedWatermarkState): string | undefined {\n return state.image ? JSON.stringify([state.image, state.width, state.height, state.gapX, state.gapY, state.rotate]) : undefined;\n}\nexport interface WatermarkImageResult { src: string; key: string; url: string }\n/** Pure layer decision used by connect and tests. */\nexport function resolveWatermarkLayer(state: ResolvedWatermarkState, image: WatermarkImageResult | null): WatermarkLayerState {\n if (state.image && image && image.src === state.image) return \"image\";\n return state.lines.length ? \"text\" : \"none\";\n}\nexport function createWatermarkProps(props: QwWatermarkProps = {}): QwWatermarkProps {\n if (props.id !== undefined && (typeof props.id !== \"string\" || !props.id.trim())) throw new TypeError(\"Watermark requires a nonempty instance id when provided\");\n return { ...props };\n}\n\nexport interface QwWatermarkSchema {\n props: QwWatermarkProps;\n context: { image: WatermarkImageResult | null };\n refs: { load: (() => void) | null; reported: Set<string> };\n state: \"ready\";\n action: \"setImage\" | \"reportError\" | \"reload\";\n effect: \"loadImage\";\n event: { type: \"IMAGE.LOADED\"; result: WatermarkImageResult } | { type: \"IMAGE.ERROR\"; src: string };\n}\nexport type QwWatermarkMachine = Machine<QwWatermarkSchema>;\nexport type QwWatermarkService = Service<QwWatermarkSchema>;\nconst rootId = (scope: QwWatermarkService[\"scope\"]) => `watermark:${scope.id}`;\nconst live = (service: Pick<QwWatermarkService, \"prop\">) => resolveWatermarkState({\n content: service.prop(\"content\"), image: service.prop(\"image\"), width: service.prop(\"width\"), height: service.prop(\"height\"),\n gapX: service.prop(\"gapX\"), gapY: service.prop(\"gapY\"), rotate: service.prop(\"rotate\"), fontSize: service.prop(\"fontSize\"), fullPage: service.prop(\"fullPage\"),\n});\n\n/** Platform boundary: rotate and tile a decoded image on a canvas. Null when canvas is unavailable or tainted. */\nfunction rasterize(doc: Document, img: HTMLImageElement, state: ResolvedWatermarkState): string | null {\n const ratio = Math.max(1, Math.min(3, doc.defaultView?.devicePixelRatio || 1));\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.ceil((state.width + state.gapX) * ratio); canvas.height = Math.ceil((state.height + state.gapY) * ratio);\n try {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.scale(ratio, ratio); ctx.translate(state.width / 2, state.height / 2); ctx.rotate((state.rotate * Math.PI) / 180);\n ctx.drawImage(img, -state.width / 2, -state.height / 2, state.width, state.height);\n return canvas.toDataURL(\"image/png\");\n } catch { return null; }\n}\n\n/** Core owns preloading, fallback, once-per-source error notification and cleanup. */\nexport const watermarkMachine: QwWatermarkMachine = createMachine<QwWatermarkSchema>({\n props: ({ props }) => createWatermarkProps(props), initialState: () => \"ready\", states: { ready: {} },\n context: ({ bindable }) => ({ image: bindable<WatermarkImageResult | null>(() => ({ defaultValue: null, isEqual: (a, b) => a?.key === b?.key && a?.url === b?.url })) }),\n refs: () => ({ load: null, reported: new Set<string>() }),\n watch({ track, prop, action }) {\n track([() => prop(\"image\"), () => prop(\"width\"), () => prop(\"height\"), () => prop(\"gapX\"), () => prop(\"gapY\"), () => prop(\"rotate\")], () => action([\"reload\"]));\n },\n on: { \"IMAGE.LOADED\": { actions: [\"setImage\"] }, \"IMAGE.ERROR\": { actions: [\"reportError\"] } },\n effects: [\"loadImage\"],\n implementations: {\n actions: {\n setImage(params) { if (params.event.type === \"IMAGE.LOADED\") params.context.set(\"image\", params.event.result); },\n reportError({ event, context, refs, prop }) {\n if (event.type !== \"IMAGE.ERROR\") return;\n if (context.get(\"image\")?.src === event.src) context.set(\"image\", null);\n const reported = refs.get(\"reported\");\n if (reported.has(event.src)) return;\n reported.add(event.src); prop(\"onImageError\")?.({ image: event.src });\n },\n reload(params) { params.refs.get(\"load\")?.(); },\n },\n effects: { loadImage({ scope, prop, send, context, refs }) {\n const doc = scope.getDoc(), win = doc?.defaultView;\n if (!doc || !win || typeof win.Image !== \"function\") return;\n let img: HTMLImageElement | null = null, pending: string | undefined, disposed = false;\n const cancel = () => { if (!img) return; img.onload = null; img.onerror = null; img.removeAttribute(\"src\"); img = null; pending = undefined; };\n const load = () => {\n if (disposed) return;\n const state = live({ prop }), key = watermarkImageKey(state);\n if (!key || !state.image) { cancel(); if (context.get(\"image\")) context.set(\"image\", null); return; }\n if (context.get(\"image\")?.key === key || pending === key) return;\n cancel();\n const src = state.image, next = new win.Image();\n next.crossOrigin = \"anonymous\"; next.referrerPolicy = \"no-referrer\"; next.decoding = \"async\";\n next.onload = () => {\n if (disposed || img !== next) return;\n const current = live({ prop }), url = watermarkImageKey(current) === key ? rasterize(doc, next, current) : null;\n img = null; pending = undefined;\n if (url) send({ type: \"IMAGE.LOADED\", result: { src, key, url } }); else send({ type: \"IMAGE.ERROR\", src });\n };\n next.onerror = () => { if (disposed || img !== next) return; img = null; pending = undefined; send({ type: \"IMAGE.ERROR\", src }); };\n img = next; pending = key; next.src = src;\n };\n refs.set(\"load\", load); load();\n return () => { disposed = true; refs.set(\"load\", null); cancel(); };\n } },\n },\n});\n\nexport interface QwWatermarkApi<T extends PropTypes = PropTypes> {\n layer: WatermarkLayerState; fullPage: boolean;\n getRootProps(): T[\"element\"];\n getLayerProps(): T[\"element\"];\n}\nexport function connectWatermark<T extends PropTypes>(service: QwWatermarkService, normalize: NormalizeProps<T>): QwWatermarkApi<T> {\n const state = live(service), image = service.context.get(\"image\"), layer = resolveWatermarkLayer(state, image);\n const size = `${round(state.width + state.gapX)}px ${round(state.height + state.gapY)}px`;\n const style: Record<string, string> = layer === \"image\" && image ? { \"--qw-watermark-image\": cssUrl(image.url), \"--qw-watermark-size\": size }\n : layer === \"text\" ? { \"--qw-watermark-tile\": watermarkTextTileUrl(state)!, \"--qw-watermark-size\": size } : {};\n return {\n layer, fullPage: state.fullPage,\n getRootProps: () => normalize.element({ \"data-scope\": \"watermark\", \"data-part\": \"root\", id: rootId(service.scope), \"data-full-page\": state.fullPage ? \"true\" : undefined }),\n getLayerProps: () => normalize.element({ \"data-scope\": \"watermark\", \"data-part\": \"layer\", \"aria-hidden\": true, \"data-state\": layer, hidden: layer === \"none\" || undefined, style }),\n };\n}\n"],"mappings":"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"}