@qw-ui/core 0.3.0-next.40 → 0.3.0-next.43

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 (402) 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 +9 -0
  26. package/dist/badge/index.js +14 -1
  27. package/dist/badge/index.js.map +1 -1
  28. package/dist/button/button.d.ts +13 -0
  29. package/dist/button/index.js +3 -5
  30. package/dist/button/index.js.map +1 -1
  31. package/dist/calendar/calendar.d.ts +100 -0
  32. package/dist/calendar/index.d.ts +1 -0
  33. package/dist/calendar/index.js +2 -0
  34. package/dist/calendar-CmpK3stz.js +363 -0
  35. package/dist/calendar-CmpK3stz.js.map +1 -0
  36. package/dist/card/card.d.ts +68 -0
  37. package/dist/card/index.d.ts +2 -0
  38. package/dist/card/index.js +2 -0
  39. package/dist/card-DRtWa6Cr.js +107 -0
  40. package/dist/card-DRtWa6Cr.js.map +1 -0
  41. package/dist/cascader/cascader.d.ts +115 -0
  42. package/dist/cascader/index.d.ts +1 -0
  43. package/dist/cascader/index.js +2 -0
  44. package/dist/cascader-D-xMjs7P.js +333 -0
  45. package/dist/cascader-D-xMjs7P.js.map +1 -0
  46. package/dist/cell/cell.d.ts +41 -0
  47. package/dist/cell/index.d.ts +1 -0
  48. package/dist/cell/index.js +43 -0
  49. package/dist/cell/index.js.map +1 -0
  50. package/dist/check-list/check-list.d.ts +78 -0
  51. package/dist/check-list/index.d.ts +2 -0
  52. package/dist/check-list/index.js +2 -0
  53. package/dist/check-list-BvZHQt5w.js +60 -0
  54. package/dist/check-list-BvZHQt5w.js.map +1 -0
  55. package/dist/checkbox/checkbox.d.ts +59 -0
  56. package/dist/checkbox/index.d.ts +2 -0
  57. package/dist/checkbox/index.js +2 -0
  58. package/dist/checkbox-BlndJrz5.js +127 -0
  59. package/dist/checkbox-BlndJrz5.js.map +1 -0
  60. package/dist/checkbox-group/checkbox-group.d.ts +86 -0
  61. package/dist/checkbox-group/index.d.ts +3 -0
  62. package/dist/checkbox-group/index.js +2 -0
  63. package/dist/checkbox-group-gGfsTv-e.js +223 -0
  64. package/dist/checkbox-group-gGfsTv-e.js.map +1 -0
  65. package/dist/choice-group-C4c9m0qe.js +373 -0
  66. package/dist/choice-group-C4c9m0qe.js.map +1 -0
  67. package/dist/circle/circle.d.ts +97 -0
  68. package/dist/circle/index.d.ts +1 -0
  69. package/dist/circle/index.js +119 -0
  70. package/dist/circle/index.js.map +1 -0
  71. package/dist/collapse/collapse.d.ts +98 -0
  72. package/dist/collapse/index.d.ts +2 -0
  73. package/dist/collapse/index.js +2 -0
  74. package/dist/collapse-B969h7-H.js +226 -0
  75. package/dist/collapse-B969h7-H.js.map +1 -0
  76. package/dist/countdown/countdown.d.ts +114 -0
  77. package/dist/countdown/index.d.ts +1 -0
  78. package/dist/countdown/index.js +309 -0
  79. package/dist/countdown/index.js.map +1 -0
  80. package/dist/date-picker/date-picker.d.ts +168 -0
  81. package/dist/date-picker/index.d.ts +1 -0
  82. package/dist/date-picker/index.js +401 -0
  83. package/dist/date-picker/index.js.map +1 -0
  84. package/dist/descriptions/descriptions.d.ts +69 -0
  85. package/dist/descriptions/index.d.ts +1 -0
  86. package/dist/descriptions/index.js +86 -0
  87. package/dist/descriptions/index.js.map +1 -0
  88. package/dist/dialog/dialog.d.ts +32 -3
  89. package/dist/dialog/index.js +58 -3
  90. package/dist/dialog/index.js.map +1 -1
  91. package/dist/divider/divider.d.ts +18 -2
  92. package/dist/divider/index.js +20 -2
  93. package/dist/divider/index.js.map +1 -1
  94. package/dist/dropdown/dropdown.d.ts +172 -0
  95. package/dist/dropdown/index.d.ts +2 -0
  96. package/dist/dropdown/index.js +467 -0
  97. package/dist/dropdown/index.js.map +1 -0
  98. package/dist/ellipsis/ellipsis-layout.d.ts +34 -0
  99. package/dist/ellipsis/ellipsis.d.ts +88 -0
  100. package/dist/ellipsis/index.d.ts +2 -0
  101. package/dist/ellipsis/index.js +320 -0
  102. package/dist/ellipsis/index.js.map +1 -0
  103. package/dist/empty/empty-illustration.d.ts +3 -0
  104. package/dist/empty/empty.d.ts +43 -1
  105. package/dist/empty/index.js +2 -21
  106. package/dist/empty-CAgyvhUI.js +166 -0
  107. package/dist/empty-CAgyvhUI.js.map +1 -0
  108. package/dist/field/field.d.ts +95 -0
  109. package/dist/field/index.d.ts +2 -0
  110. package/dist/field/index.js +2 -0
  111. package/dist/field-DMHGIMZF.js +241 -0
  112. package/dist/field-DMHGIMZF.js.map +1 -0
  113. package/dist/floating-bubble/floating-bubble.d.ts +116 -0
  114. package/dist/floating-bubble/index.d.ts +1 -0
  115. package/dist/floating-bubble/index.js +333 -0
  116. package/dist/floating-bubble/index.js.map +1 -0
  117. package/dist/floating-panel/floating-panel.d.ts +80 -0
  118. package/dist/floating-panel/index.d.ts +2 -0
  119. package/dist/floating-panel/index.js +2 -0
  120. package/dist/floating-panel-Cbm5njBJ.js +363 -0
  121. package/dist/floating-panel-Cbm5njBJ.js.map +1 -0
  122. package/dist/footer/footer.d.ts +94 -0
  123. package/dist/footer/index.d.ts +1 -0
  124. package/dist/footer/index.js +154 -0
  125. package/dist/footer/index.js.map +1 -0
  126. package/dist/form/connect.d.ts +6 -0
  127. package/dist/form/form.d.ts +100 -0
  128. package/dist/form/ids.d.ts +14 -0
  129. package/dist/form/index.d.ts +13 -0
  130. package/dist/form/index.js +3 -0
  131. package/dist/form/methods.d.ts +5 -0
  132. package/dist/form/model.d.ts +24 -0
  133. package/dist/form/native.d.ts +25 -0
  134. package/dist/form/rules.d.ts +40 -0
  135. package/dist/form/ssr.d.ts +7 -0
  136. package/dist/form/types.d.ts +150 -0
  137. package/dist/form-BAGkIEMY.js +1354 -0
  138. package/dist/form-BAGkIEMY.js.map +1 -0
  139. package/dist/format-BDUY0C_c.js +89 -0
  140. package/dist/format-BDUY0C_c.js.map +1 -0
  141. package/dist/gesture-_SRHIvBm.js +30 -0
  142. package/dist/gesture-_SRHIvBm.js.map +1 -0
  143. package/dist/grid/grid-item.d.ts +22 -0
  144. package/dist/grid/grid.d.ts +42 -0
  145. package/dist/grid/index.d.ts +2 -0
  146. package/dist/grid/index.js +73 -0
  147. package/dist/grid/index.js.map +1 -0
  148. package/dist/icon/icon.d.ts +37 -1
  149. package/dist/icon/identity.d.ts +3 -0
  150. package/dist/icon/index.js +2 -20
  151. package/dist/icon-Cgdbnk1u.js +77 -0
  152. package/dist/icon-Cgdbnk1u.js.map +1 -0
  153. package/dist/image/image-load.d.ts +24 -0
  154. package/dist/image/image.d.ts +45 -8
  155. package/dist/image/index.d.ts +1 -0
  156. package/dist/image/index.js +116 -14
  157. package/dist/image/index.js.map +1 -1
  158. package/dist/image-preview/image-preview.d.ts +124 -0
  159. package/dist/image-preview/index.d.ts +1 -0
  160. package/dist/image-preview/index.js +450 -0
  161. package/dist/image-preview/index.js.map +1 -0
  162. package/dist/index-bar/index-bar.d.ts +121 -0
  163. package/dist/index-bar/index.d.ts +1 -0
  164. package/dist/index-bar/index.js +386 -0
  165. package/dist/index-bar/index.js.map +1 -0
  166. package/dist/index.d.ts +107 -14
  167. package/dist/index.js +148 -14
  168. package/dist/index.js.map +1 -0
  169. package/dist/infinite-scroll/index.d.ts +1 -0
  170. package/dist/infinite-scroll/index.js +248 -0
  171. package/dist/infinite-scroll/index.js.map +1 -0
  172. package/dist/infinite-scroll/infinite-scroll.d.ts +95 -0
  173. package/dist/input/index.js +181 -22
  174. package/dist/input/index.js.map +1 -1
  175. package/dist/input/input.d.ts +44 -1
  176. package/dist/layer-IpFrl5--.js +414 -0
  177. package/dist/layer-IpFrl5--.js.map +1 -0
  178. package/dist/layout-BRSqi4AQ.js +43 -0
  179. package/dist/layout-BRSqi4AQ.js.map +1 -0
  180. package/dist/layout.d.ts +13 -0
  181. package/dist/list/index.d.ts +2 -0
  182. package/dist/list/index.js +2 -0
  183. package/dist/list/list.d.ts +30 -0
  184. package/dist/list-6-iz-Irh.js +28 -0
  185. package/dist/list-6-iz-Irh.js.map +1 -0
  186. package/dist/loading/index.js +45 -2
  187. package/dist/loading/index.js.map +1 -1
  188. package/dist/loading/loading.d.ts +45 -2
  189. package/dist/modal-dialog-machine-CF9_z3Dm.js +487 -0
  190. package/dist/modal-dialog-machine-CF9_z3Dm.js.map +1 -0
  191. package/dist/modal-dialog-machine.d.ts +21 -0
  192. package/dist/modal-dismissable-lifetime.d.ts +21 -0
  193. package/dist/modal-registry.d.ts +24 -0
  194. package/dist/modal-render-hydration.d.ts +35 -0
  195. package/dist/modal-render-runtime.d.ts +19 -0
  196. package/dist/modal-render-scope.d.ts +63 -0
  197. package/dist/nav-bar/index.d.ts +1 -0
  198. package/dist/nav-bar/index.js +115 -0
  199. package/dist/nav-bar/index.js.map +1 -0
  200. package/dist/nav-bar/nav-bar.d.ts +76 -0
  201. package/dist/notice-bar/index.d.ts +2 -0
  202. package/dist/notice-bar/index.js +2 -0
  203. package/dist/notice-bar/notice-bar.d.ts +103 -0
  204. package/dist/notice-bar-DMpwLvRb.js +231 -0
  205. package/dist/notice-bar-DMpwLvRb.js.map +1 -0
  206. package/dist/notify/index.d.ts +1 -0
  207. package/dist/notify/index.js +251 -0
  208. package/dist/notify/index.js.map +1 -0
  209. package/dist/notify/notify.d.ts +123 -0
  210. package/dist/number-keyboard/index.d.ts +1 -0
  211. package/dist/number-keyboard/index.js +333 -0
  212. package/dist/number-keyboard/index.js.map +1 -0
  213. package/dist/number-keyboard/number-keyboard.d.ts +141 -0
  214. package/dist/page-indicator/index.d.ts +1 -0
  215. package/dist/page-indicator/index.js +138 -0
  216. package/dist/page-indicator/index.js.map +1 -0
  217. package/dist/page-indicator/page-indicator.d.ts +93 -0
  218. package/dist/pagination/index.d.ts +1 -0
  219. package/dist/pagination/index.js +198 -0
  220. package/dist/pagination/index.js.map +1 -0
  221. package/dist/pagination/pagination.d.ts +125 -0
  222. package/dist/password-input/index.d.ts +1 -0
  223. package/dist/password-input/index.js +317 -0
  224. package/dist/password-input/index.js.map +1 -0
  225. package/dist/password-input/password-input.d.ts +144 -0
  226. package/dist/picker/index.d.ts +8 -0
  227. package/dist/picker/index.js +2 -0
  228. package/dist/picker/picker-machine.d.ts +80 -0
  229. package/dist/picker/picker.d.ts +121 -0
  230. package/dist/picker/platform.d.ts +84 -0
  231. package/dist/picker/selection-connect.d.ts +90 -0
  232. package/dist/picker/selection-model.d.ts +211 -0
  233. package/dist/picker-BykFntQN.js +1675 -0
  234. package/dist/picker-BykFntQN.js.map +1 -0
  235. package/dist/popover/index.d.ts +3 -0
  236. package/dist/popover/index.js +253 -0
  237. package/dist/popover/index.js.map +1 -0
  238. package/dist/popover/layer.d.ts +44 -0
  239. package/dist/popover/popover.d.ts +104 -0
  240. package/dist/popover/positioning.d.ts +132 -0
  241. package/dist/popup/index.d.ts +2 -0
  242. package/dist/popup/index.js +2 -0
  243. package/dist/popup/popup.d.ts +60 -0
  244. package/dist/popup-z5d8IYCt.js +576 -0
  245. package/dist/popup-z5d8IYCt.js.map +1 -0
  246. package/dist/portal-BHCNTWhg.js +78 -0
  247. package/dist/portal-BHCNTWhg.js.map +1 -0
  248. package/dist/portal.d.ts +61 -0
  249. package/dist/price/format.d.ts +19 -0
  250. package/dist/price/index.d.ts +1 -0
  251. package/dist/price/index.js +154 -0
  252. package/dist/price/index.js.map +1 -0
  253. package/dist/price/price.d.ts +88 -0
  254. package/dist/progress/index.d.ts +1 -0
  255. package/dist/progress/index.js +2 -0
  256. package/dist/progress/progress.d.ts +32 -0
  257. package/dist/progress-f3iYEfdA.js +37 -0
  258. package/dist/progress-f3iYEfdA.js.map +1 -0
  259. package/dist/pull-refresh/index.d.ts +1 -0
  260. package/dist/pull-refresh/index.js +414 -0
  261. package/dist/pull-refresh/index.js.map +1 -0
  262. package/dist/pull-refresh/pull-refresh.d.ts +118 -0
  263. package/dist/radio-group/index.d.ts +3 -0
  264. package/dist/radio-group/index.js +2 -0
  265. package/dist/radio-group/radio-group.d.ts +78 -0
  266. package/dist/radio-group-BOIMuqnS.js +230 -0
  267. package/dist/radio-group-BOIMuqnS.js.map +1 -0
  268. package/dist/rate/index.d.ts +1 -0
  269. package/dist/rate/index.js +2 -0
  270. package/dist/rate/rate-form.d.ts +28 -0
  271. package/dist/rate/rate.d.ts +144 -0
  272. package/dist/rate-5XsU2QkY.js +631 -0
  273. package/dist/rate-5XsU2QkY.js.map +1 -0
  274. package/dist/reorder/index.d.ts +1 -0
  275. package/dist/reorder/index.js +720 -0
  276. package/dist/reorder/index.js.map +1 -0
  277. package/dist/reorder/reorder.d.ts +190 -0
  278. package/dist/result/index.d.ts +1 -0
  279. package/dist/result/index.js +123 -0
  280. package/dist/result/index.js.map +1 -0
  281. package/dist/result/result.d.ts +88 -0
  282. package/dist/safe-area/index.d.ts +1 -0
  283. package/dist/safe-area/index.js +42 -0
  284. package/dist/safe-area/index.js.map +1 -0
  285. package/dist/safe-area/safe-area.d.ts +28 -0
  286. package/dist/search-bar/index.js +3 -1
  287. package/dist/search-bar/index.js.map +1 -1
  288. package/dist/search-bar/search-bar.d.ts +4 -0
  289. package/dist/segmented/index.d.ts +2 -0
  290. package/dist/segmented/index.js +2 -0
  291. package/dist/segmented/segmented.d.ts +127 -0
  292. package/dist/segmented-BaU38_L4.js +367 -0
  293. package/dist/segmented-BaU38_L4.js.map +1 -0
  294. package/dist/selection-form-BOM_odUk.js +88 -0
  295. package/dist/selection-form-BOM_odUk.js.map +1 -0
  296. package/dist/selection-form.d.ts +27 -0
  297. package/dist/selection-ivXqO1eu.js +55 -0
  298. package/dist/selection-ivXqO1eu.js.map +1 -0
  299. package/dist/selection.d.ts +29 -0
  300. package/dist/selector/choice-group.d.ts +114 -0
  301. package/dist/selector/index.d.ts +2 -0
  302. package/dist/selector/index.js +2 -0
  303. package/dist/selector/selector.d.ts +90 -0
  304. package/dist/selector-BU2MMJ4N.js +93 -0
  305. package/dist/selector-BU2MMJ4N.js.map +1 -0
  306. package/dist/share-sheet/index.d.ts +1 -0
  307. package/dist/share-sheet/index.js +138 -0
  308. package/dist/share-sheet/index.js.map +1 -0
  309. package/dist/share-sheet/share-sheet.d.ts +139 -0
  310. package/dist/skeleton/index.js +51 -2
  311. package/dist/skeleton/index.js.map +1 -1
  312. package/dist/skeleton/skeleton.d.ts +34 -3
  313. package/dist/slider/index.d.ts +1 -0
  314. package/dist/slider/index.js +482 -0
  315. package/dist/slider/index.js.map +1 -0
  316. package/dist/slider/slider.d.ts +174 -0
  317. package/dist/space/index.d.ts +1 -0
  318. package/dist/space/index.js +52 -0
  319. package/dist/space/index.js.map +1 -0
  320. package/dist/space/space.d.ts +46 -0
  321. package/dist/statistic/index.d.ts +1 -0
  322. package/dist/statistic/index.js +152 -0
  323. package/dist/statistic/index.js.map +1 -0
  324. package/dist/statistic/statistic.d.ts +101 -0
  325. package/dist/stepper/index.js +62 -3
  326. package/dist/stepper/index.js.map +1 -1
  327. package/dist/stepper/stepper.d.ts +44 -4
  328. package/dist/steps/index.d.ts +1 -0
  329. package/dist/steps/index.js +72 -0
  330. package/dist/steps/index.js.map +1 -0
  331. package/dist/steps/steps.d.ts +67 -0
  332. package/dist/sticky/index.d.ts +1 -0
  333. package/dist/sticky/index.js +145 -0
  334. package/dist/sticky/index.js.map +1 -0
  335. package/dist/sticky/sticky.d.ts +70 -0
  336. package/dist/swipe-action/index.d.ts +1 -0
  337. package/dist/swipe-action/index.js +417 -0
  338. package/dist/swipe-action/index.js.map +1 -0
  339. package/dist/swipe-action/swipe-action.d.ts +148 -0
  340. package/dist/swiper/gesture.d.ts +32 -0
  341. package/dist/swiper/index.d.ts +1 -0
  342. package/dist/swiper/index.js +2 -0
  343. package/dist/swiper/swiper.d.ts +177 -0
  344. package/dist/swiper-BKivDkHp.js +550 -0
  345. package/dist/swiper-BKivDkHp.js.map +1 -0
  346. package/dist/switch/index.js +135 -10
  347. package/dist/switch/index.js.map +1 -1
  348. package/dist/switch/switch.d.ts +93 -6
  349. package/dist/tabbar/index.js +46 -1
  350. package/dist/tabbar/index.js.map +1 -1
  351. package/dist/tabbar/tabbar.d.ts +50 -0
  352. package/dist/tabs/index.js +22 -1
  353. package/dist/tabs/index.js.map +1 -1
  354. package/dist/tabs/tabs.d.ts +12 -8
  355. package/dist/tag/index.js +123 -2
  356. package/dist/tag/index.js.map +1 -1
  357. package/dist/tag/tag.d.ts +67 -1
  358. package/dist/textarea/index.d.ts +2 -0
  359. package/dist/textarea/index.js +2 -242
  360. package/dist/textarea/platform.d.ts +22 -0
  361. package/dist/textarea/textarea.d.ts +165 -46
  362. package/dist/textarea-qbnruDUG.js +775 -0
  363. package/dist/textarea-qbnruDUG.js.map +1 -0
  364. package/dist/time-picker/index.d.ts +1 -0
  365. package/dist/time-picker/index.js +228 -0
  366. package/dist/time-picker/index.js.map +1 -0
  367. package/dist/time-picker/time-picker.d.ts +83 -0
  368. package/dist/timeline/index.d.ts +1 -0
  369. package/dist/timeline/index.js +131 -0
  370. package/dist/timeline/index.js.map +1 -0
  371. package/dist/timeline/timeline.d.ts +79 -0
  372. package/dist/toast/index.js +47 -4
  373. package/dist/toast/index.js.map +1 -1
  374. package/dist/toast/toast.d.ts +26 -3
  375. package/dist/top-bar/index.js +16 -2
  376. package/dist/top-bar/index.js.map +1 -1
  377. package/dist/top-bar/top-bar.d.ts +13 -2
  378. package/dist/tree-select/index.d.ts +1 -0
  379. package/dist/tree-select/index.js +512 -0
  380. package/dist/tree-select/index.js.map +1 -0
  381. package/dist/tree-select/tree-select.d.ts +215 -0
  382. package/dist/typography/index.d.ts +1 -0
  383. package/dist/typography/index.js +82 -0
  384. package/dist/typography/index.js.map +1 -0
  385. package/dist/typography/typography.d.ts +54 -0
  386. package/dist/upload/index.d.ts +1 -0
  387. package/dist/upload/index.js +458 -0
  388. package/dist/upload/index.js.map +1 -0
  389. package/dist/upload/upload.d.ts +172 -0
  390. package/dist/virtual-list/index.d.ts +1 -0
  391. package/dist/virtual-list/index.js +445 -0
  392. package/dist/virtual-list/index.js.map +1 -0
  393. package/dist/virtual-list/virtual-list.d.ts +160 -0
  394. package/dist/visual-manifest.d.ts +6 -0
  395. package/dist/watermark/index.d.ts +1 -0
  396. package/dist/watermark/index.js +260 -0
  397. package/dist/watermark/index.js.map +1 -0
  398. package/dist/watermark/watermark.d.ts +106 -0
  399. package/package.json +399 -50
  400. package/dist/empty/index.js.map +0 -1
  401. package/dist/icon/index.js.map +0 -1
  402. package/dist/textarea/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-BykFntQN.js","names":["node"],"sources":["../src/picker/selection-model.ts","../src/picker/picker-machine.ts","../src/picker/selection-connect.ts","../src/picker/picker.ts","../src/picker/platform.ts"],"sourcesContent":["/**\n * Picker 选择内核 —— 选值的唯一权威。无 DOM、无 Popup 实例、无模态状态;\n * 唯一的模态输出是 `close` 请求,由同一 Foundation service 经继承的 Popup CLOSE 转移执行。\n *\n * 迁移自 specs/054-mobile-picker/spike/selection-model.ts:输入代次(epoch/generation)、\n * 物理挂载(mountEpoch)、会话代次与等待落定的守卫原样保留(T035–T039 证据)。\n * 本文件在其上增加:内嵌落定提交、离散选择(点击/键盘)、列焦点与重复值诊断。\n */\n\n/** 按列顺序的业务值;null 表示该列没有有效项。 */\nexport type PickerValue = readonly (string | null)[];\n/** popup:带工具栏,确定才提交;inline:内嵌滚轮,落定即提交。 */\nexport type PickerMode = \"popup\" | \"inline\";\nexport interface PickerOption { value: string; label: string; disabled?: boolean }\nexport interface PickerColumn { label?: string; options: readonly PickerOption[] }\nexport interface PickerChangeDetails { value: PickerValue }\n/** 选择内核输入:列与外部值。 */\nexport interface PickerSelectionProps { columns: readonly PickerColumn[]; value?: PickerValue; defaultValue?: PickerValue }\n/** Core 签发的列输入票据。桥只原样运输,不推导选值。 */\nexport interface PickerColumnToken { serviceId: string; epoch: number; columnIndex: number; generation: number; mountEpoch: number }\n/** 桥测得的原始几何(像素)。rows 与该列 options 一一对应。 */\nexport interface PickerGeometry { viewportHeight: number; scrollHeight: number; scrollTop: number; rows: readonly { top: number; height: number }[] }\n/** Core 输出的滚动请求;桥只执行 scrollTo 并回 ACK。 */\nexport interface PickerScrollCommand { token: PickerColumnToken; commandId: number; offset: number; behavior: \"auto\"; reason: \"alignment\" | \"settlement\" }\nexport type PickerSelectionNotice = { type: \"preview\" | \"value\"; value: PickerValue } | { type: \"close\"; open: false };\n/** 桥送入的原始信号;pointer/wheel/scroll 只是数值事实,落点与是否提交由 Core 决定。 */\nexport type PickerColumnSignal =\n | { type: \"MEASURE\"; geometry: PickerGeometry }\n | { type: \"POINTER.START\"; pointerId: number }\n | { type: \"POINTER.END\" | \"POINTER.CANCEL\"; pointerId: number }\n | { type: \"WHEEL\"; deltaY: number }\n | { type: \"SCROLL\"; scrollTop: number; lastCommandId?: number }\n | { type: \"COMMAND.APPLIED\"; commandId: number; geometry: PickerGeometry };\n/** 列内键盘移动。page-* 一次跨 5 项。 */\nexport type PickerKeyboardMove = \"next\" | \"previous\" | \"first\" | \"last\" | \"page-next\" | \"page-previous\";\n/** 开发诊断:重复值后项可见但永不可选。 */\nexport interface PickerDiagnostic { type: \"duplicate-value\"; columnIndex: number; optionIndex: number; firstIndex: number; value: string }\n\ninterface ColumnState { generation: number; mountEpoch: number; attached: boolean; geometry?: PickerGeometry; user: boolean; pointer?: number; scrolling: boolean; command?: PickerScrollCommand; timer?: ReturnType<typeof setTimeout> }\n\n/** 静默判定落定的内部时长;不是 API,也不是真实惯性承诺(真实触摸见 T029 浏览器验收)。 */\nconst QUIET_MS = 40;\n/**\n * 受控值请求后等待调用方回写的内部时长(不是 API)。到期仍未改写 value 即视为拒绝:\n * 显示回到调用方的值并通知一次恢复后的预览(FR-004:受控时组件只发请求,显示跟随调用方)。\n */\nconst OWNER_MS = 100;\nconst PAGE_STEP = 5;\nconst sameValue = (a: PickerValue, b: PickerValue) => a.length === b.length && a.every((item, index) => item === b[index]);\nconst resizeValue = (value: PickerValue, length: number): PickerValue => Array.from({ length }, (_, index) => value[index] ?? null);\n\n/** 可选 = 存在、未禁用、且是该值的逻辑第一项(第一项禁用也不提升后项)。 */\nexport function isPickerOptionSelectable(column: PickerColumn, index: number): boolean {\n const option = column.options[index];\n return !!option && !option.disabled && column.options.findIndex(item => item.value === option.value) === index;\n}\n/** 列的第一可选值;没有可选项时为 null。 */\nexport function getPickerFirstValue(column: PickerColumn): string | null {\n return column.options.find((_option, index) => isPickerOptionSelectable(column, index))?.value ?? null;\n}\n/** 值在列中的可选索引;不可选或不存在时为 -1(不伪造选中)。 */\nexport function getPickerOptionIndex(column: PickerColumn, value: string | null): number {\n return column.options.findIndex((option, index) => option.value === value && isPickerOptionSelectable(column, index));\n}\n/** 重复值诊断:每个后项一条,指向逻辑第一项。 */\nexport function getPickerDiagnostics(columns: readonly PickerColumn[]): readonly PickerDiagnostic[] {\n return columns.flatMap((column, columnIndex) => column.options.flatMap((option, optionIndex) => {\n const firstIndex = column.options.findIndex(item => item.value === option.value);\n return firstIndex === optionIndex ? [] : [{ type: \"duplicate-value\" as const, columnIndex, optionIndex, firstIndex, value: option.value }];\n }));\n}\n/** 键盘目标索引:跳过禁用与重复后项;没有可去的项时返回 -1。当前无效时向下类从首项、向上类从末项找。 */\nexport function getPickerKeyboardTarget(column: PickerColumn, current: number, move: PickerKeyboardMove): number {\n const count = column.options.length;\n const scan = (from: number, step: 1 | -1, stop = step > 0 ? count : -1): number => {\n for (let index = from; step > 0 ? index < stop : index > stop; index += step) if (isPickerOptionSelectable(column, index)) return index;\n return -1;\n };\n const valid = current >= 0 && current < count;\n if (move === \"first\" || (!valid && (move === \"next\" || move === \"page-next\"))) return scan(0, 1);\n if (move === \"last\" || (!valid && (move === \"previous\" || move === \"page-previous\"))) return scan(count - 1, -1);\n if (move === \"next\") return scan(current + 1, 1);\n if (move === \"previous\") return scan(current - 1, -1);\n if (move === \"page-next\") {\n const target = Math.min(count - 1, current + PAGE_STEP);\n const forward = scan(target, 1);\n return forward >= 0 ? forward : scan(target - 1, -1, current);\n }\n const target = Math.max(0, current - PAGE_STEP);\n const backward = scan(target, -1);\n return backward >= 0 ? backward : scan(target + 1, 1, current);\n}\nfunction sameColumns(a: readonly PickerColumn[], b: readonly PickerColumn[]): boolean {\n return a.length === b.length && a.every((column, index) => {\n const other = b[index]!;\n return column.label === other.label && column.options.length === other.options.length && column.options.every((option, i) => {\n const next = other.options[i]!;\n return option.value === next.value && option.label === next.label && !!option.disabled === !!next.disabled;\n });\n });\n}\nfunction validGeometry(geometry: PickerGeometry, count: number): boolean {\n return Number.isFinite(geometry.viewportHeight) && geometry.viewportHeight > 0 && Number.isFinite(geometry.scrollHeight) && geometry.scrollHeight > 0 &&\n Number.isFinite(geometry.scrollTop) && geometry.rows.length === count && geometry.rows.every((row, index) => Number.isFinite(row.top) && Number.isFinite(row.height) && row.height > 0 && (index === 0 || row.top >= geometry.rows[index - 1]!.top));\n}\nfunction nearest(column: PickerColumn, geometry: PickerGeometry): number {\n const center = geometry.scrollTop + geometry.viewportHeight / 2;\n let result = -1; let distance = Infinity;\n geometry.rows.forEach((row, index) => {\n const next = Math.abs(row.top + row.height / 2 - center);\n if (isPickerOptionSelectable(column, index) && next < distance) { result = index; distance = next; }\n });\n return result;\n}\nfunction snapshotColumns(columns: readonly PickerColumn[]): readonly PickerColumn[] {\n return columns.map(column => ({ ...column, options: column.options.map(option => ({ ...option })) }));\n}\n\n/** Core 选择会话。由 pickerMachine 的 refs 持有;context 中的 snapshot 只是它的可观察投影。 */\nexport class PickerSelectionModel {\n private props: PickerSelectionProps;\n private accepted: PickerValue;\n private restore: PickerValue;\n private preview: PickerValue;\n private source: \"external\" | \"user\" | \"restore\" = \"external\";\n private externalInvalid = false;\n private lastUserColumn = -1;\n private columns: ColumnState[];\n private epoch = 1;\n private sessionEpoch = 1;\n private active = true;\n private disposed = false;\n private pendingConfirm = false;\n private inlineDirty = false;\n private discreteTimer?: ReturnType<typeof setTimeout>;\n private ownerTimer?: ReturnType<typeof setTimeout>;\n private focusedColumn = 0;\n private userRevision = 0;\n private nextCommand = 0;\n private nextGeneration = 0;\n private nextMountEpoch = 0;\n private readonly serviceId: string;\n private readonly notificationSink: (event: PickerSelectionNotice) => void;\n readonly mode: PickerMode;\n constructor(serviceId: string, props: PickerSelectionProps, notificationSink: (event: PickerSelectionNotice) => void, mode: PickerMode = \"popup\") {\n this.serviceId = serviceId; this.notificationSink = notificationSink; this.mode = mode;\n this.props = { ...props, columns: snapshotColumns(props.columns), ...(props.value ? { value: [...props.value] } : {}) };\n this.accepted = [...(props.value ?? props.defaultValue ?? props.columns.map(getPickerFirstValue))];\n this.restore = resizeValue(this.accepted, props.columns.length);\n this.preview = this.restore;\n this.columns = props.columns.map(() => ({ generation: ++this.nextGeneration, mountEpoch: 0, attached: false, user: false, scrolling: false }));\n this.externalInvalid = props.value !== undefined && !this.previewValid();\n }\n private observer?: (snapshot: PickerSelectionSnapshot) => void;\n observe(observer: (snapshot: PickerSelectionSnapshot) => void): () => void {\n this.observer = observer; observer(this.snapshot);\n return () => { if (this.observer === observer) this.observer = undefined; };\n }\n private publish(): void { this.observer?.(this.snapshot); }\n private notify(event: PickerSelectionNotice): void { this.publish(); this.notificationSink(event); }\n get isDisposed(): boolean { return this.disposed; }\n get snapshot() {\n return {\n mode: this.mode,\n userRevision: this.userRevision, committed: [...this.accepted], preview: [...this.preview], source: this.source,\n selectedIndices: this.props.columns.map((column, index) => getPickerOptionIndex(column, this.preview[index] ?? null)),\n valid: this.valid(), pendingConfirm: this.pendingConfirm, active: this.active,\n focusedColumn: Math.max(0, Math.min(this.focusedColumn, this.props.columns.length - 1)),\n tokens: this.columns.map((column, index) => this.active && column.attached ? this.token(index) : undefined),\n commands: this.columns.flatMap(column => column.command ? [{ ...column.command, token: { ...column.command.token } }] : []),\n };\n }\n private previewValid(): boolean { return this.props.columns.length > 0 && this.props.columns.every((column, index) => getPickerOptionIndex(column, this.preview[index] ?? null) >= 0); }\n private valid(): boolean { return this.previewValid() && !this.externalInvalid; }\n private token(columnIndex: number): PickerColumnToken {\n const column = this.columns[columnIndex]!;\n return { serviceId: this.serviceId, epoch: this.epoch, columnIndex, generation: column.generation, mountEpoch: column.mountEpoch };\n }\n private current(token: PickerColumnToken): ColumnState | undefined {\n const column = this.columns[token.columnIndex];\n return this.active && column?.attached && token.serviceId === this.serviceId && token.epoch === this.epoch && token.generation === column.generation && token.mountEpoch === column.mountEpoch ? column : undefined;\n }\n attach(columnIndex: number): PickerColumnToken {\n try {\n const column = this.columns[columnIndex];\n if (!this.active || !column) throw new Error(\"Inactive selection surface\");\n this.clearTimer(column); column.mountEpoch = ++this.nextMountEpoch; column.attached = true; column.geometry = undefined; column.command = undefined;\n column.user = false; column.pointer = undefined;\n return this.token(columnIndex);\n } finally { this.publish(); }\n }\n detach(token: PickerColumnToken): void {\n try {\n const column = this.columns[token.columnIndex];\n if (this.disposed || !column?.attached || token.serviceId !== this.serviceId || token.mountEpoch !== column.mountEpoch) return;\n this.clearTimer(column); column.mountEpoch = ++this.nextMountEpoch; column.attached = false; column.geometry = undefined; column.command = undefined;\n column.scrolling = false; column.pointer = undefined; column.user = false;\n this.pendingConfirm = false;\n } finally { this.publish(); }\n }\n dispatch(token: PickerColumnToken, signal: PickerColumnSignal): void {\n try {\n const column = this.current(token); if (!column) return;\n if (signal.type === \"MEASURE\") {\n if (!validGeometry(signal.geometry, this.props.columns[token.columnIndex]!.options.length)) {\n this.clearTimer(column); column.geometry = undefined; column.command = undefined;\n // A current mount that measures as zero-size/unlaid-out has no scroll to settle: a replaced column's\n // wait ends here instead of blocking a retained confirm forever (it settles on its Core preview).\n if (column.scrolling && !column.user && column.pointer === undefined) {\n column.scrolling = false;\n if (this.mode === \"inline\") this.flushInline();\n else if (this.pendingConfirm && !this.waiting() && this.valid()) this.commit();\n }\n return;\n }\n column.geometry = { ...signal.geometry, rows: signal.geometry.rows.map(row => ({ ...row })) };\n if (!this.align(token.columnIndex, \"alignment\") && column.scrolling) this.schedule(token);\n return;\n }\n if (signal.type === \"COMMAND.APPLIED\") {\n if (column.command?.commandId !== signal.commandId || !validGeometry(signal.geometry, this.props.columns[token.columnIndex]!.options.length)) return;\n const reason = column.command.reason;\n column.geometry = { ...signal.geometry, rows: signal.geometry.rows.map(row => ({ ...row })) }; column.command = undefined;\n if ((reason === \"settlement\" && column.user) || (this.pendingConfirm && column.scrolling)) this.schedule(token);\n return; // ACK is never a selection/value callback or another scroll command.\n }\n if (signal.type === \"POINTER.START\" || signal.type === \"WHEEL\") {\n if (signal.type === \"WHEEL\" && !Number.isFinite(signal.deltaY)) return;\n this.userRevision++;\n column.user = true; column.command = undefined; this.clearTimer(column);\n if (signal.type === \"POINTER.START\") { if (column.pointer === undefined) column.pointer = signal.pointerId; }\n else { column.scrolling = true; if (column.geometry) this.schedule(token); }\n return;\n }\n if (signal.type === \"POINTER.END\" || signal.type === \"POINTER.CANCEL\") {\n if (column.pointer !== signal.pointerId) return;\n column.pointer = undefined; this.schedule(token); return;\n }\n if (signal.type === \"SCROLL\") {\n if (!column.geometry || !Number.isFinite(signal.scrollTop)) return;\n column.geometry = { ...column.geometry, scrollTop: signal.scrollTop };\n if (!column.user) return; // Core causal epoch, never Event.isTrusted/bridge guesses.\n column.scrolling = true;\n const index = nearest(this.props.columns[token.columnIndex]!, column.geometry);\n const value = index < 0 ? null : this.props.columns[token.columnIndex]!.options[index]!.value;\n const preview = this.preview.map((item, i) => i === token.columnIndex ? value : item);\n if (!sameValue(preview, this.preview)) { this.setUserPreview(preview, token.columnIndex); this.notify({ type: \"preview\", value: [...preview] }); }\n if (this.current(token) && column.pointer === undefined) this.schedule(token);\n }\n } finally { this.publish(); }\n }\n /** Captured identity must survive queueing; never relabel an old input. */\n queue(token: PickerColumnToken, signal: PickerColumnSignal): void { queueMicrotask(() => this.dispatch(token, signal)); }\n /** 离散选择(点击/键盘):等同一次立即落定的用户选择;正在滚的本列被它取代。 */\n select(columnIndex: number, optionIndex: number): void {\n try {\n const column = this.props.columns[columnIndex]; const state = this.columns[columnIndex];\n if (!this.active || this.disposed || !column || !state || !isPickerOptionSelectable(column, optionIndex)) return;\n this.userRevision++;\n this.focusedColumn = columnIndex;\n this.clearTimer(state); state.user = false; state.scrolling = false; state.pointer = undefined; state.command = undefined;\n const value = column.options[optionIndex]!.value;\n const preview = resizeValue(this.preview, this.props.columns.length).map((item, i) => i === columnIndex ? value : item);\n if (!sameValue(preview, this.preview)) { this.setUserPreview(preview, columnIndex); this.notify({ type: \"preview\", value: [...preview] }); }\n // The caller may synchronously replace dependent columns inside the notice; re-check the session.\n if (!this.active || this.disposed || !this.columns[columnIndex]) return;\n this.align(columnIndex, \"alignment\");\n this.scheduleDiscrete();\n } finally { this.publish(); }\n }\n /**\n * 离散选择的落定:与滚轮相同的静默窗口后才提交(内嵌)或兑现已按下的确定(工具栏)。\n * 让框架下一次渲染才送达的联动后列先到,避免以旧后列冒充新数据(FR-011)。\n */\n private scheduleDiscrete(): void {\n if (this.mode !== \"inline\" && !this.pendingConfirm) return;\n this.clearDiscrete();\n const epoch = this.epoch; const sessionEpoch = this.sessionEpoch;\n this.discreteTimer = setTimeout(() => {\n this.discreteTimer = undefined;\n if (!this.active || this.disposed || this.epoch !== epoch || this.sessionEpoch !== sessionEpoch) return;\n try {\n if (this.mode === \"inline\") this.flushInline();\n else if (this.pendingConfirm && !this.waiting() && this.valid()) this.commit();\n } finally { this.publish(); }\n }, QUIET_MS);\n }\n private clearDiscrete(): void { if (this.discreteTimer !== undefined) clearTimeout(this.discreteTimer); this.discreteTimer = undefined; }\n /** 列内键盘移动;目标不存在时只更新列焦点。 */\n move(columnIndex: number, move: PickerKeyboardMove): void {\n const column = this.props.columns[columnIndex];\n if (!this.active || this.disposed || !column) return;\n const target = getPickerKeyboardTarget(column, getPickerOptionIndex(column, this.preview[columnIndex] ?? null), move);\n if (target >= 0) this.select(columnIndex, target);\n else this.focus(columnIndex);\n }\n /** 记录逻辑列焦点(roving tabindex)。不发业务通知。 */\n focus(columnIndex: number): void {\n if (this.disposed || columnIndex < 0 || columnIndex >= this.props.columns.length || columnIndex === this.focusedColumn) return;\n this.focusedColumn = columnIndex; this.publish();\n }\n private setUserPreview(preview: PickerValue, columnIndex: number): void {\n this.preview = preview; this.source = \"user\"; this.lastUserColumn = columnIndex;\n if (this.mode === \"inline\") this.inlineDirty = true;\n }\n private clearTimer(column: ColumnState): void { if (column.timer !== undefined) clearTimeout(column.timer); column.timer = undefined; }\n private schedule(token: PickerColumnToken): void {\n const column = this.current(token); if (!column || column.pointer !== undefined) return;\n this.clearTimer(column);\n column.timer = setTimeout(() => {\n column.timer = undefined;\n if (!this.current(token) || column.pointer !== undefined) return;\n this.settle(token); this.publish();\n }, QUIET_MS);\n }\n private align(columnIndex: number, reason: PickerScrollCommand[\"reason\"]): boolean {\n const column = this.columns[columnIndex]!; const geometry = column.geometry;\n const index = getPickerOptionIndex(this.props.columns[columnIndex]!, this.preview[columnIndex] ?? null);\n if (!geometry || index < 0) return false;\n const row = geometry.rows[index]!;\n const offset = Math.max(0, Math.min(geometry.scrollHeight - geometry.viewportHeight, row.top + row.height / 2 - geometry.viewportHeight / 2));\n if (geometry.scrollTop === offset) return false;\n if (column.command?.offset === offset && column.command.reason === reason) return true;\n column.command = { token: this.token(columnIndex), commandId: ++this.nextCommand, offset, behavior: \"auto\", reason };\n return true;\n }\n private settle(token: PickerColumnToken): void {\n const column = this.current(token); if (!column?.geometry) return;\n if (this.align(token.columnIndex, \"settlement\")) return;\n column.scrolling = false;\n if (this.mode === \"inline\") this.flushInline();\n else if (this.pendingConfirm && !this.waiting() && this.valid()) this.commit();\n }\n private waiting(): boolean { return this.columns.some(column => column.pointer !== undefined || column.scrolling || column.command?.reason === \"settlement\"); }\n confirm(): void {\n try {\n if (!this.active || !this.valid() || this.mode === \"inline\") return;\n if (this.waiting()) { this.pendingConfirm = true; return; }\n this.commit();\n } finally { this.publish(); }\n }\n private commit(): void {\n this.pendingConfirm = false;\n const value = resizeValue(this.preview, this.props.columns.length);\n if (this.props.value === undefined) this.accepted = [...value];\n this.restore = resizeValue(this.accepted, this.props.columns.length);\n this.invalidate();\n const sessionEpoch = this.sessionEpoch;\n this.notify({ type: \"value\", value: [...value] });\n this.awaitOwner();\n if (this.sessionEpoch === sessionEpoch && this.active && !this.disposed) this.notify({ type: \"close\", open: false });\n }\n /** 内嵌:所有列落定且有效、并且与已提交值不同,才通知一次 value。不关闭、不使在途输入失效。 */\n private flushInline(): void {\n if (this.mode !== \"inline\" || !this.active || this.disposed || !this.inlineDirty || this.waiting() || !this.valid()) return;\n this.inlineDirty = false;\n const value = resizeValue(this.preview, this.props.columns.length);\n if (sameValue(value, resizeValue(this.accepted, this.props.columns.length))) return;\n if (this.props.value === undefined) this.accepted = [...value];\n this.restore = resizeValue(this.accepted, this.props.columns.length);\n this.notify({ type: \"value\", value: [...value] });\n this.awaitOwner();\n }\n /**\n * 受控请求发出后:调用方在 OWNER_MS 内没有改写 value(拒绝),且用户未再操作,\n * 则显示回到调用方的值(同外部回写路径:新代次、桥重新测量并对齐),并通知一次恢复后的预览。\n * 工具栏若已真实关闭,会话结束即可,重开本就从已提交值开始。\n */\n private awaitOwner(): void {\n this.clearOwner();\n if (this.props.value === undefined || this.disposed || !this.active) return;\n const requested = [...this.props.value]; const revision = this.userRevision; const sessionEpoch = this.sessionEpoch;\n this.ownerTimer = setTimeout(() => {\n this.ownerTimer = undefined;\n if (this.disposed || !this.active || this.sessionEpoch !== sessionEpoch || this.userRevision !== revision || this.props.value === undefined) return;\n if (!sameValue(this.props.value, requested) || this.waiting()) return;\n const count = this.props.columns.length;\n const restored = resizeValue(this.accepted, count);\n if (sameValue(resizeValue(this.preview, count), restored)) return;\n try {\n this.invalidate(); this.preview = restored; this.restore = [...restored]; this.source = \"external\";\n this.externalInvalid = !this.previewValid();\n this.notify({ type: \"preview\", value: [...restored] });\n } finally { this.publish(); }\n }, OWNER_MS);\n }\n private clearOwner(): void { if (this.ownerTimer !== undefined) clearTimeout(this.ownerTimer); this.ownerTimer = undefined; }\n cancel(requestClose = true): void {\n try {\n if (!this.active || this.mode === \"inline\") return;\n this.invalidate(); this.preview = resizeValue(this.restore, this.props.columns.length); this.source = \"restore\";\n const sessionEpoch = this.sessionEpoch;\n this.notify({ type: \"preview\", value: [...this.preview] });\n if (requestClose && this.sessionEpoch === sessionEpoch && this.active && !this.disposed) this.notify({ type: \"close\", open: false });\n } finally { this.publish(); }\n }\n /** Actual inherited Popup close fact, not another modal state transition. */\n closed(): void {\n try { this.sessionEpoch++; this.invalidate(); this.clearOwner(); this.active = false; this.source = \"external\"; } finally { this.publish(); }\n }\n stop(): void {\n try { this.sessionEpoch++; this.invalidate(); this.clearOwner(); this.active = false; this.disposed = true; } finally { this.publish(); }\n }\n private invalidate(): void {\n this.epoch++; this.pendingConfirm = false; this.inlineDirty = false; this.clearDiscrete();\n for (const column of this.columns) { this.clearTimer(column); column.generation = ++this.nextGeneration; column.user = false; column.scrolling = false; column.pointer = undefined; column.command = undefined; }\n }\n update(props: PickerSelectionProps): void {\n try {\n if (this.disposed) return;\n const columnsChanged = !sameColumns(this.props.columns, props.columns);\n const dependentChanged = props.columns.some((column, index) => index > this.lastUserColumn && (column.options.length !== this.props.columns[index]?.options.length || column.options.some((option, row) => {\n const previous = this.props.columns[index]?.options[row];\n return !previous || option.value !== previous.value || !!option.disabled !== !!previous.disabled;\n })));\n const externalChanged = props.value !== undefined && (this.props.value === undefined || !sameValue(props.value, this.props.value));\n const controlledRemoved = props.value === undefined && this.props.value !== undefined;\n if (columnsChanged) {\n this.columns.slice(props.columns.length).forEach(column => this.clearTimer(column));\n this.columns = props.columns.map((column, index) => {\n const previous = this.columns[index];\n const before = this.props.columns[index];\n if (previous && before && sameColumns([before], [column])) return previous;\n if (previous) this.clearTimer(previous);\n // A replaced, physically mounted column must be measured and settle before a retained confirm commits.\n return { generation: ++this.nextGeneration, mountEpoch: previous?.mountEpoch ?? 0, attached: previous?.attached ?? false, user: false, scrolling: this.active && this.source === \"user\" && (previous?.attached ?? false) };\n });\n }\n this.props = { ...props, columns: snapshotColumns(props.columns), ...(props.value ? { value: [...props.value] } : {}) };\n if (externalChanged) {\n this.invalidate(); this.clearOwner(); this.accepted = [...props.value!]; this.preview = resizeValue(this.accepted, props.columns.length); this.source = \"external\";\n this.restore = [...this.preview];\n this.externalInvalid = !this.previewValid();\n } else if (controlledRemoved) {\n this.preview = resizeValue(this.accepted, props.columns.length); this.source = \"external\"; this.pendingConfirm = false; this.externalInvalid = false; this.inlineDirty = false;\n } else if (columnsChanged) {\n this.preview = resizeValue(this.preview, props.columns.length);\n if (this.source === \"user\" && dependentChanged) {\n const next = this.preview.map((value, index) => index > this.lastUserColumn && getPickerOptionIndex(props.columns[index]!, value) < 0 ? getPickerFirstValue(props.columns[index]!) : value);\n this.externalInvalid = false;\n if (!sameValue(next, this.preview)) { this.setUserPreview(next, this.lastUserColumn); this.notify({ type: \"preview\", value: [...next] }); }\n this.flushInline();\n } else {\n this.externalInvalid = props.value !== undefined && props.columns.some((column, index) => getPickerOptionIndex(column, this.accepted[index] ?? null) < 0);\n if (!this.valid()) this.pendingConfirm = false;\n }\n }\n } finally { this.publish(); }\n }\n /** Begin a later actual Popup opening from the accepted entry value. */\n reopened(): void {\n try {\n if (this.disposed) throw new Error(\"Disposed selection service\");\n this.sessionEpoch++; this.invalidate(); this.clearOwner(); this.active = true; this.restore = resizeValue(this.accepted, this.props.columns.length);\n this.preview = [...this.restore]; this.source = \"external\";\n this.externalInvalid = this.props.value !== undefined && !this.previewValid();\n } finally { this.publish(); }\n }\n}\n\nexport type PickerSelectionSnapshot = PickerSelectionModel[\"snapshot\"];\n","import { MachineStatus } from \"@zag-js/core\";\nimport type { BindableContext, Machine, MachineState, Params, Service, Transition, ValueOrFn } from \"@zag-js/core\";\nimport { modalRequestSend, onModalBeforeClose } from \"../modal-dialog-machine.js\";\nimport { popupMachine } from \"../popup/popup.js\";\nimport {\n PickerSelectionModel,\n type PickerColumnSignal,\n type PickerColumnToken,\n type PickerKeyboardMove,\n type PickerMode,\n type PickerSelectionNotice,\n type PickerSelectionProps,\n type PickerSelectionSnapshot,\n type PickerValue,\n} from \"./selection-model.js\";\n\n/**\n * Picker 的单一 Foundation service(T002)。\n *\n * 不是第二个 machine:它是锁定的上游 `popupMachine` 的显式 typed 投影 —— props / context / states /\n * transitions / actions / effects 全部来自同一个 Popup machine,只追加选择会话的 context、refs 与事件。\n * 工具栏(popup)形态的开合、焦点、滚动锁、portal id 与模态票据都由这一个 service 承担;\n * 内嵌(inline)形态把所有上游打开路径守卫为 closed:没有锁、没有 portal、没有模态登记。\n *\n * 迁移自 specs/054-mobile-picker/spike/machine-foundation.ts(T002 + T035–T039 证据),\n * 仅删去 spike 的 PREVIEW.SET 探针并增加离散选择/键盘/列焦点事件。\n */\n\ntype PopupSchema = typeof popupMachine extends Machine<infer Schema> ? Schema : never;\nconst EMPTY_SELECTION: PickerSelectionProps = { columns: [] };\n\nexport interface QwPickerSchema extends Omit<PopupSchema, \"action\" | \"event\" | \"effect\"> {\n props: PopupSchema[\"props\"] & { mode: PickerMode; selection?: PickerSelectionProps; onSelectionNotice?: (event: PickerSelectionNotice) => void };\n context: {\n rendered: PopupSchema[\"context\"][\"rendered\"];\n triggerValue: PopupSchema[\"context\"][\"triggerValue\"];\n preview: PickerValue;\n selectionSnapshot: PickerSelectionSnapshot | null;\n surfaceTokens: readonly (PickerColumnToken | undefined)[];\n };\n refs: {\n /** 构造时固定的形态;切换形态须重新挂载。 */\n mode: PickerMode;\n selectionModel: PickerSelectionModel;\n selectionTransport: { notice?: (event: PickerSelectionNotice) => void; closeIntent: boolean; session: number };\n };\n action: PopupSchema[\"action\"] | \"selectionInput\";\n effect: PopupSchema[\"effect\"] | \"selectionLifetime\";\n event: PopupSchema[\"event\"]\n | { type: \"SELECTION.MOUNT\"; columnIndex: number }\n | { type: \"SELECTION.UNMOUNT\"; token: PickerColumnToken }\n | { type: \"SELECTION.INPUT\"; token: PickerColumnToken; signal: PickerColumnSignal }\n | { type: \"SELECTION.SELECT\"; columnIndex: number; optionIndex: number }\n | { type: \"SELECTION.MOVE\"; columnIndex: number; move: PickerKeyboardMove }\n | { type: \"SELECTION.FOCUS\"; columnIndex: number }\n | { type: \"SELECTION.CONFIRM\" } | { type: \"SELECTION.CANCEL\" } | { type: \"SELECTION.CLOSE\"; session: number };\n}\nexport type QwPickerService = Service<QwPickerSchema>;\nexport type QwPickerMachine = Machine<QwPickerSchema>;\n\nconst noRefs = { get: () => { throw new Error(\"Pinned Popup has no refs\"); }, set: () => { throw new Error(\"Pinned Popup has no refs\"); } };\n\nfunction popupContext(context: BindableContext<QwPickerSchema>): BindableContext<PopupSchema> {\n // Both existing context properties keep precisely their upstream value types.\n // TS does not simplify indexed ValueOrFn across a context with extra keys.\n function set<K extends keyof PopupSchema[\"context\"]>(key: K, value: ValueOrFn<PopupSchema[\"context\"][K]>) {\n context.set(key, value as ValueOrFn<QwPickerSchema[\"context\"][K]>);\n }\n return {\n get: (key) => context.get(key),\n set,\n initial: (key) => context.initial(key),\n hash: (key) => context.hash(key),\n };\n}\nfunction isPopupEvent(event: QwPickerSchema[\"event\"]): event is PopupSchema[\"event\"] {\n return !event.type.startsWith(\"SELECTION.\");\n}\nfunction popupEvent(event: QwPickerSchema[\"event\"]): PopupSchema[\"event\"] {\n if (!isPopupEvent(event)) throw new Error(\"Picker events must not run upstream Popup handlers\");\n return event;\n}\n// The upstream service envelope is opaque transport. Only setTriggerValue reads\n// event.value in the pinned machine, and that action validates its event below.\nfunction popupMetadata(event: Params<QwPickerSchema>[\"event\"]): Params<PopupSchema>[\"event\"] {\n return event as Params<PopupSchema>[\"event\"];\n}\nfunction popupParams(params: Params<QwPickerSchema>): Params<PopupSchema> {\n return {\n ...params,\n prop: (key) => params.prop(key),\n context: popupContext(params.context),\n refs: noRefs,\n computed: (key) => params.computed(key),\n event: popupMetadata(params.event),\n send: (event) => params.send(event),\n action: (keys) => params.action(keys),\n guard: (key) => typeof key === \"function\" ? key(popupParams(params)) : params.guard(key),\n // Pinned upstream dialog never calls choose. Fail loudly on an upstream change.\n choose: () => { throw new Error(\"Pinned Popup has no inline choose implementation\"); },\n };\n}\nfunction transition<P extends string | undefined>(input: Transition<PopupSchema, P>): Transition<QwPickerSchema, P> {\n const guard = input.guard;\n return { ...input, guard: (params) => !params.refs.get(\"selectionModel\").isDisposed &&\n (guard === undefined || (typeof guard === \"function\" ? guard(popupParams(params)) : params.guard(guard)) === true) };\n}\nfunction transitions<P extends string | undefined>(input: Transition<PopupSchema, P> | Transition<PopupSchema, P>[] | undefined) {\n return Array.isArray(input) ? input.map((item) => transition<P>(item)) : input ? transition(input) : undefined;\n}\n/** A queued selection close carries the actual service session and is re-checked at execution. */\nfunction selectionClose<P extends string | undefined>(input: Transition<PopupSchema, P> | Transition<PopupSchema, P>[] | undefined) {\n const items = transitions(input);\n return items ? (Array.isArray(items) ? items : [items]).map(item => ({\n ...item,\n guard: (params: Params<QwPickerSchema>) => params.event.type === \"SELECTION.CLOSE\" &&\n params.event.session === params.refs.get(\"selectionTransport\").session &&\n (item.guard === undefined || (typeof item.guard === \"function\" ? item.guard(params) : params.guard(item.guard)) === true),\n })) : undefined;\n}\nfunction state<P extends \"open\" | \"closed\">(input: MachineState<PopupSchema, P>): MachineState<QwPickerSchema, P> {\n const { entry, exit, effects, states: nested, ...rest } = input;\n if (nested) throw new Error(\"Pinned Popup has no nested states\");\n return {\n ...rest,\n entry: typeof entry === \"function\" ? (params) => entry(popupParams(params)) : entry,\n exit: typeof exit === \"function\" ? (params) => exit(popupParams(params)) : exit,\n effects: typeof effects === \"function\" ? (params) => effects(popupParams(params)) : effects,\n on: {\n OPEN: transitions(input.on?.OPEN), CLOSE: transitions(input.on?.CLOSE),\n \"SELECTION.CLOSE\": selectionClose(input.on?.CLOSE),\n TOGGLE: transitions(input.on?.TOGGLE),\n \"CONTROLLED.OPEN\": transitions(input.on?.[\"CONTROLLED.OPEN\"]),\n \"CONTROLLED.CLOSE\": transitions(input.on?.[\"CONTROLLED.CLOSE\"]),\n \"TRIGGER_VALUE.SET\": transitions(input.on?.[\"TRIGGER_VALUE.SET\"]),\n },\n };\n}\nconst closed = state(popupMachine.states.closed);\n/** Inline keeps every inherited opening path closed: no lock, portal, ticket or registration. */\nfunction onlyPopup<P extends string | undefined>(input: Transition<QwPickerSchema, P> | Transition<QwPickerSchema, P>[] | undefined) {\n return input ? (Array.isArray(input) ? input : [input]).map((item) => ({\n ...item,\n guard: (params: Params<QwPickerSchema>) => params.refs.get(\"mode\") === \"popup\" &&\n (item.guard === undefined || (typeof item.guard === \"function\" ? item.guard(params) : params.guard(item.guard)) === true),\n })) : undefined;\n}\nconst disposed = (params: Params<QwPickerSchema>) => params.refs.get(\"selectionModel\").isDisposed;\n\n/** Typed pinned upstream projection: one service, the original two modal states. */\nexport const pickerMachine: QwPickerMachine = {\n props(params) {\n return { ...popupMachine.props!({ props: params.props, scope: params.scope }), mode: params.props.mode === \"inline\" ? \"inline\" : \"popup\", selection: params.props.selection, onSelectionNotice: params.props.onSelectionNotice };\n },\n initialState(params) { return params.prop(\"mode\") === \"inline\" ? \"closed\" : popupMachine.initialState({ prop: (key) => params.prop(key) }); },\n context(params) {\n return {\n ...popupMachine.context!({\n ...params, prop: (key) => params.prop(key),\n getContext: () => popupContext(params.getContext()),\n getComputed: () => (key) => params.getComputed()(key),\n getRefs: () => noRefs,\n getEvent: () => popupEvent(params.getEvent()),\n }),\n preview: params.bindable<PickerValue>(() => ({ defaultValue: [] })),\n selectionSnapshot: params.bindable<PickerSelectionSnapshot | null>(() => ({ defaultValue: null })),\n surfaceTokens: params.bindable<readonly (PickerColumnToken | undefined)[]>(() => ({ defaultValue: [] })),\n };\n },\n // Pure: React's useMachine evaluates refs on every render and keeps only the first result,\n // so this must never write context. The lifetime effect's observer publishes the first snapshot.\n refs({ prop }) {\n const mode = prop(\"mode\");\n const selectionTransport: QwPickerSchema[\"refs\"][\"selectionTransport\"] = { closeIntent: false, session: 0 };\n const selectionModel = new PickerSelectionModel(prop(\"id\") ?? \"\", prop(\"selection\") ?? EMPTY_SELECTION, (event) => selectionTransport.notice?.(event), mode);\n if (mode === \"popup\" && !(prop(\"open\") ?? prop(\"defaultOpen\"))) selectionModel.closed();\n return { mode, selectionModel, selectionTransport };\n },\n entry: params => typeof popupMachine.entry === \"function\" ? popupMachine.entry(popupParams(params)) : popupMachine.entry,\n exit: params => typeof popupMachine.exit === \"function\" ? popupMachine.exit(popupParams(params)) : popupMachine.exit,\n effects: [\"selectionLifetime\"],\n watch(params) {\n popupMachine.watch?.(popupParams(params));\n params.track([() => JSON.stringify(params.prop(\"selection\"))], () => {\n params.refs.get(\"selectionModel\").update(params.prop(\"selection\") ?? EMPTY_SELECTION);\n });\n },\n states: {\n open: { ...state(popupMachine.states.open),\n entry(params) {\n if (disposed(params)) return;\n params.refs.get(\"selectionTransport\").session++; params.refs.get(\"selectionModel\").reopened();\n const entry = popupMachine.states.open.entry; return typeof entry === \"function\" ? entry(popupParams(params)) : entry;\n },\n exit(params) {\n const model = params.refs.get(\"selectionModel\"); const transport = params.refs.get(\"selectionTransport\");\n transport.session++;\n if (model.snapshot.active && !transport.closeIntent) model.cancel(false);\n model.closed(); transport.closeIntent = false;\n const exit = popupMachine.states.open.exit; return typeof exit === \"function\" ? exit(popupParams(params)) : exit;\n },\n },\n closed: { ...closed, on: { ...closed.on,\n OPEN: onlyPopup(closed.on?.OPEN),\n TOGGLE: onlyPopup(closed.on?.TOGGLE),\n \"CONTROLLED.OPEN\": onlyPopup(closed.on?.[\"CONTROLLED.OPEN\"]),\n } },\n },\n on: {\n \"SELECTION.MOUNT\": { actions: [\"selectionInput\"] }, \"SELECTION.UNMOUNT\": { actions: [\"selectionInput\"] },\n \"SELECTION.INPUT\": { actions: [\"selectionInput\"] }, \"SELECTION.SELECT\": { actions: [\"selectionInput\"] },\n \"SELECTION.MOVE\": { actions: [\"selectionInput\"] }, \"SELECTION.FOCUS\": { actions: [\"selectionInput\"] },\n \"SELECTION.CONFIRM\": { actions: [\"selectionInput\"] }, \"SELECTION.CANCEL\": { actions: [\"selectionInput\"] },\n },\n implementations: {\n guards: { isOpenControlled: (params) => popupMachine.implementations!.guards!.isOpenControlled(popupParams(params)) },\n effects: {\n selectionLifetime(params) {\n const model = params.refs.get(\"selectionModel\");\n const transport = params.refs.get(\"selectionTransport\");\n const releaseClose = onModalBeforeClose(params, () => {\n if (model.snapshot.active && !transport.closeIntent) { model.cancel(false); transport.closeIntent = true; }\n });\n let userRevision = model.snapshot.userRevision;\n const unobserve = model.observe((snapshot) => {\n if (snapshot.userRevision !== userRevision) transport.closeIntent = false;\n userRevision = snapshot.userRevision;\n params.context.set(\"selectionSnapshot\", snapshot); params.context.set(\"preview\", snapshot.preview);\n params.context.set(\"surfaceTokens\", snapshot.tokens);\n });\n transport.notice = (event) => {\n // Model publishes context before a caller can synchronously replace columns.\n const session = transport.session;\n params.prop(\"onSelectionNotice\")?.(event);\n if (event.type === \"close\" && model.snapshot.active && session === transport.session) {\n transport.closeIntent = true;\n const target = popupParams(params);\n modalRequestSend({ ...target, send: event => params.send({ ...event, type: \"SELECTION.CLOSE\", session }) })({ type: \"CLOSE\" });\n }\n };\n return () => { releaseClose(); selectionPending.delete(model); transport.session++; transport.notice = undefined; model.stop(); unobserve(); };\n },\n trackDismissableElement: (params) => disposed(params) ? undefined : popupMachine.implementations!.effects!.trackDismissableElement(popupParams(params)),\n trapFocus: (params) => disposed(params) ? undefined : popupMachine.implementations!.effects!.trapFocus(popupParams(params)),\n preventScroll: (params) => disposed(params) ? undefined : popupMachine.implementations!.effects!.preventScroll(popupParams(params)),\n hideContentBelow: (params) => disposed(params) ? undefined : popupMachine.implementations!.effects!.hideContentBelow(popupParams(params)),\n },\n actions: {\n checkRenderedElements: (params) => disposed(params) ? undefined : popupMachine.implementations!.actions!.checkRenderedElements(popupParams(params)),\n setInitialFocus: (params) => disposed(params) ? undefined : popupMachine.implementations!.actions!.setInitialFocus(popupParams(params)),\n invokeOnClose(params) {\n const model = params.refs.get(\"selectionModel\"); const transport = params.refs.get(\"selectionTransport\");\n if (model.snapshot.active && !transport.closeIntent) { model.cancel(false); transport.closeIntent = true; }\n if (!model.isDisposed) popupMachine.implementations!.actions!.invokeOnClose(popupParams(params));\n },\n invokeOnOpen: (params) => disposed(params) ? undefined : popupMachine.implementations!.actions!.invokeOnOpen(popupParams(params)),\n toggleVisibility: (params) => disposed(params) ? undefined : popupMachine.implementations!.actions!.toggleVisibility(popupParams(params)),\n setTriggerValue: (params) => {\n if (disposed(params)) return;\n popupEvent(params.event);\n popupMachine.implementations!.actions!.setTriggerValue(popupParams(params));\n },\n selectionInput(params) {\n const ticket = (params.event as SelectionEnvelope)[selectionTicket];\n if (ticket) {\n if (ticket.processed) return;\n ticket.processed = true;\n const pending = selectionPending.get(params.refs.get(\"selectionModel\"));\n if (pending) pending.splice(pending.indexOf(ticket), 1);\n }\n requestPickerSelection(params);\n },\n },\n },\n};\n\n/** Project the one service for the upstream Popup connector; never instantiate another. */\nexport function toPopupService(service: Service<QwPickerSchema>): Service<PopupSchema> {\n return {\n ...service,\n context: popupContext(service.context),\n prop: (key) => service.prop(key),\n refs: noRefs,\n computed: (key) => service.computed(key),\n send: (event) => service.send(event),\n event: popupMetadata(service.event),\n };\n}\n\n\nfunction requestPickerSelection({ event, refs }: { event: QwPickerSchema[\"event\"]; refs: QwPickerService[\"refs\"] }): void {\n const model = refs.get(\"selectionModel\");\n if (event.type === \"SELECTION.UNMOUNT\") { model.detach(event.token); return; }\n if (!model.snapshot.active) return;\n // attach() publishes the complete token list through the observer; no stale context merge.\n if (event.type === \"SELECTION.MOUNT\") model.attach(event.columnIndex);\n else if (event.type === \"SELECTION.INPUT\") model.dispatch(event.token, event.signal);\n else if (event.type === \"SELECTION.SELECT\") model.select(event.columnIndex, event.optionIndex);\n else if (event.type === \"SELECTION.MOVE\") model.move(event.columnIndex, event.move);\n else if (event.type === \"SELECTION.FOCUS\") model.focus(event.columnIndex);\n else if (event.type === \"SELECTION.CONFIRM\") model.confirm();\n else if (event.type === \"SELECTION.CANCEL\") model.cancel();\n}\n\n\ntype SelectionEvent = QwPickerSchema[\"event\"];\ntype SelectionTicket = { event: SelectionEvent; processed: boolean };\nconst selectionTicket = Symbol(\"qw-picker-input\");\ntype SelectionEnvelope = SelectionEvent & { [selectionTicket]?: SelectionTicket };\nconst selectionPending = new WeakMap<PickerSelectionModel, SelectionTicket[]>();\n\n/** Keep input ordering when the machine scheduler has not consumed an earlier selection yet. */\nexport function sendPickerSelection(service: QwPickerService, event: SelectionEvent): void {\n if (service.getStatus() === MachineStatus.Stopped || service.refs.get(\"selectionModel\").isDisposed) return;\n if (service.getStatus() === MachineStatus.NotStarted) { service.send(event); return; }\n if (service.refs.get(\"mode\") === \"inline\") { service.send(event); return; }\n if (event.type === \"SELECTION.CONFIRM\" || event.type === \"SELECTION.CANCEL\") {\n const pending = selectionPending.get(service.refs.get(\"selectionModel\"));\n if (pending) {\n while (pending.length) {\n const ticket = pending.shift()!;\n if (ticket.processed) continue;\n ticket.processed = true;\n requestPickerSelection({ refs: service.refs, event: ticket.event });\n }\n }\n requestPickerSelection({ refs: service.refs, event });\n return;\n }\n const ticket: SelectionTicket = { event, processed: false };\n let pending = selectionPending.get(service.refs.get(\"selectionModel\"));\n if (!pending) { pending = []; selectionPending.set(service.refs.get(\"selectionModel\"), pending); }\n pending.push(ticket);\n const envelope = { ...event, [selectionTicket]: ticket };\n service.send(envelope);\n}\n","import { connectPopup, type QwPopupProps } from \"../popup/popup.js\";\nimport type { ModalRenderRuntime } from \"../modal-render-runtime.js\";\nimport { toPopupService, sendPickerSelection, type QwPickerService } from \"./picker-machine.js\";\nimport type { PickerColumnSignal, PickerColumnToken, PickerKeyboardMove } from \"./selection-model.js\";\n\n/**\n * 机械连接层(包内):同一 service 投影给原 Popup connector,选择输入保留 typed 队列;confirm/cancel 同步排空先前输入再请求关闭。\n * 原生 IO 只运输捕获的票据与原始信号。connectPicker 在其上增加 ARIA/工具栏 getters。\n */\nexport function connectSelection(service: QwPickerService, normalize: Parameters<typeof connectPopup>[1], popupProps: QwPopupProps, runtime?: ModalRenderRuntime) {\n const model = service.refs.get(\"selectionModel\");\n return {\n popup: connectPopup(toPopupService(service), normalize, popupProps, runtime),\n // Reactive projection once the lifetime effect runs; the model itself before start (SSR/first render).\n snapshot: service.context.get(\"selectionSnapshot\") ?? model.snapshot,\n mountColumn(columnIndex: number) { sendPickerSelection(service, { type: \"SELECTION.MOUNT\", columnIndex }); },\n // Fresh from the model: framework context may lag one render behind (React state).\n getColumnToken(columnIndex: number): PickerColumnToken | undefined { return model.snapshot.tokens[columnIndex]; },\n unmountColumn(token: PickerColumnToken) { sendPickerSelection(service, { type: \"SELECTION.UNMOUNT\", token }); },\n input(token: PickerColumnToken, signal: PickerColumnSignal) { sendPickerSelection(service, { type: \"SELECTION.INPUT\", token, signal }); },\n select(columnIndex: number, optionIndex: number) { sendPickerSelection(service, { type: \"SELECTION.SELECT\", columnIndex, optionIndex }); },\n move(columnIndex: number, move: PickerKeyboardMove) { sendPickerSelection(service, { type: \"SELECTION.MOVE\", columnIndex, move }); },\n focusColumn(columnIndex: number) { sendPickerSelection(service, { type: \"SELECTION.FOCUS\", columnIndex }); },\n confirm() { sendPickerSelection(service, { type: \"SELECTION.CONFIRM\" }); },\n cancel() { sendPickerSelection(service, { type: \"SELECTION.CANCEL\" }); },\n };\n}\n","import type { ModalRenderRuntime } from \"../modal-render-runtime.js\";\nimport { connectPopup, createPopupProps, type QwPopupProps } from \"../popup/popup.js\";\nimport type { QwPickerSchema, QwPickerService } from \"./picker-machine.js\";\nimport { connectSelection } from \"./selection-connect.js\";\nimport {\n getPickerDiagnostics,\n getPickerOptionIndex,\n isPickerOptionSelectable,\n type PickerChangeDetails,\n type PickerColumn,\n type PickerColumnSignal,\n type PickerColumnToken,\n type PickerDiagnostic,\n type PickerKeyboardMove,\n type PickerMode,\n type PickerScrollCommand,\n type PickerSelectionSnapshot,\n type PickerValue,\n} from \"./selection-model.js\";\n\n/**\n * Picker 公开 Core 面:props 归一化、模态 runtime 透传与 getters。\n * 物理层是同一个 pickerMachine service(见 picker-machine.ts):工具栏形态复用 Popup 的\n * 遮罩/焦点/滚动锁/portal/票据;内嵌形态不进入打开态,不使用 runtime。\n */\n\n/** Picker 输入。继承 Popup 同义 props;固定底部,不接受 placement。 */\nexport interface QwPickerProps extends Omit<QwPopupProps, \"placement\"> {\n /** 缺省 \"popup\"(带确定/取消工具栏)。只在构造时读取;切换形态须重新挂载。 */\n mode?: PickerMode;\n /** 按逻辑顺序的列。联动列由调用方在 onPreviewChange 中同步替换。 */\n columns: readonly PickerColumn[];\n /** 受控已提交值。传入即受控,组件只发出变更请求。 */\n value?: PickerValue;\n /** 非受控初值;缺省为各列第一可选项。 */\n defaultValue?: PickerValue;\n /** 确定按钮文字,缺省「确定」。 */\n confirmLabel?: string;\n /** 取消按钮文字,缺省「取消」。 */\n cancelLabel?: string;\n /** 工具栏确定(等待落定后)或内嵌落定时通知一次。 */\n onValueChange?: (details: PickerChangeDetails) => void;\n /** 预览变化时通知;取消/关闭离开时通知一次恢复后的预览。 */\n onPreviewChange?: (details: PickerChangeDetails) => void;\n}\n\n/** createPickerProps 的输出:同一 Popup machine 的 context + 选择会话输入(只供 Core 读取)。 */\nexport type QwPickerMachineProps = Partial<QwPickerSchema[\"props\"]>;\n\n/** Core 派生的渲染数据。适配层只渲染,不判断 disabled/duplicate/selected。 */\nexport interface QwResolvedPickerOption {\n readonly index: number;\n readonly value: string;\n readonly label: string;\n /** 禁用或重复值后项:可见、不可落定。 */\n readonly disabled: boolean;\n readonly duplicate: boolean;\n readonly selected: boolean;\n}\nexport interface QwResolvedPickerColumn {\n readonly index: number;\n /** 可访问列名:column.label → 「第 N 列」。 */\n readonly label: string;\n readonly options: readonly QwResolvedPickerOption[];\n /** 当前预览项索引;无效时 -1(不伪造选中)。 */\n readonly selectedIndex: number;\n /** 没有任何可选项。 */\n readonly empty: boolean;\n}\n\ntype PickerNormalize = Parameters<typeof connectPopup>[1];\ntype NormalizedProps = ReturnType<PickerNormalize[\"element\"]>;\ntype PopupApi = ReturnType<typeof connectPopup>;\n\nexport type QwPickerApi = PopupApi & {\n readonly mode: PickerMode;\n readonly columns: readonly QwResolvedPickerColumn[];\n /** 已提交值(受控时即调用方值)。 */\n readonly value: PickerValue;\n /** 滚轮当前预览。 */\n readonly preview: PickerValue;\n /** 所有列都有有效项且外部值有效。为 false 时确定不可用。 */\n readonly valid: boolean;\n /** 已按确定,正在等待滚动落定。 */\n readonly pendingConfirm: boolean;\n /** 选择会话是否接收输入(工具栏打开时,或内嵌)。 */\n readonly active: boolean;\n /** roving tabindex 的逻辑列。 */\n readonly focusedColumn: number;\n readonly selectedIndices: readonly number[];\n /** 待桥执行的 scrollTo 请求。 */\n readonly commands: readonly PickerScrollCommand[];\n readonly diagnostics: readonly PickerDiagnostic[];\n readonly accessibleName: string;\n readonly confirmLabel: string;\n readonly cancelLabel: string;\n confirm(): void;\n cancel(): void;\n selectOption(columnIndex: number, optionIndex: number): void;\n moveColumn(columnIndex: number, move: PickerKeyboardMove): void;\n /** 机械桥:真实列节点挂载后调用;票据随 getColumnToken 发布。 */\n mountColumn(columnIndex: number): void;\n getColumnToken(columnIndex: number): PickerColumnToken | undefined;\n unmountColumn(token: PickerColumnToken): void;\n input(token: PickerColumnToken, signal: PickerColumnSignal): void;\n getRootProps(): NormalizedProps;\n getColumnsProps(): NormalizedProps;\n getColumnProps(details: { index: number }): NormalizedProps;\n getOptionProps(details: { columnIndex: number; index: number }): NormalizedProps;\n getIndicatorProps(): NormalizedProps;\n getToolbarProps(): NormalizedProps;\n getCancelProps(): NormalizedProps;\n getConfirmProps(): NormalizedProps;\n};\n\nconst FALLBACK_NAME = \"选择器\";\nconst CONFIRM_LABEL = \"确定\";\nconst CANCEL_LABEL = \"取消\";\nconst text = (value: string | undefined): string | undefined => {\n const normalized = typeof value === \"string\" ? value.trim() : undefined;\n return normalized ? normalized : undefined;\n};\n\n/** 未知 mode 回退 popup。 */\nexport function resolvePickerMode(mode: unknown): PickerMode {\n return mode === \"inline\" ? \"inline\" : \"popup\";\n}\n/** 可访问名称:title → ariaLabel → 「选择器」。空白视为缺省。 */\nexport function getPickerAccessibleName(props: Pick<QwPickerProps, \"title\" | \"ariaLabel\">): string {\n return text(props.title) ?? text(props.ariaLabel) ?? FALLBACK_NAME;\n}\n/** 业务值只接受 string/null 数组。 */\nexport function isPickerValue(value: unknown): value is PickerValue {\n return Array.isArray(value) && value.every(item => item === null || typeof item === \"string\");\n}\n/** 列结构校验:label 可选字符串,options 的 value/label 为字符串,disabled 可选布尔。 */\nexport function isPickerColumns(value: unknown): value is readonly PickerColumn[] {\n return Array.isArray(value) && value.every((column: unknown) => {\n if (typeof column !== \"object\" || column === null) return false;\n const { label, options } = column as { label?: unknown; options?: unknown };\n return (label === undefined || typeof label === \"string\") && Array.isArray(options) && options.every((option: unknown) => {\n if (typeof option !== \"object\" || option === null) return false;\n const entry = option as { value?: unknown; label?: unknown; disabled?: unknown };\n return typeof entry.value === \"string\" && typeof entry.label === \"string\" && (entry.disabled === undefined || typeof entry.disabled === \"boolean\");\n });\n });\n}\n/** 渲染数据:保留全部可见项,标出禁用/重复后项与当前预览项。 */\nexport function resolvePickerColumns(columns: readonly PickerColumn[], preview: PickerValue = []): readonly QwResolvedPickerColumn[] {\n return columns.map((column, index) => {\n const selectedIndex = getPickerOptionIndex(column, preview[index] ?? null);\n const options = column.options.map((option, optionIndex) => {\n const duplicate = column.options.findIndex(item => item.value === option.value) !== optionIndex;\n return { index: optionIndex, value: option.value, label: option.label, duplicate, disabled: !isPickerOptionSelectable(column, optionIndex), selected: optionIndex === selectedIndex };\n });\n return { index, label: text(column.label) ?? `第 ${index + 1} 列`, options, selectedIndex, empty: options.every(option => option.disabled) };\n });\n}\n/** Popup 的 data 属性(placement 固定 bottom)。 */\nexport function getPickerDataAttrs(props: Pick<QwPickerProps, \"safeArea\">): Record<string, string | undefined> {\n return { \"data-placement\": \"bottom\", \"data-safe-area\": props.safeArea === false ? undefined : \"\" };\n}\n\nfunction toPopupProps(props: QwPickerProps, mode: PickerMode): QwPopupProps {\n const { mode: _mode, columns: _columns, value: _value, defaultValue: _defaultValue, confirmLabel: _confirm, cancelLabel: _cancel, onValueChange: _onValue, onPreviewChange: _onPreview, ...rest } = props;\n void _mode; void _columns; void _value; void _defaultValue; void _confirm; void _cancel; void _onValue; void _onPreview;\n const popup: QwPopupProps = { ...rest, placement: \"bottom\" };\n // Inline never opens: no initial request, no rejection notice, no registry entry.\n if (mode === \"inline\") { delete popup.open; popup.defaultOpen = false; }\n // 有标题时 Zag 写 aria-labelledby;无标题时名称回退「选择器」而非 Popup 的「弹出层」。\n if (!text(props.title)) popup.ariaLabel = getPickerAccessibleName(props);\n return popup;\n}\n/** 只接受 popup 物理票据;有限 owner 只能缺省(React/Vue)或 \"wc:picker\"(qw-picker 宿主)。 */\nfunction pickerRuntime(mode: PickerMode, runtime: ModalRenderRuntime | undefined): ModalRenderRuntime | undefined {\n if (mode === \"inline\" || !runtime) return undefined;\n const { kind, owner } = runtime.ticket;\n if (kind !== \"popup\" || (owner !== undefined && owner !== \"wc:picker\")) throw new TypeError(\"Picker requires a popup modal ticket owned by wc:picker or unowned\");\n return runtime;\n}\n\n/**\n * 公开 props → 同一 pickerMachine 的 props。机械委托 createPopupProps(props, runtime):\n * 受控优先、初态许可/拒绝仍由 Popup Core 决定;runtime 只在工具栏形态透传(WC 带 owner \"wc:picker\")。\n */\nexport function createPickerProps(props: QwPickerProps, runtime?: ModalRenderRuntime): QwPickerMachineProps {\n const columns = props.columns ?? [];\n if (!isPickerColumns(columns)) throw new TypeError(\"Picker columns must be an array of { label?, options: { value, label, disabled? }[] }\");\n if (props.value !== undefined && !isPickerValue(props.value)) throw new TypeError(\"Picker value must be an array of string | null\");\n if (props.defaultValue !== undefined && !isPickerValue(props.defaultValue)) throw new TypeError(\"Picker defaultValue must be an array of string | null\");\n const mode = resolvePickerMode(props.mode);\n return {\n ...createPopupProps(toPopupProps(props, mode), pickerRuntime(mode, runtime)),\n mode,\n selection: { columns, value: props.value, defaultValue: props.defaultValue },\n onSelectionNotice(notice) {\n if (notice.type === \"preview\") props.onPreviewChange?.({ value: notice.value });\n else if (notice.type === \"value\") props.onValueChange?.({ value: notice.value });\n },\n };\n}\n\ntype KeyEvent = { key: string; defaultPrevented?: boolean; altKey?: boolean; ctrlKey?: boolean; metaKey?: boolean; isComposing?: boolean; preventDefault(): void; currentTarget?: EventTarget | null };\nconst VERTICAL: Record<string, PickerKeyboardMove> = { ArrowDown: \"next\", ArrowUp: \"previous\", Home: \"first\", End: \"last\", PageDown: \"page-next\", PageUp: \"page-previous\" };\ntype Lookup = { closest?(selector: string): Lookup | null; getAttribute?(name: string): string | null; querySelector?(selector: string): Lookup | null; focus?(options?: { preventScroll?: boolean }): void };\n\n/** 物理方向只取渲染树上最近的 dir;逻辑列序不变。 */\nfunction isRtl(target: EventTarget | null | undefined): boolean {\n const node = target as Lookup | null | undefined;\n return node?.closest?.(\"[dir]\")?.getAttribute?.(\"dir\")?.toLowerCase() === \"rtl\";\n}\nfunction focusSibling(target: EventTarget | null | undefined, index: number): void {\n const node = target as Lookup | null | undefined;\n node?.closest?.('[data-scope=\"picker\"][data-part=\"columns\"]')?.querySelector?.(`[data-scope=\"picker\"][data-part=\"column\"][data-index=\"${index}\"]`)?.focus?.({ preventScroll: true });\n}\n\n/**\n * 包装同一 service 的 connectPopup:继承开合/getters 与单层模态拒绝,增加滚轮 root/column/option、\n * 工具栏 cancel/confirm getters。确定/取消/键盘/点击都只发 typed 事件,由 selection-model 决定结果。\n */\nexport function connectPicker(service: QwPickerService, normalize: PickerNormalize, props: QwPickerProps, runtime?: ModalRenderRuntime): QwPickerApi {\n const mode = service.refs.get(\"mode\");\n const selection = connectSelection(service, normalize, toPopupProps(props, mode), pickerRuntime(mode, runtime));\n const snapshot: PickerSelectionSnapshot = selection.snapshot;\n const sourceColumns = service.prop(\"selection\")?.columns ?? [];\n const columns = resolvePickerColumns(sourceColumns, snapshot.preview);\n const base = `picker:${service.scope.id ?? \"\"}`;\n const columnId = (index: number) => `${base}:column:${index}`;\n const optionId = (column: number, option: number) => `${base}:column:${column}:option:${option}`;\n const accessibleName = getPickerAccessibleName(props);\n const inline = mode === \"inline\";\n const part = (name: string) => ({ \"data-scope\": \"picker\", \"data-part\": name });\n\n return {\n ...selection.popup,\n mode,\n columns,\n value: snapshot.committed,\n preview: snapshot.preview,\n valid: snapshot.valid,\n pendingConfirm: snapshot.pendingConfirm,\n active: snapshot.active,\n focusedColumn: snapshot.focusedColumn,\n selectedIndices: snapshot.selectedIndices,\n commands: snapshot.commands,\n diagnostics: getPickerDiagnostics(sourceColumns),\n accessibleName,\n confirmLabel: text(props.confirmLabel) ?? CONFIRM_LABEL,\n cancelLabel: text(props.cancelLabel) ?? CANCEL_LABEL,\n confirm: selection.confirm,\n cancel: selection.cancel,\n selectOption: selection.select,\n moveColumn: selection.move,\n mountColumn: selection.mountColumn,\n getColumnToken: selection.getColumnToken,\n unmountColumn: selection.unmountColumn,\n input: selection.input,\n getRootProps: () => normalize.element({\n ...part(\"root\"),\n id: `${base}:root`,\n \"data-visual-target\": inline ? \"picker-inline\" : \"picker-wheel\",\n \"data-mode\": mode,\n \"data-valid\": snapshot.valid ? \"\" : undefined,\n \"data-pending\": snapshot.pendingConfirm ? \"\" : undefined,\n role: inline ? \"group\" : undefined,\n \"aria-label\": inline ? accessibleName : undefined,\n }),\n getColumnsProps: () => normalize.element({ ...part(\"columns\"), \"data-count\": columns.length, \"data-empty\": columns.length === 0 ? \"\" : undefined }),\n getColumnProps({ index }) {\n const column = columns[index];\n const selected = column?.selectedIndex ?? -1;\n return normalize.element({\n ...part(\"column\"),\n \"data-visual-target\": \"picker-column\",\n \"data-index\": index,\n id: columnId(index),\n role: \"listbox\",\n \"aria-orientation\": \"vertical\",\n \"aria-label\": column?.label ?? `第 ${index + 1} 列`,\n \"aria-activedescendant\": selected >= 0 ? optionId(index, selected) : undefined,\n \"aria-disabled\": !column || column.empty ? true : undefined,\n \"data-empty\": !column || column.empty ? \"\" : undefined,\n \"data-invalid\": selected < 0 ? \"\" : undefined,\n \"data-focused\": snapshot.focusedColumn === index ? \"\" : undefined,\n tabIndex: snapshot.focusedColumn === index ? 0 : -1,\n onFocus() { if (snapshot.focusedColumn !== index) selection.focusColumn(index); },\n onKeyDown(event: KeyEvent) {\n if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey || event.isComposing) return;\n const move = VERTICAL[event.key];\n if (move) { event.preventDefault(); selection.move(index, move); return; }\n if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\n event.preventDefault();\n const forward = (event.key === \"ArrowRight\") !== isRtl(event.currentTarget);\n const next = Math.max(0, Math.min(columns.length - 1, index + (forward ? 1 : -1)));\n if (next === index) return;\n selection.focusColumn(next);\n focusSibling(event.currentTarget, next);\n },\n });\n },\n getOptionProps({ columnIndex, index }) {\n const option = columns[columnIndex]?.options[index];\n if (!option) return normalize.element({ ...part(\"option\"), role: \"option\", \"aria-selected\": false, \"aria-disabled\": true, \"data-disabled\": \"\" });\n return normalize.element({\n ...part(\"option\"),\n \"data-visual-target\": \"picker-option\",\n \"data-index\": index,\n \"data-value\": option.value,\n id: optionId(columnIndex, index),\n role: \"option\",\n \"aria-selected\": option.selected,\n \"aria-disabled\": option.disabled ? true : undefined,\n \"data-selected\": option.selected ? \"\" : undefined,\n \"data-disabled\": option.disabled ? \"\" : undefined,\n \"data-duplicate\": option.duplicate ? \"\" : undefined,\n onClick() { if (!option.disabled) selection.select(columnIndex, index); },\n });\n },\n getIndicatorProps: () => normalize.element({ ...part(\"indicator\"), \"aria-hidden\": true }),\n getToolbarProps: () => normalize.element({ ...part(\"toolbar\"), \"data-visual-target\": \"picker-toolbar\" }),\n getCancelProps: () => normalize.element({ ...part(\"cancel\"), \"data-visual-target\": \"picker-cancel\", id: `${base}:cancel`, type: \"button\", onClick: () => selection.cancel() }),\n getConfirmProps: () => normalize.element({\n ...part(\"confirm\"),\n \"data-visual-target\": \"picker-confirm\",\n id: `${base}:confirm`,\n type: \"button\",\n disabled: !snapshot.valid,\n \"data-pending\": snapshot.pendingConfirm ? \"\" : undefined,\n onClick: () => selection.confirm(),\n }),\n };\n}\n","import type { PickerColumnSignal, PickerColumnToken, PickerGeometry, PickerScrollCommand } from \"./selection-model.js\";\n\n/**\n * Picker 列的平台装配:监听、测量、执行 Core 的 scrollTo 与回 ACK。\n * 只运输原始数值与 Core 票据 —— 不排序、不回退、不选值、不判断确定(那些只在 selection-model)。\n * 各栈适配层只保留生命周期胶水:挂载后 connectPickerColumn(...),每次渲染后 sync(),卸载时 dispose()。\n * 模块顶层不访问 DOM;所有 DOM 读取都在调用时发生(SSR-safe)。\n *\n * attachPickerColumn 迁移自 specs/054-mobile-picker/spike/column-surface.ts(T039 证据)。\n */\n\n/** 原始事件事实,仅作运输元数据。 */\nexport type PickerRawEventFacts = { type: string; timeStamp: number; isTrusted: boolean; clientX?: number; clientY?: number; pointerId?: number; pointerType?: string; deltaX?: number; deltaY?: number; deltaMode?: number };\nexport type PickerBridgeNotice =\n | { type: \"SURFACE.MOUNTED\" | \"SURFACE.DETACHED\"; token: PickerColumnToken }\n | { type: \"INPUT\"; token: PickerColumnToken; signal: PickerColumnSignal; event?: PickerRawEventFacts; sampledAt?: number }\n | { type: \"RAW.POINTER.MOVE\"; token: PickerColumnToken; event: PickerRawEventFacts }\n | { type: \"COMMAND.FAILED\"; token: PickerColumnToken; commandId: number; reason: \"unbound\" | \"exception\" };\nexport type PickerBridgeCommand = { type: \"SCROLL_TO\"; command: PickerScrollCommand } | { type: \"MEASURE\"; token: PickerColumnToken } | { type: \"FOCUS_COLUMN\"; token: PickerColumnToken };\nexport interface PickerColumnBinding { execute(command: PickerBridgeCommand): boolean; release(): void }\nexport interface PickerColumnSurface { readonly binding: PickerColumnBinding; bind(token: PickerColumnToken, rows: readonly HTMLElement[]): PickerColumnBinding; dispose(): void }\n\ninterface OwnedBinding extends PickerColumnBinding { measureOwned(): PickerGeometry | undefined; rollback(): void }\nconst sameToken = (a: PickerColumnToken, b: PickerColumnToken) => a.serviceId === b.serviceId && a.epoch === b.epoch && a.columnIndex === b.columnIndex && a.generation === b.generation && a.mountEpoch === b.mountEpoch;\nconst sameMount = (a: PickerColumnToken, b: PickerColumnToken) => a.serviceId === b.serviceId && a.columnIndex === b.columnIndex && a.mountEpoch === b.mountEpoch;\n\n/** Private mechanical resources only. Option/settlement/selection policy remains in Core. */\nfunction createBinding(viewport: HTMLElement, token: PickerColumnToken, rows: readonly HTMLElement[], sink: (notice: PickerBridgeNotice) => void, physical: { active(): boolean; measureCurrent(): PickerGeometry | undefined }): OwnedBinding {\n const view = viewport.ownerDocument.defaultView;\n if (!view) throw new Error(\"Column requires its owner window\");\n const captured = { ...token };\n let bound = true;\n let lastCommandId: number | undefined;\n const resources: (() => void)[] = [];\n const releaseResources = () => {\n if (!bound) return [];\n bound = false;\n const errors: unknown[] = [];\n for (const release of resources.splice(0).reverse()) { try { release(); } catch (error) { errors.push(error); } }\n return errors;\n };\n const emitRaw = (notice: PickerBridgeNotice) => { if (physical.active()) sink(notice); };\n const measure = (): PickerGeometry => {\n const box = viewport.getBoundingClientRect();\n return { viewportHeight: viewport.clientHeight, scrollTop: viewport.scrollTop, scrollHeight: viewport.scrollHeight,\n rows: rows.map(row => { const rect = row.getBoundingClientRect(); return { top: rect.top - box.top - viewport.clientTop + viewport.scrollTop, height: rect.height }; }) };\n };\n const measureOwned = () => bound && physical.active() ? measure() : undefined;\n const measured = () => { const geometry = measureOwned(); if (geometry) emitRaw({ type: \"INPUT\", token: captured, signal: { type: \"MEASURE\", geometry }, sampledAt: view.performance.now() }); };\n const facts = (event: Event): PickerRawEventFacts => ({ type: event.type, timeStamp: event.timeStamp, isTrusted: event.isTrusted });\n const pointer = (event: PointerEvent) => ({ ...facts(event), pointerId: event.pointerId, pointerType: event.pointerType, clientX: event.clientX, clientY: event.clientY });\n const listeners: [string, EventListener][] = [\n [\"scroll\", event => emitRaw({ type: \"INPUT\", token: captured, signal: { type: \"SCROLL\", scrollTop: viewport.scrollTop, ...(lastCommandId === undefined ? {} : { lastCommandId }) }, event: facts(event) })],\n [\"wheel\", event => { const e = event as WheelEvent; emitRaw({ type: \"INPUT\", token: captured, signal: { type: \"WHEEL\", deltaY: e.deltaY }, event: { ...facts(e), deltaX: e.deltaX, deltaY: e.deltaY, deltaMode: e.deltaMode } }); }],\n ...([\"pointerdown\", \"pointerup\", \"pointercancel\"] as const).map(type => [type, ((event: Event) => {\n const e = event as PointerEvent; emitRaw({ type: \"INPUT\", token: captured, signal: { type: type === \"pointerdown\" ? \"POINTER.START\" : type === \"pointerup\" ? \"POINTER.END\" : \"POINTER.CANCEL\", pointerId: e.pointerId }, event: pointer(e) });\n })] satisfies [string, EventListener]),\n [\"pointermove\", event => emitRaw({ type: \"RAW.POINTER.MOVE\", token: captured, event: pointer(event as PointerEvent) })],\n ];\n try {\n for (const [type, listener] of listeners) { resources.push(() => viewport.removeEventListener(type, listener)); viewport.addEventListener(type, listener, { passive: true }); }\n if (typeof view.ResizeObserver === \"function\") { const resize = new view.ResizeObserver(measured); resources.push(() => resize.disconnect()); resize.observe(viewport); for (const row of rows) resize.observe(row); }\n if (typeof view.IntersectionObserver === \"function\") { const intersect = new view.IntersectionObserver(measured); resources.push(() => intersect.disconnect()); intersect.observe(viewport); }\n const fonts = viewport.ownerDocument.fonts;\n if (fonts) { resources.push(() => fonts.removeEventListener(\"loadingdone\", measured)); fonts.addEventListener(\"loadingdone\", measured); if (fonts.ready) void fonts.ready.then(measured); }\n } catch (error) { releaseResources(); throw error; }\n return {\n measureOwned,\n rollback() { releaseResources(); },\n release() { const errors = releaseResources(); if (errors.length) throw errors[0]; },\n execute(request: PickerBridgeCommand) {\n const input = request.type === \"SCROLL_TO\" ? request.command.token : request.token;\n if (!bound || !physical.active() || !sameToken(captured, input)) {\n if (request.type === \"SCROLL_TO\") emitRaw({ type: \"COMMAND.FAILED\", token: input, commandId: request.command.commandId, reason: \"unbound\" });\n return false;\n }\n if (request.type === \"MEASURE\") { measured(); return true; }\n if (request.type === \"FOCUS_COLUMN\") { viewport.focus({ preventScroll: true }); return true; }\n const command = request.command;\n if (command.commandId === lastCommandId) return true;\n const previous = lastCommandId;\n lastCommandId = command.commandId;\n let geometry: PickerGeometry | undefined;\n try { viewport.scrollTo({ top: command.offset, behavior: command.behavior }); geometry = physical.measureCurrent(); }\n catch {\n if (lastCommandId === command.commandId) lastCommandId = previous;\n emitRaw({ type: \"COMMAND.FAILED\", token: captured, commandId: command.commandId, reason: \"exception\" }); return false;\n }\n if (!geometry) { emitRaw({ type: \"COMMAND.FAILED\", token: captured, commandId: command.commandId, reason: \"unbound\" }); return false; }\n // Transport callback exceptions stay exceptions, not fake native execution failures.\n emitRaw({ type: \"INPUT\", token: captured, signal: { type: \"COMMAND.APPLIED\", commandId: command.commandId, geometry }, sampledAt: view.performance.now() });\n return true;\n },\n };\n}\n\n/**\n * 一个物理列挂载:先按 Core 票据校验物理归属,再替换可换的输入绑定。\n * 票据刷新(epoch/generation)只换 binding;真实卸载才 dispose 并送 SURFACE.DETACHED。\n */\nexport function attachPickerColumn(viewport: HTMLElement, initial: PickerColumnToken, rows: readonly HTMLElement[], sink: (notice: PickerBridgeNotice) => void): PickerColumnSurface {\n const physicalOwner = { ...initial };\n let active = true;\n let current: OwnedBinding | undefined;\n const physical = { active: () => active, measureCurrent: () => current?.measureOwned() };\n const first = createBinding(viewport, initial, rows, sink, physical);\n current = first;\n try { sink({ type: \"SURFACE.MOUNTED\", token: physicalOwner }); first.execute({ type: \"MEASURE\", token: initial }); }\n catch (error) { active = false; first.rollback(); throw error; }\n return {\n get binding() { if (!current) throw new Error(\"No physical binding\"); return current; },\n bind(token, nextRows) {\n if (!sameMount(physicalOwner, token)) throw new Error(\"Binding does not belong to this physical mount\");\n if (!active) throw new Error(\"Cannot bind a detached physical surface\");\n const previous = current;\n previous?.release();\n let own: OwnedBinding | undefined;\n try {\n own = createBinding(viewport, token, nextRows, sink, physical); current = own;\n own.execute({ type: \"MEASURE\", token }); return own;\n } catch (error) { own?.rollback(); if (own && current === own) current = previous; throw error; }\n },\n dispose() {\n if (!active) return;\n active = false;\n const errors: unknown[] = [];\n try { current?.release(); } catch (error) { errors.push(error); }\n try { sink({ type: \"SURFACE.DETACHED\", token: physicalOwner }); } catch (error) { errors.push(error); }\n if (errors.length) throw errors[0];\n },\n };\n}\n\n/** connectPicker 的 api 满足这个宿主接口;桥只调用这些运输方法。 */\nexport interface PickerColumnHost {\n readonly commands: readonly PickerScrollCommand[];\n mountColumn(columnIndex: number): void;\n getColumnToken(columnIndex: number): PickerColumnToken | undefined;\n unmountColumn(token: PickerColumnToken): void;\n input(token: PickerColumnToken, signal: PickerColumnSignal): void;\n}\nexport interface PickerColumnController {\n /** 每次渲染/更新后调用:请求挂载、按新票据换绑定、执行属于当前绑定的 scroll 命令。 */\n sync(): void;\n /** 真实卸载时调用一次:释放监听与观察器,并送 SURFACE.DETACHED。 */\n dispose(): void;\n}\n\n/**\n * 三栈共用的列生命周期胶水。getHost 每次返回最新 api(React/Vue/WC 每次渲染都会 connect 一次)。\n * Core 未签发票据(工具栏关闭、会话失效)时保持物理挂载但不输入;票据回来后只换绑定。\n */\nexport function connectPickerColumn(getHost: () => PickerColumnHost, viewport: HTMLElement, columnIndex: number, getRows: () => readonly HTMLElement[]): PickerColumnController {\n let surface: PickerColumnSurface | undefined;\n let owner: PickerColumnToken | undefined;\n let bound: PickerColumnToken | undefined;\n let boundRows: readonly HTMLElement[] = [];\n let disposed = false;\n const sink = (notice: PickerBridgeNotice) => {\n if (notice.type === \"INPUT\") getHost().input(notice.token, notice.signal);\n else if (notice.type === \"SURFACE.DETACHED\") getHost().unmountColumn(notice.token);\n };\n const sameRows = (a: readonly HTMLElement[], b: readonly HTMLElement[]) => a.length === b.length && a.every((row, index) => row === b[index]);\n const release = () => { const previous = surface; surface = undefined; owner = undefined; bound = undefined; boundRows = []; previous?.dispose(); };\n return {\n sync() {\n if (disposed) return;\n let token = getHost().getColumnToken(columnIndex);\n if (token && owner && !sameMount(token, owner)) release();\n if (!surface) {\n if (!token) { getHost().mountColumn(columnIndex); token = getHost().getColumnToken(columnIndex); }\n if (!token) return;\n const rows = getRows();\n surface = attachPickerColumn(viewport, token, rows, sink);\n owner = token; bound = token; boundRows = rows;\n } else if (token) {\n const rows = getRows();\n if (!bound || !sameToken(token, bound) || !sameRows(rows, boundRows)) { surface.bind(token, rows); bound = token; boundRows = rows; }\n }\n if (!token || !surface || !bound) return;\n for (const command of getHost().commands) if (sameToken(command.token, bound)) surface.binding.execute({ type: \"SCROLL_TO\", command });\n },\n dispose() {\n if (disposed) return;\n disposed = true;\n release();\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./popover.js";
2
+ export { FLOATING_ALIGNS, FLOATING_DEFAULT_OFFSET, FLOATING_PLACEMENTS, FLOATING_SIDES, computeFloatingPosition, joinFloatingPlacement, resolveFloatingPlacement, splitFloatingPlacement, } from "./positioning.js";
3
+ export type { FloatingAlign, FloatingLayout, FloatingPlacement, FloatingPosition, FloatingPositionInput, FloatingRect, FloatingSide } from "./positioning.js";
@@ -0,0 +1,253 @@
1
+ import { a as FLOATING_DEFAULT_OFFSET, c as computeFloatingPosition, d as resolveFloatingPlacement, f as sameFloatingLayout, i as FLOATING_ALIGNS, l as getFloatingPositionerStyle, m as trackFloatingLayout, n as restoreFloatingFocus, o as FLOATING_PLACEMENTS, p as splitFloatingPlacement, r as trackFloatingDismiss, s as FLOATING_SIDES, u as joinFloatingPlacement } from "../layer-IpFrl5--.js";
2
+ import { createMachine } from "@zag-js/core";
3
+ //#region src/popover/popover.ts
4
+ /** Stable DOM parts shared by every adapter. */
5
+ const POPOVER_PARTS = [
6
+ "trigger",
7
+ "positioner",
8
+ "arrow",
9
+ "content"
10
+ ];
11
+ const POPOVER_DEFAULT_PLACEMENT = "bottom";
12
+ const text = (value) => typeof value === "string" && value.trim() ? value.trim() : void 0;
13
+ function resolvePopoverState(props = {}) {
14
+ return {
15
+ placement: resolveFloatingPlacement(props.placement, POPOVER_DEFAULT_PLACEMENT),
16
+ offset: typeof props.offset === "number" && Number.isFinite(props.offset) ? props.offset : 8,
17
+ arrow: props.arrow !== false,
18
+ label: text(props.label),
19
+ closeOnEscape: props.closeOnEscape !== false,
20
+ closeOnInteractOutside: props.closeOnInteractOutside !== false
21
+ };
22
+ }
23
+ function createPopoverProps(props = {}) {
24
+ if (props.id !== void 0 && (typeof props.id !== "string" || !props.id.trim())) throw new TypeError("Popover requires a nonempty instance id when provided");
25
+ return { ...props };
26
+ }
27
+ const ids = (scope) => {
28
+ const base = `popover:${scope.id}`;
29
+ return {
30
+ trigger: `${base}:trigger`,
31
+ positioner: `${base}:positioner`,
32
+ arrow: `${base}:arrow`,
33
+ content: `${base}:content`
34
+ };
35
+ };
36
+ const live = (prop) => resolvePopoverState({
37
+ placement: prop("placement"),
38
+ offset: prop("offset"),
39
+ arrow: prop("arrow"),
40
+ label: prop("label"),
41
+ closeOnEscape: prop("closeOnEscape"),
42
+ closeOnInteractOutside: prop("closeOnInteractOutside")
43
+ });
44
+ const reasonOf = (event) => typeof event.reason === "string" ? event.reason : "api";
45
+ /**
46
+ * Core owns open/close (controlled requests and refusals), positioning while open, dismissal through the
47
+ * shared non-modal layer stack (Escape, outside pointer; focus may leave freely) and the focus return.
48
+ */
49
+ const popoverMachine = createMachine({
50
+ props: ({ props }) => createPopoverProps(props),
51
+ initialState: ({ prop }) => prop("open") ?? prop("defaultOpen") ? "open" : "closed",
52
+ context: ({ bindable }) => ({
53
+ dismissReady: bindable(() => ({ defaultValue: false })),
54
+ layout: bindable(() => ({
55
+ defaultValue: null,
56
+ isEqual: sameFloatingLayout
57
+ }))
58
+ }),
59
+ refs: () => ({ request: null }),
60
+ watch({ track, prop, action }) {
61
+ track([() => prop("open")], () => action(["syncControlled"]));
62
+ },
63
+ states: {
64
+ closed: { on: {
65
+ "CONTROLLED.OPEN": { target: "open" },
66
+ OPEN: [{
67
+ guard: "isControlled",
68
+ actions: ["notifyOpen"]
69
+ }, {
70
+ target: "open",
71
+ actions: ["notifyOpen"]
72
+ }],
73
+ TOGGLE: [{
74
+ guard: "isControlled",
75
+ actions: ["notifyOpen"]
76
+ }, {
77
+ target: "open",
78
+ actions: ["notifyOpen"]
79
+ }]
80
+ } },
81
+ open: {
82
+ effects: ["trackLayout", "trackDismiss"],
83
+ exit: ["clearLayout"],
84
+ on: {
85
+ "CONTROLLED.CLOSE": {
86
+ target: "closed",
87
+ actions: ["restoreFocus"]
88
+ },
89
+ CLOSE: [{
90
+ guard: "isControlled",
91
+ actions: ["notifyClose"]
92
+ }, {
93
+ target: "closed",
94
+ actions: ["notifyClose", "restoreFocus"]
95
+ }],
96
+ TOGGLE: [{
97
+ guard: "isControlled",
98
+ actions: ["notifyClose"]
99
+ }, {
100
+ target: "closed",
101
+ actions: ["notifyClose", "restoreFocus"]
102
+ }],
103
+ LAYOUT: { actions: ["setLayout"] },
104
+ "DISMISS.READY": { actions: ["dismissReady"] }
105
+ }
106
+ }
107
+ },
108
+ implementations: {
109
+ guards: { isControlled: ({ prop }) => prop("open") !== void 0 },
110
+ actions: {
111
+ notifyOpen({ prop, event, refs }) {
112
+ refs.set("request", null);
113
+ prop("onOpenChange")?.({
114
+ open: true,
115
+ reason: reasonOf(event)
116
+ });
117
+ },
118
+ notifyClose({ prop, event, refs }) {
119
+ const reason = reasonOf(event);
120
+ refs.set("request", {
121
+ reason,
122
+ focusable: event.focusable === true
123
+ });
124
+ prop("onOpenChange")?.({
125
+ open: false,
126
+ reason
127
+ });
128
+ },
129
+ restoreFocus({ scope, refs }) {
130
+ const request = refs.get("request") ?? {
131
+ reason: "api",
132
+ focusable: false
133
+ }, id = ids(scope);
134
+ refs.set("request", null);
135
+ restoreFloatingFocus(scope.getDoc(), scope.getById(id.trigger), scope.getById(id.content), request);
136
+ },
137
+ setLayout({ context, event }) {
138
+ if (event.type === "LAYOUT") context.set("layout", event.layout);
139
+ },
140
+ dismissReady({ context }) {
141
+ context.set("dismissReady", true);
142
+ },
143
+ clearLayout({ context }) {
144
+ context.set("dismissReady", false);
145
+ context.set("layout", null);
146
+ },
147
+ syncControlled({ prop, send }) {
148
+ const open = prop("open");
149
+ if (open !== void 0) send({ type: open ? "CONTROLLED.OPEN" : "CONTROLLED.CLOSE" });
150
+ }
151
+ },
152
+ effects: {
153
+ trackLayout({ scope, prop, send }) {
154
+ const id = ids(scope);
155
+ return trackFloatingLayout(scope.getDoc(), {
156
+ anchor: () => scope.getById(id.trigger),
157
+ positioner: () => scope.getById(id.positioner),
158
+ content: () => scope.getById(id.content),
159
+ arrow: () => live(prop).arrow ? scope.getById(id.arrow) : null,
160
+ placement: () => live(prop).placement,
161
+ offset: () => live(prop).offset,
162
+ fallback: POPOVER_DEFAULT_PLACEMENT,
163
+ onLayout: (layout) => send({
164
+ type: "LAYOUT",
165
+ layout
166
+ })
167
+ });
168
+ },
169
+ trackDismiss({ scope, prop, send }) {
170
+ const id = ids(scope);
171
+ return trackFloatingDismiss(scope.getDoc(), {
172
+ onReady: () => send({ type: "DISMISS.READY" }),
173
+ type: "popover",
174
+ content: () => scope.getById(id.content),
175
+ trigger: () => scope.getById(id.trigger),
176
+ closeOnEscape: () => live(prop).closeOnEscape,
177
+ closeOnOutside: () => live(prop).closeOnInteractOutside,
178
+ closeOnFocusOutside: () => false,
179
+ onDismiss: (request) => send({
180
+ type: "CLOSE",
181
+ reason: request.reason,
182
+ focusable: request.focusable
183
+ })
184
+ });
185
+ }
186
+ }
187
+ }
188
+ });
189
+ function connectPopover(service, normalize) {
190
+ const state = live(service.prop), id = ids(service.scope), open = service.state.matches("open");
191
+ const layout = open && service.context.get("dismissReady") ? service.context.get("layout") : null;
192
+ const placement = layout?.placement ?? state.placement, { side, align } = layout ?? splitFloatingPlacement(state.placement);
193
+ const part = (name) => ({
194
+ "data-scope": "popover",
195
+ "data-part": name
196
+ });
197
+ return {
198
+ open,
199
+ placement,
200
+ side,
201
+ align,
202
+ positioned: !!layout,
203
+ arrow: state.arrow,
204
+ setOpen(next) {
205
+ if (next !== open) service.send({
206
+ type: next ? "OPEN" : "CLOSE",
207
+ reason: "api"
208
+ });
209
+ },
210
+ getTriggerProps: () => normalize.element({
211
+ ...part("trigger"),
212
+ id: id.trigger,
213
+ "aria-haspopup": "dialog",
214
+ "aria-expanded": open,
215
+ "aria-controls": id.content,
216
+ "data-state": open ? "open" : "closed",
217
+ onClick(event) {
218
+ if (!event.defaultPrevented) service.send({
219
+ type: "TOGGLE",
220
+ reason: "trigger"
221
+ });
222
+ }
223
+ }),
224
+ getPositionerProps: () => normalize.element({
225
+ ...part("positioner"),
226
+ id: id.positioner,
227
+ "data-placement": placement,
228
+ "data-side": side,
229
+ "data-align": align,
230
+ "data-positioned": layout ? "" : void 0,
231
+ style: getFloatingPositionerStyle(layout)
232
+ }),
233
+ getArrowProps: () => normalize.element({
234
+ ...part("arrow"),
235
+ id: id.arrow,
236
+ "aria-hidden": "true",
237
+ "data-side": side
238
+ }),
239
+ getContentProps: () => normalize.element({
240
+ ...part("content"),
241
+ id: id.content,
242
+ role: "dialog",
243
+ "aria-label": state.label,
244
+ "aria-labelledby": state.label ? void 0 : id.trigger,
245
+ "data-state": open ? "open" : "closed",
246
+ "data-side": side
247
+ })
248
+ };
249
+ }
250
+ //#endregion
251
+ export { FLOATING_ALIGNS, FLOATING_DEFAULT_OFFSET, FLOATING_PLACEMENTS, FLOATING_SIDES, POPOVER_DEFAULT_PLACEMENT, POPOVER_PARTS, computeFloatingPosition, connectPopover, createPopoverProps, joinFloatingPlacement, popoverMachine, resolveFloatingPlacement, resolvePopoverState, splitFloatingPlacement };
252
+
253
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/popover/popover.ts"],"sourcesContent":["import { createMachine, type Machine, type Service } from \"@zag-js/core\";\nimport type { NormalizeProps, PropTypes } from \"@zag-js/types\";\nimport {\n FLOATING_DEFAULT_OFFSET, getFloatingPositionerStyle, resolveFloatingPlacement, sameFloatingLayout, splitFloatingPlacement, trackFloatingLayout,\n type FloatingAlign, type FloatingLayout, type FloatingPlacement, type FloatingSide,\n} from \"./positioning.js\";\nimport { restoreFloatingFocus, trackFloatingDismiss, type FloatingCloseRequest } from \"./layer.js\";\n\n/** Stable DOM parts shared by every adapter. */\nexport const POPOVER_PARTS = [\"trigger\", \"positioner\", \"arrow\", \"content\"] as const;\nexport type PopoverPlacement = FloatingPlacement;\nexport const POPOVER_DEFAULT_PLACEMENT: PopoverPlacement = \"bottom\";\n/** trigger: the trigger toggled; escape / outside: dismissal; api: setOpen. */\nexport type PopoverOpenChangeReason = \"trigger\" | \"escape\" | \"outside\" | \"api\";\nexport interface PopoverOpenChangeDetails { open: boolean; reason: PopoverOpenChangeReason }\n\nexport interface QwPopoverProps {\n /** Page-unique instance identity; adapters generate one when omitted. */\n id?: string;\n /** Controlled open state; undefined lets Core own it. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Every open/close request (trigger, Escape, outside, setOpen), controlled or not. Controlled owners accept by updating open, or refuse by keeping it. */\n onOpenChange?: (details: PopoverOpenChangeDetails) => void;\n /** Preferred placement (default bottom; unknown values use bottom). Flips to the opposite side when space is short; start/end mirror on top/bottom in RTL. */\n placement?: PopoverPlacement;\n /** Main-axis gap between the trigger and the panel in CSS px; default 8. */\n offset?: number;\n /** Arrow pointing at the trigger; default true. */\n arrow?: boolean;\n /** Accessible name of the dialog; omitted names it by the trigger (aria-labelledby). */\n label?: string;\n /** Escape closes the topmost open layer; default true. */\n closeOnEscape?: boolean;\n /** A pointer interaction outside the panel and the trigger closes; default true. */\n closeOnInteractOutside?: boolean;\n}\nexport interface ResolvedPopoverState {\n placement: PopoverPlacement; offset: number; arrow: boolean; label: string | undefined; closeOnEscape: boolean; closeOnInteractOutside: boolean;\n}\nconst text = (value: unknown): string | undefined => typeof value === \"string\" && value.trim() ? value.trim() : undefined;\nexport function resolvePopoverState(props: QwPopoverProps = {}): ResolvedPopoverState {\n return {\n placement: resolveFloatingPlacement(props.placement, POPOVER_DEFAULT_PLACEMENT),\n offset: typeof props.offset === \"number\" && Number.isFinite(props.offset) ? props.offset : FLOATING_DEFAULT_OFFSET,\n arrow: props.arrow !== false, label: text(props.label),\n closeOnEscape: props.closeOnEscape !== false, closeOnInteractOutside: props.closeOnInteractOutside !== false,\n };\n}\nexport function createPopoverProps(props: QwPopoverProps = {}): QwPopoverProps {\n if (props.id !== undefined && (typeof props.id !== \"string\" || !props.id.trim())) throw new TypeError(\"Popover requires a nonempty instance id when provided\");\n return { ...props };\n}\n\nexport interface QwPopoverSchema {\n props: QwPopoverProps;\n context: { dismissReady: boolean; layout: FloatingLayout | null };\n refs: { request: FloatingCloseRequest | null };\n state: \"open\" | \"closed\";\n guard: \"isControlled\";\n action: \"notifyOpen\" | \"notifyClose\" | \"restoreFocus\" | \"setLayout\" | \"dismissReady\" | \"clearLayout\" | \"syncControlled\";\n effect: \"trackLayout\" | \"trackDismiss\";\n event:\n | { type: \"OPEN\" | \"TOGGLE\"; reason?: PopoverOpenChangeReason }\n | { type: \"CLOSE\"; reason?: PopoverOpenChangeReason; focusable?: boolean }\n | { type: \"CONTROLLED.OPEN\" | \"CONTROLLED.CLOSE\" }\n | { type: \"LAYOUT\"; layout: FloatingLayout }\n | { type: \"DISMISS.READY\" };\n}\nexport type QwPopoverMachine = Machine<QwPopoverSchema>;\nexport type QwPopoverService = Service<QwPopoverSchema>;\ntype Scope = QwPopoverService[\"scope\"];\nconst ids = (scope: Scope) => {\n const base = `popover:${scope.id}`;\n return { trigger: `${base}:trigger`, positioner: `${base}:positioner`, arrow: `${base}:arrow`, content: `${base}:content` };\n};\nconst live = (prop: QwPopoverService[\"prop\"]) => resolvePopoverState({\n placement: prop(\"placement\"), offset: prop(\"offset\"), arrow: prop(\"arrow\"), label: prop(\"label\"),\n closeOnEscape: prop(\"closeOnEscape\"), closeOnInteractOutside: prop(\"closeOnInteractOutside\"),\n});\nconst reasonOf = (event: { readonly [key: string]: unknown }): PopoverOpenChangeReason => typeof event.reason === \"string\" ? event.reason as PopoverOpenChangeReason : \"api\";\n\n/**\n * Core owns open/close (controlled requests and refusals), positioning while open, dismissal through the\n * shared non-modal layer stack (Escape, outside pointer; focus may leave freely) and the focus return.\n */\nexport const popoverMachine: QwPopoverMachine = createMachine<QwPopoverSchema>({\n props: ({ props }) => createPopoverProps(props),\n initialState: ({ prop }) => (prop(\"open\") ?? prop(\"defaultOpen\")) ? \"open\" : \"closed\",\n context: ({ bindable }) => ({ dismissReady: bindable(() => ({ defaultValue: false })), layout: bindable<FloatingLayout | null>(() => ({ defaultValue: null, isEqual: sameFloatingLayout })) }),\n refs: () => ({ request: null }),\n watch({ track, prop, action }) { track([() => prop(\"open\")], () => action([\"syncControlled\"])); },\n states: {\n closed: {\n on: {\n \"CONTROLLED.OPEN\": { target: \"open\" },\n OPEN: [{ guard: \"isControlled\", actions: [\"notifyOpen\"] }, { target: \"open\", actions: [\"notifyOpen\"] }],\n TOGGLE: [{ guard: \"isControlled\", actions: [\"notifyOpen\"] }, { target: \"open\", actions: [\"notifyOpen\"] }],\n },\n },\n open: {\n effects: [\"trackLayout\", \"trackDismiss\"],\n exit: [\"clearLayout\"],\n on: {\n \"CONTROLLED.CLOSE\": { target: \"closed\", actions: [\"restoreFocus\"] },\n CLOSE: [{ guard: \"isControlled\", actions: [\"notifyClose\"] }, { target: \"closed\", actions: [\"notifyClose\", \"restoreFocus\"] }],\n TOGGLE: [{ guard: \"isControlled\", actions: [\"notifyClose\"] }, { target: \"closed\", actions: [\"notifyClose\", \"restoreFocus\"] }],\n LAYOUT: { actions: [\"setLayout\"] },\n \"DISMISS.READY\": { actions: [\"dismissReady\"] },\n },\n },\n },\n implementations: {\n guards: { isControlled: ({ prop }) => prop(\"open\") !== undefined },\n actions: {\n notifyOpen({ prop, event, refs }) {\n refs.set(\"request\", null);\n prop(\"onOpenChange\")?.({ open: true, reason: reasonOf(event) });\n },\n notifyClose({ prop, event, refs }) {\n const reason = reasonOf(event);\n refs.set(\"request\", { reason, focusable: event.focusable === true });\n prop(\"onOpenChange\")?.({ open: false, reason });\n },\n // Runs while the content is still in the DOM: focus moves before the panel unmounts.\n restoreFocus({ scope, refs }) {\n const request = refs.get(\"request\") ?? { reason: \"api\", focusable: false }, id = ids(scope);\n refs.set(\"request\", null);\n restoreFloatingFocus(scope.getDoc(), scope.getById(id.trigger), scope.getById(id.content), request);\n },\n setLayout({ context, event }) { if (event.type === \"LAYOUT\") context.set(\"layout\", event.layout); },\n dismissReady({ context }) { context.set(\"dismissReady\", true); },\n clearLayout({ context }) { context.set(\"dismissReady\", false); context.set(\"layout\", null); },\n syncControlled({ prop, send }) {\n const open = prop(\"open\");\n if (open !== undefined) send({ type: open ? \"CONTROLLED.OPEN\" : \"CONTROLLED.CLOSE\" });\n },\n },\n effects: {\n trackLayout({ scope, prop, send }) {\n const id = ids(scope);\n return trackFloatingLayout(scope.getDoc(), {\n anchor: () => scope.getById(id.trigger), positioner: () => scope.getById(id.positioner), content: () => scope.getById(id.content),\n arrow: () => live(prop).arrow ? scope.getById(id.arrow) : null,\n placement: () => live(prop).placement, offset: () => live(prop).offset, fallback: POPOVER_DEFAULT_PLACEMENT,\n onLayout: (layout) => send({ type: \"LAYOUT\", layout }),\n });\n },\n trackDismiss({ scope, prop, send }) {\n const id = ids(scope);\n return trackFloatingDismiss(scope.getDoc(), {\n onReady: () => send({ type: \"DISMISS.READY\" }),\n type: \"popover\", content: () => scope.getById(id.content), trigger: () => scope.getById(id.trigger),\n closeOnEscape: () => live(prop).closeOnEscape, closeOnOutside: () => live(prop).closeOnInteractOutside,\n // Non-modal: focus may leave the panel freely.\n closeOnFocusOutside: () => false,\n onDismiss: (request) => send({ type: \"CLOSE\", reason: request.reason as PopoverOpenChangeReason, focusable: request.focusable }),\n });\n },\n },\n },\n});\n\n/** Minimal event surface shared by React, Vue and native events. */\nexport interface PopoverDomEvent { readonly defaultPrevented: boolean }\n\nexport interface QwPopoverApi<T extends PropTypes = PropTypes> {\n open: boolean;\n /** The measured placement while open (after flipping), otherwise the preferred one. */\n placement: PopoverPlacement;\n side: FloatingSide;\n align: FloatingAlign;\n /** The open panel has been measured and is visible. */\n positioned: boolean;\n arrow: boolean;\n /** Request a state; controlled owners decide through onOpenChange (reason api). */\n setOpen(open: boolean): void;\n /** Merge onto the caller's own trigger node: its other props and handlers stay; preventDefault() in its onClick skips the toggle. */\n getTriggerProps(): T[\"element\"];\n getPositionerProps(): T[\"element\"];\n getArrowProps(): T[\"element\"];\n getContentProps(): T[\"element\"];\n}\nexport function connectPopover<T extends PropTypes>(service: QwPopoverService, normalize: NormalizeProps<T>): QwPopoverApi<T> {\n const state = live(service.prop), id = ids(service.scope), open = service.state.matches(\"open\");\n const layout = open && service.context.get(\"dismissReady\") ? service.context.get(\"layout\") : null;\n const placement = layout?.placement ?? state.placement, { side, align } = layout ?? splitFloatingPlacement(state.placement);\n const part = (name: (typeof POPOVER_PARTS)[number]) => ({ \"data-scope\": \"popover\", \"data-part\": name });\n return {\n open, placement, side, align, positioned: !!layout, arrow: state.arrow,\n setOpen(next) { if (next !== open) service.send({ type: next ? \"OPEN\" : \"CLOSE\", reason: \"api\" }); },\n getTriggerProps: () => normalize.element({\n ...part(\"trigger\"), id: id.trigger, \"aria-haspopup\": \"dialog\", \"aria-expanded\": open, \"aria-controls\": id.content, \"data-state\": open ? \"open\" : \"closed\",\n onClick(event: PopoverDomEvent) { if (!event.defaultPrevented) service.send({ type: \"TOGGLE\", reason: \"trigger\" }); },\n }),\n getPositionerProps: () => normalize.element({\n ...part(\"positioner\"), id: id.positioner, \"data-placement\": placement, \"data-side\": side, \"data-align\": align,\n \"data-positioned\": layout ? \"\" : undefined, style: getFloatingPositionerStyle(layout),\n }),\n getArrowProps: () => normalize.element({ ...part(\"arrow\"), id: id.arrow, \"aria-hidden\": \"true\", \"data-side\": side }),\n getContentProps: () => normalize.element({\n ...part(\"content\"), id: id.content, role: \"dialog\", \"aria-label\": state.label, \"aria-labelledby\": state.label ? undefined : id.trigger,\n \"data-state\": open ? \"open\" : \"closed\", \"data-side\": side,\n }),\n };\n}\n"],"mappings":"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"}