@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
@@ -1,6 +1,28 @@
1
1
  import { createMachine } from "@zag-js/core";
2
2
  import { compact } from "@zag-js/utils";
3
3
  //#region src/input/input.ts
4
+ /** Explicitly supported native types; number is a native string field, not numeric validation. */
5
+ const INPUT_TYPES = [
6
+ "text",
7
+ "search",
8
+ "tel",
9
+ "url",
10
+ "email",
11
+ "password",
12
+ "number"
13
+ ];
14
+ function inputType(type) {
15
+ return INPUT_TYPES.includes(type) ? type : "text";
16
+ }
17
+ function inputLimit(value) {
18
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : void 0;
19
+ }
20
+ function clampInput(value, limit) {
21
+ if (limit === void 0 || value.length <= limit) return value;
22
+ let end = limit;
23
+ if (end > 0 && /[\uD800-\uDBFF]/.test(value[end - 1]) && /[\uDC00-\uDFFF]/.test(value[end])) end--;
24
+ return value.slice(0, end);
25
+ }
4
26
  /**
5
27
  * Input zag.js machine。
6
28
  * 唯一状态来源:value(受控/非受控由 bindable 收敛)。
@@ -19,17 +41,21 @@ const machine = createMachine({
19
41
  return "idle";
20
42
  },
21
43
  context({ bindable, prop }) {
22
- return { value: bindable(() => {
23
- const controlledValue = prop("value");
24
- return {
25
- defaultValue: prop("defaultValue") ?? "",
26
- sync: true,
27
- ...controlledValue !== void 0 ? { value: controlledValue } : {},
28
- onChange(value, prev) {
29
- if (value !== prev) prop("onChange")?.(value);
30
- }
31
- };
32
- }) };
44
+ return {
45
+ composing: bindable(() => ({ defaultValue: false })),
46
+ draft: bindable(() => ({ defaultValue: "" })),
47
+ value: bindable(() => {
48
+ const controlledValue = prop("value");
49
+ return {
50
+ defaultValue: prop("defaultValue") ?? "",
51
+ sync: true,
52
+ ...controlledValue !== void 0 ? { value: controlledValue } : {},
53
+ onChange(value, prev) {
54
+ if (value !== prev) prop("onChange")?.(value);
55
+ }
56
+ };
57
+ })
58
+ };
33
59
  },
34
60
  computed: {
35
61
  mode({ prop }) {
@@ -52,36 +78,131 @@ const machine = createMachine({
52
78
  if (external !== void 0 && external !== context.get("value")) context.set("value", external);
53
79
  });
54
80
  },
81
+ effects: ["trackReset"],
55
82
  states: { idle: { on: { "VALUE.SET": { actions: ["setValue"] } } } },
56
- implementations: { actions: { setValue({ context, event }) {
57
- if (event.type === "VALUE.SET") context.set("value", event.value);
58
- } } }
83
+ implementations: {
84
+ effects: { trackReset({ scope, prop, context }) {
85
+ const root = scope.getRootNode();
86
+ let active = true;
87
+ const pending = /* @__PURE__ */ new Set();
88
+ const onReset = (event) => {
89
+ const input = scope.getById(prop("control")?.id ?? `input:${scope.id}:input`);
90
+ if (!input || input.form !== event.target) return;
91
+ const timer = setTimeout(() => {
92
+ pending.delete(timer);
93
+ if (!active || event.defaultPrevented || !input.isConnected) return;
94
+ context.set("composing", false);
95
+ if (prop("value") === void 0) context.set("value", prop("defaultValue") ?? "");
96
+ input.value = context.get("value");
97
+ }, 0);
98
+ pending.add(timer);
99
+ };
100
+ root.addEventListener("reset", onReset);
101
+ return () => {
102
+ active = false;
103
+ root.removeEventListener("reset", onReset);
104
+ pending.forEach(clearTimeout);
105
+ };
106
+ } },
107
+ actions: { setValue({ context, event }) {
108
+ if (event.type === "VALUE.SET") context.set("value", event.value);
109
+ } }
110
+ }
59
111
  });
60
112
  /**
61
113
  * connect:把 service 接成业务友好的 prop-getter。
62
114
  * 适配层只需调用 connect(service, normalizeProps),按 api.mode 选择渲染子树。
63
115
  */
64
116
  function connect(service, normalizeProps) {
65
- const { context, computed, prop } = service;
117
+ const { context, computed, prop, scope } = service;
66
118
  const value = context.get("value");
67
119
  const mode = computed("mode");
68
120
  const overflow = computed("overflow");
69
121
  const clampLines = computed("clampLines");
122
+ const disabled = () => prop("disabled") === true || prop("control")?.disabled === true;
123
+ const editable = () => !prop("readOnly") && !disabled();
124
+ const type = inputType(prop("type"));
125
+ const limit = type === "number" ? void 0 : inputLimit(prop("maxLength"));
126
+ const inputId = () => prop("control")?.id ?? `input:${scope.id}:input`;
127
+ const countId = `input:${scope.id}:count`;
128
+ function writeback(target) {
129
+ const confirmed = context.get("value");
130
+ if (target.value === confirmed) return;
131
+ const start = target.selectionStart, end = target.selectionEnd, direction = target.selectionDirection;
132
+ target.value = confirmed;
133
+ if (typeof target.setSelectionRange === "function" && start !== null && end !== null) try {
134
+ target.setSelectionRange(Math.min(start, confirmed.length), Math.min(end, confirmed.length), direction ?? void 0);
135
+ } catch {}
136
+ }
137
+ function commit(target) {
138
+ if (editable() && !target.matches?.(":disabled")) context.set("value", clampInput(target.value, limit));
139
+ writeback(target);
140
+ queueMicrotask(() => {
141
+ if (target.isConnected && !context.get("composing")) writeback(target);
142
+ });
143
+ }
70
144
  return {
71
145
  value,
72
146
  mode,
73
147
  overflow,
148
+ showClear: mode === "input" && !!prop("clearable") && editable() && value.length > 0,
149
+ showCount: mode === "input" && !!prop("showCount"),
150
+ countText: limit === void 0 ? String(value.length) : `${value.length} / ${limit}`,
151
+ getPrefixProps() {
152
+ return normalizeProps.element({
153
+ "data-scope": "input",
154
+ "data-part": "prefix"
155
+ });
156
+ },
157
+ getSuffixProps() {
158
+ return normalizeProps.element({
159
+ "data-scope": "input",
160
+ "data-part": "suffix"
161
+ });
162
+ },
163
+ getCountProps() {
164
+ return normalizeProps.element({
165
+ "data-scope": "input",
166
+ "data-part": "count",
167
+ id: countId
168
+ });
169
+ },
170
+ getClearProps() {
171
+ return normalizeProps.button(compact({
172
+ "data-scope": "input",
173
+ "data-part": "clear",
174
+ type: "button",
175
+ disabled: disabled() || prop("readOnly") || void 0,
176
+ "aria-label": prop("clearLabel") ?? "Clear input",
177
+ onPointerDown(event) {
178
+ event.preventDefault();
179
+ },
180
+ onClick() {
181
+ const input = scope.getById(inputId());
182
+ if (!editable() || !prop("clearable") || !context.get("value") || input?.matches(":disabled")) return;
183
+ context.set("composing", false);
184
+ context.set("value", "");
185
+ prop("onClear")?.();
186
+ if (input) {
187
+ writeback(input);
188
+ input.focus({ preventScroll: true });
189
+ }
190
+ }
191
+ }));
192
+ },
74
193
  getRootProps() {
75
194
  return normalizeProps.element(compact({
76
195
  "data-scope": "input",
77
196
  "data-part": "root",
78
- "data-mode": mode
197
+ "data-mode": mode,
198
+ "data-disabled": disabled() || void 0
79
199
  }));
80
200
  },
81
201
  getTitleProps() {
82
202
  return normalizeProps.element(compact({
83
203
  "data-scope": "input",
84
- "data-part": "title"
204
+ "data-part": "title",
205
+ id: `input:${scope.id}:title`
85
206
  }));
86
207
  },
87
208
  getFieldProps() {
@@ -91,15 +212,46 @@ function connect(service, normalizeProps) {
91
212
  }));
92
213
  },
93
214
  getInputProps() {
215
+ const control = prop("control");
94
216
  return normalizeProps.input(compact({
95
217
  "data-scope": "input",
96
218
  "data-part": "input",
97
- type: "text",
98
- value,
219
+ type,
220
+ inputMode: prop("inputMode"),
221
+ maxLength: limit,
222
+ value: context.get("composing") ? context.get("draft") : value,
99
223
  placeholder: prop("placeholder"),
224
+ id: control?.id ?? `input:${scope.id}:input`,
225
+ name: control?.name,
226
+ form: control?.form,
227
+ disabled: disabled() || void 0,
228
+ required: control?.required,
229
+ "aria-labelledby": control?.labelledBy ?? (prop("title") ? `input:${scope.id}:title` : void 0),
230
+ "aria-describedby": [control?.describedBy, prop("showCount") ? countId : void 0].filter(Boolean).join(" ") || void 0,
231
+ "aria-invalid": control?.invalid || void 0,
232
+ onBlur() {
233
+ if (!disabled()) prop("onBlur")?.();
234
+ },
235
+ onCompositionStart(event) {
236
+ if (!editable()) return;
237
+ context.set("draft", event.target.value);
238
+ context.set("composing", true);
239
+ },
240
+ onCompositionEnd(event) {
241
+ context.set("composing", false);
242
+ commit(event.target);
243
+ },
100
244
  onChange(event) {
101
245
  const target = event.target;
102
- context.set("value", target.value);
246
+ const native = event.nativeEvent;
247
+ if (context.get("composing") || native?.isComposing) {
248
+ if (editable()) {
249
+ context.set("draft", target.value);
250
+ if (limit === void 0) context.set("value", target.value);
251
+ }
252
+ return;
253
+ }
254
+ commit(target);
103
255
  }
104
256
  }));
105
257
  },
@@ -108,15 +260,22 @@ function connect(service, normalizeProps) {
108
260
  "data-scope": "input",
109
261
  "data-part": "icon",
110
262
  onClick() {
111
- prop("onIconClick")?.();
263
+ if (editable()) prop("onIconClick")?.();
112
264
  }
113
265
  }));
114
266
  },
115
267
  getReadonlyProps() {
268
+ const control = prop("control");
116
269
  return normalizeProps.element(compact({
117
270
  "data-scope": "input",
118
271
  "data-part": "readonly",
119
272
  "data-overflow": overflow,
273
+ id: control?.id ?? `input:${scope.id}:readonly`,
274
+ role: control || prop("title") ? "group" : void 0,
275
+ "aria-labelledby": control?.labelledBy,
276
+ "aria-label": control?.labelledBy === void 0 ? prop("title") : void 0,
277
+ "aria-describedby": control?.describedBy,
278
+ "aria-invalid": control?.invalid || void 0,
120
279
  style: clampLines ? { ["--qw-input-max-lines"]: String(clampLines) } : void 0
121
280
  }));
122
281
  }
@@ -134,6 +293,6 @@ function createInputProps(props = {}) {
134
293
  };
135
294
  }
136
295
  //#endregion
137
- export { connect, createInputProps, machine };
296
+ export { INPUT_TYPES, connect, createInputProps, machine };
138
297
 
139
298
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/input/input.ts"],"sourcesContent":["import { createMachine } from \"@zag-js/core\";\nimport type { MachineSchema, Service } from \"@zag-js/core\";\nimport type { PropTypes, NormalizeProps } from \"@zag-js/types\";\nimport type { JSX } from \"@zag-js/types\";\nimport { compact } from \"@zag-js/utils\";\n\n/**\n * 只读模式溢出策略。\n * - `wrap`:换行展示(默认),可配 `maxLines` 限制最大行数。\n * - `ellipsis`:单行超出省略。\n */\nexport type InputReadOnlyOverflow = \"wrap\" | \"ellipsis\";\n\n/**\n * 渲染模式(由 readOnly 派生)。\n */\nexport type InputMode = \"input\" | \"readonly\";\n\n/**\n * Input 公共 props 契约(双栈共享,不含框架特有节点类型)。\n */\nexport interface QwInputProps {\n /** 唯一 id 前缀。 */\n id?: string;\n /** true=只读模式,false=输入模式。默认 false。 */\n readOnly?: boolean;\n /** 受控值。 */\n value?: string;\n /** 非受控初始值。默认 \"\"。 */\n defaultValue?: string;\n /** 输入变化回调(仅输入模式触发)。 */\n onChange?: (value: string) => void;\n /** 输入模式提示文本(右对齐)。 */\n placeholder?: string;\n /** 左侧标题文本(宽度自适应)。 */\n title?: string;\n /** icon 点击回调(仅输入模式)。 */\n onIconClick?: () => void;\n /** 只读模式溢出策略。默认 \"wrap\"。 */\n readOnlyOverflow?: InputReadOnlyOverflow;\n /** 只读换行最大行数(仅 wrap 生效;缺省不限行数)。 */\n maxLines?: number;\n}\n\n/**\n * 内部 schema,用于 createMachine 类型推导。\n */\ninterface InputSchema extends MachineSchema {\n props: QwInputProps;\n context: {\n value: string;\n };\n computed: {\n mode: InputMode;\n overflow: InputReadOnlyOverflow | undefined;\n clampLines: number | undefined;\n };\n state: \"idle\";\n event: { type: \"VALUE.SET\"; value: string };\n action: \"setValue\";\n}\n\n/**\n * Input zag.js machine。\n * 唯一状态来源:value(受控/非受控由 bindable 收敛)。\n * readOnly / overflow / maxLines 为纯派生,不进入状态。\n */\nexport const machine = createMachine<InputSchema>({\n props({ props }) {\n return {\n defaultValue: \"\",\n readOnly: false,\n readOnlyOverflow: \"wrap\",\n ...props,\n };\n },\n\n initialState() {\n return \"idle\";\n },\n\n context({ bindable, prop }) {\n return {\n value: bindable<string>(() => {\n const controlledValue = prop(\"value\");\n return {\n defaultValue: prop(\"defaultValue\") ?? \"\",\n sync: true,\n ...(controlledValue !== undefined ? { value: controlledValue } : {}),\n onChange(value, prev) {\n if (value !== prev) {\n prop(\"onChange\")?.(value);\n }\n },\n };\n }),\n };\n },\n\n computed: {\n mode({ prop }) {\n return prop(\"readOnly\") ? \"readonly\" : \"input\";\n },\n overflow({ prop }) {\n if (!prop(\"readOnly\")) return undefined;\n return prop(\"readOnlyOverflow\") ?? \"wrap\";\n },\n clampLines({ prop, computed }) {\n if (computed(\"mode\") !== \"readonly\") return undefined;\n if (computed(\"overflow\") !== \"wrap\") return undefined;\n const max = prop(\"maxLines\");\n return typeof max === \"number\" && max > 0 ? Math.floor(max) : undefined;\n },\n },\n\n watch({ track, prop, context }) {\n track([() => prop(\"value\")], () => {\n const external = prop(\"value\");\n if (external !== undefined && external !== context.get(\"value\")) {\n context.set(\"value\", external);\n }\n });\n },\n\n states: {\n idle: {\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n },\n },\n },\n\n implementations: {\n actions: {\n setValue({ context, event }) {\n if (event.type === \"VALUE.SET\") {\n context.set(\"value\", event.value);\n }\n },\n },\n },\n});\n\n/**\n * Input api 类型(由 connect 返回)。\n */\nexport interface InputApi<T extends PropTypes = PropTypes> {\n /** 当前值。 */\n value: string;\n /** 渲染模式:input | readonly。 */\n mode: InputMode;\n /** 只读溢出策略(输入模式为 undefined)。 */\n overflow: InputReadOnlyOverflow | undefined;\n /** 根容器 prop-getter。 */\n getRootProps(): T[\"element\"];\n /** 左侧标题 prop-getter。 */\n getTitleProps(): T[\"element\"];\n /** 输入区容器 prop-getter(输入模式)。 */\n getFieldProps(): T[\"element\"];\n /** 输入框 prop-getter(输入模式)。 */\n getInputProps(): T[\"input\"];\n /** 右侧图标容器 prop-getter(输入模式,承载点击)。 */\n getIconProps(): T[\"element\"];\n /** 只读展示容器 prop-getter(只读模式)。 */\n getReadonlyProps(): T[\"element\"];\n}\n\n/**\n * connect:把 service 接成业务友好的 prop-getter。\n * 适配层只需调用 connect(service, normalizeProps),按 api.mode 选择渲染子树。\n */\nexport function connect<T extends PropTypes>(service: Service<InputSchema>, normalizeProps: NormalizeProps<T>): InputApi<T> {\n const { context, computed, prop } = service;\n\n const value = context.get(\"value\");\n const mode = computed(\"mode\");\n const overflow = computed(\"overflow\");\n const clampLines = computed(\"clampLines\");\n\n return {\n value,\n mode,\n overflow,\n\n getRootProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"root\",\n \"data-mode\": mode,\n }),\n );\n },\n\n getTitleProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"title\",\n }),\n );\n },\n\n getFieldProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"field\",\n }),\n );\n },\n\n getInputProps() {\n return normalizeProps.input(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"input\",\n type: \"text\" as const,\n value,\n placeholder: prop(\"placeholder\"),\n onChange(event: JSX.ChangeEvent<HTMLInputElement>) {\n const target = event.target as HTMLInputElement;\n // 直接同步更新,绕过 send() 的 queueMicrotask 延迟\n context.set(\"value\", target.value);\n },\n }),\n );\n },\n\n getIconProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"icon\",\n onClick() {\n prop(\"onIconClick\")?.();\n },\n }),\n );\n },\n\n getReadonlyProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"readonly\",\n \"data-overflow\": overflow,\n style: clampLines ? ({ [\"--qw-input-max-lines\"]: String(clampLines) } as Record<string, string>) : undefined,\n }),\n );\n },\n };\n}\n\n/**\n * 把 QwInputProps 转成 machine props(默认值收口)。\n */\nexport function createInputProps(props: QwInputProps = {}): Partial<QwInputProps> {\n return {\n defaultValue: props.defaultValue ?? \"\",\n readOnly: props.readOnly ?? false,\n readOnlyOverflow: props.readOnlyOverflow ?? \"wrap\",\n ...props,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/input/input.ts"],"sourcesContent":["import { createMachine } from \"@zag-js/core\";\nimport type { MachineSchema, Service } from \"@zag-js/core\";\nimport type { PropTypes, NormalizeProps } from \"@zag-js/types\";\nimport type { JSX } from \"@zag-js/types\";\nimport { compact } from \"@zag-js/utils\";\n\n/**\n * 只读模式溢出策略。\n * - `wrap`:换行展示(默认),可配 `maxLines` 限制最大行数。\n * - `ellipsis`:单行超出省略。\n */\nexport type InputReadOnlyOverflow = \"wrap\" | \"ellipsis\";\n\n/**\n * 渲染模式(由 readOnly 派生)。\n */\nexport type InputMode = \"input\" | \"readonly\";\n\n/** Explicitly supported native types; number is a native string field, not numeric validation. */\nexport const INPUT_TYPES = [\"text\", \"search\", \"tel\", \"url\", \"email\", \"password\", \"number\"] as const;\nexport type InputType = (typeof INPUT_TYPES)[number];\nexport type InputInputMode = \"none\" | \"text\" | \"tel\" | \"url\" | \"email\" | \"numeric\" | \"decimal\" | \"search\";\nfunction inputType(type: InputType | undefined): InputType { return INPUT_TYPES.includes(type as InputType) ? type! : \"text\"; }\nfunction inputLimit(value: number | undefined): number | undefined { return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.floor(value) : undefined; }\nfunction clampInput(value: string, limit: number | undefined): string {\n if (limit === undefined || value.length <= limit) return value;\n let end = limit;\n if (end > 0 && /[\\uD800-\\uDBFF]/.test(value[end - 1]!) && /[\\uDC00-\\uDFFF]/.test(value[end]!)) end--;\n return value.slice(0, end);\n}\n\n/** Attributes of the actual editable input or named readonly display. */\nexport interface QwInputControlProps {\n id?: string;\n name?: string;\n form?: string;\n disabled?: boolean;\n required?: boolean;\n labelledBy?: string;\n describedBy?: string;\n invalid?: boolean;\n}\n\n/**\n * Input 公共 props 契约(双栈共享,不含框架特有节点类型)。\n */\nexport interface QwInputProps {\n /** Beta: disables editing and all trailing actions; combines with control.disabled. */\n disabled?: boolean;\n /** Beta: native input type, default text. */\n type?: InputType;\n /** Beta: independent mobile keyboard hint, not validation. */\n inputMode?: InputInputMode;\n /** Beta: optional named native clear button. */\n clearable?: boolean;\n clearLabel?: string;\n onClear?: () => void;\n /** Beta: finite nonnegative UTF-16 limit for text types; ignored for number. */\n maxLength?: number;\n /** Beta: confirmed UTF-16 length, merged into the field description. */\n showCount?: boolean;\n /** 唯一 id 前缀。 */\n id?: string;\n /** true=只读模式,false=输入模式。默认 false。 */\n readOnly?: boolean;\n /** 受控值。 */\n value?: string;\n /** 非受控初始值。默认 \"\"。 */\n defaultValue?: string;\n /** 输入变化回调(仅输入模式触发)。 */\n onChange?: (value: string) => void;\n /** Native editable-control blur notification. */\n onBlur?: () => void;\n control?: QwInputControlProps;\n /** 输入模式提示文本;有 title 时靠末端对齐,独立表单布局靠起始侧。 */\n placeholder?: string;\n /** 左侧标题文本(宽度自适应)。 */\n title?: string;\n /** icon 点击回调(仅输入模式)。 */\n onIconClick?: () => void;\n /** 只读模式溢出策略。默认 \"wrap\"。 */\n readOnlyOverflow?: InputReadOnlyOverflow;\n /** 只读换行最大行数(仅 wrap 生效;缺省不限行数)。 */\n maxLines?: number;\n}\n\n/**\n * 内部 schema,用于 createMachine 类型推导。\n */\ninterface InputSchema extends MachineSchema {\n props: QwInputProps;\n context: {\n value: string;\n composing: boolean;\n draft: string;\n };\n computed: {\n mode: InputMode;\n overflow: InputReadOnlyOverflow | undefined;\n clampLines: number | undefined;\n };\n state: \"idle\";\n event: { type: \"VALUE.SET\"; value: string };\n action: \"setValue\";\n effect: \"trackReset\";\n}\n\n/**\n * Input zag.js machine。\n * 唯一状态来源:value(受控/非受控由 bindable 收敛)。\n * readOnly / overflow / maxLines 为纯派生,不进入状态。\n */\nexport const machine = createMachine<InputSchema>({\n props({ props }) {\n return {\n defaultValue: \"\",\n readOnly: false,\n readOnlyOverflow: \"wrap\",\n ...props,\n };\n },\n\n initialState() {\n return \"idle\";\n },\n\n context({ bindable, prop }) {\n return {\n composing: bindable(() => ({ defaultValue: false })),\n draft: bindable(() => ({ defaultValue: \"\" })),\n value: bindable<string>(() => {\n const controlledValue = prop(\"value\");\n return {\n defaultValue: prop(\"defaultValue\") ?? \"\",\n sync: true,\n ...(controlledValue !== undefined ? { value: controlledValue } : {}),\n onChange(value, prev) {\n if (value !== prev) {\n prop(\"onChange\")?.(value);\n }\n },\n };\n }),\n };\n },\n\n computed: {\n mode({ prop }) {\n return prop(\"readOnly\") ? \"readonly\" : \"input\";\n },\n overflow({ prop }) {\n if (!prop(\"readOnly\")) return undefined;\n return prop(\"readOnlyOverflow\") ?? \"wrap\";\n },\n clampLines({ prop, computed }) {\n if (computed(\"mode\") !== \"readonly\") return undefined;\n if (computed(\"overflow\") !== \"wrap\") return undefined;\n const max = prop(\"maxLines\");\n return typeof max === \"number\" && max > 0 ? Math.floor(max) : undefined;\n },\n },\n\n watch({ track, prop, context }) {\n track([() => prop(\"value\")], () => {\n const external = prop(\"value\");\n if (external !== undefined && external !== context.get(\"value\")) {\n context.set(\"value\", external);\n }\n });\n },\n\n effects: [\"trackReset\"],\n\n states: {\n idle: {\n on: {\n \"VALUE.SET\": {\n actions: [\"setValue\"],\n },\n },\n },\n },\n\n implementations: {\n effects: {\n trackReset({ scope, prop, context }) {\n const root = scope.getRootNode();\n let active = true;\n const pending = new Set<ReturnType<typeof setTimeout>>();\n const onReset = (event: Event) => {\n const input = scope.getById<HTMLInputElement>(prop(\"control\")?.id ?? `input:${scope.id}:input`);\n if (!input || input.form !== event.target) return;\n const timer = setTimeout(() => {\n pending.delete(timer);\n if (!active || event.defaultPrevented || !input.isConnected) return;\n context.set(\"composing\", false);\n if (prop(\"value\") === undefined) context.set(\"value\", prop(\"defaultValue\") ?? \"\");\n input.value = context.get(\"value\");\n }, 0);\n pending.add(timer);\n };\n root.addEventListener(\"reset\", onReset);\n return () => { active = false; root.removeEventListener(\"reset\", onReset); pending.forEach(clearTimeout); };\n },\n },\n actions: {\n setValue({ context, event }) {\n if (event.type === \"VALUE.SET\") {\n context.set(\"value\", event.value);\n }\n },\n },\n },\n});\n\n/**\n * Input api 类型(由 connect 返回)。\n */\nexport interface InputApi<T extends PropTypes = PropTypes> {\n /** 当前值。 */\n value: string;\n /** 渲染模式:input | readonly。 */\n mode: InputMode;\n /** 只读溢出策略(输入模式为 undefined)。 */\n overflow: InputReadOnlyOverflow | undefined;\n /** Beta clear/count presentation derives from confirmed Core state. */\n showClear: boolean;\n showCount: boolean;\n countText: string;\n getClearProps(): T[\"button\"];\n getCountProps(): T[\"element\"];\n getPrefixProps(): T[\"element\"];\n getSuffixProps(): T[\"element\"];\n /** 根容器 prop-getter。 */\n getRootProps(): T[\"element\"];\n /** 左侧标题 prop-getter。 */\n getTitleProps(): T[\"element\"];\n /** 输入区容器 prop-getter(输入模式)。 */\n getFieldProps(): T[\"element\"];\n /** 输入框 prop-getter(输入模式)。 */\n getInputProps(): T[\"input\"];\n /** 右侧图标容器 prop-getter(输入模式,承载点击)。 */\n getIconProps(): T[\"element\"];\n /** 只读展示容器 prop-getter(只读模式)。 */\n getReadonlyProps(): T[\"element\"];\n}\n\n/**\n * connect:把 service 接成业务友好的 prop-getter。\n * 适配层只需调用 connect(service, normalizeProps),按 api.mode 选择渲染子树。\n */\nexport function connect<T extends PropTypes>(service: Service<InputSchema>, normalizeProps: NormalizeProps<T>): InputApi<T> {\n const { context, computed, prop, scope } = service;\n\n const value = context.get(\"value\");\n const mode = computed(\"mode\");\n const overflow = computed(\"overflow\");\n const clampLines = computed(\"clampLines\");\n const disabled = () => prop(\"disabled\") === true || prop(\"control\")?.disabled === true;\n const editable = () => !prop(\"readOnly\") && !disabled();\n const type = inputType(prop(\"type\"));\n const limit = type === \"number\" ? undefined : inputLimit(prop(\"maxLength\"));\n const inputId = () => prop(\"control\")?.id ?? `input:${scope.id}:input`;\n const countId = `input:${scope.id}:count`;\n function writeback(target: HTMLInputElement) {\n const confirmed = context.get(\"value\");\n if (target.value === confirmed) return;\n const start = target.selectionStart, end = target.selectionEnd, direction = target.selectionDirection;\n target.value = confirmed;\n if (typeof target.setSelectionRange === \"function\" && start !== null && end !== null) {\n try { target.setSelectionRange(Math.min(start, confirmed.length), Math.min(end, confirmed.length), direction ?? undefined); } catch { /* number/email do not expose text selection */ }\n }\n }\n function commit(target: HTMLInputElement) {\n if (editable() && !target.matches?.(\":disabled\")) context.set(\"value\", clampInput(target.value, limit));\n writeback(target);\n queueMicrotask(() => { if (target.isConnected && !context.get(\"composing\")) writeback(target); });\n }\n\n return {\n value,\n mode,\n overflow,\n showClear: mode === \"input\" && !!prop(\"clearable\") && editable() && value.length > 0,\n showCount: mode === \"input\" && !!prop(\"showCount\"),\n countText: limit === undefined ? String(value.length) : `${value.length} / ${limit}`,\n getPrefixProps() { return normalizeProps.element({ \"data-scope\": \"input\", \"data-part\": \"prefix\" }); },\n getSuffixProps() { return normalizeProps.element({ \"data-scope\": \"input\", \"data-part\": \"suffix\" }); },\n getCountProps() { return normalizeProps.element({ \"data-scope\": \"input\", \"data-part\": \"count\", id: countId }); },\n getClearProps() {\n return normalizeProps.button(compact({\n \"data-scope\": \"input\", \"data-part\": \"clear\", type: \"button\" as const, disabled: disabled() || prop(\"readOnly\") || undefined,\n \"aria-label\": prop(\"clearLabel\") ?? \"Clear input\",\n onPointerDown(event: JSX.PointerEvent) { event.preventDefault(); },\n onClick() {\n const input = scope.getById<HTMLInputElement>(inputId());\n if (!editable() || !prop(\"clearable\") || !context.get(\"value\") || input?.matches(\":disabled\")) return;\n context.set(\"composing\", false);\n context.set(\"value\", \"\");\n prop(\"onClear\")?.();\n if (input) { writeback(input); input.focus({ preventScroll: true }); }\n },\n }));\n },\n\n getRootProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"root\",\n \"data-mode\": mode,\n \"data-disabled\": disabled() || undefined,\n }),\n );\n },\n\n getTitleProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"title\",\n id: `input:${scope.id}:title`,\n }),\n );\n },\n\n getFieldProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"field\",\n }),\n );\n },\n\n getInputProps() {\n const control = prop(\"control\");\n return normalizeProps.input(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"input\",\n type,\n inputMode: prop(\"inputMode\"),\n maxLength: limit,\n value: context.get(\"composing\") ? context.get(\"draft\") : value,\n placeholder: prop(\"placeholder\"),\n id: control?.id ?? `input:${scope.id}:input`,\n name: control?.name,\n form: control?.form,\n disabled: disabled() || undefined,\n required: control?.required,\n \"aria-labelledby\": control?.labelledBy ?? (prop(\"title\") ? `input:${scope.id}:title` : undefined),\n \"aria-describedby\": [control?.describedBy, prop(\"showCount\") ? countId : undefined].filter(Boolean).join(\" \") || undefined,\n \"aria-invalid\": control?.invalid || undefined,\n onBlur() { if (!disabled()) prop(\"onBlur\")?.(); },\n onCompositionStart(event: JSX.CompositionEvent<HTMLInputElement>) {\n if (!editable()) return;\n context.set(\"draft\", (event.target as HTMLInputElement).value);\n context.set(\"composing\", true);\n },\n onCompositionEnd(event: JSX.CompositionEvent<HTMLInputElement>) { context.set(\"composing\", false); commit(event.target as HTMLInputElement); },\n onChange(event: JSX.ChangeEvent<HTMLInputElement>) {\n const target = event.target as HTMLInputElement;\n const native = event.nativeEvent as InputEvent | undefined;\n if (context.get(\"composing\") || native?.isComposing) {\n if (editable()) {\n context.set(\"draft\", target.value);\n // No effective limit preserves the existing intermediate IME notifications.\n if (limit === undefined) context.set(\"value\", target.value);\n }\n return;\n }\n commit(target);\n },\n }),\n );\n },\n\n getIconProps() {\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"icon\",\n onClick() {\n if (editable()) prop(\"onIconClick\")?.();\n },\n }),\n );\n },\n\n getReadonlyProps() {\n const control = prop(\"control\");\n return normalizeProps.element(\n compact({\n \"data-scope\": \"input\",\n \"data-part\": \"readonly\",\n \"data-overflow\": overflow,\n id: control?.id ?? `input:${scope.id}:readonly`,\n role: control || prop(\"title\") ? \"group\" : undefined,\n \"aria-labelledby\": control?.labelledBy,\n \"aria-label\": control?.labelledBy === undefined ? prop(\"title\") : undefined,\n \"aria-describedby\": control?.describedBy,\n \"aria-invalid\": control?.invalid || undefined,\n style: clampLines ? ({ [\"--qw-input-max-lines\"]: String(clampLines) } as Record<string, string>) : undefined,\n }),\n );\n },\n };\n}\n\n/**\n * 把 QwInputProps 转成 machine props(默认值收口)。\n */\nexport function createInputProps(props: QwInputProps = {}): Partial<QwInputProps> {\n return {\n defaultValue: props.defaultValue ?? \"\",\n readOnly: props.readOnly ?? false,\n readOnlyOverflow: props.readOnlyOverflow ?? \"wrap\",\n ...props,\n };\n}\n"],"mappings":"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"}
@@ -10,10 +10,39 @@ export type InputReadOnlyOverflow = "wrap" | "ellipsis";
10
10
  * 渲染模式(由 readOnly 派生)。
11
11
  */
12
12
  export type InputMode = "input" | "readonly";
13
+ /** Explicitly supported native types; number is a native string field, not numeric validation. */
14
+ export declare const INPUT_TYPES: readonly ["text", "search", "tel", "url", "email", "password", "number"];
15
+ export type InputType = (typeof INPUT_TYPES)[number];
16
+ export type InputInputMode = "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search";
17
+ /** Attributes of the actual editable input or named readonly display. */
18
+ export interface QwInputControlProps {
19
+ id?: string;
20
+ name?: string;
21
+ form?: string;
22
+ disabled?: boolean;
23
+ required?: boolean;
24
+ labelledBy?: string;
25
+ describedBy?: string;
26
+ invalid?: boolean;
27
+ }
13
28
  /**
14
29
  * Input 公共 props 契约(双栈共享,不含框架特有节点类型)。
15
30
  */
16
31
  export interface QwInputProps {
32
+ /** Beta: disables editing and all trailing actions; combines with control.disabled. */
33
+ disabled?: boolean;
34
+ /** Beta: native input type, default text. */
35
+ type?: InputType;
36
+ /** Beta: independent mobile keyboard hint, not validation. */
37
+ inputMode?: InputInputMode;
38
+ /** Beta: optional named native clear button. */
39
+ clearable?: boolean;
40
+ clearLabel?: string;
41
+ onClear?: () => void;
42
+ /** Beta: finite nonnegative UTF-16 limit for text types; ignored for number. */
43
+ maxLength?: number;
44
+ /** Beta: confirmed UTF-16 length, merged into the field description. */
45
+ showCount?: boolean;
17
46
  /** 唯一 id 前缀。 */
18
47
  id?: string;
19
48
  /** true=只读模式,false=输入模式。默认 false。 */
@@ -24,7 +53,10 @@ export interface QwInputProps {
24
53
  defaultValue?: string;
25
54
  /** 输入变化回调(仅输入模式触发)。 */
26
55
  onChange?: (value: string) => void;
27
- /** 输入模式提示文本(右对齐)。 */
56
+ /** Native editable-control blur notification. */
57
+ onBlur?: () => void;
58
+ control?: QwInputControlProps;
59
+ /** 输入模式提示文本;有 title 时靠末端对齐,独立表单布局靠起始侧。 */
28
60
  placeholder?: string;
29
61
  /** 左侧标题文本(宽度自适应)。 */
30
62
  title?: string;
@@ -42,6 +74,8 @@ interface InputSchema extends MachineSchema {
42
74
  props: QwInputProps;
43
75
  context: {
44
76
  value: string;
77
+ composing: boolean;
78
+ draft: string;
45
79
  };
46
80
  computed: {
47
81
  mode: InputMode;
@@ -54,6 +88,7 @@ interface InputSchema extends MachineSchema {
54
88
  value: string;
55
89
  };
56
90
  action: "setValue";
91
+ effect: "trackReset";
57
92
  }
58
93
  /**
59
94
  * Input zag.js machine。
@@ -71,6 +106,14 @@ export interface InputApi<T extends PropTypes = PropTypes> {
71
106
  mode: InputMode;
72
107
  /** 只读溢出策略(输入模式为 undefined)。 */
73
108
  overflow: InputReadOnlyOverflow | undefined;
109
+ /** Beta clear/count presentation derives from confirmed Core state. */
110
+ showClear: boolean;
111
+ showCount: boolean;
112
+ countText: string;
113
+ getClearProps(): T["button"];
114
+ getCountProps(): T["element"];
115
+ getPrefixProps(): T["element"];
116
+ getSuffixProps(): T["element"];
74
117
  /** 根容器 prop-getter。 */
75
118
  getRootProps(): T["element"];
76
119
  /** 左侧标题 prop-getter。 */