@qw-ui/core 0.3.0-next.9 → 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,77 @@
1
+ import { ICON_FALLBACK_NAME, ICON_NAME_SET } from "@qw-ui/icons/names";
2
+ import { ICON_VECTORS } from "@qw-ui/icons/vectors";
3
+ //#region src/icon/identity.ts
4
+ function encodeIconIdentity(value) {
5
+ let encoded = "";
6
+ for (let index = 0; index < value.length; index++) encoded += value.charCodeAt(index).toString(16).padStart(4, "0");
7
+ return encoded;
8
+ }
9
+ function formatIconDefinitionId(identity, original) {
10
+ return `qw-icon-${encodeIconIdentity(identity)}--${encodeIconIdentity(original)}`;
11
+ }
12
+ function rewriteIconAttribute(key, value, ids) {
13
+ if (key === "id") return ids.get(value) ?? value;
14
+ if ((key === "href" || key === "xlink:href") && value.startsWith("#")) return `#${ids.get(value.slice(1)) ?? value.slice(1)}`;
15
+ return value.replace(/url\(\s*(['"]?)#([^)'"\s]+)\1\s*\)/g, (original, _quote, id) => ids.has(id) ? `url(#${ids.get(id)})` : original);
16
+ }
17
+ //#endregion
18
+ //#region src/icon/icon.ts
19
+ /** Icon 根部件的共享 data-part 词表。 */
20
+ const ICON_PARTS = ["root"];
21
+ function isProductionBuild() {
22
+ return globalThis.process?.env?.NODE_ENV === "production";
23
+ }
24
+ /**
25
+ * 把动态输入收敛为系统内的稳定名称。未知值始终回退到 component,
26
+ * 只在开发环境记录诊断,避免远端配置错误中断渲染。
27
+ */
28
+ function resolveIconName(name) {
29
+ if (ICON_NAME_SET.has(name)) return name;
30
+ if (!isProductionBuild()) console.warn(`[qw-ui] Unknown icon name "${name}". Falling back to "${ICON_FALLBACK_NAME}".`);
31
+ return ICON_FALLBACK_NAME;
32
+ }
33
+ /** Normalize name once and require the identity used by inline definitions. */
34
+ function resolveIconState(config) {
35
+ if (!config.id.length) throw new Error("Icon requires a nonempty stable instance id");
36
+ return {
37
+ id: config.id,
38
+ name: resolveIconName(config.name),
39
+ ariaLabel: config.ariaLabel
40
+ };
41
+ }
42
+ /** Standard SVG root attributes shared by every adapter. */
43
+ function getIconRootProps(state) {
44
+ return {
45
+ "data-scope": "icon",
46
+ "data-part": "root",
47
+ viewBox: "0 0 24 24",
48
+ width: "1em",
49
+ height: "1em",
50
+ fill: "currentColor",
51
+ focusable: "false",
52
+ "aria-label": state.ariaLabel ?? void 0,
53
+ "aria-hidden": state.ariaLabel ? void 0 : true
54
+ };
55
+ }
56
+ /** Instance-owned safe vector tree, with every local id/reference isolated. */
57
+ function getIconVector(state) {
58
+ const source = ICON_VECTORS[state.name];
59
+ const ids = /* @__PURE__ */ new Map();
60
+ const collect = (nodes) => {
61
+ for (const node of nodes) {
62
+ if (node.attrs.id) ids.set(node.attrs.id, formatIconDefinitionId(state.id, node.attrs.id));
63
+ collect(node.children);
64
+ }
65
+ };
66
+ collect(source);
67
+ const copy = (nodes) => nodes.map((node) => ({
68
+ tag: node.tag,
69
+ attrs: Object.fromEntries(Object.entries(node.attrs).map(([key, value]) => [key, rewriteIconAttribute(key, value, ids)])),
70
+ children: copy(node.children)
71
+ }));
72
+ return copy(source);
73
+ }
74
+ //#endregion
75
+ export { resolveIconName as a, getIconVector as i, ICON_PARTS as n, resolveIconState as o, getIconRootProps as r, ICON_FALLBACK_NAME as t };
76
+
77
+ //# sourceMappingURL=icon-Cgdbnk1u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-Cgdbnk1u.js","names":["runtime"],"sources":["../src/icon/identity.ts","../src/icon/icon.ts"],"sourcesContent":["// Canonical private rules. The fixed-icon generators mechanically emit this file.\n// Fixed-width UTF-16 encoding includes both surrogate code units and is injective.\nexport function encodeIconIdentity(value: string): string {\n let encoded = \"\";\n for (let index = 0; index < value.length; index++) {\n encoded += value.charCodeAt(index).toString(16).padStart(4, \"0\");\n }\n return encoded;\n}\n\nexport function formatIconDefinitionId(identity: string, original: string): string {\n return `qw-icon-${encodeIconIdentity(identity)}--${encodeIconIdentity(original)}`;\n}\n\nexport function rewriteIconAttribute(key: string, value: string, ids: ReadonlyMap<string, string>): string {\n if (key === \"id\") return ids.get(value) ?? value;\n if ((key === \"href\" || key === \"xlink:href\") && value.startsWith(\"#\")) {\n return `#${ids.get(value.slice(1)) ?? value.slice(1)}`;\n }\n return value.replace(/url\\(\\s*(['\"]?)#([^)'\"\\s]+)\\1\\s*\\)/g, (original: string, _quote: string, id: string) => ids.has(id) ? `url(#${ids.get(id)})` : original);\n}\n","import {\n ICON_FALLBACK_NAME,\n ICON_NAME_SET,\n type IconName,\n type IconNameInput,\n} from \"@qw-ui/icons/names\";\nimport { ICON_VECTORS, type IconVectorNode } from \"@qw-ui/icons/vectors\";\nimport { formatIconDefinitionId, rewriteIconAttribute } from \"./identity.js\";\nexport type { IconVectorNode } from \"@qw-ui/icons/vectors\";\n\n/** Icon 根部件的共享 data-part 词表。 */\nexport const ICON_PARTS = [\"root\"] as const;\nexport type IconPart = (typeof ICON_PARTS)[number];\n\nexport type { IconName, IconNameInput };\nexport { ICON_FALLBACK_NAME };\n\nfunction isProductionBuild(): boolean {\n const runtime = globalThis as typeof globalThis & {\n process?: { env?: Record<string, string | undefined> };\n };\n return runtime.process?.env?.NODE_ENV === \"production\";\n}\n\n/**\n * 把动态输入收敛为系统内的稳定名称。未知值始终回退到 component,\n * 只在开发环境记录诊断,避免远端配置错误中断渲染。\n */\nexport function resolveIconName(name: IconNameInput): IconName {\n if (ICON_NAME_SET.has(name as IconName)) return name as IconName;\n if (!isProductionBuild()) {\n console.warn(`[qw-ui] Unknown icon name \"${name}\". Falling back to \"${ICON_FALLBACK_NAME}\".`);\n }\n return ICON_FALLBACK_NAME;\n}\n\n/** Shared Icon input. Identity must be stable across SSR and hydration. */\nexport interface IconConfig {\n /** Nonempty instance identity, separate from a caller's SVG element id. */\n id: string;\n /** Dynamic system name; unknown names use the existing fallback. */\n name: IconNameInput;\n /** Existing label truthiness determines whether the SVG is decorative. */\n ariaLabel?: string | null;\n}\n\n/** Normalized, framework-independent Icon state. */\nexport interface IconState {\n /** Stable instance identity used only for internal vector references. */\n readonly id: string;\n /** Resolved system name. */\n readonly name: IconName;\n /** Unmodified accessible label. */\n readonly ariaLabel?: string | null;\n}\n\n/** Normalize name once and require the identity used by inline definitions. */\nexport function resolveIconState(config: IconConfig): IconState {\n if (!config.id.length) throw new Error(\"Icon requires a nonempty stable instance id\");\n return { id: config.id, name: resolveIconName(config.name), ariaLabel: config.ariaLabel };\n}\n\n/** Standard SVG root attributes shared by every adapter. */\nexport function getIconRootProps(state: IconState) {\n return {\n \"data-scope\": \"icon\" as const,\n \"data-part\": \"root\" as const,\n viewBox: \"0 0 24 24\",\n width: \"1em\",\n height: \"1em\",\n fill: \"currentColor\",\n focusable: \"false\" as const,\n \"aria-label\": state.ariaLabel ?? undefined,\n \"aria-hidden\": state.ariaLabel ? undefined : true,\n };\n}\n\n/** Instance-owned safe vector tree, with every local id/reference isolated. */\nexport function getIconVector(state: IconState): readonly IconVectorNode[] {\n const source = ICON_VECTORS[state.name];\n const ids = new Map<string, string>();\n const collect = (nodes: readonly IconVectorNode[]) => {\n for (const node of nodes) {\n if (node.attrs.id) ids.set(node.attrs.id, formatIconDefinitionId(state.id, node.attrs.id));\n collect(node.children);\n }\n };\n collect(source);\n const copy = (nodes: readonly IconVectorNode[]): IconVectorNode[] => nodes.map(node => ({\n tag: node.tag,\n attrs: Object.fromEntries(Object.entries(node.attrs).map(([key, value]) => [key, rewriteIconAttribute(key, value, ids)])),\n children: copy(node.children),\n }));\n return copy(source);\n}\n"],"mappings":";;;AAEA,SAAgB,mBAAmB,OAAuB;CACxD,IAAI,UAAU;CACd,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SACxC,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;CAEjE,OAAO;AACT;AAEA,SAAgB,uBAAuB,UAAkB,UAA0B;CACjF,OAAO,WAAW,mBAAmB,QAAQ,EAAE,IAAI,mBAAmB,QAAQ;AAChF;AAEA,SAAgB,qBAAqB,KAAa,OAAe,KAA0C;CACzG,IAAI,QAAQ,MAAM,OAAO,IAAI,IAAI,KAAK,KAAK;CAC3C,KAAK,QAAQ,UAAU,QAAQ,iBAAiB,MAAM,WAAW,GAAG,GAClE,OAAO,IAAI,IAAI,IAAI,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC;CAErD,OAAO,MAAM,QAAQ,wCAAwC,UAAkB,QAAgB,OAAe,IAAI,IAAI,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE,EAAE,KAAK,QAAQ;AAC/J;;;;ACTA,MAAa,aAAa,CAAC,MAAM;AAMjC,SAAS,oBAA6B;CAIpC,OAAOA,WAAQ,SAAS,KAAK,aAAa;AAC5C;;;;;AAMA,SAAgB,gBAAgB,MAA+B;CAC7D,IAAI,cAAc,IAAI,IAAgB,GAAG,OAAO;CAChD,IAAI,CAAC,kBAAkB,GACrB,QAAQ,KAAK,8BAA8B,KAAK,sBAAsB,mBAAmB,GAAG;CAE9F,OAAO;AACT;;AAuBA,SAAgB,iBAAiB,QAA+B;CAC9D,IAAI,CAAC,OAAO,GAAG,QAAQ,MAAM,IAAI,MAAM,6CAA6C;CACpF,OAAO;EAAE,IAAI,OAAO;EAAI,MAAM,gBAAgB,OAAO,IAAI;EAAG,WAAW,OAAO;CAAU;AAC1F;;AAGA,SAAgB,iBAAiB,OAAkB;CACjD,OAAO;EACL,cAAc;EACd,aAAa;EACb,SAAS;EACT,OAAO;EACP,QAAQ;EACR,MAAM;EACN,WAAW;EACX,cAAc,MAAM,aAAa,KAAA;EACjC,eAAe,MAAM,YAAY,KAAA,IAAY;CAC/C;AACF;;AAGA,SAAgB,cAAc,OAA6C;CACzE,MAAM,SAAS,aAAa,MAAM;CAClC,MAAM,sBAAM,IAAI,IAAoB;CACpC,MAAM,WAAW,UAAqC;EACpD,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,uBAAuB,MAAM,IAAI,KAAK,MAAM,EAAE,CAAC;GACzF,QAAQ,KAAK,QAAQ;EACvB;CACF;CACA,QAAQ,MAAM;CACd,MAAM,QAAQ,UAAuD,MAAM,KAAI,UAAS;EACtF,KAAK,KAAK;EACV,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,qBAAqB,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC;EACxH,UAAU,KAAK,KAAK,QAAQ;CAC9B,EAAE;CACF,OAAO,KAAK,MAAM;AACpB"}
@@ -0,0 +1,24 @@
1
+ import type { Machine, Service } from "@zag-js/core";
2
+ import { type ImageRequestFrame, type ImageResourceBinding, type QwAvatarLoadApi, type QwAvatarLoadProps, type QwAvatarLoadSchema } from "../avatar/avatar-load.js";
3
+ /** Shared resource model plus Image's existing zero-argument owner notifications. */
4
+ export interface QwImageLoadProps extends QwAvatarLoadProps {
5
+ onLoad?: () => void;
6
+ onError?: () => void;
7
+ /** Adapter lifecycle snapshot, never a guessed cached resource result. */
8
+ initialNotification?: ImageRequestFrame;
9
+ }
10
+ export interface QwImageLoadSchema extends QwAvatarLoadSchema {
11
+ props: QwImageLoadProps;
12
+ context: QwAvatarLoadSchema["context"] & {
13
+ notification: ImageRequestFrame | undefined;
14
+ };
15
+ }
16
+ export type QwImageLoadService = Service<QwImageLoadSchema>;
17
+ export interface QwImageLoadApi extends QwAvatarLoadApi {
18
+ readonly notification: ImageRequestFrame | undefined;
19
+ }
20
+ /** Resource interpretation stays in the shared machine; this wrapper owns Image callback delivery. */
21
+ export declare const imageLoadMachine: Machine<QwImageLoadSchema>;
22
+ /** Reuse the same session/detach resource sink, with no duplicate snapshot interpretation. */
23
+ export declare function createImageResourceBinding(service: QwImageLoadService, frame: ImageRequestFrame): ImageResourceBinding;
24
+ export declare function connectImageLoad(service: QwImageLoadService, frame?: ImageRequestFrame): QwImageLoadApi;
@@ -1,13 +1,11 @@
1
1
  /**
2
2
  * Image 的跨框架行为契约。
3
3
  *
4
- * Image 是无状态的 Prototype A:Core 归一化 props、推导降级模式,
5
- * 生成 root/placeholder/image/fallback 的 data 属性。React/Vue 适配器只投影
6
- * 内容通道并渲染固定 DOM。图片加载状态通过 `data-load-status` 属性由 CSS
7
- * 声明式管理,不参与 Core 状态归一化。与 Avatar 的 `data-load-status` 模式一致。
4
+ * Core 归一化展示、尺寸和可访问语义;同目录 image-load.ts 复用共享Zag资源模型。
5
+ * 三栈适配器只运输资源快照/内容并投影Core结果,不自行解释load/error。
8
6
  */
9
7
  export declare const IMAGE_FITS: readonly ["cover", "contain", "fill", "none", "scale-down"];
10
- export declare const IMAGE_PARTS: readonly ["root", "image", "placeholder", "fallback"];
8
+ export declare const IMAGE_PARTS: readonly ["root", "image", "placeholder", "fallback", "alt-label"];
11
9
  export declare const IMAGE_LOAD_STATUS: readonly ["loading", "loaded", "error"];
12
10
  export type ImageFit = (typeof IMAGE_FITS)[number];
13
11
  export type ImagePart = (typeof IMAGE_PARTS)[number];
@@ -42,6 +40,8 @@ export interface ImageContentPresence {
42
40
  /** 是否提供子元素(覆盖层)。 */
43
41
  hasChildren: boolean;
44
42
  }
43
+ /** Scalar presence is computed once in Core; adapters only report supplied channels. */
44
+ export declare function getImageContentPresence(props: QwImageProps, channels: Readonly<Record<string, boolean>>): ImageContentPresence;
45
45
  /** 适配器唯一可消费的归一化结果。 */
46
46
  export interface ResolvedImageState {
47
47
  fit: ImageFit;
@@ -79,10 +79,47 @@ export interface ImageFallbackProps {
79
79
  /** 将公开输入和内容通道归一化为唯一的跨框架状态。 */
80
80
  export declare function resolveImageState(props?: QwImageProps, presence?: ImageContentPresence): ResolvedImageState;
81
81
  /** 将归一化结果转成 root 属性。 */
82
- export declare function getImageRootProps(state: ResolvedImageState): ImageRootProps;
82
+ export interface ImageRootOptions {
83
+ loadStatus?: ImageLoadStatus;
84
+ lang?: string;
85
+ dir?: string;
86
+ hidden?: boolean;
87
+ }
88
+ export declare function getImageRootProps(state: ResolvedImageState, options?: ImageRootOptions): ImageRootProps & Pick<ImageRootOptions, "lang" | "dir" | "hidden">;
83
89
  /** 将归一化结果转成 placeholder 元素的属性。 */
84
- export declare function getImagePlaceholderProps(): ImagePlaceholderProps;
90
+ export declare function getImagePlaceholderProps(loadStatus?: ImageLoadStatus): ImagePlaceholderProps & {
91
+ hidden?: boolean;
92
+ };
85
93
  /** 将归一化结果转成图片包装元素的属性。 */
86
94
  export declare function getImageImageProps(_state: ResolvedImageState): ImageImageProps;
87
95
  /** 将归一化结果转成降级内容元素的属性。 */
88
- export declare function getImageFallbackProps(state: ResolvedImageState): ImageFallbackProps;
96
+ export declare function getImageFallbackProps(state: ResolvedImageState, options?: {
97
+ alt?: string;
98
+ loadStatus: ImageLoadStatus;
99
+ }): ImageFallbackProps & {
100
+ hidden?: boolean;
101
+ role?: "img";
102
+ "aria-label"?: string;
103
+ };
104
+ /** Caller dimensions override defaults but never leak invalid numeric CSS values. */
105
+ export declare function getImageRootStyle(props: Pick<QwImageProps, "width" | "height">): Record<string, string>;
106
+ export declare function getImageDescriptor(state: ResolvedImageState, src?: string): {
107
+ src: string;
108
+ active: boolean;
109
+ };
110
+ export declare function getImageElementProps(state: ResolvedImageState, options: {
111
+ src?: string;
112
+ alt?: string;
113
+ loadStatus?: ImageLoadStatus;
114
+ }): {
115
+ src: string | undefined;
116
+ alt: string;
117
+ loading: "lazy" | undefined;
118
+ "aria-hidden": boolean | undefined;
119
+ };
120
+ export declare function getImageFallbackLabel(state: ResolvedImageState, alt?: string): string | undefined;
121
+ export declare function getImageFallbackLabelProps(state: ResolvedImageState, alt?: string): {
122
+ "data-scope": string;
123
+ "data-part": string;
124
+ hidden: boolean;
125
+ };
@@ -1 +1,2 @@
1
1
  export * from "./image.js";
2
+ export * from "./image-load.js";
@@ -1,11 +1,10 @@
1
+ import { n as connectAvatarLoad, r as createAvatarResourceBinding, t as avatarLoadMachine } from "../avatar-load-w9dq05oV.js";
1
2
  //#region src/image/image.ts
2
3
  /**
3
4
  * Image 的跨框架行为契约。
4
5
  *
5
- * Image 是无状态的 Prototype A:Core 归一化 props、推导降级模式,
6
- * 生成 root/placeholder/image/fallback 的 data 属性。React/Vue 适配器只投影
7
- * 内容通道并渲染固定 DOM。图片加载状态通过 `data-load-status` 属性由 CSS
8
- * 声明式管理,不参与 Core 状态归一化。与 Avatar 的 `data-load-status` 模式一致。
6
+ * Core 归一化展示、尺寸和可访问语义;同目录 image-load.ts 复用共享Zag资源模型。
7
+ * 三栈适配器只运输资源快照/内容并投影Core结果,不自行解释load/error。
9
8
  */
10
9
  const IMAGE_FITS = [
11
10
  "cover",
@@ -18,13 +17,23 @@ const IMAGE_PARTS = [
18
17
  "root",
19
18
  "image",
20
19
  "placeholder",
21
- "fallback"
20
+ "fallback",
21
+ "alt-label"
22
22
  ];
23
23
  const IMAGE_LOAD_STATUS = [
24
24
  "loading",
25
25
  "loaded",
26
26
  "error"
27
27
  ];
28
+ /** Scalar presence is computed once in Core; adapters only report supplied channels. */
29
+ function getImageContentPresence(props, channels) {
30
+ return {
31
+ hasSrc: typeof props.src === "string" && !!props.src.trim(),
32
+ hasPlaceholder: !!channels.placeholder,
33
+ hasFallback: !!channels.fallback,
34
+ hasChildren: !!channels.default
35
+ };
36
+ }
28
37
  const EMPTY_PRESENCE = {
29
38
  hasSrc: false,
30
39
  hasPlaceholder: false,
@@ -38,7 +47,7 @@ function resolveImageState(props = {}, presence = EMPTY_PRESENCE) {
38
47
  const hasFallback = presence.hasFallback;
39
48
  const hasChildren = presence.hasChildren;
40
49
  return {
41
- fit: props.fit ?? "cover",
50
+ fit: IMAGE_FITS.includes(props.fit) ? props.fit : "cover",
42
51
  hasSrc,
43
52
  hasPlaceholder,
44
53
  hasFallback,
@@ -47,20 +56,23 @@ function resolveImageState(props = {}, presence = EMPTY_PRESENCE) {
47
56
  initialLoadStatus: hasSrc ? "loading" : "error"
48
57
  };
49
58
  }
50
- /** 将归一化结果转成 root 属性。 */
51
- function getImageRootProps(state) {
59
+ function getImageRootProps(state, options = {}) {
52
60
  return {
53
61
  "data-scope": "image",
54
62
  "data-part": "root",
55
63
  "data-fit": state.fit,
56
- "data-load-status": state.initialLoadStatus
64
+ "data-load-status": options.loadStatus ?? state.initialLoadStatus,
65
+ ...options.lang === void 0 ? {} : { lang: options.lang },
66
+ ...options.dir === void 0 ? {} : { dir: options.dir },
67
+ ...options.hidden === void 0 ? {} : { hidden: options.hidden }
57
68
  };
58
69
  }
59
70
  /** 将归一化结果转成 placeholder 元素的属性。 */
60
- function getImagePlaceholderProps() {
71
+ function getImagePlaceholderProps(loadStatus) {
61
72
  return {
62
73
  "data-scope": "image",
63
- "data-part": "placeholder"
74
+ "data-part": "placeholder",
75
+ ...loadStatus === void 0 ? {} : { hidden: loadStatus !== "loading" }
64
76
  };
65
77
  }
66
78
  /** 将归一化结果转成图片包装元素的属性。 */
@@ -71,14 +83,104 @@ function getImageImageProps(_state) {
71
83
  };
72
84
  }
73
85
  /** 将归一化结果转成降级内容元素的属性。 */
74
- function getImageFallbackProps(state) {
86
+ function getImageFallbackProps(state, options) {
87
+ const label = typeof options?.alt === "string" && options.alt.trim() ? options.alt : void 0;
75
88
  return {
76
89
  "data-scope": "image",
77
90
  "data-part": "fallback",
78
- "data-fallback": state.hasFallback ? "custom" : "default"
91
+ "data-fallback": state.hasFallback ? "custom" : "default",
92
+ ...options ? { hidden: options.loadStatus !== "error" } : {},
93
+ ...!state.hasFallback && label ? {
94
+ role: "img",
95
+ "aria-label": label
96
+ } : {}
97
+ };
98
+ }
99
+ /** Caller dimensions override defaults but never leak invalid numeric CSS values. */
100
+ function getImageRootStyle(props) {
101
+ const result = {};
102
+ for (const key of ["width", "height"]) {
103
+ const value = props[key];
104
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) result[`--qw-image-${key}`] = `${value}px`;
105
+ else if (typeof value === "string" && value.trim() && !/^(?:NaN|[+-]?Infinity)$/i.test(value.trim())) result[`--qw-image-${key}`] = value;
106
+ }
107
+ return result;
108
+ }
109
+ function getImageDescriptor(state, src) {
110
+ return {
111
+ src: typeof src === "string" ? src : "",
112
+ active: state.hasSrc
113
+ };
114
+ }
115
+ function getImageElementProps(state, options) {
116
+ return {
117
+ src: options.src,
118
+ alt: options.alt ?? "",
119
+ loading: state.lazy ? "lazy" : void 0,
120
+ "aria-hidden": options.loadStatus === "error" ? true : void 0
121
+ };
122
+ }
123
+ function getImageFallbackLabel(state, alt) {
124
+ return state.hasFallback && typeof alt === "string" && alt.trim() ? alt : void 0;
125
+ }
126
+ function getImageFallbackLabelProps(state, alt) {
127
+ return {
128
+ "data-scope": "image",
129
+ "data-part": "alt-label",
130
+ hidden: !getImageFallbackLabel(state, alt)
131
+ };
132
+ }
133
+ //#endregion
134
+ //#region src/image/image-load.ts
135
+ const sameFrame = (a, b) => a?.epoch === b.epoch && a.src === b.src;
136
+ const base = avatarLoadMachine;
137
+ /** Resource interpretation stays in the shared machine; this wrapper owns Image callback delivery. */
138
+ const imageLoadMachine = {
139
+ ...base,
140
+ props(params) {
141
+ return {
142
+ ...base.props(params),
143
+ onLoad: params.props.onLoad,
144
+ onError: params.props.onError,
145
+ initialNotification: params.props.initialNotification
146
+ };
147
+ },
148
+ context(params) {
149
+ return {
150
+ ...base.context(params),
151
+ notification: params.bindable(() => ({
152
+ defaultValue: params.prop("initialNotification"),
153
+ isEqual: (a, b) => a?.epoch === b?.epoch && a?.src === b?.src,
154
+ hash: (value) => value ? `${value.epoch}:${value.src}` : ""
155
+ }))
156
+ };
157
+ },
158
+ watch(params) {
159
+ base.watch?.(params);
160
+ params.track([() => {
161
+ const value = params.context.get("result");
162
+ return value ? `${value.epoch}:${value.src}:${value.status}` : "";
163
+ }], () => {
164
+ const frame = params.prop("frame"), result = params.context.get("result");
165
+ if (!params.refs.get("active") || !frame.active || !result || result.status === "loading" || !sameFrame(result, frame) || sameFrame(params.context.get("notification"), frame)) return;
166
+ params.context.set("notification", Object.freeze({ ...frame }));
167
+ if (result.status === "loaded") params.prop("onLoad")?.();
168
+ else params.prop("onError")?.();
169
+ });
170
+ }
171
+ };
172
+ /** Reuse the same session/detach resource sink, with no duplicate snapshot interpretation. */
173
+ function createImageResourceBinding(service, frame) {
174
+ return createAvatarResourceBinding(service, frame);
175
+ }
176
+ function connectImageLoad(service, frame = service.prop("frame")) {
177
+ return {
178
+ ...connectAvatarLoad(service, frame),
179
+ notification: service.context.get("notification"),
180
+ bindResource: () => createImageResourceBinding(service, frame)
79
181
  };
80
182
  }
81
183
  //#endregion
82
- export { IMAGE_FITS, IMAGE_LOAD_STATUS, IMAGE_PARTS, getImageFallbackProps, getImageImageProps, getImagePlaceholderProps, getImageRootProps, resolveImageState };
184
+ export { IMAGE_FITS, IMAGE_LOAD_STATUS, IMAGE_PARTS, connectImageLoad, createImageResourceBinding, getImageContentPresence, getImageDescriptor, getImageElementProps, getImageFallbackLabel, getImageFallbackLabelProps, getImageFallbackProps, getImageImageProps, getImagePlaceholderProps, getImageRootProps, getImageRootStyle, imageLoadMachine, resolveImageState };
83
185
 
84
186
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/image/image.ts"],"sourcesContent":["/**\n * Image 的跨框架行为契约。\n *\n * Image 是无状态的 Prototype A:Core 归一化 props、推导降级模式,\n * 生成 root/placeholder/image/fallback 的 data 属性。React/Vue 适配器只投影\n * 内容通道并渲染固定 DOM。图片加载状态通过 `data-load-status` 属性由 CSS\n * 声明式管理,不参与 Core 状态归一化。与 Avatar 的 `data-load-status` 模式一致。\n */\n\nexport const IMAGE_FITS = [\"cover\", \"contain\", \"fill\", \"none\", \"scale-down\"] as const;\nexport const IMAGE_PARTS = [\"root\", \"image\", \"placeholder\", \"fallback\"] as const;\nexport const IMAGE_LOAD_STATUS = [\"loading\", \"loaded\", \"error\"] as const;\n\nexport type ImageFit = (typeof IMAGE_FITS)[number];\nexport type ImagePart = (typeof IMAGE_PARTS)[number];\nexport type ImageLoadStatus = (typeof IMAGE_LOAD_STATUS)[number];\n\n/** 双栈共享的标量 props;框架特有的内容通道不进入 Core。 */\nexport interface QwImageProps {\n /** 图片源地址。空字符串或 undefined 时不渲染 img,直接进入降级。 */\n src?: string;\n /** 替代文本。传入时作为 img alt 属性;未传入时默认空字符串(装饰性图片)。 */\n alt?: string;\n /** object-fit 模式,默认 `cover`。 */\n fit?: ImageFit;\n /** 是否启用原生懒加载,默认 `false`。 */\n lazy?: boolean;\n /** 容器宽度(string | number)。 */\n width?: string | number;\n /** 容器高度(string | number)。 */\n height?: string | number;\n /** 图片加载成功回调。 */\n onLoad?: () => void;\n /** 图片加载失败回调。 */\n onError?: () => void;\n}\n\n/** 由各框架的内容通道存在性计算;不检查 DOM 或 VNode 内容。 */\nexport interface ImageContentPresence {\n /** 是否提供有效 `src`(非空字符串)。 */\n hasSrc: boolean;\n /** 是否提供自定义 placeholder。 */\n hasPlaceholder: boolean;\n /** 是否提供自定义 fallback。 */\n hasFallback: boolean;\n /** 是否提供子元素(覆盖层)。 */\n hasChildren: boolean;\n}\n\n/** 适配器唯一可消费的归一化结果。 */\nexport interface ResolvedImageState {\n fit: ImageFit;\n hasSrc: boolean;\n hasPlaceholder: boolean;\n hasFallback: boolean;\n hasChildren: boolean;\n lazy: boolean;\n /** 初始加载状态(有 src 时 `loading`,无 src 时 `error`)。 */\n initialLoadStatus: ImageLoadStatus;\n}\n\n/** Core 生成、由适配器覆盖到根元素的属性。 */\nexport interface ImageRootProps {\n \"data-scope\": \"image\";\n \"data-part\": \"root\";\n \"data-fit\": ImageFit;\n \"data-load-status\": ImageLoadStatus;\n}\n\n/** Core 生成、由适配器覆盖到 placeholder 元素的属性。 */\nexport interface ImagePlaceholderProps {\n \"data-scope\": \"image\";\n \"data-part\": \"placeholder\";\n}\n\n/** Core 生成、由适配器覆盖到图片包装元素的属性。 */\nexport interface ImageImageProps {\n \"data-scope\": \"image\";\n \"data-part\": \"image\";\n}\n\n/** Core 生成、由适配器覆盖到降级内容元素的属性。 */\nexport interface ImageFallbackProps {\n \"data-scope\": \"image\";\n \"data-part\": \"fallback\";\n \"data-fallback\": \"default\" | \"custom\";\n}\n\nconst EMPTY_PRESENCE: ImageContentPresence = {\n hasSrc: false,\n hasPlaceholder: false,\n hasFallback: false,\n hasChildren: false,\n};\n\n/** 将公开输入和内容通道归一化为唯一的跨框架状态。 */\nexport function resolveImageState(\n props: QwImageProps = {},\n presence: ImageContentPresence = EMPTY_PRESENCE,\n): ResolvedImageState {\n const hasSrc = presence.hasSrc;\n const hasPlaceholder = presence.hasPlaceholder;\n const hasFallback = presence.hasFallback;\n const hasChildren = presence.hasChildren;\n\n return {\n fit: props.fit ?? \"cover\",\n hasSrc,\n hasPlaceholder,\n hasFallback,\n hasChildren,\n lazy: props.lazy ?? false,\n initialLoadStatus: hasSrc ? \"loading\" : \"error\",\n };\n}\n\n/** 将归一化结果转成 root 属性。 */\nexport function getImageRootProps(state: ResolvedImageState): ImageRootProps {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"root\",\n \"data-fit\": state.fit,\n \"data-load-status\": state.initialLoadStatus,\n };\n}\n\n/** 将归一化结果转成 placeholder 元素的属性。 */\nexport function getImagePlaceholderProps(): ImagePlaceholderProps {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"placeholder\",\n };\n}\n\n/** 将归一化结果转成图片包装元素的属性。 */\nexport function getImageImageProps(_state: ResolvedImageState): ImageImageProps {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"image\",\n };\n}\n\n/** 将归一化结果转成降级内容元素的属性。 */\nexport function getImageFallbackProps(state: ResolvedImageState): ImageFallbackProps {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"fallback\",\n \"data-fallback\": state.hasFallback ? \"custom\" : \"default\",\n };\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,aAAa;CAAC;CAAS;CAAW;CAAQ;CAAQ;AAAY;AAC3E,MAAa,cAAc;CAAC;CAAQ;CAAS;CAAe;AAAU;AACtE,MAAa,oBAAoB;CAAC;CAAW;CAAU;AAAO;AA6E9D,MAAM,iBAAuC;CAC3C,QAAQ;CACR,gBAAgB;CAChB,aAAa;CACb,aAAa;AACf;;AAGA,SAAgB,kBACd,QAAsB,CAAC,GACvB,WAAiC,gBACb;CACpB,MAAM,SAAS,SAAS;CACxB,MAAM,iBAAiB,SAAS;CAChC,MAAM,cAAc,SAAS;CAC7B,MAAM,cAAc,SAAS;CAE7B,OAAO;EACL,KAAK,MAAM,OAAO;EAClB;EACA;EACA;EACA;EACA,MAAM,MAAM,QAAQ;EACpB,mBAAmB,SAAS,YAAY;CAC1C;AACF;;AAGA,SAAgB,kBAAkB,OAA2C;CAC3E,OAAO;EACL,cAAc;EACd,aAAa;EACb,YAAY,MAAM;EAClB,oBAAoB,MAAM;CAC5B;AACF;;AAGA,SAAgB,2BAAkD;CAChE,OAAO;EACL,cAAc;EACd,aAAa;CACf;AACF;;AAGA,SAAgB,mBAAmB,QAA6C;CAC9E,OAAO;EACL,cAAc;EACd,aAAa;CACf;AACF;;AAGA,SAAgB,sBAAsB,OAA+C;CACnF,OAAO;EACL,cAAc;EACd,aAAa;EACb,iBAAiB,MAAM,cAAc,WAAW;CAClD;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/image/image.ts","../../src/image/image-load.ts"],"sourcesContent":["/**\n * Image 的跨框架行为契约。\n *\n * Core 归一化展示、尺寸和可访问语义;同目录 image-load.ts 复用共享Zag资源模型。\n * 三栈适配器只运输资源快照/内容并投影Core结果,不自行解释load/error。\n */\n\nexport const IMAGE_FITS = [\"cover\", \"contain\", \"fill\", \"none\", \"scale-down\"] as const;\nexport const IMAGE_PARTS = [\"root\", \"image\", \"placeholder\", \"fallback\", \"alt-label\"] as const;\nexport const IMAGE_LOAD_STATUS = [\"loading\", \"loaded\", \"error\"] as const;\n\nexport type ImageFit = (typeof IMAGE_FITS)[number];\nexport type ImagePart = (typeof IMAGE_PARTS)[number];\nexport type ImageLoadStatus = (typeof IMAGE_LOAD_STATUS)[number];\n\n/** 双栈共享的标量 props;框架特有的内容通道不进入 Core。 */\nexport interface QwImageProps {\n /** 图片源地址。空字符串或 undefined 时不渲染 img,直接进入降级。 */\n src?: string;\n /** 替代文本。传入时作为 img alt 属性;未传入时默认空字符串(装饰性图片)。 */\n alt?: string;\n /** object-fit 模式,默认 `cover`。 */\n fit?: ImageFit;\n /** 是否启用原生懒加载,默认 `false`。 */\n lazy?: boolean;\n /** 容器宽度(string | number)。 */\n width?: string | number;\n /** 容器高度(string | number)。 */\n height?: string | number;\n /** 图片加载成功回调。 */\n onLoad?: () => void;\n /** 图片加载失败回调。 */\n onError?: () => void;\n}\n\n/** 由各框架的内容通道存在性计算;不检查 DOM 或 VNode 内容。 */\nexport interface ImageContentPresence {\n /** 是否提供有效 `src`(非空字符串)。 */\n hasSrc: boolean;\n /** 是否提供自定义 placeholder。 */\n hasPlaceholder: boolean;\n /** 是否提供自定义 fallback。 */\n hasFallback: boolean;\n /** 是否提供子元素(覆盖层)。 */\n hasChildren: boolean;\n}\n/** Scalar presence is computed once in Core; adapters only report supplied channels. */\nexport function getImageContentPresence(props:QwImageProps,channels:Readonly<Record<string,boolean>>):ImageContentPresence {\n return {hasSrc:typeof props.src===\"string\" && !!props.src.trim(),hasPlaceholder:!!channels.placeholder,hasFallback:!!channels.fallback,hasChildren:!!channels.default};\n}\n\n/** 适配器唯一可消费的归一化结果。 */\nexport interface ResolvedImageState {\n fit: ImageFit;\n hasSrc: boolean;\n hasPlaceholder: boolean;\n hasFallback: boolean;\n hasChildren: boolean;\n lazy: boolean;\n /** 初始加载状态(有 src 时 `loading`,无 src 时 `error`)。 */\n initialLoadStatus: ImageLoadStatus;\n}\n\n/** Core 生成、由适配器覆盖到根元素的属性。 */\nexport interface ImageRootProps {\n \"data-scope\": \"image\";\n \"data-part\": \"root\";\n \"data-fit\": ImageFit;\n \"data-load-status\": ImageLoadStatus;\n}\n\n/** Core 生成、由适配器覆盖到 placeholder 元素的属性。 */\nexport interface ImagePlaceholderProps {\n \"data-scope\": \"image\";\n \"data-part\": \"placeholder\";\n}\n\n/** Core 生成、由适配器覆盖到图片包装元素的属性。 */\nexport interface ImageImageProps {\n \"data-scope\": \"image\";\n \"data-part\": \"image\";\n}\n\n/** Core 生成、由适配器覆盖到降级内容元素的属性。 */\nexport interface ImageFallbackProps {\n \"data-scope\": \"image\";\n \"data-part\": \"fallback\";\n \"data-fallback\": \"default\" | \"custom\";\n}\n\nconst EMPTY_PRESENCE: ImageContentPresence = {\n hasSrc: false,\n hasPlaceholder: false,\n hasFallback: false,\n hasChildren: false,\n};\n\n/** 将公开输入和内容通道归一化为唯一的跨框架状态。 */\nexport function resolveImageState(\n props: QwImageProps = {},\n presence: ImageContentPresence = EMPTY_PRESENCE,\n): ResolvedImageState {\n const hasSrc = presence.hasSrc;\n const hasPlaceholder = presence.hasPlaceholder;\n const hasFallback = presence.hasFallback;\n const hasChildren = presence.hasChildren;\n\n return {\n fit: IMAGE_FITS.includes(props.fit!) ? props.fit! : \"cover\",\n hasSrc,\n hasPlaceholder,\n hasFallback,\n hasChildren,\n lazy: props.lazy ?? false,\n initialLoadStatus: hasSrc ? \"loading\" : \"error\",\n };\n}\n\n/** 将归一化结果转成 root 属性。 */\nexport interface ImageRootOptions {loadStatus?:ImageLoadStatus;lang?:string;dir?:string;hidden?:boolean}\nexport function getImageRootProps(state: ResolvedImageState,options:ImageRootOptions={}): ImageRootProps & Pick<ImageRootOptions,\"lang\"|\"dir\"|\"hidden\"> {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"root\",\n \"data-fit\": state.fit,\n \"data-load-status\": options.loadStatus ?? state.initialLoadStatus,\n ...(options.lang===undefined?{}:{lang:options.lang}),...(options.dir===undefined?{}:{dir:options.dir}),...(options.hidden===undefined?{}:{hidden:options.hidden}),\n };\n}\n\n/** 将归一化结果转成 placeholder 元素的属性。 */\nexport function getImagePlaceholderProps(loadStatus?:ImageLoadStatus): ImagePlaceholderProps & {hidden?:boolean} {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"placeholder\",\n ...(loadStatus===undefined?{}:{hidden:loadStatus!==\"loading\"}),\n };\n}\n\n/** 将归一化结果转成图片包装元素的属性。 */\nexport function getImageImageProps(_state: ResolvedImageState): ImageImageProps {\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"image\",\n };\n}\n\n/** 将归一化结果转成降级内容元素的属性。 */\nexport function getImageFallbackProps(state: ResolvedImageState,options?:{alt?:string;loadStatus:ImageLoadStatus}): ImageFallbackProps & {hidden?:boolean;role?:\"img\";\"aria-label\"?:string} {\n const label=typeof options?.alt===\"string\" && options.alt.trim()?options.alt:undefined;\n return {\n \"data-scope\": \"image\",\n \"data-part\": \"fallback\",\n \"data-fallback\": state.hasFallback ? \"custom\" : \"default\",\n ...(options?{hidden:options.loadStatus!==\"error\"}:{}),\n ...(!state.hasFallback && label?{role:\"img\" as const,\"aria-label\":label}:{}),\n };\n}\n/** Caller dimensions override defaults but never leak invalid numeric CSS values. */\nexport function getImageRootStyle(props:Pick<QwImageProps,\"width\"|\"height\">):Record<string,string>{\n const result:Record<string,string>={};\n for(const key of [\"width\",\"height\"] as const){const value=props[key];\n if(typeof value===\"number\" && Number.isFinite(value) && value>=0)result[`--qw-image-${key}`]=`${value}px`;\n else if(typeof value===\"string\" && value.trim() && !/^(?:NaN|[+-]?Infinity)$/i.test(value.trim()))result[`--qw-image-${key}`]=value;\n }return result;\n}\nexport function getImageDescriptor(state:ResolvedImageState,src?:string):{src:string;active:boolean}{return {src:typeof src===\"string\"?src:\"\",active:state.hasSrc};}\nexport function getImageElementProps(state:ResolvedImageState,options:{src?:string;alt?:string;loadStatus?:ImageLoadStatus}){\n return {src:options.src,alt:options.alt??\"\",loading:state.lazy?\"lazy\" as const:undefined,\"aria-hidden\":options.loadStatus===\"error\"?true:undefined};\n}\nexport function getImageFallbackLabel(state:ResolvedImageState,alt?:string):string|undefined{return state.hasFallback && typeof alt===\"string\" && alt.trim()?alt:undefined;}\nexport function getImageFallbackLabelProps(state:ResolvedImageState,alt?:string){return {\"data-scope\":\"image\",\"data-part\":\"alt-label\",hidden:!getImageFallbackLabel(state,alt)};}\n","import type { Machine, Service } from \"@zag-js/core\";\nimport { avatarLoadMachine, connectAvatarLoad, createAvatarResourceBinding, type ImageRequestFrame, type ImageResourceBinding, type QwAvatarLoadApi, type QwAvatarLoadProps, type QwAvatarLoadSchema, type QwAvatarLoadService } from \"../avatar/avatar-load.js\";\n\n/** Shared resource model plus Image's existing zero-argument owner notifications. */\nexport interface QwImageLoadProps extends QwAvatarLoadProps {\n onLoad?:()=>void; onError?:()=>void;\n /** Adapter lifecycle snapshot, never a guessed cached resource result. */\n initialNotification?:ImageRequestFrame;\n}\nexport interface QwImageLoadSchema extends QwAvatarLoadSchema {\n props:QwImageLoadProps;\n context:QwAvatarLoadSchema[\"context\"] & {notification:ImageRequestFrame|undefined};\n}\nexport type QwImageLoadService=Service<QwImageLoadSchema>;\nexport interface QwImageLoadApi extends QwAvatarLoadApi {readonly notification:ImageRequestFrame|undefined}\nconst sameFrame=(a:Pick<ImageRequestFrame,\"epoch\"|\"src\">|undefined,b:ImageRequestFrame)=>a?.epoch===b.epoch && a.src===b.src;\nconst base=avatarLoadMachine as unknown as Machine<QwImageLoadSchema>;\n/** Resource interpretation stays in the shared machine; this wrapper owns Image callback delivery. */\nexport const imageLoadMachine:Machine<QwImageLoadSchema>={\n ...base,\n props(params){return {...base.props!(params),onLoad:params.props.onLoad,onError:params.props.onError,initialNotification:params.props.initialNotification};},\n context(params){return {...base.context!(params),notification:params.bindable<ImageRequestFrame|undefined>(()=>({defaultValue:params.prop(\"initialNotification\"),isEqual:(a,b)=>a?.epoch===b?.epoch && a?.src===b?.src,hash:value=>value ? `${value.epoch}:${value.src}` : \"\"}))};},\n watch(params){\n base.watch?.(params);\n params.track([()=>{const value=params.context.get(\"result\");return value ? `${value.epoch}:${value.src}:${value.status}` : \"\";}],()=>{\n const frame=params.prop(\"frame\"),result=params.context.get(\"result\");\n if(!params.refs.get(\"active\") || !frame.active || !result || result.status===\"loading\" || !sameFrame(result,frame) || sameFrame(params.context.get(\"notification\"),frame))return;\n params.context.set(\"notification\",Object.freeze({...frame}));\n if(result.status===\"loaded\")params.prop(\"onLoad\")?.();else params.prop(\"onError\")?.();\n });\n },\n};\n/** Reuse the same session/detach resource sink, with no duplicate snapshot interpretation. */\nexport function createImageResourceBinding(service:QwImageLoadService,frame:ImageRequestFrame):ImageResourceBinding {\n return createAvatarResourceBinding(service as unknown as QwAvatarLoadService,frame);\n}\nexport function connectImageLoad(service:QwImageLoadService,frame=service.prop(\"frame\")):QwImageLoadApi {\n const api=connectAvatarLoad(service as unknown as QwAvatarLoadService,frame);\n return {...api,notification:service.context.get(\"notification\"),bindResource:()=>createImageResourceBinding(service,frame)};\n}\n"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import { type Machine, type Service } from "@zag-js/core";
2
+ import type { NormalizeProps, PropTypes } from "@zag-js/types";
3
+ import type { QwPopupProps } from "../popup/popup.js";
4
+ import { type QwSwiperProps } from "../swiper/swiper.js";
5
+ export interface ImagePreviewImage {
6
+ src: string;
7
+ alt: string;
8
+ }
9
+ export interface ImagePreviewIndexDetails {
10
+ index: number;
11
+ }
12
+ export interface QwImagePreviewProps extends Omit<QwPopupProps, "placement"> {
13
+ /** Locale on the immediate Popup host; arbitrary outer ancestors are not copied into its portal. */
14
+ lang?: string;
15
+ dir?: string;
16
+ /** Up to 12 images (the shared native Swiper channel domain); alt is always visible to assistive technology. */
17
+ images?: readonly ImagePreviewImage[];
18
+ index?: number;
19
+ defaultIndex?: number;
20
+ loop?: boolean;
21
+ /** Finite upper zoom, clamped to 1–6; default 3. */
22
+ maxZoom?: number;
23
+ prevLabel?: string;
24
+ nextLabel?: string;
25
+ zoomInLabel?: string;
26
+ zoomOutLabel?: string;
27
+ resetLabel?: string;
28
+ loadingText?: string;
29
+ errorText?: string;
30
+ retryText?: string;
31
+ onIndexChange?: (details: ImagePreviewIndexDetails) => void;
32
+ }
33
+ export interface PreviewTransform {
34
+ scale: number;
35
+ x: number;
36
+ y: number;
37
+ }
38
+ interface PointerPoint {
39
+ x: number;
40
+ y: number;
41
+ }
42
+ interface Gesture {
43
+ points: Map<number, PointerPoint>;
44
+ distance: number;
45
+ scale: number;
46
+ x: number;
47
+ y: number;
48
+ originX: number;
49
+ originY: number;
50
+ }
51
+ export interface QwImagePreviewSchema {
52
+ props: QwImagePreviewProps;
53
+ context: {
54
+ open: boolean;
55
+ index: number;
56
+ transform: PreviewTransform;
57
+ status: "loading" | "loaded" | "error";
58
+ revision: number;
59
+ };
60
+ refs: {
61
+ gesture: Gesture;
62
+ syncResource: (() => void) | undefined;
63
+ };
64
+ state: "ready";
65
+ effect: "trackResources";
66
+ action: "open" | "index" | "transform" | "resource" | "reset" | "retry" | "sync";
67
+ event: {
68
+ type: "OPEN";
69
+ open: boolean;
70
+ } | {
71
+ type: "INDEX";
72
+ index: number;
73
+ } | {
74
+ type: "TRANSFORM";
75
+ value: PreviewTransform;
76
+ width?: number;
77
+ height?: number;
78
+ } | {
79
+ type: "RESOURCE";
80
+ src: string;
81
+ revision: number;
82
+ status: "loaded" | "error";
83
+ } | {
84
+ type: "RESET";
85
+ } | {
86
+ type: "RETRY";
87
+ } | {
88
+ type: "SYNC";
89
+ };
90
+ }
91
+ export type QwImagePreviewService = Service<QwImagePreviewSchema>;
92
+ export declare function resolveImagePreviewMaxZoom(value?: number): number;
93
+ export declare function resolveImagePreviewImages(images?: readonly ImagePreviewImage[]): readonly ImagePreviewImage[];
94
+ export declare function clampImagePreviewTransform(value: PreviewTransform, maxZoom: number, width?: number, height?: number): PreviewTransform;
95
+ export declare function createImagePreviewProps(props?: QwImagePreviewProps): QwImagePreviewProps;
96
+ export declare const imagePreviewMachine: Machine<QwImagePreviewSchema>;
97
+ export declare function connectImagePreview<T extends PropTypes>(service: QwImagePreviewService, normalize: NormalizeProps<T>): {
98
+ images: readonly ImagePreviewImage[];
99
+ index: number;
100
+ open: boolean;
101
+ status: "error" | "loaded" | "loading";
102
+ revision: number;
103
+ transform: PreviewTransform;
104
+ popupProps: QwPopupProps;
105
+ swiperProps: QwSwiperProps;
106
+ statusText: string;
107
+ retryText: string;
108
+ counter: string;
109
+ reset: () => void;
110
+ setOpen: (next: boolean) => void;
111
+ setIndex: (next: number) => void;
112
+ getRootProps: () => T["element"];
113
+ getCounterProps: () => T["element"];
114
+ getControlsProps: () => T["element"];
115
+ getZoomInProps: () => T["button"];
116
+ getZoomOutProps: () => T["button"];
117
+ getResetProps: () => T["button"];
118
+ getStatusProps: () => T["element"];
119
+ getRetryProps: () => T["button"];
120
+ getImageProps(imageIndex: number): T["element"];
121
+ getStageProps(imageIndex: number): T["element"];
122
+ };
123
+ export type QwImagePreviewApi<T extends PropTypes = PropTypes> = ReturnType<typeof connectImagePreview<T>>;
124
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./image-preview.js";