@qw-ui/core 0.3.0-next.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/README.md +21 -37
  2. package/dist/action-sheet/action-sheet.d.ts +110 -0
  3. package/dist/action-sheet/index.d.ts +2 -0
  4. package/dist/action-sheet/index.js +2 -0
  5. package/dist/action-sheet-Cvcr1S_m.js +183 -0
  6. package/dist/action-sheet-Cvcr1S_m.js.map +1 -0
  7. package/dist/area-picker/area-picker.d.ts +113 -0
  8. package/dist/area-picker/index.d.ts +1 -0
  9. package/dist/area-picker/index.js +348 -0
  10. package/dist/area-picker/index.js.map +1 -0
  11. package/dist/aria-description-CimD2M_C.js +13 -0
  12. package/dist/aria-description-CimD2M_C.js.map +1 -0
  13. package/dist/aria-description.d.ts +2 -0
  14. package/dist/avatar/avatar-load.d.ts +76 -0
  15. package/dist/avatar/avatar.d.ts +22 -5
  16. package/dist/avatar/index.d.ts +1 -0
  17. package/dist/avatar/index.js +57 -18
  18. package/dist/avatar/index.js.map +1 -1
  19. package/dist/avatar-load-w9dq05oV.js +139 -0
  20. package/dist/avatar-load-w9dq05oV.js.map +1 -0
  21. package/dist/back-top/back-top.d.ts +77 -0
  22. package/dist/back-top/index.d.ts +1 -0
  23. package/dist/back-top/index.js +189 -0
  24. package/dist/back-top/index.js.map +1 -0
  25. package/dist/badge/badge.d.ts +85 -0
  26. package/dist/badge/index.d.ts +1 -0
  27. package/dist/badge/index.js +88 -0
  28. package/dist/badge/index.js.map +1 -0
  29. package/dist/button/button.d.ts +13 -0
  30. package/dist/button/index.js +3 -5
  31. package/dist/button/index.js.map +1 -1
  32. package/dist/calendar/calendar.d.ts +100 -0
  33. package/dist/calendar/index.d.ts +1 -0
  34. package/dist/calendar/index.js +2 -0
  35. package/dist/calendar-CmpK3stz.js +363 -0
  36. package/dist/calendar-CmpK3stz.js.map +1 -0
  37. package/dist/card/card.d.ts +68 -0
  38. package/dist/card/index.d.ts +2 -0
  39. package/dist/card/index.js +2 -0
  40. package/dist/card-DRtWa6Cr.js +107 -0
  41. package/dist/card-DRtWa6Cr.js.map +1 -0
  42. package/dist/cascader/cascader.d.ts +115 -0
  43. package/dist/cascader/index.d.ts +1 -0
  44. package/dist/cascader/index.js +2 -0
  45. package/dist/cascader-D-xMjs7P.js +333 -0
  46. package/dist/cascader-D-xMjs7P.js.map +1 -0
  47. package/dist/cell/cell.d.ts +41 -0
  48. package/dist/cell/index.d.ts +1 -0
  49. package/dist/cell/index.js +43 -0
  50. package/dist/cell/index.js.map +1 -0
  51. package/dist/check-list/check-list.d.ts +78 -0
  52. package/dist/check-list/index.d.ts +2 -0
  53. package/dist/check-list/index.js +2 -0
  54. package/dist/check-list-BvZHQt5w.js +60 -0
  55. package/dist/check-list-BvZHQt5w.js.map +1 -0
  56. package/dist/checkbox/checkbox.d.ts +59 -0
  57. package/dist/checkbox/index.d.ts +2 -0
  58. package/dist/checkbox/index.js +2 -0
  59. package/dist/checkbox-BlndJrz5.js +127 -0
  60. package/dist/checkbox-BlndJrz5.js.map +1 -0
  61. package/dist/checkbox-group/checkbox-group.d.ts +86 -0
  62. package/dist/checkbox-group/index.d.ts +3 -0
  63. package/dist/checkbox-group/index.js +2 -0
  64. package/dist/checkbox-group-gGfsTv-e.js +223 -0
  65. package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
  66. package/dist/choice-group-C4c9m0qe.js +373 -0
  67. package/dist/choice-group-C4c9m0qe.js.map +1 -0
  68. package/dist/circle/circle.d.ts +97 -0
  69. package/dist/circle/index.d.ts +1 -0
  70. package/dist/circle/index.js +119 -0
  71. package/dist/circle/index.js.map +1 -0
  72. package/dist/collapse/collapse.d.ts +98 -0
  73. package/dist/collapse/index.d.ts +2 -0
  74. package/dist/collapse/index.js +2 -0
  75. package/dist/collapse-B969h7-H.js +226 -0
  76. package/dist/collapse-B969h7-H.js.map +1 -0
  77. package/dist/countdown/countdown.d.ts +114 -0
  78. package/dist/countdown/index.d.ts +1 -0
  79. package/dist/countdown/index.js +309 -0
  80. package/dist/countdown/index.js.map +1 -0
  81. package/dist/date-picker/date-picker.d.ts +168 -0
  82. package/dist/date-picker/index.d.ts +1 -0
  83. package/dist/date-picker/index.js +401 -0
  84. package/dist/date-picker/index.js.map +1 -0
  85. package/dist/descriptions/descriptions.d.ts +69 -0
  86. package/dist/descriptions/index.d.ts +1 -0
  87. package/dist/descriptions/index.js +86 -0
  88. package/dist/descriptions/index.js.map +1 -0
  89. package/dist/dialog/dialog.d.ts +61 -43
  90. package/dist/dialog/index.js +73 -19
  91. package/dist/dialog/index.js.map +1 -1
  92. package/dist/divider/divider.d.ts +18 -2
  93. package/dist/divider/index.js +20 -2
  94. package/dist/divider/index.js.map +1 -1
  95. package/dist/dropdown/dropdown.d.ts +172 -0
  96. package/dist/dropdown/index.d.ts +2 -0
  97. package/dist/dropdown/index.js +467 -0
  98. package/dist/dropdown/index.js.map +1 -0
  99. package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
  100. package/dist/ellipsis/ellipsis.d.ts +88 -0
  101. package/dist/ellipsis/index.d.ts +2 -0
  102. package/dist/ellipsis/index.js +320 -0
  103. package/dist/ellipsis/index.js.map +1 -0
  104. package/dist/empty/empty-illustration.d.ts +3 -0
  105. package/dist/empty/empty.d.ts +43 -1
  106. package/dist/empty/index.js +2 -21
  107. package/dist/empty-CAgyvhUI.js +166 -0
  108. package/dist/empty-CAgyvhUI.js.map +1 -0
  109. package/dist/field/field.d.ts +95 -0
  110. package/dist/field/index.d.ts +2 -0
  111. package/dist/field/index.js +2 -0
  112. package/dist/field-DMHGIMZF.js +241 -0
  113. package/dist/field-DMHGIMZF.js.map +1 -0
  114. package/dist/floating-bubble/floating-bubble.d.ts +116 -0
  115. package/dist/floating-bubble/index.d.ts +1 -0
  116. package/dist/floating-bubble/index.js +333 -0
  117. package/dist/floating-bubble/index.js.map +1 -0
  118. package/dist/floating-panel/floating-panel.d.ts +80 -0
  119. package/dist/floating-panel/index.d.ts +2 -0
  120. package/dist/floating-panel/index.js +2 -0
  121. package/dist/floating-panel-Cbm5njBJ.js +363 -0
  122. package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
  123. package/dist/footer/footer.d.ts +94 -0
  124. package/dist/footer/index.d.ts +1 -0
  125. package/dist/footer/index.js +154 -0
  126. package/dist/footer/index.js.map +1 -0
  127. package/dist/form/connect.d.ts +6 -0
  128. package/dist/form/form.d.ts +100 -0
  129. package/dist/form/ids.d.ts +14 -0
  130. package/dist/form/index.d.ts +13 -0
  131. package/dist/form/index.js +3 -0
  132. package/dist/form/methods.d.ts +5 -0
  133. package/dist/form/model.d.ts +24 -0
  134. package/dist/form/native.d.ts +25 -0
  135. package/dist/form/rules.d.ts +40 -0
  136. package/dist/form/ssr.d.ts +7 -0
  137. package/dist/form/types.d.ts +150 -0
  138. package/dist/form-BAGkIEMY.js +1354 -0
  139. package/dist/form-BAGkIEMY.js.map +1 -0
  140. package/dist/format-BDUY0C_c.js +89 -0
  141. package/dist/format-BDUY0C_c.js.map +1 -0
  142. package/dist/gesture-_SRHIvBm.js +30 -0
  143. package/dist/gesture-_SRHIvBm.js.map +1 -0
  144. package/dist/grid/grid-item.d.ts +22 -0
  145. package/dist/grid/grid.d.ts +42 -0
  146. package/dist/grid/index.d.ts +2 -0
  147. package/dist/grid/index.js +73 -0
  148. package/dist/grid/index.js.map +1 -0
  149. package/dist/icon/icon.d.ts +37 -1
  150. package/dist/icon/identity.d.ts +3 -0
  151. package/dist/icon/index.js +2 -20
  152. package/dist/icon-Cgdbnk1u.js +77 -0
  153. package/dist/icon-Cgdbnk1u.js.map +1 -0
  154. package/dist/image/image-load.d.ts +24 -0
  155. package/dist/image/image.d.ts +45 -8
  156. package/dist/image/index.d.ts +1 -0
  157. package/dist/image/index.js +116 -14
  158. package/dist/image/index.js.map +1 -1
  159. package/dist/image-preview/image-preview.d.ts +124 -0
  160. package/dist/image-preview/index.d.ts +1 -0
  161. package/dist/image-preview/index.js +450 -0
  162. package/dist/image-preview/index.js.map +1 -0
  163. package/dist/index-bar/index-bar.d.ts +121 -0
  164. package/dist/index-bar/index.d.ts +1 -0
  165. package/dist/index-bar/index.js +386 -0
  166. package/dist/index-bar/index.js.map +1 -0
  167. package/dist/index.d.ts +115 -10
  168. package/dist/index.js +151 -11
  169. package/dist/index.js.map +1 -0
  170. package/dist/infinite-scroll/index.d.ts +1 -0
  171. package/dist/infinite-scroll/index.js +248 -0
  172. package/dist/infinite-scroll/index.js.map +1 -0
  173. package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
  174. package/dist/input/index.js +181 -22
  175. package/dist/input/index.js.map +1 -1
  176. package/dist/input/input.d.ts +44 -1
  177. package/dist/layer-IpFrl5--.js +414 -0
  178. package/dist/layer-IpFrl5--.js.map +1 -0
  179. package/dist/layout-BRSqi4AQ.js +43 -0
  180. package/dist/layout-BRSqi4AQ.js.map +1 -0
  181. package/dist/layout.d.ts +13 -0
  182. package/dist/list/index.d.ts +2 -0
  183. package/dist/list/index.js +2 -0
  184. package/dist/list/list.d.ts +30 -0
  185. package/dist/list-6-iz-Irh.js +28 -0
  186. package/dist/list-6-iz-Irh.js.map +1 -0
  187. package/dist/loading/index.js +45 -2
  188. package/dist/loading/index.js.map +1 -1
  189. package/dist/loading/loading.d.ts +45 -2
  190. package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
  191. package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
  192. package/dist/modal-dialog-machine.d.ts +21 -0
  193. package/dist/modal-dismissable-lifetime.d.ts +21 -0
  194. package/dist/modal-registry.d.ts +24 -0
  195. package/dist/modal-render-hydration.d.ts +35 -0
  196. package/dist/modal-render-runtime.d.ts +19 -0
  197. package/dist/modal-render-scope.d.ts +63 -0
  198. package/dist/nav-bar/index.d.ts +1 -0
  199. package/dist/nav-bar/index.js +115 -0
  200. package/dist/nav-bar/index.js.map +1 -0
  201. package/dist/nav-bar/nav-bar.d.ts +76 -0
  202. package/dist/notice-bar/index.d.ts +2 -0
  203. package/dist/notice-bar/index.js +2 -0
  204. package/dist/notice-bar/notice-bar.d.ts +103 -0
  205. package/dist/notice-bar-DMpwLvRb.js +231 -0
  206. package/dist/notice-bar-DMpwLvRb.js.map +1 -0
  207. package/dist/notify/index.d.ts +1 -0
  208. package/dist/notify/index.js +251 -0
  209. package/dist/notify/index.js.map +1 -0
  210. package/dist/notify/notify.d.ts +123 -0
  211. package/dist/number-keyboard/index.d.ts +1 -0
  212. package/dist/number-keyboard/index.js +333 -0
  213. package/dist/number-keyboard/index.js.map +1 -0
  214. package/dist/number-keyboard/number-keyboard.d.ts +141 -0
  215. package/dist/overlay-panel/index.d.ts +2 -0
  216. package/dist/overlay-panel/index.js +2 -0
  217. package/dist/overlay-panel/overlay-panel.d.ts +20 -0
  218. package/dist/overlay-panel-Z_qdKeBj.js +26 -0
  219. package/dist/overlay-panel-Z_qdKeBj.js.map +1 -0
  220. package/dist/page-indicator/index.d.ts +1 -0
  221. package/dist/page-indicator/index.js +138 -0
  222. package/dist/page-indicator/index.js.map +1 -0
  223. package/dist/page-indicator/page-indicator.d.ts +93 -0
  224. package/dist/pagination/index.d.ts +1 -0
  225. package/dist/pagination/index.js +198 -0
  226. package/dist/pagination/index.js.map +1 -0
  227. package/dist/pagination/pagination.d.ts +125 -0
  228. package/dist/password-input/index.d.ts +1 -0
  229. package/dist/password-input/index.js +317 -0
  230. package/dist/password-input/index.js.map +1 -0
  231. package/dist/password-input/password-input.d.ts +144 -0
  232. package/dist/picker/index.d.ts +8 -0
  233. package/dist/picker/index.js +2 -0
  234. package/dist/picker/picker-machine.d.ts +80 -0
  235. package/dist/picker/picker.d.ts +121 -0
  236. package/dist/picker/platform.d.ts +84 -0
  237. package/dist/picker/selection-connect.d.ts +90 -0
  238. package/dist/picker/selection-model.d.ts +211 -0
  239. package/dist/picker-BykFntQN.js +1675 -0
  240. package/dist/picker-BykFntQN.js.map +1 -0
  241. package/dist/popover/index.d.ts +3 -0
  242. package/dist/popover/index.js +253 -0
  243. package/dist/popover/index.js.map +1 -0
  244. package/dist/popover/layer.d.ts +44 -0
  245. package/dist/popover/popover.d.ts +104 -0
  246. package/dist/popover/positioning.d.ts +132 -0
  247. package/dist/popup/index.d.ts +2 -0
  248. package/dist/popup/index.js +2 -0
  249. package/dist/popup/popup.d.ts +60 -0
  250. package/dist/popup-z5d8IYCt.js +576 -0
  251. package/dist/popup-z5d8IYCt.js.map +1 -0
  252. package/dist/portal-BHCNTWhg.js +78 -0
  253. package/dist/portal-BHCNTWhg.js.map +1 -0
  254. package/dist/portal.d.ts +61 -0
  255. package/dist/price/format.d.ts +19 -0
  256. package/dist/price/index.d.ts +1 -0
  257. package/dist/price/index.js +154 -0
  258. package/dist/price/index.js.map +1 -0
  259. package/dist/price/price.d.ts +88 -0
  260. package/dist/progress/index.d.ts +1 -0
  261. package/dist/progress/index.js +2 -0
  262. package/dist/progress/progress.d.ts +32 -0
  263. package/dist/progress-f3iYEfdA.js +37 -0
  264. package/dist/progress-f3iYEfdA.js.map +1 -0
  265. package/dist/pull-refresh/index.d.ts +1 -0
  266. package/dist/pull-refresh/index.js +414 -0
  267. package/dist/pull-refresh/index.js.map +1 -0
  268. package/dist/pull-refresh/pull-refresh.d.ts +118 -0
  269. package/dist/radio-group/index.d.ts +3 -0
  270. package/dist/radio-group/index.js +2 -0
  271. package/dist/radio-group/radio-group.d.ts +78 -0
  272. package/dist/radio-group-BOIMuqnS.js +230 -0
  273. package/dist/radio-group-BOIMuqnS.js.map +1 -0
  274. package/dist/rate/index.d.ts +1 -0
  275. package/dist/rate/index.js +2 -0
  276. package/dist/rate/rate-form.d.ts +28 -0
  277. package/dist/rate/rate.d.ts +144 -0
  278. package/dist/rate-5XsU2QkY.js +631 -0
  279. package/dist/rate-5XsU2QkY.js.map +1 -0
  280. package/dist/reorder/index.d.ts +1 -0
  281. package/dist/reorder/index.js +720 -0
  282. package/dist/reorder/index.js.map +1 -0
  283. package/dist/reorder/reorder.d.ts +190 -0
  284. package/dist/result/index.d.ts +1 -0
  285. package/dist/result/index.js +123 -0
  286. package/dist/result/index.js.map +1 -0
  287. package/dist/result/result.d.ts +88 -0
  288. package/dist/safe-area/index.d.ts +1 -0
  289. package/dist/safe-area/index.js +42 -0
  290. package/dist/safe-area/index.js.map +1 -0
  291. package/dist/safe-area/safe-area.d.ts +28 -0
  292. package/dist/search-bar/index.js +4 -2
  293. package/dist/search-bar/index.js.map +1 -1
  294. package/dist/search-bar/search-bar.d.ts +6 -0
  295. package/dist/segmented/index.d.ts +2 -0
  296. package/dist/segmented/index.js +2 -0
  297. package/dist/segmented/segmented.d.ts +127 -0
  298. package/dist/segmented-BaU38_L4.js +367 -0
  299. package/dist/segmented-BaU38_L4.js.map +1 -0
  300. package/dist/selection-form-BOM_odUk.js +88 -0
  301. package/dist/selection-form-BOM_odUk.js.map +1 -0
  302. package/dist/selection-form.d.ts +27 -0
  303. package/dist/selection-ivXqO1eu.js +55 -0
  304. package/dist/selection-ivXqO1eu.js.map +1 -0
  305. package/dist/selection.d.ts +29 -0
  306. package/dist/selector/choice-group.d.ts +114 -0
  307. package/dist/selector/index.d.ts +2 -0
  308. package/dist/selector/index.js +2 -0
  309. package/dist/selector/selector.d.ts +90 -0
  310. package/dist/selector-BU2MMJ4N.js +93 -0
  311. package/dist/selector-BU2MMJ4N.js.map +1 -0
  312. package/dist/share-sheet/index.d.ts +1 -0
  313. package/dist/share-sheet/index.js +138 -0
  314. package/dist/share-sheet/index.js.map +1 -0
  315. package/dist/share-sheet/share-sheet.d.ts +139 -0
  316. package/dist/side-nav/index.d.ts +1 -0
  317. package/dist/side-nav/index.js +99 -0
  318. package/dist/side-nav/index.js.map +1 -0
  319. package/dist/side-nav/side-nav.d.ts +94 -0
  320. package/dist/skeleton/index.js +51 -2
  321. package/dist/skeleton/index.js.map +1 -1
  322. package/dist/skeleton/skeleton.d.ts +34 -3
  323. package/dist/slider/index.d.ts +1 -0
  324. package/dist/slider/index.js +482 -0
  325. package/dist/slider/index.js.map +1 -0
  326. package/dist/slider/slider.d.ts +174 -0
  327. package/dist/space/index.d.ts +1 -0
  328. package/dist/space/index.js +52 -0
  329. package/dist/space/index.js.map +1 -0
  330. package/dist/space/space.d.ts +46 -0
  331. package/dist/statistic/index.d.ts +1 -0
  332. package/dist/statistic/index.js +152 -0
  333. package/dist/statistic/index.js.map +1 -0
  334. package/dist/statistic/statistic.d.ts +101 -0
  335. package/dist/stepper/index.d.ts +1 -0
  336. package/dist/stepper/index.js +172 -0
  337. package/dist/stepper/index.js.map +1 -0
  338. package/dist/stepper/stepper.d.ts +161 -0
  339. package/dist/steps/index.d.ts +1 -0
  340. package/dist/steps/index.js +72 -0
  341. package/dist/steps/index.js.map +1 -0
  342. package/dist/steps/steps.d.ts +67 -0
  343. package/dist/sticky/index.d.ts +1 -0
  344. package/dist/sticky/index.js +145 -0
  345. package/dist/sticky/index.js.map +1 -0
  346. package/dist/sticky/sticky.d.ts +70 -0
  347. package/dist/swipe-action/index.d.ts +1 -0
  348. package/dist/swipe-action/index.js +417 -0
  349. package/dist/swipe-action/index.js.map +1 -0
  350. package/dist/swipe-action/swipe-action.d.ts +148 -0
  351. package/dist/swiper/gesture.d.ts +32 -0
  352. package/dist/swiper/index.d.ts +1 -0
  353. package/dist/swiper/index.js +2 -0
  354. package/dist/swiper/swiper.d.ts +177 -0
  355. package/dist/swiper-BKivDkHp.js +550 -0
  356. package/dist/swiper-BKivDkHp.js.map +1 -0
  357. package/dist/switch/index.d.ts +1 -0
  358. package/dist/switch/index.js +168 -0
  359. package/dist/switch/index.js.map +1 -0
  360. package/dist/switch/switch.d.ts +142 -0
  361. package/dist/tabbar/index.d.ts +1 -0
  362. package/dist/tabbar/index.js +95 -0
  363. package/dist/tabbar/index.js.map +1 -0
  364. package/dist/tabbar/tabbar.d.ts +119 -0
  365. package/dist/tabs/index.js +22 -1
  366. package/dist/tabs/index.js.map +1 -1
  367. package/dist/tabs/tabs.d.ts +12 -8
  368. package/dist/tag/index.js +123 -2
  369. package/dist/tag/index.js.map +1 -1
  370. package/dist/tag/tag.d.ts +67 -1
  371. package/dist/textarea/index.d.ts +2 -0
  372. package/dist/textarea/index.js +2 -242
  373. package/dist/textarea/platform.d.ts +22 -0
  374. package/dist/textarea/textarea.d.ts +169 -46
  375. package/dist/textarea-qbnruDUG.js +775 -0
  376. package/dist/textarea-qbnruDUG.js.map +1 -0
  377. package/dist/time-picker/index.d.ts +1 -0
  378. package/dist/time-picker/index.js +228 -0
  379. package/dist/time-picker/index.js.map +1 -0
  380. package/dist/time-picker/time-picker.d.ts +83 -0
  381. package/dist/timeline/index.d.ts +1 -0
  382. package/dist/timeline/index.js +131 -0
  383. package/dist/timeline/index.js.map +1 -0
  384. package/dist/timeline/timeline.d.ts +79 -0
  385. package/dist/toast/index.js +47 -4
  386. package/dist/toast/index.js.map +1 -1
  387. package/dist/toast/toast.d.ts +26 -3
  388. package/dist/top-bar/index.js +16 -2
  389. package/dist/top-bar/index.js.map +1 -1
  390. package/dist/top-bar/top-bar.d.ts +13 -2
  391. package/dist/tree-select/index.d.ts +1 -0
  392. package/dist/tree-select/index.js +512 -0
  393. package/dist/tree-select/index.js.map +1 -0
  394. package/dist/tree-select/tree-select.d.ts +215 -0
  395. package/dist/typography/index.d.ts +1 -0
  396. package/dist/typography/index.js +82 -0
  397. package/dist/typography/index.js.map +1 -0
  398. package/dist/typography/typography.d.ts +54 -0
  399. package/dist/upload/index.d.ts +1 -0
  400. package/dist/upload/index.js +458 -0
  401. package/dist/upload/index.js.map +1 -0
  402. package/dist/upload/upload.d.ts +172 -0
  403. package/dist/virtual-list/index.d.ts +1 -0
  404. package/dist/virtual-list/index.js +445 -0
  405. package/dist/virtual-list/index.js.map +1 -0
  406. package/dist/virtual-list/virtual-list.d.ts +160 -0
  407. package/dist/visual-manifest.d.ts +27 -0
  408. package/dist/watermark/index.d.ts +1 -0
  409. package/dist/watermark/index.js +260 -0
  410. package/dist/watermark/index.js.map +1 -0
  411. package/dist/watermark/watermark.d.ts +106 -0
  412. package/package.json +417 -44
  413. package/dist/empty/index.js.map +0 -1
  414. package/dist/icon/index.js.map +0 -1
  415. package/dist/textarea/index.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ import { type Machine, type Service } from "@zag-js/core";
2
+ import type { NormalizeProps, PropTypes } from "@zag-js/types";
3
+ import { type IconState } from "../icon/index.js";
4
+ /** Stable DOM parts shared by every adapter. */
5
+ export declare const NOTIFY_PARTS: readonly ["root", "message", "action", "close"];
6
+ /** Four semantic types; primary doubles as the neutral/info tone. */
7
+ export declare const NOTIFY_TYPES: readonly ["primary", "success", "warning", "danger"];
8
+ export type NotifyType = (typeof NOTIFY_TYPES)[number];
9
+ export declare const NOTIFY_DEFAULT_DURATION = 3000;
10
+ /** Why the open state changed: timer expiry, close button / Escape, action activation, or an imperative show/close. */
11
+ export type NotifyOpenChangeReason = "timeout" | "close" | "action" | "api";
12
+ export interface NotifyOpenChangeDetails {
13
+ open: boolean;
14
+ reason: NotifyOpenChangeReason;
15
+ }
16
+ export interface QwNotifyProps {
17
+ /** Page-unique instance identity; adapters generate one when omitted. */
18
+ id?: string;
19
+ /** Controlled visibility; undefined lets Core own it (seeded by defaultOpen). */
20
+ open?: boolean;
21
+ defaultOpen?: boolean;
22
+ /** Called for every open request; controlled owners accept by updating `open`. */
23
+ onOpenChange?: (details: NotifyOpenChangeDetails) => void;
24
+ /** Semantic type; default primary. danger is announced assertively (role=alert). */
25
+ type?: NotifyType;
26
+ /** Notification text. Changing it while open replaces the content and restarts the timer. */
27
+ message?: string;
28
+ /** Optional action button text; omitted hides the action. */
29
+ actionText?: string;
30
+ /** The action button was activated (before the optional close). */
31
+ onAction?: () => void;
32
+ /** Close after the action; default true. */
33
+ closeOnAction?: boolean;
34
+ /** Show the close button (and allow Escape); default true. */
35
+ closable?: boolean;
36
+ /** Accessible name of the close button; default 关闭通知. */
37
+ closeLabel?: string;
38
+ /** Auto-dismiss delay in ms; 0 keeps it open; invalid uses 3000. Paused on hover and while focus is inside. */
39
+ duration?: number;
40
+ }
41
+ export interface ResolvedNotifyState {
42
+ type: NotifyType;
43
+ message: string;
44
+ actionText: string;
45
+ closeOnAction: boolean;
46
+ closable: boolean;
47
+ closeLabel: string;
48
+ duration: number;
49
+ }
50
+ export declare function resolveNotifyState(props?: QwNotifyProps): ResolvedNotifyState;
51
+ export declare function createNotifyProps(props?: QwNotifyProps): QwNotifyProps;
52
+ /** Minimal event surface shared by React, Vue and native events. */
53
+ export interface NotifyDomEvent {
54
+ readonly defaultPrevented: boolean;
55
+ readonly type?: string;
56
+ readonly key?: string;
57
+ readonly pointerType?: string;
58
+ readonly currentTarget?: unknown;
59
+ readonly relatedTarget?: unknown;
60
+ preventDefault?(): void;
61
+ }
62
+ export type NotifyEventHandler = (event: NotifyDomEvent) => void;
63
+ type RootHandler = "onPointerEnter" | "onPointerLeave" | "onFocus" | "onBlur" | "onKeyDown";
64
+ /** Caller handlers for the root run first; Core's own handler is skipped when the caller calls preventDefault(). */
65
+ export interface NotifyConnectOptions {
66
+ root?: Partial<Record<RootHandler, NotifyEventHandler | readonly NotifyEventHandler[] | undefined>>;
67
+ }
68
+ export interface QwNotifySchema {
69
+ props: QwNotifyProps;
70
+ context: {
71
+ open: boolean;
72
+ };
73
+ refs: {
74
+ timer: ReturnType<typeof setTimeout> | undefined;
75
+ remaining: number;
76
+ startedAt: number;
77
+ hovered: boolean;
78
+ focused: boolean;
79
+ };
80
+ state: "ready";
81
+ action: "show" | "close" | "action" | "restart" | "pause" | "expire";
82
+ effect: "lifecycle";
83
+ event: {
84
+ type: "SHOW";
85
+ } | {
86
+ type: "CLOSE";
87
+ reason: NotifyOpenChangeReason;
88
+ } | {
89
+ type: "ACTION";
90
+ } | {
91
+ type: "RESTART";
92
+ } | {
93
+ type: "TIMEOUT";
94
+ } | {
95
+ type: "HOVER";
96
+ value: boolean;
97
+ } | {
98
+ type: "FOCUS";
99
+ value: boolean;
100
+ };
101
+ }
102
+ export type QwNotifyMachine = Machine<QwNotifySchema>;
103
+ export type QwNotifyService = Service<QwNotifySchema>;
104
+ /** Core owns visibility requests, the auto-dismiss timer, hover/focus pause, content-replacement restarts and cleanup. */
105
+ export declare const notifyMachine: QwNotifyMachine;
106
+ export interface QwNotifyApi<T extends PropTypes = PropTypes> {
107
+ open: boolean;
108
+ type: NotifyType;
109
+ message: string;
110
+ actionText: string;
111
+ closable: boolean;
112
+ closeLabel: string;
113
+ show(): void;
114
+ close(): void;
115
+ getRootProps(): T["element"];
116
+ getMessageProps(): T["element"];
117
+ getActionProps(): T["button"];
118
+ getCloseProps(): T["button"];
119
+ /** Decorative close glyph rendered inside the close button. */
120
+ getCloseIconState(): IconState;
121
+ }
122
+ export declare function connectNotify<T extends PropTypes>(service: QwNotifyService, normalize: NormalizeProps<T>, options?: NotifyConnectOptions): QwNotifyApi<T>;
123
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./number-keyboard.js";
@@ -0,0 +1,333 @@
1
+ import { createMachine } from "@zag-js/core";
2
+ import { dataAttr } from "@zag-js/dom-query";
3
+ //#region src/number-keyboard/number-keyboard.ts
4
+ /**
5
+ * NumberKeyboard 数字键盘:内联输入事件源。
6
+ *
7
+ * Core 只报告按了什么(输入 / 删除 / 完成),从不持有或修改调用方的值。
8
+ * 长按删除、禁用、物理按键映射都在这里;适配层只运输事件并重绘。
9
+ */
10
+ /** Stable DOM parts shared by every adapter. */
11
+ const NUMBER_KEYBOARD_PARTS = [
12
+ "root",
13
+ "keys",
14
+ "key",
15
+ "sidebar",
16
+ "delete-key",
17
+ "delete-icon",
18
+ "done-key"
19
+ ];
20
+ /** Digit keys in render order: 1–9 fill three rows, 0 sits in the bottom row. */
21
+ const NUMBER_KEYBOARD_DIGITS = [
22
+ "1",
23
+ "2",
24
+ "3",
25
+ "4",
26
+ "5",
27
+ "6",
28
+ "7",
29
+ "8",
30
+ "9",
31
+ "0"
32
+ ];
33
+ /** At most two extra keys share the bottom row with 0. */
34
+ const NUMBER_KEYBOARD_MAX_EXTRA_KEYS = 2;
35
+ /** Hold time (ms) before a pressed delete key starts repeating. */
36
+ const NUMBER_KEYBOARD_LONG_PRESS_DELAY = 500;
37
+ /** Interval (ms) between repeated deletes while the pointer stays down. */
38
+ const NUMBER_KEYBOARD_REPEAT_INTERVAL = 100;
39
+ /** Decorative delete glyph. Adapters render it `aria-hidden`; the name comes from `deleteLabel`. */
40
+ const NUMBER_KEYBOARD_DELETE_GLYPH = "⌫";
41
+ const DEFAULT_LABEL = "数字键盘";
42
+ const DEFAULT_DELETE_LABEL = "删除";
43
+ const DEFAULT_DONE_TEXT = "完成";
44
+ const DIGITS = NUMBER_KEYBOARD_DIGITS;
45
+ const text = (value) => typeof value === "string" ? value.trim() : "";
46
+ /** Trim extra keys; drop empty, digit and duplicate keys; keep at most two. Never throws. */
47
+ function normalizeNumberKeyboardExtraKeys(extraKeys) {
48
+ const result = [];
49
+ for (const item of Array.isArray(extraKeys) ? extraKeys : []) {
50
+ const key = text(typeof item === "string" ? item : item?.key), label = item && typeof item === "object" ? text(item.label) : "";
51
+ if (!key || DIGITS.includes(key) || result.some((entry) => entry.key === key)) continue;
52
+ result.push(label ? {
53
+ key,
54
+ label
55
+ } : { key });
56
+ if (result.length === 2) break;
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Ordered input keys. Bottom row: no extra → 0 spans three columns; one extra → 0 spans two, then the extra;
62
+ * two extras → extra₁, 0, extra₂. Delete and done live in the separate side column.
63
+ */
64
+ function getNumberKeyboardKeys(extraKeys) {
65
+ const extras = normalizeNumberKeyboardExtraKeys(extraKeys).map((entry) => ({
66
+ ...entry,
67
+ kind: "extra",
68
+ span: 1
69
+ }));
70
+ const keys = DIGITS.slice(0, 9).map((key) => ({
71
+ key,
72
+ kind: "digit",
73
+ span: 1
74
+ }));
75
+ const zero = {
76
+ key: "0",
77
+ kind: "digit",
78
+ span: extras.length === 2 ? 1 : extras.length === 1 ? 2 : 3
79
+ };
80
+ return extras.length === 2 ? [
81
+ ...keys,
82
+ extras[0],
83
+ zero,
84
+ extras[1]
85
+ ] : [
86
+ ...keys,
87
+ zero,
88
+ ...extras
89
+ ];
90
+ }
91
+ /** Resolve a pressed or typed key against the current key set. Single letters match case-insensitively. */
92
+ function resolveNumberKeyboardKey(extraKeys, key) {
93
+ if (typeof key !== "string" || !key) return void 0;
94
+ const keys = getNumberKeyboardKeys(extraKeys);
95
+ return keys.find((item) => item.key === key) ?? (key.length === 1 ? keys.find((item) => item.key.toLowerCase() === key.toLowerCase()) : void 0);
96
+ }
97
+ function createNumberKeyboardProps(props = {}) {
98
+ return {
99
+ ...props,
100
+ label: text(props.label) || DEFAULT_LABEL,
101
+ deleteLabel: text(props.deleteLabel) || DEFAULT_DELETE_LABEL,
102
+ doneText: text(props.doneText) || DEFAULT_DONE_TEXT,
103
+ disabled: !!props.disabled,
104
+ dir: props.dir === "rtl" || props.dir === "ltr" ? props.dir : void 0
105
+ };
106
+ }
107
+ /**
108
+ * Tap = click: one notification for mouse, touch, keyboard and assistive tech alike.
109
+ * Hold (delete only): after the delay Core repeats `onDelete({ repeat: true })` until the same pointer
110
+ * goes up / cancels / leaves, the keyboard is disabled, or the machine stops. Timers live in state effects,
111
+ * so leaving the state or stopping the machine always clears them. The pointer click that ends a repeat
112
+ * session is swallowed so a long press never adds one extra delete.
113
+ */
114
+ const numberKeyboardMachine = createMachine({
115
+ props: ({ props }) => createNumberKeyboardProps(props),
116
+ initialState: () => "idle",
117
+ refs: () => ({
118
+ pointerId: null,
119
+ swallowClick: false
120
+ }),
121
+ watch({ track, prop, send }) {
122
+ track([() => !!prop("disabled")], () => {
123
+ if (prop("disabled")) send({ type: "PRESS.ABORT" });
124
+ });
125
+ },
126
+ on: {
127
+ "KEY.INPUT": { actions: ["input"] },
128
+ "KEY.DELETE": { actions: ["remove"] },
129
+ "KEY.DONE": { actions: ["done"] }
130
+ },
131
+ states: {
132
+ idle: { on: { "PRESS.START": {
133
+ guard: "isEnabled",
134
+ target: "holding",
135
+ actions: ["beginPress"]
136
+ } } },
137
+ holding: {
138
+ effects: ["waitForHold"],
139
+ on: {
140
+ "PRESS.END": {
141
+ guard: "isPressPointer",
142
+ target: "idle",
143
+ actions: ["endPress"]
144
+ },
145
+ "PRESS.ABORT": {
146
+ target: "idle",
147
+ actions: ["endPress"]
148
+ },
149
+ "HOLD.ELAPSED": [{
150
+ guard: "isEnabled",
151
+ target: "repeating",
152
+ actions: ["repeatRemove"]
153
+ }, {
154
+ target: "idle",
155
+ actions: ["endPress"]
156
+ }]
157
+ }
158
+ },
159
+ repeating: {
160
+ effects: ["repeatWhileHeld"],
161
+ on: {
162
+ "PRESS.END": {
163
+ guard: "isPressPointer",
164
+ target: "idle",
165
+ actions: ["endPress"]
166
+ },
167
+ "PRESS.ABORT": {
168
+ target: "idle",
169
+ actions: ["endPress"]
170
+ },
171
+ "REPEAT.TICK": [{
172
+ guard: "isEnabled",
173
+ actions: ["repeatRemove"]
174
+ }, {
175
+ target: "idle",
176
+ actions: ["endPress"]
177
+ }]
178
+ }
179
+ }
180
+ },
181
+ implementations: {
182
+ guards: {
183
+ isEnabled: ({ prop }) => !prop("disabled"),
184
+ isPressPointer: ({ event, refs }) => event.type === "PRESS.END" && event.pointerId === refs.get("pointerId")
185
+ },
186
+ actions: {
187
+ input({ event, prop }) {
188
+ if (event.type !== "KEY.INPUT" || prop("disabled")) return;
189
+ const key = resolveNumberKeyboardKey(prop("extraKeys"), event.key);
190
+ if (key) prop("onInput")?.({ key: key.key });
191
+ },
192
+ remove({ event, prop, refs }) {
193
+ if (event.type !== "KEY.DELETE" || prop("disabled")) return;
194
+ const swallow = !!event.pointer && refs.get("swallowClick");
195
+ refs.set("swallowClick", false);
196
+ if (!swallow) prop("onDelete")?.({ repeat: !!event.repeat });
197
+ },
198
+ done({ prop }) {
199
+ if (!prop("disabled")) prop("onDone")?.();
200
+ },
201
+ beginPress({ event, refs }) {
202
+ if (event.type === "PRESS.START") {
203
+ refs.set("pointerId", event.pointerId);
204
+ refs.set("swallowClick", false);
205
+ }
206
+ },
207
+ endPress({ refs }) {
208
+ refs.set("pointerId", null);
209
+ },
210
+ repeatRemove({ prop, refs }) {
211
+ refs.set("swallowClick", true);
212
+ prop("onDelete")?.({ repeat: true });
213
+ }
214
+ },
215
+ effects: {
216
+ waitForHold({ send }) {
217
+ const timer = setTimeout(() => send({ type: "HOLD.ELAPSED" }), 500);
218
+ return () => clearTimeout(timer);
219
+ },
220
+ repeatWhileHeld({ send }) {
221
+ const timer = setInterval(() => send({ type: "REPEAT.TICK" }), 100);
222
+ return () => clearInterval(timer);
223
+ }
224
+ }
225
+ }
226
+ });
227
+ function connectNumberKeyboard(service, normalize) {
228
+ const { prop, send } = service;
229
+ const disabled = !!prop("disabled"), keys = getNumberKeyboardKeys(prop("extraKeys")), repeating = service.state.matches("repeating");
230
+ const label = prop("label") || DEFAULT_LABEL, deleteLabel = prop("deleteLabel") || DEFAULT_DELETE_LABEL, doneText = prop("doneText") || DEFAULT_DONE_TEXT;
231
+ const part = (name) => ({
232
+ "data-scope": "number-keyboard",
233
+ "data-part": name
234
+ });
235
+ const end = (event) => send({
236
+ type: "PRESS.END",
237
+ pointerId: event.pointerId
238
+ });
239
+ return {
240
+ keys,
241
+ disabled,
242
+ repeating,
243
+ label,
244
+ deleteLabel,
245
+ doneText,
246
+ input: (key) => send({
247
+ type: "KEY.INPUT",
248
+ key
249
+ }),
250
+ remove: () => send({ type: "KEY.DELETE" }),
251
+ done: () => send({ type: "KEY.DONE" }),
252
+ getRootProps: () => normalize.element({
253
+ ...part("root"),
254
+ role: "group",
255
+ "aria-label": label,
256
+ dir: prop("dir"),
257
+ "data-disabled": dataAttr(disabled),
258
+ onKeyDown(event) {
259
+ if (event.defaultPrevented || disabled || event.ctrlKey || event.metaKey || event.altKey || event.isComposing) return;
260
+ if (event.key === "Backspace") {
261
+ event.preventDefault();
262
+ send({
263
+ type: "KEY.DELETE",
264
+ repeat: !!event.repeat
265
+ });
266
+ return;
267
+ }
268
+ const key = typeof event.key === "string" && event.key.length === 1 ? resolveNumberKeyboardKey(prop("extraKeys"), event.key) : void 0;
269
+ if (key) {
270
+ event.preventDefault();
271
+ send({
272
+ type: "KEY.INPUT",
273
+ key: key.key
274
+ });
275
+ }
276
+ }
277
+ }),
278
+ getKeysProps: () => normalize.element(part("keys")),
279
+ getKeyProps: (key) => normalize.button({
280
+ ...part("key"),
281
+ type: "button",
282
+ "data-value": key.key,
283
+ "data-kind": key.kind,
284
+ "data-span": key.span > 1 ? String(key.span) : void 0,
285
+ "aria-label": key.label,
286
+ disabled,
287
+ onClick: () => send({
288
+ type: "KEY.INPUT",
289
+ key: key.key
290
+ })
291
+ }),
292
+ getSidebarProps: () => normalize.element(part("sidebar")),
293
+ getDeleteKeyProps: () => normalize.button({
294
+ ...part("delete-key"),
295
+ type: "button",
296
+ "aria-label": deleteLabel,
297
+ disabled,
298
+ "data-repeating": dataAttr(repeating),
299
+ onClick(event) {
300
+ send({
301
+ type: "KEY.DELETE",
302
+ pointer: (event.detail ?? 0) > 0
303
+ });
304
+ },
305
+ onPointerDown(event) {
306
+ if (event.isPrimary !== false && !((event.button ?? 0) > 0)) send({
307
+ type: "PRESS.START",
308
+ pointerId: event.pointerId
309
+ });
310
+ },
311
+ onPointerUp: end,
312
+ onPointerCancel: end,
313
+ onPointerLeave: end,
314
+ onContextMenu(event) {
315
+ event.preventDefault();
316
+ }
317
+ }),
318
+ getDeleteIconProps: () => normalize.element({
319
+ ...part("delete-icon"),
320
+ "aria-hidden": true
321
+ }),
322
+ getDoneKeyProps: () => normalize.button({
323
+ ...part("done-key"),
324
+ type: "button",
325
+ disabled,
326
+ onClick: () => send({ type: "KEY.DONE" })
327
+ })
328
+ };
329
+ }
330
+ //#endregion
331
+ export { NUMBER_KEYBOARD_DELETE_GLYPH, NUMBER_KEYBOARD_DIGITS, NUMBER_KEYBOARD_LONG_PRESS_DELAY, NUMBER_KEYBOARD_MAX_EXTRA_KEYS, NUMBER_KEYBOARD_PARTS, NUMBER_KEYBOARD_REPEAT_INTERVAL, connectNumberKeyboard, createNumberKeyboardProps, getNumberKeyboardKeys, normalizeNumberKeyboardExtraKeys, numberKeyboardMachine, resolveNumberKeyboardKey };
332
+
333
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/number-keyboard/number-keyboard.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\";\n\n/**\n * NumberKeyboard 数字键盘:内联输入事件源。\n *\n * Core 只报告按了什么(输入 / 删除 / 完成),从不持有或修改调用方的值。\n * 长按删除、禁用、物理按键映射都在这里;适配层只运输事件并重绘。\n */\n\n/** Stable DOM parts shared by every adapter. */\nexport const NUMBER_KEYBOARD_PARTS = [\"root\", \"keys\", \"key\", \"sidebar\", \"delete-key\", \"delete-icon\", \"done-key\"] as const;\n/** Digit keys in render order: 1–9 fill three rows, 0 sits in the bottom row. */\nexport const NUMBER_KEYBOARD_DIGITS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"0\"] as const;\n/** At most two extra keys share the bottom row with 0. */\nexport const NUMBER_KEYBOARD_MAX_EXTRA_KEYS = 2;\n/** Hold time (ms) before a pressed delete key starts repeating. */\nexport const NUMBER_KEYBOARD_LONG_PRESS_DELAY = 500;\n/** Interval (ms) between repeated deletes while the pointer stays down. */\nexport const NUMBER_KEYBOARD_REPEAT_INTERVAL = 100;\n/** Decorative delete glyph. Adapters render it `aria-hidden`; the name comes from `deleteLabel`. */\nexport const NUMBER_KEYBOARD_DELETE_GLYPH = \"⌫\";\n\nexport type NumberKeyboardPart = (typeof NUMBER_KEYBOARD_PARTS)[number];\n/** An extra key: a bare string such as \".\" / \"X\", or a key with an accessible label. */\nexport type NumberKeyboardExtraKey = string | { key: string; label?: string };\n/** One rendered input key. `span` is the number of grid columns it occupies. */\nexport interface NumberKeyboardKey { key: string; kind: \"digit\" | \"extra\"; label?: string; span: 1 | 2 | 3 }\nexport interface NumberKeyboardInputDetails { key: string }\n/** `repeat` is true for deletes produced by a held delete key or a held physical Backspace. */\nexport interface NumberKeyboardDeleteDetails { repeat: boolean }\n\nexport interface QwNumberKeyboardProps {\n /** Instance identity; adapters generate one when omitted. */\n id?: string;\n /** Accessible name of the keyboard group; defaults to 数字键盘. */\n label?: string;\n /** Up to two extra keys next to 0, e.g. [\".\"] for amounts or [\"X\"] for ID cards. Empty, digit and duplicate keys are dropped. */\n extraKeys?: readonly NumberKeyboardExtraKey[];\n /** Disables every key; nothing is reported and an active long press stops. */\n disabled?: boolean;\n /** Layout direction; rtl moves the delete/done column to the inline end and mirrors the delete glyph. Digits keep keypad order. */\n dir?: \"ltr\" | \"rtl\";\n /** Accessible name of the delete key; defaults to 删除. */\n deleteLabel?: string;\n /** Visible text of the done key; defaults to 完成. */\n doneText?: string;\n /** A digit or extra key was pressed. The caller decides how its own value changes. */\n onInput?: (details: NumberKeyboardInputDetails) => void;\n /** The delete key was pressed, or repeated while held. */\n onDelete?: (details: NumberKeyboardDeleteDetails) => void;\n /** The done key was pressed. */\n onDone?: () => void;\n}\n\nconst DEFAULT_LABEL = \"数字键盘\", DEFAULT_DELETE_LABEL = \"删除\", DEFAULT_DONE_TEXT = \"完成\";\nconst DIGITS: readonly string[] = NUMBER_KEYBOARD_DIGITS;\nconst text = (value: unknown): string => (typeof value === \"string\" ? value.trim() : \"\");\n\n/** Trim extra keys; drop empty, digit and duplicate keys; keep at most two. Never throws. */\nexport function normalizeNumberKeyboardExtraKeys(extraKeys?: readonly NumberKeyboardExtraKey[]): { key: string; label?: string }[] {\n const result: { key: string; label?: string }[] = [];\n for (const item of Array.isArray(extraKeys) ? extraKeys : []) {\n const key = text(typeof item === \"string\" ? item : item?.key), label = item && typeof item === \"object\" ? text(item.label) : \"\";\n if (!key || DIGITS.includes(key) || result.some((entry) => entry.key === key)) continue;\n result.push(label ? { key, label } : { key });\n if (result.length === NUMBER_KEYBOARD_MAX_EXTRA_KEYS) break;\n }\n return result;\n}\n\n/**\n * Ordered input keys. Bottom row: no extra → 0 spans three columns; one extra → 0 spans two, then the extra;\n * two extras → extra₁, 0, extra₂. Delete and done live in the separate side column.\n */\nexport function getNumberKeyboardKeys(extraKeys?: readonly NumberKeyboardExtraKey[]): NumberKeyboardKey[] {\n const extras = normalizeNumberKeyboardExtraKeys(extraKeys).map((entry): NumberKeyboardKey => ({ ...entry, kind: \"extra\", span: 1 }));\n const keys = DIGITS.slice(0, 9).map((key): NumberKeyboardKey => ({ key, kind: \"digit\", span: 1 }));\n const zero: NumberKeyboardKey = { key: \"0\", kind: \"digit\", span: extras.length === 2 ? 1 : extras.length === 1 ? 2 : 3 };\n return extras.length === 2 ? [...keys, extras[0]!, zero, extras[1]!] : [...keys, zero, ...extras];\n}\n\n/** Resolve a pressed or typed key against the current key set. Single letters match case-insensitively. */\nexport function resolveNumberKeyboardKey(extraKeys: readonly NumberKeyboardExtraKey[] | undefined, key: string): NumberKeyboardKey | undefined {\n if (typeof key !== \"string\" || !key) return undefined;\n const keys = getNumberKeyboardKeys(extraKeys);\n return keys.find((item) => item.key === key) ?? (key.length === 1 ? keys.find((item) => item.key.toLowerCase() === key.toLowerCase()) : undefined);\n}\n\nexport function createNumberKeyboardProps(props: QwNumberKeyboardProps = {}): QwNumberKeyboardProps {\n return {\n ...props,\n label: text(props.label) || DEFAULT_LABEL,\n deleteLabel: text(props.deleteLabel) || DEFAULT_DELETE_LABEL,\n doneText: text(props.doneText) || DEFAULT_DONE_TEXT,\n disabled: !!props.disabled,\n dir: props.dir === \"rtl\" || props.dir === \"ltr\" ? props.dir : undefined,\n };\n}\n\nexport interface QwNumberKeyboardSchema {\n props: QwNumberKeyboardProps;\n refs: { pointerId: number | null; swallowClick: boolean };\n state: \"idle\" | \"holding\" | \"repeating\";\n guard: \"isEnabled\" | \"isPressPointer\";\n action: \"input\" | \"remove\" | \"done\" | \"beginPress\" | \"endPress\" | \"repeatRemove\";\n effect: \"waitForHold\" | \"repeatWhileHeld\";\n event:\n | { type: \"KEY.INPUT\"; key: string }\n | { type: \"KEY.DELETE\"; pointer?: boolean; repeat?: boolean }\n | { type: \"KEY.DONE\" }\n | { type: \"PRESS.START\"; pointerId: number }\n | { type: \"PRESS.END\"; pointerId: number }\n | { type: \"PRESS.ABORT\" }\n | { type: \"HOLD.ELAPSED\" }\n | { type: \"REPEAT.TICK\" };\n}\nexport type QwNumberKeyboardMachine = Machine<QwNumberKeyboardSchema>;\nexport type QwNumberKeyboardService = Service<QwNumberKeyboardSchema>;\n\n/**\n * Tap = click: one notification for mouse, touch, keyboard and assistive tech alike.\n * Hold (delete only): after the delay Core repeats `onDelete({ repeat: true })` until the same pointer\n * goes up / cancels / leaves, the keyboard is disabled, or the machine stops. Timers live in state effects,\n * so leaving the state or stopping the machine always clears them. The pointer click that ends a repeat\n * session is swallowed so a long press never adds one extra delete.\n */\nexport const numberKeyboardMachine: QwNumberKeyboardMachine = createMachine<QwNumberKeyboardSchema>({\n props: ({ props }) => createNumberKeyboardProps(props),\n initialState: () => \"idle\",\n refs: () => ({ pointerId: null, swallowClick: false }),\n watch({ track, prop, send }) { track([() => !!prop(\"disabled\")], () => { if (prop(\"disabled\")) send({ type: \"PRESS.ABORT\" }); }); },\n on: { \"KEY.INPUT\": { actions: [\"input\"] }, \"KEY.DELETE\": { actions: [\"remove\"] }, \"KEY.DONE\": { actions: [\"done\"] } },\n states: {\n idle: { on: { \"PRESS.START\": { guard: \"isEnabled\", target: \"holding\", actions: [\"beginPress\"] } } },\n holding: {\n effects: [\"waitForHold\"],\n on: {\n \"PRESS.END\": { guard: \"isPressPointer\", target: \"idle\", actions: [\"endPress\"] },\n \"PRESS.ABORT\": { target: \"idle\", actions: [\"endPress\"] },\n \"HOLD.ELAPSED\": [{ guard: \"isEnabled\", target: \"repeating\", actions: [\"repeatRemove\"] }, { target: \"idle\", actions: [\"endPress\"] }],\n },\n },\n repeating: {\n effects: [\"repeatWhileHeld\"],\n on: {\n \"PRESS.END\": { guard: \"isPressPointer\", target: \"idle\", actions: [\"endPress\"] },\n \"PRESS.ABORT\": { target: \"idle\", actions: [\"endPress\"] },\n \"REPEAT.TICK\": [{ guard: \"isEnabled\", actions: [\"repeatRemove\"] }, { target: \"idle\", actions: [\"endPress\"] }],\n },\n },\n },\n implementations: {\n guards: {\n isEnabled: ({ prop }) => !prop(\"disabled\"),\n isPressPointer: ({ event, refs }) => event.type === \"PRESS.END\" && event.pointerId === refs.get(\"pointerId\"),\n },\n actions: {\n input({ event, prop }) {\n if (event.type !== \"KEY.INPUT\" || prop(\"disabled\")) return;\n const key = resolveNumberKeyboardKey(prop(\"extraKeys\"), event.key);\n if (key) prop(\"onInput\")?.({ key: key.key });\n },\n remove({ event, prop, refs }) {\n if (event.type !== \"KEY.DELETE\" || prop(\"disabled\")) return;\n const swallow = !!event.pointer && refs.get(\"swallowClick\");\n refs.set(\"swallowClick\", false);\n if (!swallow) prop(\"onDelete\")?.({ repeat: !!event.repeat });\n },\n done({ prop }) { if (!prop(\"disabled\")) prop(\"onDone\")?.(); },\n beginPress({ event, refs }) { if (event.type === \"PRESS.START\") { refs.set(\"pointerId\", event.pointerId); refs.set(\"swallowClick\", false); } },\n endPress({ refs }) { refs.set(\"pointerId\", null); },\n repeatRemove({ prop, refs }) { refs.set(\"swallowClick\", true); prop(\"onDelete\")?.({ repeat: true }); },\n },\n effects: {\n waitForHold({ send }) { const timer = setTimeout(() => send({ type: \"HOLD.ELAPSED\" }), NUMBER_KEYBOARD_LONG_PRESS_DELAY); return () => clearTimeout(timer); },\n repeatWhileHeld({ send }) { const timer = setInterval(() => send({ type: \"REPEAT.TICK\" }), NUMBER_KEYBOARD_REPEAT_INTERVAL); return () => clearInterval(timer); },\n },\n },\n});\n\nexport interface QwNumberKeyboardApi<T extends PropTypes = PropTypes> {\n keys: NumberKeyboardKey[];\n disabled: boolean;\n /** A held delete key is currently repeating. */\n repeating: boolean;\n label: string;\n deleteLabel: string;\n doneText: string;\n /** Report a key press programmatically (ignored when disabled or unknown). */\n input(key: string): void;\n /** Report one delete programmatically. */\n remove(): void;\n /** Report done programmatically. */\n done(): void;\n getRootProps(): T[\"element\"];\n getKeysProps(): T[\"element\"];\n getKeyProps(key: NumberKeyboardKey): T[\"button\"];\n getSidebarProps(): T[\"element\"];\n getDeleteKeyProps(): T[\"button\"];\n getDeleteIconProps(): T[\"element\"];\n getDoneKeyProps(): T[\"button\"];\n}\n\ninterface NumberKeyboardPressEvent { pointerId: number; isPrimary?: boolean; button?: number }\ninterface NumberKeyboardKeyEvent {\n key: string; repeat?: boolean; defaultPrevented: boolean; ctrlKey?: boolean; metaKey?: boolean; altKey?: boolean; isComposing?: boolean;\n preventDefault(): void;\n}\n\nexport function connectNumberKeyboard<T extends PropTypes>(service: QwNumberKeyboardService, normalize: NormalizeProps<T>): QwNumberKeyboardApi<T> {\n const { prop, send } = service;\n const disabled = !!prop(\"disabled\"), keys = getNumberKeyboardKeys(prop(\"extraKeys\")), repeating = service.state.matches(\"repeating\");\n const label = prop(\"label\") || DEFAULT_LABEL, deleteLabel = prop(\"deleteLabel\") || DEFAULT_DELETE_LABEL, doneText = prop(\"doneText\") || DEFAULT_DONE_TEXT;\n const part = (name: NumberKeyboardPart) => ({ \"data-scope\": \"number-keyboard\", \"data-part\": name });\n const end = (event: NumberKeyboardPressEvent) => send({ type: \"PRESS.END\", pointerId: event.pointerId });\n return {\n keys, disabled, repeating, label, deleteLabel, doneText,\n input: (key) => send({ type: \"KEY.INPUT\", key }),\n remove: () => send({ type: \"KEY.DELETE\" }),\n done: () => send({ type: \"KEY.DONE\" }),\n getRootProps: () => normalize.element({\n ...part(\"root\"), role: \"group\", \"aria-label\": label, dir: prop(\"dir\"), \"data-disabled\": dataAttr(disabled),\n onKeyDown(event: NumberKeyboardKeyEvent) {\n if (event.defaultPrevented || disabled || event.ctrlKey || event.metaKey || event.altKey || event.isComposing) return;\n if (event.key === \"Backspace\") { event.preventDefault(); send({ type: \"KEY.DELETE\", repeat: !!event.repeat }); return; }\n const key = typeof event.key === \"string\" && event.key.length === 1 ? resolveNumberKeyboardKey(prop(\"extraKeys\"), event.key) : undefined;\n if (key) { event.preventDefault(); send({ type: \"KEY.INPUT\", key: key.key }); }\n },\n }),\n getKeysProps: () => normalize.element(part(\"keys\")),\n getKeyProps: (key) => normalize.button({\n ...part(\"key\"), type: \"button\", \"data-value\": key.key, \"data-kind\": key.kind, \"data-span\": key.span > 1 ? String(key.span) : undefined,\n \"aria-label\": key.label, disabled, onClick: () => send({ type: \"KEY.INPUT\", key: key.key }),\n }),\n getSidebarProps: () => normalize.element(part(\"sidebar\")),\n getDeleteKeyProps: () => normalize.button({\n ...part(\"delete-key\"), type: \"button\", \"aria-label\": deleteLabel, disabled, \"data-repeating\": dataAttr(repeating),\n onClick(event: { detail?: number }) { send({ type: \"KEY.DELETE\", pointer: (event.detail ?? 0) > 0 }); },\n onPointerDown(event: NumberKeyboardPressEvent) { if (event.isPrimary !== false && !((event.button ?? 0) > 0)) send({ type: \"PRESS.START\", pointerId: event.pointerId }); },\n onPointerUp: end, onPointerCancel: end, onPointerLeave: end,\n // A held key must not open the long-press context menu (Android) or the desktop menu.\n onContextMenu(event: { preventDefault(): void }) { event.preventDefault(); },\n }),\n getDeleteIconProps: () => normalize.element({ ...part(\"delete-icon\"), \"aria-hidden\": true }),\n getDoneKeyProps: () => normalize.button({ ...part(\"done-key\"), type: \"button\", disabled, onClick: () => send({ type: \"KEY.DONE\" }) }),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { type Machine, type Service } from "@zag-js/core";
2
+ import type { NormalizeProps, PropTypes } from "@zag-js/types";
3
+ /**
4
+ * NumberKeyboard 数字键盘:内联输入事件源。
5
+ *
6
+ * Core 只报告按了什么(输入 / 删除 / 完成),从不持有或修改调用方的值。
7
+ * 长按删除、禁用、物理按键映射都在这里;适配层只运输事件并重绘。
8
+ */
9
+ /** Stable DOM parts shared by every adapter. */
10
+ export declare const NUMBER_KEYBOARD_PARTS: readonly ["root", "keys", "key", "sidebar", "delete-key", "delete-icon", "done-key"];
11
+ /** Digit keys in render order: 1–9 fill three rows, 0 sits in the bottom row. */
12
+ export declare const NUMBER_KEYBOARD_DIGITS: readonly ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"];
13
+ /** At most two extra keys share the bottom row with 0. */
14
+ export declare const NUMBER_KEYBOARD_MAX_EXTRA_KEYS = 2;
15
+ /** Hold time (ms) before a pressed delete key starts repeating. */
16
+ export declare const NUMBER_KEYBOARD_LONG_PRESS_DELAY = 500;
17
+ /** Interval (ms) between repeated deletes while the pointer stays down. */
18
+ export declare const NUMBER_KEYBOARD_REPEAT_INTERVAL = 100;
19
+ /** Decorative delete glyph. Adapters render it `aria-hidden`; the name comes from `deleteLabel`. */
20
+ export declare const NUMBER_KEYBOARD_DELETE_GLYPH = "\u232B";
21
+ export type NumberKeyboardPart = (typeof NUMBER_KEYBOARD_PARTS)[number];
22
+ /** An extra key: a bare string such as "." / "X", or a key with an accessible label. */
23
+ export type NumberKeyboardExtraKey = string | {
24
+ key: string;
25
+ label?: string;
26
+ };
27
+ /** One rendered input key. `span` is the number of grid columns it occupies. */
28
+ export interface NumberKeyboardKey {
29
+ key: string;
30
+ kind: "digit" | "extra";
31
+ label?: string;
32
+ span: 1 | 2 | 3;
33
+ }
34
+ export interface NumberKeyboardInputDetails {
35
+ key: string;
36
+ }
37
+ /** `repeat` is true for deletes produced by a held delete key or a held physical Backspace. */
38
+ export interface NumberKeyboardDeleteDetails {
39
+ repeat: boolean;
40
+ }
41
+ export interface QwNumberKeyboardProps {
42
+ /** Instance identity; adapters generate one when omitted. */
43
+ id?: string;
44
+ /** Accessible name of the keyboard group; defaults to 数字键盘. */
45
+ label?: string;
46
+ /** Up to two extra keys next to 0, e.g. ["."] for amounts or ["X"] for ID cards. Empty, digit and duplicate keys are dropped. */
47
+ extraKeys?: readonly NumberKeyboardExtraKey[];
48
+ /** Disables every key; nothing is reported and an active long press stops. */
49
+ disabled?: boolean;
50
+ /** Layout direction; rtl moves the delete/done column to the inline end and mirrors the delete glyph. Digits keep keypad order. */
51
+ dir?: "ltr" | "rtl";
52
+ /** Accessible name of the delete key; defaults to 删除. */
53
+ deleteLabel?: string;
54
+ /** Visible text of the done key; defaults to 完成. */
55
+ doneText?: string;
56
+ /** A digit or extra key was pressed. The caller decides how its own value changes. */
57
+ onInput?: (details: NumberKeyboardInputDetails) => void;
58
+ /** The delete key was pressed, or repeated while held. */
59
+ onDelete?: (details: NumberKeyboardDeleteDetails) => void;
60
+ /** The done key was pressed. */
61
+ onDone?: () => void;
62
+ }
63
+ /** Trim extra keys; drop empty, digit and duplicate keys; keep at most two. Never throws. */
64
+ export declare function normalizeNumberKeyboardExtraKeys(extraKeys?: readonly NumberKeyboardExtraKey[]): {
65
+ key: string;
66
+ label?: string;
67
+ }[];
68
+ /**
69
+ * Ordered input keys. Bottom row: no extra → 0 spans three columns; one extra → 0 spans two, then the extra;
70
+ * two extras → extra₁, 0, extra₂. Delete and done live in the separate side column.
71
+ */
72
+ export declare function getNumberKeyboardKeys(extraKeys?: readonly NumberKeyboardExtraKey[]): NumberKeyboardKey[];
73
+ /** Resolve a pressed or typed key against the current key set. Single letters match case-insensitively. */
74
+ export declare function resolveNumberKeyboardKey(extraKeys: readonly NumberKeyboardExtraKey[] | undefined, key: string): NumberKeyboardKey | undefined;
75
+ export declare function createNumberKeyboardProps(props?: QwNumberKeyboardProps): QwNumberKeyboardProps;
76
+ export interface QwNumberKeyboardSchema {
77
+ props: QwNumberKeyboardProps;
78
+ refs: {
79
+ pointerId: number | null;
80
+ swallowClick: boolean;
81
+ };
82
+ state: "idle" | "holding" | "repeating";
83
+ guard: "isEnabled" | "isPressPointer";
84
+ action: "input" | "remove" | "done" | "beginPress" | "endPress" | "repeatRemove";
85
+ effect: "waitForHold" | "repeatWhileHeld";
86
+ event: {
87
+ type: "KEY.INPUT";
88
+ key: string;
89
+ } | {
90
+ type: "KEY.DELETE";
91
+ pointer?: boolean;
92
+ repeat?: boolean;
93
+ } | {
94
+ type: "KEY.DONE";
95
+ } | {
96
+ type: "PRESS.START";
97
+ pointerId: number;
98
+ } | {
99
+ type: "PRESS.END";
100
+ pointerId: number;
101
+ } | {
102
+ type: "PRESS.ABORT";
103
+ } | {
104
+ type: "HOLD.ELAPSED";
105
+ } | {
106
+ type: "REPEAT.TICK";
107
+ };
108
+ }
109
+ export type QwNumberKeyboardMachine = Machine<QwNumberKeyboardSchema>;
110
+ export type QwNumberKeyboardService = Service<QwNumberKeyboardSchema>;
111
+ /**
112
+ * Tap = click: one notification for mouse, touch, keyboard and assistive tech alike.
113
+ * Hold (delete only): after the delay Core repeats `onDelete({ repeat: true })` until the same pointer
114
+ * goes up / cancels / leaves, the keyboard is disabled, or the machine stops. Timers live in state effects,
115
+ * so leaving the state or stopping the machine always clears them. The pointer click that ends a repeat
116
+ * session is swallowed so a long press never adds one extra delete.
117
+ */
118
+ export declare const numberKeyboardMachine: QwNumberKeyboardMachine;
119
+ export interface QwNumberKeyboardApi<T extends PropTypes = PropTypes> {
120
+ keys: NumberKeyboardKey[];
121
+ disabled: boolean;
122
+ /** A held delete key is currently repeating. */
123
+ repeating: boolean;
124
+ label: string;
125
+ deleteLabel: string;
126
+ doneText: string;
127
+ /** Report a key press programmatically (ignored when disabled or unknown). */
128
+ input(key: string): void;
129
+ /** Report one delete programmatically. */
130
+ remove(): void;
131
+ /** Report done programmatically. */
132
+ done(): void;
133
+ getRootProps(): T["element"];
134
+ getKeysProps(): T["element"];
135
+ getKeyProps(key: NumberKeyboardKey): T["button"];
136
+ getSidebarProps(): T["element"];
137
+ getDeleteKeyProps(): T["button"];
138
+ getDeleteIconProps(): T["element"];
139
+ getDoneKeyProps(): T["button"];
140
+ }
141
+ export declare function connectNumberKeyboard<T extends PropTypes>(service: QwNumberKeyboardService, normalize: NormalizeProps<T>): QwNumberKeyboardApi<T>;
@@ -0,0 +1,2 @@
1
+ export { DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT, OVERLAY_PANEL_PARTS, resolveOverlayPanelHeight, } from "./overlay-panel.js";
2
+ export type { OverlayPanelHeight, OverlayPanelPart, QwOverlayPanelProps, } from "./overlay-panel.js";
@@ -0,0 +1,2 @@
1
+ import { n as OVERLAY_PANEL_PARTS, r as resolveOverlayPanelHeight, t as DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT } from "../overlay-panel-Z_qdKeBj.js";
2
+ export { DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT, OVERLAY_PANEL_PARTS, resolveOverlayPanelHeight };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * OverlayPanel 契约 — 原型 A(无状态),core 无 machine。
3
+ * 渲染契约:`data-scope="overlay-panel"`,根/header/title/actions/content/footer
4
+ * 以 data-part 摊平,React/Vue 适配层同名同义。
5
+ */
6
+ /** OverlayPanel 各渲染部位全集(data-part 取值)。 */
7
+ export declare const OVERLAY_PANEL_PARTS: readonly ["root", "header", "title", "actions", "content", "footer"];
8
+ /** 默认 header 高度,对齐 Figma H5 浮层导航。 */
9
+ export declare const DEFAULT_OVERLAY_PANEL_HEADER_HEIGHT = 60;
10
+ export type OverlayPanelPart = (typeof OVERLAY_PANEL_PARTS)[number];
11
+ export type OverlayPanelHeight = number | string;
12
+ /** QwOverlayPanelProps — 双栈共享的容器契约。 */
13
+ export interface QwOverlayPanelProps {
14
+ /** 容器高度;数字按 px 归一化,字符串原样透传。 */
15
+ height?: OverlayPanelHeight;
16
+ /** 默认 header 的标题内容。 */
17
+ title?: unknown;
18
+ }
19
+ /** 将外部传入的 height 归一化为 CSS height 值。 */
20
+ export declare function resolveOverlayPanelHeight(height?: OverlayPanelHeight): string | undefined;