@qw-ui/core 0.3.0-next.4 → 0.3.0-next.42

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":"collapse-B969h7-H.js","names":[],"sources":["../src/collapse/collapse.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport { dataAttr } from \"@zag-js/dom-query\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\nimport { selectionItemKey } from \"../selection.js\";\nimport { resolveIconState, type IconState } from \"../icon/index.js\";\n\n/** Stable DOM parts shared by every adapter. */\nexport const COLLAPSE_PARTS = [\"root\", \"item\", \"heading\", \"trigger\", \"title\", \"arrow\", \"content\", \"body\"] as const;\n/** Allowed heading levels for panel headers; default 3. */\nexport const COLLAPSE_HEADING_LEVELS = [2, 3, 4, 5, 6] as const;\nexport type CollapsePart = (typeof COLLAPSE_PARTS)[number];\nexport type CollapseHeadingLevel = (typeof COLLAPSE_HEADING_LEVELS)[number];\n/** One disclosure panel. `title` is the header button's accessible name. */\nexport interface QwCollapseItem {\n key: string;\n title: string;\n /** Plain text body; adapters may project rich content instead. */\n content?: string;\n disabled?: boolean;\n}\nexport interface CollapseValueChangeDetails { value: string[] }\nexport interface QwCollapseProps {\n id?: string;\n items: QwCollapseItem[];\n /** At most one open panel; opening another closes the previous one. */\n accordion?: boolean;\n /** Controlled open keys (including []). User toggles only request changes. */\n value?: string[];\n /** Initial open keys. Defaults []. */\n defaultValue?: string[];\n /** Disable every header. Open panels stay open. */\n disabled?: boolean;\n /** Heading level wrapping each header button; 2–6, default 3. */\n headingLevel?: number;\n /** ArrowUp/ArrowDown wrap between headers; defaults true. */\n loop?: boolean;\n onValueChange?: (details: CollapseValueChangeDetails) => void;\n}\nexport interface QwCollapseSchema {\n props: QwCollapseProps & { accordion: boolean; defaultValue: string[]; headingLevel: CollapseHeadingLevel; loop: boolean };\n context: { value: string[] };\n state: \"ready\";\n action: \"toggle\" | \"setValue\" | \"normalizeMode\";\n event: { type: \"VALUE.TOGGLE\"; value: string } | { type: \"VALUE.SET\"; value: string[] };\n}\nexport type QwCollapseMachine = Machine<QwCollapseSchema>;\nexport type QwCollapseService = Service<QwCollapseSchema>;\nexport interface QwCollapseItemProps { key: string }\nexport interface QwCollapseItemState { open: boolean; disabled: boolean }\n\nexport function normalizeCollapseItems(items: readonly QwCollapseItem[]): QwCollapseItem[] {\n const seen = new Set<string>();\n return items.map((item) => {\n if (typeof item.key !== \"string\" || !item.key.length) throw new TypeError(\"Collapse item keys must be nonempty strings\");\n if (seen.has(item.key)) throw new TypeError(\"Collapse item keys must be unique\");\n if (typeof item.title !== \"string\" || !item.title.trim()) throw new TypeError(\"Collapse item titles must be nonempty accessible text\");\n seen.add(item.key);\n return { ...item };\n });\n}\n/** Ordered unique keys; accordion keeps the first. Unknown keys are retained. */\nexport function normalizeCollapseValue(value: readonly string[] = [], accordion = false): string[] {\n if (value.some((key) => typeof key !== \"string\" || !key.length)) throw new TypeError(\"Collapse values must be nonempty strings\");\n const keys = [...new Set(value)];\n return accordion ? keys.slice(0, 1) : keys;\n}\nexport function resolveCollapseHeadingLevel(level: unknown): CollapseHeadingLevel {\n return (COLLAPSE_HEADING_LEVELS as readonly unknown[]).includes(level) ? level as CollapseHeadingLevel : 3;\n}\nexport function createCollapseProps(props: QwCollapseProps): QwCollapseSchema[\"props\"] {\n if (props.id !== undefined && (typeof props.id !== \"string\" || !props.id.trim())) throw new TypeError(\"Collapse requires a nonempty instance id when provided\");\n const accordion = !!props.accordion;\n return { ...props, accordion, items: normalizeCollapseItems(props.items ?? []), value: props.value === undefined ? undefined : normalizeCollapseValue(props.value, accordion),\n defaultValue: normalizeCollapseValue(props.defaultValue, accordion), headingLevel: resolveCollapseHeadingLevel(props.headingLevel), loop: props.loop ?? true };\n}\n/** Pure toggle rule used by the machine. Returns null when blocked. */\nexport function toggleCollapseValue(value: readonly string[], item: QwCollapseItem, options: { accordion?: boolean; disabled?: boolean } = {}): string[] | null {\n if (options.disabled || item.disabled) return null;\n const keys = normalizeCollapseValue(value, options.accordion);\n if (keys.includes(item.key)) return keys.filter((key) => key !== item.key);\n return options.accordion ? [item.key] : [...keys, item.key];\n}\n\nconst same = (a: string[], b: string[] | undefined) => !!b && a.length === b.length && a.every((value, index) => value === b[index]);\nconst rootId = (service: Pick<QwCollapseService, \"scope\">) => `collapse:${service.scope.id}`;\nconst partId = (service: Pick<QwCollapseService, \"scope\">, part: string, key: string) => `${rootId(service)}:${part}:${selectionItemKey(key)}`;\n\n/** One Zag bindable lifecycle; Core owns toggling, accordion exclusivity and header focus moves. */\nexport const collapseMachine: QwCollapseMachine = createMachine<QwCollapseSchema>({\n props: ({ props }) => createCollapseProps({ ...props, items: props.items ?? [] }),\n initialState: () => \"ready\",\n context({ prop, bindable }) {\n return { value: bindable(() => ({ defaultValue: prop(\"defaultValue\"), value: prop(\"value\"), isEqual: same, onChange: (value) => prop(\"onValueChange\")?.({ value: [...value] }) })) };\n },\n watch({ track, prop, action }) { track([() => prop(\"accordion\")], () => action([\"normalizeMode\"])); },\n on: { \"VALUE.TOGGLE\": { actions: [\"toggle\"] }, \"VALUE.SET\": { actions: [\"setValue\"] } },\n states: { ready: {} },\n implementations: { actions: {\n toggle({ event, prop, context }) {\n if (event.type !== \"VALUE.TOGGLE\") return;\n const item = prop(\"items\").find((entry) => entry.key === event.value);\n const next = item && toggleCollapseValue(context.get(\"value\"), item, { accordion: prop(\"accordion\"), disabled: prop(\"disabled\") });\n if (next) context.set(\"value\", next);\n },\n setValue({ event, prop, context }) { if (event.type === \"VALUE.SET\") context.set(\"value\", normalizeCollapseValue(event.value, prop(\"accordion\"))); },\n normalizeMode({ prop, context }) { context.set(\"value\", normalizeCollapseValue(context.get(\"value\"), prop(\"accordion\"))); },\n } },\n});\n\nexport interface QwCollapseApi<T extends PropTypes = PropTypes> {\n value: string[];\n items: QwCollapseItem[];\n /** Tag name adapters render for each header wrapper, e.g. \"h3\". */\n headingTag: `h${CollapseHeadingLevel}`;\n setValue(value: string[]): void;\n toggle(key: string): void;\n getRootProps(): T[\"element\"];\n getItemState(item: QwCollapseItemProps): QwCollapseItemState;\n getItemProps(item: QwCollapseItemProps): T[\"element\"];\n getHeadingProps(item: QwCollapseItemProps): T[\"element\"];\n getTriggerProps(item: QwCollapseItemProps): T[\"button\"];\n getTitleProps(item: QwCollapseItemProps): T[\"element\"];\n getArrowProps(item: QwCollapseItemProps): T[\"element\"];\n getArrowIconState(item: QwCollapseItemProps): IconState;\n getContentProps(item: QwCollapseItemProps): T[\"element\"];\n getBodyProps(item: QwCollapseItemProps): T[\"element\"];\n}\n/** SSR-pure getters; focus moves use the Zag DOM scope only inside key events. */\nexport function connectCollapse<T extends PropTypes>(service: QwCollapseService, normalize: NormalizeProps<T>): QwCollapseApi<T> {\n const id = rootId(service), items = service.prop(\"items\"), accordion = service.prop(\"accordion\");\n const value = normalizeCollapseValue(service.context.get(\"value\"), accordion);\n const resolve = ({ key }: QwCollapseItemProps) => { const item = items.find((entry) => entry.key === key); if (!item) throw new RangeError(\"Collapse item is not present in items\"); return item; };\n const disabled = (item: QwCollapseItem) => !!service.prop(\"disabled\") || !!item.disabled;\n const part = (name: string) => ({ \"data-scope\": \"collapse\", \"data-part\": name });\n const data = (item: QwCollapseItem) => ({ \"data-state\": value.includes(item.key) ? \"open\" : \"closed\", \"data-disabled\": dataAttr(disabled(item)) });\n return {\n value: [...value], items: items.map((item) => ({ ...item })), headingTag: `h${service.prop(\"headingLevel\")}`,\n setValue: (next) => service.send({ type: \"VALUE.SET\", value: normalizeCollapseValue(next, accordion) }),\n toggle: (key) => service.send({ type: \"VALUE.TOGGLE\", value: key }),\n getRootProps: () => normalize.element({ ...part(\"root\"), id, \"data-accordion\": dataAttr(accordion), \"data-disabled\": dataAttr(service.prop(\"disabled\")) }),\n getItemState: (props) => { const item = resolve(props); return { open: value.includes(item.key), disabled: disabled(item) }; },\n getItemProps: (props) => normalize.element({ ...part(\"item\"), ...data(resolve(props)) }),\n getHeadingProps: (props) => normalize.element({ ...part(\"heading\"), ...data(resolve(props)) }),\n getTriggerProps(props) {\n const item = resolve(props);\n return normalize.button({ ...part(\"trigger\"), ...data(item), type: \"button\", id: partId(service, \"trigger\", item.key), disabled: disabled(item),\n \"aria-expanded\": value.includes(item.key), \"aria-controls\": partId(service, \"content\", item.key),\n onClick(event) { if (!event.defaultPrevented) service.send({ type: \"VALUE.TOGGLE\", value: item.key }); },\n onKeyDown(event) {\n if (event.defaultPrevented || event.ctrlKey || event.altKey || event.metaKey || ![\"ArrowUp\", \"ArrowDown\", \"Home\", \"End\"].includes(event.key)) return;\n const enabled = service.prop(\"items\").filter((entry) => !disabled(entry));\n const index = enabled.findIndex((entry) => entry.key === item.key);\n if (index < 0) return;\n event.preventDefault();\n let target = event.key === \"Home\" ? 0 : event.key === \"End\" ? enabled.length - 1 : index + (event.key === \"ArrowDown\" ? 1 : -1);\n if (service.prop(\"loop\")) target = (target + enabled.length) % enabled.length;\n const next = enabled[target];\n if (next) service.scope.getById<HTMLButtonElement>(partId(service, \"trigger\", next.key))?.focus();\n },\n });\n },\n getTitleProps: (props) => normalize.element({ ...part(\"title\"), id: partId(service, \"title\", resolve(props).key) }),\n getArrowProps: (props) => normalize.element({ ...part(\"arrow\"), ...data(resolve(props)), \"aria-hidden\": true }),\n getArrowIconState: (props) => resolveIconState({ id: partId(service, \"arrow\", resolve(props).key), name: \"down\" }),\n getContentProps(props) {\n const item = resolve(props);\n return normalize.element({ ...part(\"content\"), ...data(item), id: partId(service, \"content\", item.key), role: \"region\", \"aria-labelledby\": partId(service, \"trigger\", item.key), hidden: !value.includes(item.key) });\n },\n getBodyProps: (props) => normalize.element({ ...part(\"body\"), ...data(resolve(props)) }),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { type Machine, type Service } from "@zag-js/core";
2
+ import type { NormalizeProps, PropTypes } from "@zag-js/types";
3
+ export declare const COUNTDOWN_VARIANTS: readonly ["text", "block"];
4
+ export declare const COUNTDOWN_STATES: readonly ["idle", "running", "finished"];
5
+ /** Stable DOM parts shared by every adapter. */
6
+ export declare const COUNTDOWN_PARTS: readonly ["root", "timer", "segment", "separator", "status"];
7
+ export declare const COUNTDOWN_DEFAULT_FORMAT = "HH:mm:ss";
8
+ /** Refresh cadence when the format shows sub-second digits. */
9
+ export declare const COUNTDOWN_FAST_INTERVAL = 33;
10
+ export type CountdownVariant = (typeof COUNTDOWN_VARIANTS)[number];
11
+ export type CountdownStatus = (typeof COUNTDOWN_STATES)[number];
12
+ export type CountdownPart = (typeof COUNTDOWN_PARTS)[number];
13
+ export type CountdownUnit = "days" | "hours" | "minutes" | "seconds" | "milliseconds";
14
+ /** Time units after format carry-over: units missing from the format roll into the next shown unit. */
15
+ export interface CountdownTimeParts {
16
+ total: number;
17
+ days: number;
18
+ hours: number;
19
+ minutes: number;
20
+ seconds: number;
21
+ milliseconds: number;
22
+ }
23
+ export type CountdownSegment = {
24
+ kind: "value";
25
+ unit: CountdownUnit;
26
+ text: string;
27
+ } | {
28
+ kind: "literal";
29
+ text: string;
30
+ };
31
+ export interface CountdownChangeDetails {
32
+ remaining: number;
33
+ parts: CountdownTimeParts;
34
+ }
35
+ export interface QwCountdownProps {
36
+ id?: string;
37
+ /** Deadline timestamp (ms). The deadline is the source of truth; pausing only freezes the display. */
38
+ target?: number;
39
+ /** Duration in ms, used when target is absent. */
40
+ duration?: number;
41
+ /** Reference "now" (ms) for the initial snapshot, e.g. the server time during SSR. The client re-syncs on start. */
42
+ now?: number;
43
+ /** Tokens DD HH mm ss S SS SSS; other characters are literal. Defaults to HH:mm:ss. */
44
+ format?: string;
45
+ /** Start on mount; defaults true. */
46
+ autoStart?: boolean;
47
+ /** Accessible timer name, e.g. "距活动结束". */
48
+ label?: string;
49
+ /** Announced once through a polite status region when finished; empty announces nothing. */
50
+ finishedText?: string;
51
+ variant?: CountdownVariant;
52
+ onChange?: (details: CountdownChangeDetails) => void;
53
+ /** Called exactly once each time the countdown reaches zero (re-armed by reset). */
54
+ onFinish?: () => void;
55
+ }
56
+ /** Split remaining milliseconds by the units present in the format (Vant-compatible carry-over). */
57
+ export declare function getCountdownTimeParts(remaining: number, format?: string): CountdownTimeParts;
58
+ /** Tokenize the format into value and literal segments. */
59
+ export declare function getCountdownSegments(parts: CountdownTimeParts, format?: string): CountdownSegment[];
60
+ /** Formatted text for a remaining duration. */
61
+ export declare function formatCountdown(remaining: number, format?: string): string;
62
+ /** Remaining ms from props at a given clock time: target first, then duration, else 0. */
63
+ export declare function resolveCountdownRemaining(props: Pick<QwCountdownProps, "target" | "duration">, now: number): number;
64
+ export interface QwCountdownSchema {
65
+ props: QwCountdownProps & {
66
+ format: string;
67
+ autoStart: boolean;
68
+ variant: CountdownVariant;
69
+ };
70
+ context: {
71
+ remaining: number;
72
+ };
73
+ /** resume mirrors remaining synchronously: adapter contexts (e.g. React state) commit after the effect runs. */
74
+ refs: {
75
+ endAt: number;
76
+ resume: number;
77
+ };
78
+ state: CountdownStatus;
79
+ guard: "hasTime" | "autoStartWithTime" | "autoStartNoTime" | "tickDone";
80
+ action: "freeze" | "restore" | "applyTick" | "clearRemaining" | "notifyFinish";
81
+ effect: "tick";
82
+ event: {
83
+ type: "START" | "PAUSE" | "RESET";
84
+ } | {
85
+ type: "TICK";
86
+ remaining: number;
87
+ };
88
+ }
89
+ export type QwCountdownMachine = Machine<QwCountdownSchema>;
90
+ export type QwCountdownService = Service<QwCountdownSchema>;
91
+ /** Normalize adapter input. */
92
+ export declare function createCountdownProps(props: QwCountdownProps): Partial<QwCountdownSchema["props"]>;
93
+ /** Core-owned timer lifecycle: scheduling, pausing, completion-once and cleanup all live here. */
94
+ export declare const countdownMachine: QwCountdownMachine;
95
+ export interface QwCountdownApi<T extends PropTypes = PropTypes> {
96
+ remaining: number;
97
+ parts: CountdownTimeParts;
98
+ segments: CountdownSegment[];
99
+ text: string;
100
+ state: CountdownStatus;
101
+ running: boolean;
102
+ finished: boolean;
103
+ /** Status-region text: finishedText once finished, otherwise empty. */
104
+ statusText: string;
105
+ start(): void;
106
+ pause(): void;
107
+ reset(): void;
108
+ getRootProps(): T["element"];
109
+ getTimerProps(): T["element"];
110
+ getSegmentProps(segment: CountdownSegment): T["element"];
111
+ getStatusProps(): T["element"];
112
+ }
113
+ /** Getters are SSR-pure; only the running-state effect touches timers. */
114
+ export declare function connectCountdown<T extends PropTypes>(service: QwCountdownService, normalize: NormalizeProps<T>): QwCountdownApi<T>;
@@ -0,0 +1 @@
1
+ export * from "./countdown.js";
@@ -0,0 +1,309 @@
1
+ import { createMachine } from "@zag-js/core";
2
+ import { visuallyHiddenStyle } from "@zag-js/dom-query";
3
+ //#region src/countdown/countdown.ts
4
+ const COUNTDOWN_VARIANTS = ["text", "block"];
5
+ const COUNTDOWN_STATES = [
6
+ "idle",
7
+ "running",
8
+ "finished"
9
+ ];
10
+ /** Stable DOM parts shared by every adapter. */
11
+ const COUNTDOWN_PARTS = [
12
+ "root",
13
+ "timer",
14
+ "segment",
15
+ "separator",
16
+ "status"
17
+ ];
18
+ const COUNTDOWN_DEFAULT_FORMAT = "HH:mm:ss";
19
+ /** Refresh cadence when the format shows sub-second digits. */
20
+ const COUNTDOWN_FAST_INTERVAL = 33;
21
+ const DAY = 864e5;
22
+ const HOUR = 36e5;
23
+ const MINUTE = 6e4;
24
+ const SECOND = 1e3;
25
+ const TOKENS = /DD|HH|mm|ss|SSS|SS|S/g;
26
+ const pad = (value, length = 2) => String(value).padStart(length, "0");
27
+ const finite = (value) => typeof value === "number" && Number.isFinite(value);
28
+ /** Split remaining milliseconds by the units present in the format (Vant-compatible carry-over). */
29
+ function getCountdownTimeParts(remaining, format = COUNTDOWN_DEFAULT_FORMAT) {
30
+ const total = Math.max(0, Math.floor(finite(remaining) ? remaining : 0));
31
+ let days = Math.floor(total / DAY), hours = Math.floor(total % DAY / HOUR), minutes = Math.floor(total % HOUR / MINUTE);
32
+ let seconds = Math.floor(total % MINUTE / SECOND), milliseconds = total % SECOND;
33
+ if (!format.includes("DD")) {
34
+ hours += days * 24;
35
+ days = 0;
36
+ }
37
+ if (!format.includes("HH")) {
38
+ minutes += hours * 60;
39
+ hours = 0;
40
+ }
41
+ if (!format.includes("mm")) {
42
+ seconds += minutes * 60;
43
+ minutes = 0;
44
+ }
45
+ if (!format.includes("ss")) {
46
+ milliseconds += seconds * 1e3;
47
+ seconds = 0;
48
+ }
49
+ return {
50
+ total,
51
+ days,
52
+ hours,
53
+ minutes,
54
+ seconds,
55
+ milliseconds
56
+ };
57
+ }
58
+ /** Tokenize the format into value and literal segments. */
59
+ function getCountdownSegments(parts, format = COUNTDOWN_DEFAULT_FORMAT) {
60
+ const segments = [];
61
+ let last = 0;
62
+ for (const match of format.matchAll(TOKENS)) {
63
+ if (match.index > last) segments.push({
64
+ kind: "literal",
65
+ text: format.slice(last, match.index)
66
+ });
67
+ const token = match[0];
68
+ const value = token === "DD" ? {
69
+ kind: "value",
70
+ unit: "days",
71
+ text: pad(parts.days)
72
+ } : token === "HH" ? {
73
+ kind: "value",
74
+ unit: "hours",
75
+ text: pad(parts.hours)
76
+ } : token === "mm" ? {
77
+ kind: "value",
78
+ unit: "minutes",
79
+ text: pad(parts.minutes)
80
+ } : token === "ss" ? {
81
+ kind: "value",
82
+ unit: "seconds",
83
+ text: pad(parts.seconds)
84
+ } : token === "SSS" ? {
85
+ kind: "value",
86
+ unit: "milliseconds",
87
+ text: pad(parts.milliseconds, 3)
88
+ } : token === "SS" ? {
89
+ kind: "value",
90
+ unit: "milliseconds",
91
+ text: pad(Math.floor(parts.milliseconds / 10))
92
+ } : {
93
+ kind: "value",
94
+ unit: "milliseconds",
95
+ text: String(Math.floor(parts.milliseconds / 100))
96
+ };
97
+ segments.push(value);
98
+ last = match.index + token.length;
99
+ }
100
+ if (last < format.length) segments.push({
101
+ kind: "literal",
102
+ text: format.slice(last)
103
+ });
104
+ return segments;
105
+ }
106
+ /** Formatted text for a remaining duration. */
107
+ function formatCountdown(remaining, format = COUNTDOWN_DEFAULT_FORMAT) {
108
+ return getCountdownSegments(getCountdownTimeParts(remaining, format), format).map((segment) => segment.text).join("");
109
+ }
110
+ /** Remaining ms from props at a given clock time: target first, then duration, else 0. */
111
+ function resolveCountdownRemaining(props, now) {
112
+ if (finite(props.target)) return Math.max(0, Math.floor(props.target - now));
113
+ if (finite(props.duration)) return Math.max(0, Math.floor(props.duration));
114
+ return 0;
115
+ }
116
+ /** Normalize adapter input. */
117
+ function createCountdownProps(props) {
118
+ return {
119
+ ...props,
120
+ format: typeof props.format === "string" && props.format ? props.format : COUNTDOWN_DEFAULT_FORMAT,
121
+ autoStart: props.autoStart ?? true,
122
+ variant: COUNTDOWN_VARIANTS.includes(props.variant) ? props.variant : "text"
123
+ };
124
+ }
125
+ const clock = () => Date.now();
126
+ const fromProps = (params, now = clock()) => resolveCountdownRemaining({
127
+ target: params.prop("target"),
128
+ duration: params.prop("duration")
129
+ }, now);
130
+ const setRemaining = (params, remaining) => {
131
+ params.refs.set("resume", remaining);
132
+ params.context.set("remaining", remaining);
133
+ };
134
+ const isFast = (format) => format.includes("S");
135
+ /** Core-owned timer lifecycle: scheduling, pausing, completion-once and cleanup all live here. */
136
+ const countdownMachine = createMachine({
137
+ props: ({ props }) => createCountdownProps(props),
138
+ initialState({ prop }) {
139
+ const remaining = resolveCountdownRemaining({
140
+ target: prop("target"),
141
+ duration: prop("duration")
142
+ }, prop("now") ?? clock());
143
+ return !prop("autoStart") ? "idle" : remaining > 0 ? "running" : "finished";
144
+ },
145
+ context({ prop, bindable }) {
146
+ return { remaining: bindable(() => ({
147
+ defaultValue: resolveCountdownRemaining({
148
+ target: prop("target"),
149
+ duration: prop("duration")
150
+ }, prop("now") ?? clock()),
151
+ onChange: (remaining) => prop("onChange")?.({
152
+ remaining,
153
+ parts: getCountdownTimeParts(remaining, prop("format"))
154
+ })
155
+ })) };
156
+ },
157
+ refs: ({ context }) => ({
158
+ endAt: 0,
159
+ resume: context.get("remaining")
160
+ }),
161
+ watch({ track, send, prop }) {
162
+ track([() => prop("target"), () => prop("duration")], () => send({ type: "RESET" }));
163
+ },
164
+ on: { RESET: [
165
+ {
166
+ guard: "autoStartWithTime",
167
+ target: "running",
168
+ actions: ["restore"],
169
+ reenter: true
170
+ },
171
+ {
172
+ guard: "autoStartNoTime",
173
+ target: "finished",
174
+ actions: ["restore"],
175
+ reenter: true
176
+ },
177
+ {
178
+ target: "idle",
179
+ actions: ["restore"]
180
+ }
181
+ ] },
182
+ states: {
183
+ idle: { on: { START: [{
184
+ guard: "hasTime",
185
+ target: "running"
186
+ }, {
187
+ target: "finished",
188
+ actions: ["clearRemaining"]
189
+ }] } },
190
+ running: {
191
+ effects: ["tick"],
192
+ on: {
193
+ PAUSE: {
194
+ target: "idle",
195
+ actions: ["freeze"]
196
+ },
197
+ TICK: [{
198
+ guard: "tickDone",
199
+ target: "finished",
200
+ actions: ["applyTick"]
201
+ }, { actions: ["applyTick"] }]
202
+ }
203
+ },
204
+ finished: { entry: ["clearRemaining", "notifyFinish"] }
205
+ },
206
+ implementations: {
207
+ guards: {
208
+ hasTime: (params) => (finite(params.prop("target")) ? fromProps(params) : params.refs.get("resume")) > 0,
209
+ autoStartWithTime: (params) => params.prop("autoStart") && fromProps(params) > 0,
210
+ autoStartNoTime: (params) => params.prop("autoStart") && fromProps(params) === 0,
211
+ tickDone: (params) => params.event.type === "TICK" && params.event.remaining <= 0
212
+ },
213
+ actions: {
214
+ freeze(params) {
215
+ setRemaining(params, Math.max(0, params.refs.get("endAt") - clock()));
216
+ },
217
+ restore(params) {
218
+ setRemaining(params, fromProps(params));
219
+ },
220
+ applyTick(params) {
221
+ if (params.event.type === "TICK") setRemaining(params, Math.max(0, params.event.remaining));
222
+ },
223
+ clearRemaining(params) {
224
+ setRemaining(params, 0);
225
+ },
226
+ notifyFinish(params) {
227
+ params.prop("onFinish")?.();
228
+ }
229
+ },
230
+ effects: { tick(params) {
231
+ const now = clock();
232
+ const initial = finite(params.prop("target")) ? fromProps(params, now) : params.refs.get("resume");
233
+ params.refs.set("endAt", now + initial);
234
+ setRemaining(params, initial);
235
+ let timer;
236
+ const schedule = () => {
237
+ const left = params.refs.get("endAt") - clock();
238
+ const step = isFast(params.prop("format")) ? 33 : left % SECOND || SECOND;
239
+ timer = setTimeout(() => {
240
+ const remaining = Math.max(0, params.refs.get("endAt") - clock());
241
+ params.send({
242
+ type: "TICK",
243
+ remaining
244
+ });
245
+ if (remaining > 0) schedule();
246
+ }, Math.max(0, Math.min(step, left)));
247
+ };
248
+ schedule();
249
+ return () => {
250
+ if (timer !== void 0) clearTimeout(timer);
251
+ };
252
+ } }
253
+ }
254
+ });
255
+ /** Getters are SSR-pure; only the running-state effect touches timers. */
256
+ function connectCountdown(service, normalize) {
257
+ const format = service.prop("format");
258
+ const remaining = service.context.get("remaining");
259
+ const parts = getCountdownTimeParts(remaining, format);
260
+ const segments = getCountdownSegments(parts, format);
261
+ const state = service.state.get();
262
+ const label = service.prop("label")?.trim();
263
+ return {
264
+ remaining,
265
+ parts,
266
+ segments,
267
+ text: segments.map((segment) => segment.text).join(""),
268
+ state,
269
+ running: state === "running",
270
+ finished: state === "finished",
271
+ statusText: state === "finished" ? service.prop("finishedText") ?? "" : "",
272
+ start: () => service.send({ type: "START" }),
273
+ pause: () => service.send({ type: "PAUSE" }),
274
+ reset: () => service.send({ type: "RESET" }),
275
+ getRootProps: () => normalize.element({
276
+ "data-scope": "countdown",
277
+ "data-part": "root",
278
+ "data-state": state,
279
+ "data-variant": service.prop("variant")
280
+ }),
281
+ getTimerProps: () => normalize.element({
282
+ "data-scope": "countdown",
283
+ "data-part": "timer",
284
+ role: "timer",
285
+ "aria-live": "off",
286
+ "aria-atomic": "true",
287
+ "aria-label": label || void 0,
288
+ "data-state": state
289
+ }),
290
+ getSegmentProps: (segment) => normalize.element(segment.kind === "value" ? {
291
+ "data-scope": "countdown",
292
+ "data-part": "segment",
293
+ "data-unit": segment.unit
294
+ } : {
295
+ "data-scope": "countdown",
296
+ "data-part": "separator"
297
+ }),
298
+ getStatusProps: () => normalize.element({
299
+ "data-scope": "countdown",
300
+ "data-part": "status",
301
+ role: "status",
302
+ style: { ...visuallyHiddenStyle }
303
+ })
304
+ };
305
+ }
306
+ //#endregion
307
+ export { COUNTDOWN_DEFAULT_FORMAT, COUNTDOWN_FAST_INTERVAL, COUNTDOWN_PARTS, COUNTDOWN_STATES, COUNTDOWN_VARIANTS, connectCountdown, countdownMachine, createCountdownProps, formatCountdown, getCountdownSegments, getCountdownTimeParts, resolveCountdownRemaining };
308
+
309
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/countdown/countdown.ts"],"sourcesContent":["import { createMachine, type Machine, type Params, type Service } from \"@zag-js/core\";\nimport { visuallyHiddenStyle } from \"@zag-js/dom-query\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\n\nexport const COUNTDOWN_VARIANTS = [\"text\", \"block\"] as const;\nexport const COUNTDOWN_STATES = [\"idle\", \"running\", \"finished\"] as const;\n/** Stable DOM parts shared by every adapter. */\nexport const COUNTDOWN_PARTS = [\"root\", \"timer\", \"segment\", \"separator\", \"status\"] as const;\nexport const COUNTDOWN_DEFAULT_FORMAT = \"HH:mm:ss\";\n/** Refresh cadence when the format shows sub-second digits. */\nexport const COUNTDOWN_FAST_INTERVAL = 33;\n\nexport type CountdownVariant = (typeof COUNTDOWN_VARIANTS)[number];\nexport type CountdownStatus = (typeof COUNTDOWN_STATES)[number];\nexport type CountdownPart = (typeof COUNTDOWN_PARTS)[number];\nexport type CountdownUnit = \"days\" | \"hours\" | \"minutes\" | \"seconds\" | \"milliseconds\";\n\n/** Time units after format carry-over: units missing from the format roll into the next shown unit. */\nexport interface CountdownTimeParts { total: number; days: number; hours: number; minutes: number; seconds: number; milliseconds: number }\nexport type CountdownSegment = { kind: \"value\"; unit: CountdownUnit; text: string } | { kind: \"literal\"; text: string };\nexport interface CountdownChangeDetails { remaining: number; parts: CountdownTimeParts }\n\nexport interface QwCountdownProps {\n id?: string;\n /** Deadline timestamp (ms). The deadline is the source of truth; pausing only freezes the display. */\n target?: number;\n /** Duration in ms, used when target is absent. */\n duration?: number;\n /** Reference \"now\" (ms) for the initial snapshot, e.g. the server time during SSR. The client re-syncs on start. */\n now?: number;\n /** Tokens DD HH mm ss S SS SSS; other characters are literal. Defaults to HH:mm:ss. */\n format?: string;\n /** Start on mount; defaults true. */\n autoStart?: boolean;\n /** Accessible timer name, e.g. \"距活动结束\". */\n label?: string;\n /** Announced once through a polite status region when finished; empty announces nothing. */\n finishedText?: string;\n variant?: CountdownVariant;\n onChange?: (details: CountdownChangeDetails) => void;\n /** Called exactly once each time the countdown reaches zero (re-armed by reset). */\n onFinish?: () => void;\n}\n\nconst DAY = 86_400_000, HOUR = 3_600_000, MINUTE = 60_000, SECOND = 1000;\nconst TOKENS = /DD|HH|mm|ss|SSS|SS|S/g;\nconst pad = (value: number, length = 2) => String(value).padStart(length, \"0\");\nconst finite = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n/** Split remaining milliseconds by the units present in the format (Vant-compatible carry-over). */\nexport function getCountdownTimeParts(remaining: number, format: string = COUNTDOWN_DEFAULT_FORMAT): CountdownTimeParts {\n const total = Math.max(0, Math.floor(finite(remaining) ? remaining : 0));\n let days = Math.floor(total / DAY), hours = Math.floor((total % DAY) / HOUR), minutes = Math.floor((total % HOUR) / MINUTE);\n let seconds = Math.floor((total % MINUTE) / SECOND), milliseconds = total % SECOND;\n if (!format.includes(\"DD\")) { hours += days * 24; days = 0; }\n if (!format.includes(\"HH\")) { minutes += hours * 60; hours = 0; }\n if (!format.includes(\"mm\")) { seconds += minutes * 60; minutes = 0; }\n if (!format.includes(\"ss\")) { milliseconds += seconds * 1000; seconds = 0; }\n return { total, days, hours, minutes, seconds, milliseconds };\n}\n\n/** Tokenize the format into value and literal segments. */\nexport function getCountdownSegments(parts: CountdownTimeParts, format: string = COUNTDOWN_DEFAULT_FORMAT): CountdownSegment[] {\n const segments: CountdownSegment[] = [];\n let last = 0;\n for (const match of format.matchAll(TOKENS)) {\n if (match.index > last) segments.push({ kind: \"literal\", text: format.slice(last, match.index) });\n const token = match[0];\n const value: CountdownSegment = token === \"DD\" ? { kind: \"value\", unit: \"days\", text: pad(parts.days) }\n : token === \"HH\" ? { kind: \"value\", unit: \"hours\", text: pad(parts.hours) }\n : token === \"mm\" ? { kind: \"value\", unit: \"minutes\", text: pad(parts.minutes) }\n : token === \"ss\" ? { kind: \"value\", unit: \"seconds\", text: pad(parts.seconds) }\n : token === \"SSS\" ? { kind: \"value\", unit: \"milliseconds\", text: pad(parts.milliseconds, 3) }\n : token === \"SS\" ? { kind: \"value\", unit: \"milliseconds\", text: pad(Math.floor(parts.milliseconds / 10)) }\n : { kind: \"value\", unit: \"milliseconds\", text: String(Math.floor(parts.milliseconds / 100)) };\n segments.push(value);\n last = match.index + token.length;\n }\n if (last < format.length) segments.push({ kind: \"literal\", text: format.slice(last) });\n return segments;\n}\n\n/** Formatted text for a remaining duration. */\nexport function formatCountdown(remaining: number, format: string = COUNTDOWN_DEFAULT_FORMAT): string {\n return getCountdownSegments(getCountdownTimeParts(remaining, format), format).map((segment) => segment.text).join(\"\");\n}\n\n/** Remaining ms from props at a given clock time: target first, then duration, else 0. */\nexport function resolveCountdownRemaining(props: Pick<QwCountdownProps, \"target\" | \"duration\">, now: number): number {\n if (finite(props.target)) return Math.max(0, Math.floor(props.target - now));\n if (finite(props.duration)) return Math.max(0, Math.floor(props.duration));\n return 0;\n}\n\nexport interface QwCountdownSchema {\n props: QwCountdownProps & { format: string; autoStart: boolean; variant: CountdownVariant };\n context: { remaining: number };\n /** resume mirrors remaining synchronously: adapter contexts (e.g. React state) commit after the effect runs. */\n refs: { endAt: number; resume: number };\n state: CountdownStatus;\n guard: \"hasTime\" | \"autoStartWithTime\" | \"autoStartNoTime\" | \"tickDone\";\n action: \"freeze\" | \"restore\" | \"applyTick\" | \"clearRemaining\" | \"notifyFinish\";\n effect: \"tick\";\n event: { type: \"START\" | \"PAUSE\" | \"RESET\" } | { type: \"TICK\"; remaining: number };\n}\nexport type QwCountdownMachine = Machine<QwCountdownSchema>;\nexport type QwCountdownService = Service<QwCountdownSchema>;\ntype CountdownParams = Params<QwCountdownSchema>;\n\n/** Normalize adapter input. */\nexport function createCountdownProps(props: QwCountdownProps): Partial<QwCountdownSchema[\"props\"]> {\n return { ...props, format: typeof props.format === \"string\" && props.format ? props.format : COUNTDOWN_DEFAULT_FORMAT,\n autoStart: props.autoStart ?? true, variant: (COUNTDOWN_VARIANTS as readonly unknown[]).includes(props.variant) ? props.variant : \"text\" };\n}\n\nconst clock = () => Date.now();\nconst fromProps = (params: Pick<CountdownParams, \"prop\">, now = clock()) => resolveCountdownRemaining({ target: params.prop(\"target\"), duration: params.prop(\"duration\") }, now);\nconst setRemaining = (params: Pick<CountdownParams, \"context\" | \"refs\">, remaining: number) => {\n params.refs.set(\"resume\", remaining);\n params.context.set(\"remaining\", remaining);\n};\nconst isFast = (format: string) => format.includes(\"S\");\n\n/** Core-owned timer lifecycle: scheduling, pausing, completion-once and cleanup all live here. */\nexport const countdownMachine: QwCountdownMachine = createMachine<QwCountdownSchema>({\n props: ({ props }) => createCountdownProps(props) as QwCountdownSchema[\"props\"],\n initialState({ prop }) {\n const remaining = resolveCountdownRemaining({ target: prop(\"target\"), duration: prop(\"duration\") }, prop(\"now\") ?? clock());\n return !prop(\"autoStart\") ? \"idle\" : remaining > 0 ? \"running\" : \"finished\";\n },\n context({ prop, bindable }) {\n return {\n remaining: bindable(() => ({\n defaultValue: resolveCountdownRemaining({ target: prop(\"target\"), duration: prop(\"duration\") }, prop(\"now\") ?? clock()),\n onChange: (remaining) => prop(\"onChange\")?.({ remaining, parts: getCountdownTimeParts(remaining, prop(\"format\")) }),\n })),\n };\n },\n refs: ({ context }) => ({ endAt: 0, resume: context.get(\"remaining\") }),\n watch({ track, send, prop }) {\n track([() => prop(\"target\"), () => prop(\"duration\")], () => send({ type: \"RESET\" }));\n },\n on: {\n RESET: [\n { guard: \"autoStartWithTime\", target: \"running\", actions: [\"restore\"], reenter: true },\n { guard: \"autoStartNoTime\", target: \"finished\", actions: [\"restore\"], reenter: true },\n { target: \"idle\", actions: [\"restore\"] },\n ],\n },\n states: {\n idle: {\n on: { START: [{ guard: \"hasTime\", target: \"running\" }, { target: \"finished\", actions: [\"clearRemaining\"] }] },\n },\n running: {\n effects: [\"tick\"],\n on: {\n PAUSE: { target: \"idle\", actions: [\"freeze\"] },\n TICK: [{ guard: \"tickDone\", target: \"finished\", actions: [\"applyTick\"] }, { actions: [\"applyTick\"] }],\n },\n },\n finished: {\n entry: [\"clearRemaining\", \"notifyFinish\"],\n },\n },\n implementations: {\n guards: {\n // Target mode re-syncs to the deadline; duration mode resumes the frozen remainder.\n hasTime: (params) => (finite(params.prop(\"target\")) ? fromProps(params) : params.refs.get(\"resume\")) > 0,\n autoStartWithTime: (params) => params.prop(\"autoStart\") && fromProps(params) > 0,\n autoStartNoTime: (params) => params.prop(\"autoStart\") && fromProps(params) === 0,\n tickDone: (params) => params.event.type === \"TICK\" && params.event.remaining <= 0,\n },\n actions: {\n freeze(params) { setRemaining(params, Math.max(0, params.refs.get(\"endAt\") - clock())); },\n restore(params) { setRemaining(params, fromProps(params)); },\n applyTick(params) { if (params.event.type === \"TICK\") setRemaining(params, Math.max(0, params.event.remaining)); },\n clearRemaining(params) { setRemaining(params, 0); },\n notifyFinish(params) { params.prop(\"onFinish\")?.(); },\n },\n effects: {\n tick(params) {\n // Resume: target mode re-syncs to the deadline, duration mode continues the frozen remainder.\n const now = clock();\n const initial = finite(params.prop(\"target\")) ? fromProps(params, now) : params.refs.get(\"resume\");\n params.refs.set(\"endAt\", now + initial);\n setRemaining(params, initial);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const schedule = () => {\n const left = params.refs.get(\"endAt\") - clock();\n // Second formats wake exactly on the next whole-second boundary of the remaining time.\n const step = isFast(params.prop(\"format\")) ? COUNTDOWN_FAST_INTERVAL : (left % SECOND) || SECOND;\n timer = setTimeout(() => {\n const remaining = Math.max(0, params.refs.get(\"endAt\") - clock());\n params.send({ type: \"TICK\", remaining });\n if (remaining > 0) schedule();\n }, Math.max(0, Math.min(step, left)));\n };\n schedule();\n return () => { if (timer !== undefined) clearTimeout(timer); };\n },\n },\n },\n});\n\nexport interface QwCountdownApi<T extends PropTypes = PropTypes> {\n remaining: number;\n parts: CountdownTimeParts;\n segments: CountdownSegment[];\n text: string;\n state: CountdownStatus;\n running: boolean;\n finished: boolean;\n /** Status-region text: finishedText once finished, otherwise empty. */\n statusText: string;\n start(): void;\n pause(): void;\n reset(): void;\n getRootProps(): T[\"element\"];\n getTimerProps(): T[\"element\"];\n getSegmentProps(segment: CountdownSegment): T[\"element\"];\n getStatusProps(): T[\"element\"];\n}\n\n/** Getters are SSR-pure; only the running-state effect touches timers. */\nexport function connectCountdown<T extends PropTypes>(service: QwCountdownService, normalize: NormalizeProps<T>): QwCountdownApi<T> {\n const format = service.prop(\"format\");\n const remaining = service.context.get(\"remaining\");\n const parts = getCountdownTimeParts(remaining, format);\n const segments = getCountdownSegments(parts, format);\n const state = service.state.get();\n const label = service.prop(\"label\")?.trim();\n return {\n remaining, parts, segments, text: segments.map((segment) => segment.text).join(\"\"), state,\n running: state === \"running\", finished: state === \"finished\",\n statusText: state === \"finished\" ? service.prop(\"finishedText\") ?? \"\" : \"\",\n start: () => service.send({ type: \"START\" }),\n pause: () => service.send({ type: \"PAUSE\" }),\n reset: () => service.send({ type: \"RESET\" }),\n getRootProps: () => normalize.element({ \"data-scope\": \"countdown\", \"data-part\": \"root\", \"data-state\": state, \"data-variant\": service.prop(\"variant\") }),\n // The timer is silent (aria-live off); completion is announced by the sibling status region, not nested in it.\n getTimerProps: () => normalize.element({ \"data-scope\": \"countdown\", \"data-part\": \"timer\", role: \"timer\", \"aria-live\": \"off\", \"aria-atomic\": \"true\",\n \"aria-label\": label || undefined, \"data-state\": state }),\n getSegmentProps: (segment) => normalize.element(segment.kind === \"value\"\n ? { \"data-scope\": \"countdown\", \"data-part\": \"segment\", \"data-unit\": segment.unit }\n : { \"data-scope\": \"countdown\", \"data-part\": \"separator\" }),\n getStatusProps: () => normalize.element({ \"data-scope\": \"countdown\", \"data-part\": \"status\", role: \"status\", style: { ...visuallyHiddenStyle } }),\n };\n}\n"],"mappings":"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"}