@soxa-ui/plugins 0.0.0-stage → 0.3.0-beta.1

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 (630) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -2
  3. package/dist/base/base.class.d.ts +54 -0
  4. package/dist/base/base.class.js +69 -0
  5. package/dist/base/bundle.class.d.ts +25 -0
  6. package/dist/base/bundle.class.js +68 -0
  7. package/dist/base/index.d.ts +3 -0
  8. package/dist/base/types.d.ts +147 -0
  9. package/dist/custom/accordion/header.d.ts +19 -0
  10. package/dist/custom/accordion/header.js +38 -0
  11. package/dist/custom/accordion/index.d.ts +2 -0
  12. package/dist/custom/accordion/item-ids/index.d.ts +1 -0
  13. package/dist/custom/accordion/item-ids/item-ids.plugin.d.ts +24 -0
  14. package/dist/custom/accordion/item-ids/item-ids.plugin.js +44 -0
  15. package/dist/custom/action/action.plugin.d.ts +178 -0
  16. package/dist/custom/action/action.plugin.js +339 -0
  17. package/dist/custom/action/index.d.ts +2 -0
  18. package/dist/custom/action/types.d.ts +65 -0
  19. package/dist/custom/calendar/ids/ids.plugin.d.ts +25 -0
  20. package/dist/custom/calendar/ids/ids.plugin.js +44 -0
  21. package/dist/custom/calendar/ids/index.d.ts +1 -0
  22. package/dist/custom/calendar/index.d.ts +5 -0
  23. package/dist/custom/calendar/keyboard/index.d.ts +2 -0
  24. package/dist/custom/calendar/keyboard/keyboard.plugin.d.ts +114 -0
  25. package/dist/custom/calendar/keyboard/keyboard.plugin.js +249 -0
  26. package/dist/custom/calendar/keyboard/types.d.ts +16 -0
  27. package/dist/custom/calendar/names/index.d.ts +1 -0
  28. package/dist/custom/calendar/names/names.plugin.d.ts +24 -0
  29. package/dist/custom/calendar/names/names.plugin.js +45 -0
  30. package/dist/custom/calendar/parts.d.ts +58 -0
  31. package/dist/custom/calendar/parts.js +119 -0
  32. package/dist/custom/calendar/pointer/index.d.ts +2 -0
  33. package/dist/custom/calendar/pointer/pointer.plugin.d.ts +58 -0
  34. package/dist/custom/calendar/pointer/pointer.plugin.js +144 -0
  35. package/dist/custom/calendar/pointer/types.d.ts +6 -0
  36. package/dist/custom/calendar/stop.d.ts +20 -0
  37. package/dist/custom/calendar/stop.js +32 -0
  38. package/dist/custom/calendar/types.d.ts +16 -0
  39. package/dist/custom/clearable/index.d.ts +1 -0
  40. package/dist/custom/clearable/names/index.d.ts +1 -0
  41. package/dist/custom/clearable/names/names.plugin.d.ts +24 -0
  42. package/dist/custom/clearable/names/names.plugin.js +29 -0
  43. package/dist/custom/collection/bundles.plugin.d.ts +55 -0
  44. package/dist/custom/collection/bundles.plugin.js +100 -0
  45. package/dist/custom/collection/collection-bundles-access.plugin.d.ts +29 -0
  46. package/dist/custom/collection/collection-bundles-access.plugin.js +44 -0
  47. package/dist/custom/collection/collection-elements.plugin.d.ts +55 -0
  48. package/dist/custom/collection/collection-elements.plugin.js +100 -0
  49. package/dist/custom/collection/index.d.ts +4 -0
  50. package/dist/custom/collection/leaving-focus.d.ts +119 -0
  51. package/dist/custom/collection/leaving-focus.js +164 -0
  52. package/dist/custom/collection/reachable.d.ts +14 -0
  53. package/dist/custom/collection/reachable.js +18 -0
  54. package/dist/custom/collection/types.d.ts +14 -0
  55. package/dist/custom/component-view/aria.plugin.d.ts +102 -0
  56. package/dist/custom/component-view/aria.plugin.js +190 -0
  57. package/dist/custom/component-view/index.d.ts +2 -0
  58. package/dist/custom/component-view/types.d.ts +62 -0
  59. package/dist/custom/date-input/clipboard/clipboard.plugin.d.ts +41 -0
  60. package/dist/custom/date-input/clipboard/clipboard.plugin.js +98 -0
  61. package/dist/custom/date-input/clipboard/index.d.ts +2 -0
  62. package/dist/custom/date-input/clipboard/types.d.ts +6 -0
  63. package/dist/custom/date-input/ids/ids.plugin.d.ts +21 -0
  64. package/dist/custom/date-input/ids/ids.plugin.js +28 -0
  65. package/dist/custom/date-input/ids/index.d.ts +1 -0
  66. package/dist/custom/date-input/index.d.ts +6 -0
  67. package/dist/custom/date-input/keyboard/index.d.ts +2 -0
  68. package/dist/custom/date-input/keyboard/keyboard.plugin.d.ts +54 -0
  69. package/dist/custom/date-input/keyboard/keyboard.plugin.js +154 -0
  70. package/dist/custom/date-input/keyboard/types.d.ts +9 -0
  71. package/dist/custom/date-input/parts.d.ts +49 -0
  72. package/dist/custom/date-input/parts.js +127 -0
  73. package/dist/custom/date-input/pointer/index.d.ts +2 -0
  74. package/dist/custom/date-input/pointer/pointer.plugin.d.ts +51 -0
  75. package/dist/custom/date-input/pointer/pointer.plugin.js +141 -0
  76. package/dist/custom/date-input/pointer/types.d.ts +6 -0
  77. package/dist/custom/date-input/touch/index.d.ts +2 -0
  78. package/dist/custom/date-input/touch/touch.plugin.d.ts +100 -0
  79. package/dist/custom/date-input/touch/touch.plugin.js +276 -0
  80. package/dist/custom/date-input/touch/types.d.ts +6 -0
  81. package/dist/custom/date-input/types.d.ts +6 -0
  82. package/dist/custom/date-picker/field.d.ts +20 -0
  83. package/dist/custom/date-picker/field.js +27 -0
  84. package/dist/custom/date-picker/focus/focus.plugin.d.ts +56 -0
  85. package/dist/custom/date-picker/focus/focus.plugin.js +81 -0
  86. package/dist/custom/date-picker/focus/index.d.ts +2 -0
  87. package/dist/custom/date-picker/focus/types.d.ts +3 -0
  88. package/dist/custom/date-picker/ids/ids.plugin.d.ts +19 -0
  89. package/dist/custom/date-picker/ids/ids.plugin.js +28 -0
  90. package/dist/custom/date-picker/ids/index.d.ts +1 -0
  91. package/dist/custom/date-picker/index.d.ts +5 -0
  92. package/dist/custom/date-picker/names/index.d.ts +2 -0
  93. package/dist/custom/date-picker/names/names.plugin.d.ts +33 -0
  94. package/dist/custom/date-picker/names/names.plugin.js +80 -0
  95. package/dist/custom/date-picker/names/types.d.ts +12 -0
  96. package/dist/custom/date-picker/trigger/index.d.ts +2 -0
  97. package/dist/custom/date-picker/trigger/trigger.plugin.d.ts +37 -0
  98. package/dist/custom/date-picker/trigger/trigger.plugin.js +69 -0
  99. package/dist/custom/date-picker/trigger/types.d.ts +3 -0
  100. package/dist/custom/dialog/ids/ids.plugin.d.ts +15 -0
  101. package/dist/custom/dialog/ids/ids.plugin.js +28 -0
  102. package/dist/custom/dialog/ids/index.d.ts +1 -0
  103. package/dist/custom/dialog/index.d.ts +3 -0
  104. package/dist/custom/dialog/layout/index.d.ts +3 -0
  105. package/dist/custom/dialog/layout/layout.plugin.d.ts +42 -0
  106. package/dist/custom/dialog/layout/layout.plugin.js +78 -0
  107. package/dist/custom/dialog/layout/offset-event.d.ts +35 -0
  108. package/dist/custom/dialog/layout/offset-event.js +44 -0
  109. package/dist/custom/dialog/layout/types.d.ts +12 -0
  110. package/dist/custom/dialog/names/index.d.ts +1 -0
  111. package/dist/custom/dialog/names/names.plugin.d.ts +13 -0
  112. package/dist/custom/dialog/names/names.plugin.js +17 -0
  113. package/dist/custom/dismiss/dismiss.plugin.d.ts +174 -0
  114. package/dist/custom/dismiss/dismiss.plugin.js +287 -0
  115. package/dist/custom/dismiss/index.d.ts +2 -0
  116. package/dist/custom/dismiss/types.d.ts +59 -0
  117. package/dist/custom/drag-and-drop/drag.plugin.d.ts +87 -0
  118. package/dist/custom/drag-and-drop/drag.plugin.js +310 -0
  119. package/dist/custom/drag-and-drop/index.d.ts +2 -0
  120. package/dist/custom/drag-and-drop/types.d.ts +13 -0
  121. package/dist/custom/drawer/index.d.ts +1 -0
  122. package/dist/custom/drawer/layout/index.d.ts +2 -0
  123. package/dist/custom/drawer/layout/layout.plugin.d.ts +17 -0
  124. package/dist/custom/drawer/layout/layout.plugin.js +22 -0
  125. package/dist/custom/drawer/layout/types.d.ts +3 -0
  126. package/dist/custom/element/element.plugin.d.ts +35 -0
  127. package/dist/custom/element/element.plugin.js +58 -0
  128. package/dist/custom/element/index.d.ts +2 -0
  129. package/dist/custom/element/types.d.ts +18 -0
  130. package/dist/custom/field/ids/ids.plugin.d.ts +64 -0
  131. package/dist/custom/field/ids/ids.plugin.js +126 -0
  132. package/dist/custom/field/ids/index.d.ts +2 -0
  133. package/dist/custom/field/ids/types.d.ts +28 -0
  134. package/dist/custom/field/index.d.ts +1 -0
  135. package/dist/custom/frame/anchor/anchor.plugin.d.ts +483 -0
  136. package/dist/custom/frame/anchor/anchor.plugin.js +820 -0
  137. package/dist/custom/frame/anchor/index.d.ts +2 -0
  138. package/dist/custom/frame/anchor/types.d.ts +83 -0
  139. package/dist/custom/frame/index.d.ts +2 -0
  140. package/dist/custom/frame/layout/index.d.ts +2 -0
  141. package/dist/custom/frame/layout/layout.plugin.d.ts +24 -0
  142. package/dist/custom/frame/layout/layout.plugin.js +65 -0
  143. package/dist/custom/frame/layout/types.d.ts +5 -0
  144. package/dist/custom/icon/index.d.ts +2 -0
  145. package/dist/custom/icon/layout.plugin.d.ts +21 -0
  146. package/dist/custom/icon/layout.plugin.js +51 -0
  147. package/dist/custom/icon/types.d.ts +5 -0
  148. package/dist/custom/id/id.plugin.d.ts +32 -0
  149. package/dist/custom/id/id.plugin.js +42 -0
  150. package/dist/custom/id/index.d.ts +2 -0
  151. package/dist/custom/id/types.d.ts +6 -0
  152. package/dist/custom/index.d.ts +42 -0
  153. package/dist/custom/input/field.d.ts +16 -0
  154. package/dist/custom/input/field.js +27 -0
  155. package/dist/custom/input/index.d.ts +3 -0
  156. package/dist/custom/input/input.plugin.d.ts +12 -0
  157. package/dist/custom/input/input.plugin.js +46 -0
  158. package/dist/custom/input/types.d.ts +2 -0
  159. package/dist/custom/input-bool/index.d.ts +2 -0
  160. package/dist/custom/input-bool/input-bool.plugin.d.ts +30 -0
  161. package/dist/custom/input-bool/input-bool.plugin.js +77 -0
  162. package/dist/custom/input-bool/types.d.ts +5 -0
  163. package/dist/custom/input-control/index.d.ts +2 -0
  164. package/dist/custom/input-control/input-control.plugin.d.ts +12 -0
  165. package/dist/custom/input-control/input-control.plugin.js +40 -0
  166. package/dist/custom/input-control/types.d.ts +2 -0
  167. package/dist/custom/item-group/ids/ids.plugin.d.ts +19 -0
  168. package/dist/custom/item-group/ids/ids.plugin.js +32 -0
  169. package/dist/custom/item-group/ids/index.d.ts +1 -0
  170. package/dist/custom/item-group/index.d.ts +1 -0
  171. package/dist/custom/label/index.d.ts +1 -0
  172. package/dist/custom/label/nested-warn/index.d.ts +1 -0
  173. package/dist/custom/label/nested-warn/nested-warn.plugin.d.ts +21 -0
  174. package/dist/custom/label/nested-warn/nested-warn.plugin.js +41 -0
  175. package/dist/custom/list/height/height.plugin.d.ts +129 -0
  176. package/dist/custom/list/height/height.plugin.js +272 -0
  177. package/dist/custom/list/height/index.d.ts +2 -0
  178. package/dist/custom/list/height/types.d.ts +10 -0
  179. package/dist/custom/list/index.d.ts +7 -0
  180. package/dist/custom/list/item/index.d.ts +2 -0
  181. package/dist/custom/list/item/item.plugin.d.ts +25 -0
  182. package/dist/custom/list/item/item.plugin.js +46 -0
  183. package/dist/custom/list/item/types.d.ts +5 -0
  184. package/dist/custom/list/keyboard/index.d.ts +2 -0
  185. package/dist/custom/list/keyboard/keyboard.plugin.d.ts +133 -0
  186. package/dist/custom/list/keyboard/keyboard.plugin.js +199 -0
  187. package/dist/custom/list/keyboard/types.d.ts +3 -0
  188. package/dist/custom/list/navigation/index.d.ts +2 -0
  189. package/dist/custom/list/navigation/navigation.plugin.d.ts +262 -0
  190. package/dist/custom/list/navigation/navigation.plugin.js +402 -0
  191. package/dist/custom/list/navigation/types.d.ts +25 -0
  192. package/dist/custom/list/newly-selected.d.ts +17 -0
  193. package/dist/custom/list/newly-selected.js +22 -0
  194. package/dist/custom/list/option-ids/index.d.ts +1 -0
  195. package/dist/custom/list/option-ids/option-ids.plugin.d.ts +29 -0
  196. package/dist/custom/list/option-ids/option-ids.plugin.js +43 -0
  197. package/dist/custom/list/row.d.ts +50 -0
  198. package/dist/custom/list/row.js +99 -0
  199. package/dist/custom/list/scroll/index.d.ts +2 -0
  200. package/dist/custom/list/scroll/scroll.plugin.d.ts +132 -0
  201. package/dist/custom/list/scroll/scroll.plugin.js +286 -0
  202. package/dist/custom/list/scroll/types.d.ts +21 -0
  203. package/dist/custom/list/typeahead.d.ts +53 -0
  204. package/dist/custom/list/typeahead.js +58 -0
  205. package/dist/custom/menu/focus/focus.plugin.d.ts +61 -0
  206. package/dist/custom/menu/focus/focus.plugin.js +105 -0
  207. package/dist/custom/menu/focus/index.d.ts +2 -0
  208. package/dist/custom/menu/focus/types.d.ts +2 -0
  209. package/dist/custom/menu/hover/hover.plugin.d.ts +99 -0
  210. package/dist/custom/menu/hover/hover.plugin.js +235 -0
  211. package/dist/custom/menu/hover/index.d.ts +2 -0
  212. package/dist/custom/menu/hover/types.d.ts +2 -0
  213. package/dist/custom/menu/ids/ids.plugin.d.ts +29 -0
  214. package/dist/custom/menu/ids/ids.plugin.js +46 -0
  215. package/dist/custom/menu/ids/index.d.ts +1 -0
  216. package/dist/custom/menu/index.d.ts +11 -0
  217. package/dist/custom/menu/keyboard/index.d.ts +2 -0
  218. package/dist/custom/menu/keyboard/keyboard.plugin.d.ts +41 -0
  219. package/dist/custom/menu/keyboard/keyboard.plugin.js +68 -0
  220. package/dist/custom/menu/keyboard/types.d.ts +2 -0
  221. package/dist/custom/menu/navigation/index.d.ts +2 -0
  222. package/dist/custom/menu/navigation/navigation.plugin.d.ts +116 -0
  223. package/dist/custom/menu/navigation/navigation.plugin.js +222 -0
  224. package/dist/custom/menu/navigation/types.d.ts +2 -0
  225. package/dist/custom/menu/nested-layer.d.ts +13 -0
  226. package/dist/custom/menu/nested-layer.js +20 -0
  227. package/dist/custom/menu/pointer/index.d.ts +2 -0
  228. package/dist/custom/menu/pointer/pointer.plugin.d.ts +45 -0
  229. package/dist/custom/menu/pointer/pointer.plugin.js +95 -0
  230. package/dist/custom/menu/pointer/strategies/context.strategy.d.ts +70 -0
  231. package/dist/custom/menu/pointer/strategies/context.strategy.js +170 -0
  232. package/dist/custom/menu/pointer/strategies/index.d.ts +3 -0
  233. package/dist/custom/menu/pointer/strategies/press.strategy.d.ts +23 -0
  234. package/dist/custom/menu/pointer/strategies/press.strategy.js +33 -0
  235. package/dist/custom/menu/pointer/strategies/types.d.ts +49 -0
  236. package/dist/custom/menu/pointer/types.d.ts +2 -0
  237. package/dist/custom/menu/popover-item-focus/focus.plugin.d.ts +54 -0
  238. package/dist/custom/menu/popover-item-focus/focus.plugin.js +70 -0
  239. package/dist/custom/menu/popover-item-focus/index.d.ts +2 -0
  240. package/dist/custom/menu/popover-item-focus/types.d.ts +10 -0
  241. package/dist/custom/menu/popover-item-keyboard/index.d.ts +2 -0
  242. package/dist/custom/menu/popover-item-keyboard/keyboard.plugin.d.ts +43 -0
  243. package/dist/custom/menu/popover-item-keyboard/keyboard.plugin.js +79 -0
  244. package/dist/custom/menu/popover-item-keyboard/types.d.ts +2 -0
  245. package/dist/custom/menu/popup-ids/ids.plugin.d.ts +27 -0
  246. package/dist/custom/menu/popup-ids/ids.plugin.js +47 -0
  247. package/dist/custom/menu/popup-ids/index.d.ts +1 -0
  248. package/dist/custom/menu/submenu-focus/focus.plugin.d.ts +53 -0
  249. package/dist/custom/menu/submenu-focus/focus.plugin.js +84 -0
  250. package/dist/custom/menu/submenu-focus/index.d.ts +2 -0
  251. package/dist/custom/menu/submenu-focus/types.d.ts +10 -0
  252. package/dist/custom/menu/submenu-keyboard/index.d.ts +2 -0
  253. package/dist/custom/menu/submenu-keyboard/keyboard.plugin.d.ts +43 -0
  254. package/dist/custom/menu/submenu-keyboard/keyboard.plugin.js +74 -0
  255. package/dist/custom/menu/submenu-keyboard/types.d.ts +2 -0
  256. package/dist/custom/number-input/index.d.ts +5 -0
  257. package/dist/custom/number-input/keyboard/index.d.ts +2 -0
  258. package/dist/custom/number-input/keyboard/keyboard.plugin.d.ts +36 -0
  259. package/dist/custom/number-input/keyboard/keyboard.plugin.js +80 -0
  260. package/dist/custom/number-input/keyboard/types.d.ts +3 -0
  261. package/dist/custom/number-input/names/index.d.ts +1 -0
  262. package/dist/custom/number-input/names/names.plugin.d.ts +17 -0
  263. package/dist/custom/number-input/names/names.plugin.js +24 -0
  264. package/dist/custom/number-input/parts.d.ts +21 -0
  265. package/dist/custom/number-input/parts.js +39 -0
  266. package/dist/custom/number-input/stepper/index.d.ts +2 -0
  267. package/dist/custom/number-input/stepper/stepper.plugin.d.ts +59 -0
  268. package/dist/custom/number-input/stepper/stepper.plugin.js +166 -0
  269. package/dist/custom/number-input/stepper/types.d.ts +19 -0
  270. package/dist/custom/number-input/touch/index.d.ts +2 -0
  271. package/dist/custom/number-input/touch/touch.plugin.d.ts +25 -0
  272. package/dist/custom/number-input/touch/touch.plugin.js +53 -0
  273. package/dist/custom/number-input/touch/types.d.ts +3 -0
  274. package/dist/custom/number-input/types.d.ts +8 -0
  275. package/dist/custom/number-input/typing/index.d.ts +2 -0
  276. package/dist/custom/number-input/typing/types.d.ts +6 -0
  277. package/dist/custom/number-input/typing/typing.plugin.d.ts +47 -0
  278. package/dist/custom/number-input/typing/typing.plugin.js +149 -0
  279. package/dist/custom/overlay/focus/focus.plugin.d.ts +150 -0
  280. package/dist/custom/overlay/focus/focus.plugin.js +242 -0
  281. package/dist/custom/overlay/focus/index.d.ts +1 -0
  282. package/dist/custom/overlay/hide-outside/hide-outside.plugin.d.ts +84 -0
  283. package/dist/custom/overlay/hide-outside/hide-outside.plugin.js +187 -0
  284. package/dist/custom/overlay/hide-outside/index.d.ts +2 -0
  285. package/dist/custom/overlay/hide-outside/marks.d.ts +19 -0
  286. package/dist/custom/overlay/hide-outside/marks.js +43 -0
  287. package/dist/custom/overlay/hide-outside/types.d.ts +17 -0
  288. package/dist/custom/overlay/index.d.ts +9 -0
  289. package/dist/custom/overlay/modal-focus/index.d.ts +1 -0
  290. package/dist/custom/overlay/modal-focus/modal-focus.plugin.d.ts +72 -0
  291. package/dist/custom/overlay/modal-focus/modal-focus.plugin.js +109 -0
  292. package/dist/custom/overlay/modal-ids/index.d.ts +1 -0
  293. package/dist/custom/overlay/modal-ids/modal-ids.plugin.d.ts +21 -0
  294. package/dist/custom/overlay/modal-ids/modal-ids.plugin.js +30 -0
  295. package/dist/custom/overlay/modal-layout/index.d.ts +2 -0
  296. package/dist/custom/overlay/modal-layout/modal-layout.plugin.d.ts +66 -0
  297. package/dist/custom/overlay/modal-layout/modal-layout.plugin.js +119 -0
  298. package/dist/custom/overlay/modal-layout/types.d.ts +13 -0
  299. package/dist/custom/overlay/modal-names/index.d.ts +1 -0
  300. package/dist/custom/overlay/modal-names/modal-names.plugin.d.ts +14 -0
  301. package/dist/custom/overlay/modal-names/modal-names.plugin.js +17 -0
  302. package/dist/custom/overlay/open-state.d.ts +12 -0
  303. package/dist/custom/overlay/open-state.js +42 -0
  304. package/dist/custom/overlay/scroll-lock/index.d.ts +2 -0
  305. package/dist/custom/overlay/scroll-lock/lock.d.ts +17 -0
  306. package/dist/custom/overlay/scroll-lock/lock.js +83 -0
  307. package/dist/custom/overlay/scroll-lock/scroll-lock.plugin.d.ts +78 -0
  308. package/dist/custom/overlay/scroll-lock/scroll-lock.plugin.js +134 -0
  309. package/dist/custom/overlay/scroll-lock/types.d.ts +17 -0
  310. package/dist/custom/overlay/swipe/index.d.ts +2 -0
  311. package/dist/custom/overlay/swipe/swipe.plugin.d.ts +150 -0
  312. package/dist/custom/overlay/swipe/swipe.plugin.js +432 -0
  313. package/dist/custom/overlay/swipe/types.d.ts +62 -0
  314. package/dist/custom/overlay/types.d.ts +40 -0
  315. package/dist/custom/pagination/current.d.ts +24 -0
  316. package/dist/custom/pagination/current.js +34 -0
  317. package/dist/custom/pagination/focus/focus.plugin.d.ts +57 -0
  318. package/dist/custom/pagination/focus/focus.plugin.js +106 -0
  319. package/dist/custom/pagination/focus/index.d.ts +2 -0
  320. package/dist/custom/pagination/focus/types.d.ts +8 -0
  321. package/dist/custom/pagination/index.d.ts +3 -0
  322. package/dist/custom/pagination/names/index.d.ts +1 -0
  323. package/dist/custom/pagination/names/names.plugin.d.ts +15 -0
  324. package/dist/custom/pagination/names/names.plugin.js +19 -0
  325. package/dist/custom/popover/focus/focus.plugin.d.ts +69 -0
  326. package/dist/custom/popover/focus/focus.plugin.js +107 -0
  327. package/dist/custom/popover/focus/index.d.ts +2 -0
  328. package/dist/custom/popover/focus/types.d.ts +2 -0
  329. package/dist/custom/popover/ids/ids.plugin.d.ts +18 -0
  330. package/dist/custom/popover/ids/ids.plugin.js +27 -0
  331. package/dist/custom/popover/ids/index.d.ts +1 -0
  332. package/dist/custom/popover/index.d.ts +4 -0
  333. package/dist/custom/popover/names/index.d.ts +1 -0
  334. package/dist/custom/popover/names/names.plugin.d.ts +7 -0
  335. package/dist/custom/popover/names/names.plugin.js +10 -0
  336. package/dist/custom/popover/pointer/index.d.ts +2 -0
  337. package/dist/custom/popover/pointer/pointer.plugin.d.ts +35 -0
  338. package/dist/custom/popover/pointer/pointer.plugin.js +65 -0
  339. package/dist/custom/popover/pointer/types.d.ts +2 -0
  340. package/dist/custom/radio-group/checked/checked.plugin.d.ts +45 -0
  341. package/dist/custom/radio-group/checked/checked.plugin.js +81 -0
  342. package/dist/custom/radio-group/checked/index.d.ts +1 -0
  343. package/dist/custom/radio-group/index.d.ts +3 -0
  344. package/dist/custom/radio-group/name/index.d.ts +1 -0
  345. package/dist/custom/radio-group/name/name.plugin.d.ts +21 -0
  346. package/dist/custom/radio-group/name/name.plugin.js +39 -0
  347. package/dist/custom/radio-group/stop.d.ts +17 -0
  348. package/dist/custom/radio-group/stop.js +30 -0
  349. package/dist/custom/rating/hover/hover.plugin.d.ts +36 -0
  350. package/dist/custom/rating/hover/hover.plugin.js +71 -0
  351. package/dist/custom/rating/hover/index.d.ts +2 -0
  352. package/dist/custom/rating/hover/types.d.ts +7 -0
  353. package/dist/custom/rating/index.d.ts +3 -0
  354. package/dist/custom/rating/names/index.d.ts +1 -0
  355. package/dist/custom/rating/names/names.plugin.d.ts +25 -0
  356. package/dist/custom/rating/names/names.plugin.js +45 -0
  357. package/dist/custom/rating/validity/index.d.ts +2 -0
  358. package/dist/custom/rating/validity/types.d.ts +7 -0
  359. package/dist/custom/rating/validity/validity.plugin.d.ts +48 -0
  360. package/dist/custom/rating/validity/validity.plugin.js +91 -0
  361. package/dist/custom/ready/index.d.ts +1 -0
  362. package/dist/custom/ready/ready.plugin.d.ts +14 -0
  363. package/dist/custom/ready/ready.plugin.js +28 -0
  364. package/dist/custom/scroller/index.d.ts +2 -0
  365. package/dist/custom/scroller/names/index.d.ts +1 -0
  366. package/dist/custom/scroller/names/names.plugin.d.ts +11 -0
  367. package/dist/custom/scroller/names/names.plugin.js +15 -0
  368. package/dist/custom/scroller/viewport/edges.d.ts +34 -0
  369. package/dist/custom/scroller/viewport/edges.js +29 -0
  370. package/dist/custom/scroller/viewport/focus.d.ts +39 -0
  371. package/dist/custom/scroller/viewport/focus.js +61 -0
  372. package/dist/custom/scroller/viewport/index.d.ts +6 -0
  373. package/dist/custom/scroller/viewport/stop.d.ts +24 -0
  374. package/dist/custom/scroller/viewport/stop.js +34 -0
  375. package/dist/custom/scroller/viewport/types.d.ts +31 -0
  376. package/dist/custom/scroller/viewport/viewport.plugin.d.ts +163 -0
  377. package/dist/custom/scroller/viewport/viewport.plugin.js +352 -0
  378. package/dist/custom/select/backspace/backspace.plugin.d.ts +50 -0
  379. package/dist/custom/select/backspace/backspace.plugin.js +125 -0
  380. package/dist/custom/select/backspace/index.d.ts +2 -0
  381. package/dist/custom/select/backspace/types.d.ts +2 -0
  382. package/dist/custom/select/editable/editable.plugin.d.ts +193 -0
  383. package/dist/custom/select/editable/editable.plugin.js +347 -0
  384. package/dist/custom/select/editable/index.d.ts +2 -0
  385. package/dist/custom/select/editable/types.d.ts +6 -0
  386. package/dist/custom/select/ids/ids.plugin.d.ts +22 -0
  387. package/dist/custom/select/ids/ids.plugin.js +31 -0
  388. package/dist/custom/select/ids/index.d.ts +1 -0
  389. package/dist/custom/select/index.d.ts +5 -0
  390. package/dist/custom/select/keyboard/index.d.ts +2 -0
  391. package/dist/custom/select/keyboard/keyboard.plugin.d.ts +125 -0
  392. package/dist/custom/select/keyboard/keyboard.plugin.js +205 -0
  393. package/dist/custom/select/keyboard/strategies/base.strategy.d.ts +37 -0
  394. package/dist/custom/select/keyboard/strategies/base.strategy.js +81 -0
  395. package/dist/custom/select/keyboard/strategies/editable.strategy.d.ts +16 -0
  396. package/dist/custom/select/keyboard/strategies/editable.strategy.js +20 -0
  397. package/dist/custom/select/keyboard/strategies/index.d.ts +4 -0
  398. package/dist/custom/select/keyboard/strategies/select-only.strategy.d.ts +13 -0
  399. package/dist/custom/select/keyboard/strategies/select-only.strategy.js +59 -0
  400. package/dist/custom/select/keyboard/strategies/types.d.ts +29 -0
  401. package/dist/custom/select/keyboard/types.d.ts +18 -0
  402. package/dist/custom/select/pointer/index.d.ts +2 -0
  403. package/dist/custom/select/pointer/pointer.plugin.d.ts +59 -0
  404. package/dist/custom/select/pointer/pointer.plugin.js +104 -0
  405. package/dist/custom/select/pointer/types.d.ts +2 -0
  406. package/dist/custom/skeleton/index.d.ts +2 -0
  407. package/dist/custom/skeleton/layout.plugin.d.ts +18 -0
  408. package/dist/custom/skeleton/layout.plugin.js +47 -0
  409. package/dist/custom/skeleton/types.d.ts +5 -0
  410. package/dist/custom/slide/direction.d.ts +30 -0
  411. package/dist/custom/slide/direction.js +75 -0
  412. package/dist/custom/slide/index.d.ts +4 -0
  413. package/dist/custom/slide/keyboard/index.d.ts +2 -0
  414. package/dist/custom/slide/keyboard/keyboard.plugin.d.ts +46 -0
  415. package/dist/custom/slide/keyboard/keyboard.plugin.js +106 -0
  416. package/dist/custom/slide/keyboard/types.d.ts +6 -0
  417. package/dist/custom/slide/parts.d.ts +7 -0
  418. package/dist/custom/slide/parts.js +26 -0
  419. package/dist/custom/slide/pointer/index.d.ts +2 -0
  420. package/dist/custom/slide/pointer/pointer.plugin.d.ts +100 -0
  421. package/dist/custom/slide/pointer/pointer.plugin.js +268 -0
  422. package/dist/custom/slide/pointer/strategies/base.strategy.d.ts +16 -0
  423. package/dist/custom/slide/pointer/strategies/base.strategy.js +23 -0
  424. package/dist/custom/slide/pointer/strategies/hold.strategy.d.ts +28 -0
  425. package/dist/custom/slide/pointer/strategies/hold.strategy.js +48 -0
  426. package/dist/custom/slide/pointer/strategies/index.d.ts +7 -0
  427. package/dist/custom/slide/pointer/strategies/magnet.strategy.d.ts +11 -0
  428. package/dist/custom/slide/pointer/strategies/magnet.strategy.js +17 -0
  429. package/dist/custom/slide/pointer/strategies/none.strategy.d.ts +7 -0
  430. package/dist/custom/slide/pointer/strategies/none.strategy.js +9 -0
  431. package/dist/custom/slide/pointer/strategies/plateau.strategy.d.ts +24 -0
  432. package/dist/custom/slide/pointer/strategies/plateau.strategy.js +81 -0
  433. package/dist/custom/slide/pointer/strategies/points.d.ts +16 -0
  434. package/dist/custom/slide/pointer/strategies/points.js +32 -0
  435. package/dist/custom/slide/pointer/strategies/settle.strategy.d.ts +11 -0
  436. package/dist/custom/slide/pointer/strategies/settle.strategy.js +17 -0
  437. package/dist/custom/slide/pointer/strategies/types.d.ts +57 -0
  438. package/dist/custom/slide/pointer/types.d.ts +46 -0
  439. package/dist/custom/slide/types.d.ts +14 -0
  440. package/dist/custom/table/column-ids/column-ids.plugin.d.ts +26 -0
  441. package/dist/custom/table/column-ids/column-ids.plugin.js +36 -0
  442. package/dist/custom/table/column-ids/index.d.ts +1 -0
  443. package/dist/custom/table/column-names/column-names.plugin.d.ts +18 -0
  444. package/dist/custom/table/column-names/column-names.plugin.js +24 -0
  445. package/dist/custom/table/column-names/index.d.ts +1 -0
  446. package/dist/custom/table/column-reorder/column-reorder.plugin.d.ts +169 -0
  447. package/dist/custom/table/column-reorder/column-reorder.plugin.js +465 -0
  448. package/dist/custom/table/column-reorder/index.d.ts +2 -0
  449. package/dist/custom/table/column-reorder/types.d.ts +81 -0
  450. package/dist/custom/table/column-resize/column-resize.plugin.d.ts +96 -0
  451. package/dist/custom/table/column-resize/column-resize.plugin.js +271 -0
  452. package/dist/custom/table/column-resize/index.d.ts +2 -0
  453. package/dist/custom/table/column-resize/types.d.ts +38 -0
  454. package/dist/custom/table/grid/grid.plugin.d.ts +119 -0
  455. package/dist/custom/table/grid/grid.plugin.js +356 -0
  456. package/dist/custom/table/grid/index.d.ts +2 -0
  457. package/dist/custom/table/grid/types.d.ts +22 -0
  458. package/dist/custom/table/index.d.ts +8 -0
  459. package/dist/custom/table/layout/index.d.ts +2 -0
  460. package/dist/custom/table/layout/layout.plugin.d.ts +52 -0
  461. package/dist/custom/table/layout/layout.plugin.js +122 -0
  462. package/dist/custom/table/layout/types.d.ts +7 -0
  463. package/dist/custom/table/names/index.d.ts +2 -0
  464. package/dist/custom/table/names/names.plugin.d.ts +18 -0
  465. package/dist/custom/table/names/names.plugin.js +31 -0
  466. package/dist/custom/table/names/types.d.ts +6 -0
  467. package/dist/custom/table/row-ids/index.d.ts +1 -0
  468. package/dist/custom/table/row-ids/row-ids.plugin.d.ts +21 -0
  469. package/dist/custom/table/row-ids/row-ids.plugin.js +28 -0
  470. package/dist/custom/tabs/active-tab/active-tab.plugin.d.ts +42 -0
  471. package/dist/custom/tabs/active-tab/active-tab.plugin.js +103 -0
  472. package/dist/custom/tabs/active-tab/index.d.ts +2 -0
  473. package/dist/custom/tabs/active-tab/types.d.ts +17 -0
  474. package/dist/custom/tabs/content-warn/content-warn.plugin.d.ts +21 -0
  475. package/dist/custom/tabs/content-warn/content-warn.plugin.js +41 -0
  476. package/dist/custom/tabs/content-warn/index.d.ts +1 -0
  477. package/dist/custom/tabs/index.d.ts +7 -0
  478. package/dist/custom/tabs/item-ids/index.d.ts +1 -0
  479. package/dist/custom/tabs/item-ids/item-ids.plugin.d.ts +60 -0
  480. package/dist/custom/tabs/item-ids/item-ids.plugin.js +94 -0
  481. package/dist/custom/tabs/item-names/index.d.ts +1 -0
  482. package/dist/custom/tabs/item-names/item-names.plugin.d.ts +17 -0
  483. package/dist/custom/tabs/item-names/item-names.plugin.js +23 -0
  484. package/dist/custom/tabs/keyboard/index.d.ts +2 -0
  485. package/dist/custom/tabs/keyboard/keyboard.plugin.d.ts +105 -0
  486. package/dist/custom/tabs/keyboard/keyboard.plugin.js +206 -0
  487. package/dist/custom/tabs/keyboard/types.d.ts +6 -0
  488. package/dist/custom/tabs/layout/index.d.ts +2 -0
  489. package/dist/custom/tabs/layout/layout.plugin.d.ts +37 -0
  490. package/dist/custom/tabs/layout/layout.plugin.js +81 -0
  491. package/dist/custom/tabs/layout/types.d.ts +4 -0
  492. package/dist/custom/tabs/parts.d.ts +15 -0
  493. package/dist/custom/tabs/parts.js +21 -0
  494. package/dist/custom/tabs/tab.d.ts +29 -0
  495. package/dist/custom/tabs/tab.js +44 -0
  496. package/dist/custom/tags/index.d.ts +4 -0
  497. package/dist/custom/tags/item-names/index.d.ts +1 -0
  498. package/dist/custom/tags/item-names/item-names.plugin.d.ts +12 -0
  499. package/dist/custom/tags/item-names/item-names.plugin.js +18 -0
  500. package/dist/custom/tags/keyboard/index.d.ts +2 -0
  501. package/dist/custom/tags/keyboard/keyboard.plugin.d.ts +133 -0
  502. package/dist/custom/tags/keyboard/keyboard.plugin.js +253 -0
  503. package/dist/custom/tags/keyboard/types.d.ts +6 -0
  504. package/dist/custom/tags/scroll/index.d.ts +2 -0
  505. package/dist/custom/tags/scroll/scroll.plugin.d.ts +68 -0
  506. package/dist/custom/tags/scroll/scroll.plugin.js +120 -0
  507. package/dist/custom/tags/scroll/types.d.ts +6 -0
  508. package/dist/custom/tags/tag.d.ts +41 -0
  509. package/dist/custom/tags/tag.js +66 -0
  510. package/dist/custom/textarea/autoresize/autoresize.plugin.d.ts +70 -0
  511. package/dist/custom/textarea/autoresize/autoresize.plugin.js +176 -0
  512. package/dist/custom/textarea/autoresize/index.d.ts +2 -0
  513. package/dist/custom/textarea/autoresize/types.d.ts +6 -0
  514. package/dist/custom/textarea/ids/ids.plugin.d.ts +26 -0
  515. package/dist/custom/textarea/ids/ids.plugin.js +44 -0
  516. package/dist/custom/textarea/ids/index.d.ts +1 -0
  517. package/dist/custom/textarea/index.d.ts +3 -0
  518. package/dist/custom/textarea/names/index.d.ts +2 -0
  519. package/dist/custom/textarea/names/names.plugin.d.ts +33 -0
  520. package/dist/custom/textarea/names/names.plugin.js +65 -0
  521. package/dist/custom/textarea/names/types.d.ts +8 -0
  522. package/dist/custom/toasts/cascade/cascade.plugin.d.ts +81 -0
  523. package/dist/custom/toasts/cascade/cascade.plugin.js +214 -0
  524. package/dist/custom/toasts/cascade/index.d.ts +2 -0
  525. package/dist/custom/toasts/cascade/types.d.ts +15 -0
  526. package/dist/custom/toasts/index.d.ts +7 -0
  527. package/dist/custom/toasts/item-names/index.d.ts +1 -0
  528. package/dist/custom/toasts/item-names/item-names.plugin.d.ts +12 -0
  529. package/dist/custom/toasts/item-names/item-names.plugin.js +18 -0
  530. package/dist/custom/toasts/keyboard/index.d.ts +2 -0
  531. package/dist/custom/toasts/keyboard/keyboard.plugin.d.ts +57 -0
  532. package/dist/custom/toasts/keyboard/keyboard.plugin.js +136 -0
  533. package/dist/custom/toasts/keyboard/types.d.ts +6 -0
  534. package/dist/custom/toasts/layout/index.d.ts +2 -0
  535. package/dist/custom/toasts/layout/layout.plugin.d.ts +23 -0
  536. package/dist/custom/toasts/layout/layout.plugin.js +39 -0
  537. package/dist/custom/toasts/layout/types.d.ts +5 -0
  538. package/dist/custom/toasts/names/index.d.ts +1 -0
  539. package/dist/custom/toasts/names/names.plugin.d.ts +10 -0
  540. package/dist/custom/toasts/names/names.plugin.js +13 -0
  541. package/dist/custom/toasts/removal/index.d.ts +2 -0
  542. package/dist/custom/toasts/removal/removal.plugin.d.ts +35 -0
  543. package/dist/custom/toasts/removal/removal.plugin.js +69 -0
  544. package/dist/custom/toasts/removal/types.d.ts +6 -0
  545. package/dist/custom/toasts/timer/index.d.ts +2 -0
  546. package/dist/custom/toasts/timer/timer.plugin.d.ts +71 -0
  547. package/dist/custom/toasts/timer/timer.plugin.js +213 -0
  548. package/dist/custom/toasts/timer/types.d.ts +15 -0
  549. package/dist/custom/tooltip/ids/ids.plugin.d.ts +22 -0
  550. package/dist/custom/tooltip/ids/ids.plugin.js +42 -0
  551. package/dist/custom/tooltip/ids/index.d.ts +1 -0
  552. package/dist/custom/tooltip/index.d.ts +2 -0
  553. package/dist/custom/tooltip/trigger/document-state.d.ts +42 -0
  554. package/dist/custom/tooltip/trigger/document-state.js +50 -0
  555. package/dist/custom/tooltip/trigger/index.d.ts +2 -0
  556. package/dist/custom/tooltip/trigger/trigger.plugin.d.ts +133 -0
  557. package/dist/custom/tooltip/trigger/trigger.plugin.js +271 -0
  558. package/dist/custom/tooltip/trigger/types.d.ts +20 -0
  559. package/dist/custom/virtual/index.d.ts +2 -0
  560. package/dist/custom/virtual/types.d.ts +6 -0
  561. package/dist/custom/virtual/virtual.plugin.d.ts +126 -0
  562. package/dist/custom/virtual/virtual.plugin.js +311 -0
  563. package/dist/index.d.ts +7 -0
  564. package/dist/index.js +149 -0
  565. package/dist/locale/index.d.ts +6 -0
  566. package/dist/locale/locale.d.ts +38 -0
  567. package/dist/locale/locale.js +93 -0
  568. package/dist/locale/locale.plugin.d.ts +26 -0
  569. package/dist/locale/locale.plugin.js +35 -0
  570. package/dist/locale/locales/ar.d.ts +5 -0
  571. package/dist/locale/locales/ar.js +59 -0
  572. package/dist/locale/locales/en.d.ts +7 -0
  573. package/dist/locale/locales/en.js +61 -0
  574. package/dist/locale/locales/es.d.ts +2 -0
  575. package/dist/locale/locales/es.js +56 -0
  576. package/dist/locale/locales/fr.d.ts +2 -0
  577. package/dist/locale/locales/fr.js +56 -0
  578. package/dist/locale/locales/index.d.ts +6 -0
  579. package/dist/locale/locales/ru.d.ts +2 -0
  580. package/dist/locale/locales/ru.js +56 -0
  581. package/dist/locale/locales/zh.d.ts +2 -0
  582. package/dist/locale/locales/zh.js +56 -0
  583. package/dist/locale/names.plugin.d.ts +32 -0
  584. package/dist/locale/names.plugin.js +39 -0
  585. package/dist/locale/source.class.d.ts +22 -0
  586. package/dist/locale/source.class.js +32 -0
  587. package/dist/locale/types.d.ts +197 -0
  588. package/dist/motion/index.d.ts +2 -0
  589. package/dist/motion/motion.d.ts +28 -0
  590. package/dist/motion/motion.js +67 -0
  591. package/dist/motion/types.d.ts +14 -0
  592. package/dist/utils/afterTransitions.d.ts +49 -0
  593. package/dist/utils/afterTransitions.js +79 -0
  594. package/dist/utils/focusFirst.d.ts +13 -0
  595. package/dist/utils/focusFirst.js +24 -0
  596. package/dist/utils/graceArea.d.ts +21 -0
  597. package/dist/utils/graceArea.js +66 -0
  598. package/dist/utils/index.d.ts +18 -0
  599. package/dist/utils/isAboveLayer.d.ts +14 -0
  600. package/dist/utils/isAboveLayer.js +24 -0
  601. package/dist/utils/isAppleTouch.d.ts +10 -0
  602. package/dist/utils/isAppleTouch.js +17 -0
  603. package/dist/utils/isFocusableElement.d.ts +8 -0
  604. package/dist/utils/isFocusableElement.js +13 -0
  605. package/dist/utils/isMeasurableElement.d.ts +11 -0
  606. package/dist/utils/isMeasurableElement.js +16 -0
  607. package/dist/utils/isPrintableKey.d.ts +7 -0
  608. package/dist/utils/isPrintableKey.js +12 -0
  609. package/dist/utils/layerOf.d.ts +12 -0
  610. package/dist/utils/layerOf.js +21 -0
  611. package/dist/utils/nearestShift.d.ts +19 -0
  612. package/dist/utils/nearestShift.js +58 -0
  613. package/dist/utils/positionOrigin.d.ts +34 -0
  614. package/dist/utils/positionOrigin.js +71 -0
  615. package/dist/utils/scrollParent.d.ts +12 -0
  616. package/dist/utils/scrollParent.js +23 -0
  617. package/dist/utils/scrollWindow.d.ts +27 -0
  618. package/dist/utils/scrollWindow.js +50 -0
  619. package/dist/utils/tabStops.d.ts +44 -0
  620. package/dist/utils/tabStops.js +102 -0
  621. package/dist/utils/tabStopsAfter.d.ts +10 -0
  622. package/dist/utils/tabStopsAfter.js +16 -0
  623. package/dist/utils/tabStopsBefore.d.ts +11 -0
  624. package/dist/utils/tabStopsBefore.js +17 -0
  625. package/dist/utils/toCssValue.d.ts +8 -0
  626. package/dist/utils/toCssValue.js +17 -0
  627. package/dist/utils/trapTab.d.ts +16 -0
  628. package/dist/utils/trapTab.js +36 -0
  629. package/dist/utils/types.d.ts +64 -0
  630. package/package.json +43 -4
@@ -0,0 +1,99 @@
1
+ import { isScrollable } from "../../utils/scrollParent.js";
2
+ //#region src/custom/list/row.ts
3
+ /**
4
+ * Строка элемента внутри его узла. Корень элемента — обёртка для темы, а фокус
5
+ * держит вложенная строка: на ней набор `aria` элемента, и в него коллекция
6
+ * пишет `tabindex="-1"` (ListBox, меню). Из-за этого атрибута строка и может
7
+ * держать фокус. Строка — первый узел элемента с этим атрибутом: роль у неё
8
+ * своя у каждого списка (`option` против `menuitem`), а `tabindex` — общий.
9
+ */
10
+ var ROW_SELECTOR = "[tabindex]";
11
+ /**
12
+ * Узел списка ListBox внутри его корня. Корень — рамка для темы: в нём рядом
13
+ * со списком стоят шапка и подвал, а в `listbox` ARIA пускает только опции.
14
+ * Фокус, клавиатуру и набор `aria` списка держит его узел — ребёнок корня с
15
+ * ролью из этого набора.
16
+ *
17
+ * По роли, а не по `tabindex`, как строка: шапка и подвал — тоже дети корня, и
18
+ * в них бывают свои остановки Tab (кнопка на `div` пишет себе `tabindex`), а
19
+ * роль `listbox` среди детей корня — только у узла списка. И не по классу
20
+ * темы: правило одно на клавиатуру списка (с чьего узла пришла клавиша),
21
+ * календарь (куда ставить фокус списку панели выбора), узел фокуса ListBox
22
+ * (`focusTarget` плагина действия), предел строк (`closestList`) и границу
23
+ * прокрутки списка (`scrollContainerOf`): у ListBox и у Select блок класса
24
+ * свой, а роль списка одна.
25
+ */
26
+ var LIST_SELECTOR = "[role=\"listbox\"]";
27
+ /**
28
+ * Граница прокрутки списка — узел с ролью списка: `listbox` у ListBox и
29
+ * Select, `menu` у панели меню и подменю. Выше него прокрутка списку не
30
+ * принадлежит: там панель, страница или меню над подменю.
31
+ */
32
+ var LIST_BOUNDARY_SELECTOR = `${LIST_SELECTOR}, [role="menu"]`;
33
+ /**
34
+ * Строка элемента коллекции — узел, который держит фокус внутри узла
35
+ * элемента. `null` — элемента нет в документе.
36
+ *
37
+ * Одна на клавиатуру ListBox (с чьей строки пришла клавиша) и меню (куда
38
+ * ставить фокус подсвеченному пункту): строку оба ищут одним правилом.
39
+ */
40
+ function rowOf(elements, uid) {
41
+ return rowIn(elements?.getElementByUid(uid) ?? null);
42
+ }
43
+ /**
44
+ * Строка внутри узла элемента — тем же правилом, что `rowOf`, когда узел уже
45
+ * на руках: свой корень у пункта с подменю — узел пункта в меню над ним.
46
+ *
47
+ * Она же узел фокуса элемента — ListBox.Item и пунктов меню (`focusTarget`
48
+ * плагина действия в дескрипторе): запись `focused = true` ставит фокус на
49
+ * строку, а не на обёртку элемента. Опции Select её не дают: у комбобокса
50
+ * фокус остаётся на поле. Tags.Item — тоже: у строки тега без выбора
51
+ * `tabindex` нет, и узел фокуса тега — его остановка (`tagStopIn`).
52
+ */
53
+ function rowIn(node) {
54
+ return node?.querySelector(ROW_SELECTOR) ?? null;
55
+ }
56
+ /**
57
+ * Узел списка ListBox — ребёнок его корня с ролью `listbox`. `null` — корня
58
+ * нет или узла списка в нём нет.
59
+ *
60
+ * Он же узел фокуса ListBox: запись `focused = true` ставит фокус на него, а
61
+ * не на поле или кнопку шапки (`focusTarget` плагина действия в дескрипторе).
62
+ */
63
+ function listOf(root) {
64
+ if (!root) return null;
65
+ for (const child of root.children) if (child.matches(LIST_SELECTOR)) return child;
66
+ return null;
67
+ }
68
+ /**
69
+ * Узел списка, в котором стоит элемент, — ближайший предок с ролью
70
+ * `listbox`: узел списка ListBox и список панели Select. `null` — элемент не в
71
+ * списке.
72
+ *
73
+ * Не родитель элемента: у элемента группы (`ListBox.Group`, `Select.Group`)
74
+ * родитель — группа, а предел строк держит список вокруг групп.
75
+ */
76
+ function closestList(element) {
77
+ return element.closest(LIST_SELECTOR);
78
+ }
79
+ /**
80
+ * Прокрутка списка, в котором стоит элемент, — ближайший предок его узла,
81
+ * который прокручивается по вертикали, не выше узла с ролью списка (`listbox`,
82
+ * `menu`). `null` — своей прокрутки у списка нет: элементы помещаются, список
83
+ * скрыт или прокручивает его только страница.
84
+ *
85
+ * У ListBox и Select это сам узел с ролью `listbox` — ему предел строк ставит
86
+ * `TListHeightPlugin`. У меню прокручивается список пунктов внутри панели с
87
+ * ролью `menu` (`.so-menu__list`), и `closestList` его не находит. Не
88
+ * родитель элемента: у элемента группы родитель — группа, а прокручивается
89
+ * список вокруг групп.
90
+ */
91
+ function scrollContainerOf(element) {
92
+ for (let current = element.parentElement; current; current = current.parentElement) {
93
+ if (isScrollable(current, "y")) return current;
94
+ if (current.matches(LIST_BOUNDARY_SELECTOR)) return null;
95
+ }
96
+ return null;
97
+ }
98
+ //#endregion
99
+ export { closestList, listOf, rowIn, rowOf, scrollContainerOf };
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export * from './scroll.plugin';
@@ -0,0 +1,132 @@
1
+ import { TBasePlugin } from '../../../base';
2
+ import type { IPluginContext } from '../../../base';
3
+ import type { IListScrollPluginOptions, TListScrollPluginEvents } from './types';
4
+ /**
5
+ * TListScrollPlugin — прокрутка списка к элементу: ListBox, Select, меню и
6
+ * подменю (и всего, что построено на них, — панели выбора месяца и года
7
+ * Calendar это ListBox).
8
+ *
9
+ * **Список докручивает к элементу ровно за двумя фактами** — элементу задали
10
+ * значение и на элементе встала видимая подсветка. Источник механизму
11
+ * безразличен: клик по строке, Enter и пробел, значение снаружи и
12
+ * монтирование — значение; стрелки, Home и End, буквы, наведение в меню и
13
+ * открытие с клавиатуры — подсветка. Флагов «откуда пришло» нет.
14
+ *
15
+ * - **Значение** — `change:selection` расширения выбора: к элементу, который
16
+ * стал выбранным (`newlySelected`), тем же правилом, что позиция клавиатуры
17
+ * ListBox. Не к первому выбранному: в `multiple` выбор видимого элемента
18
+ * уводил бы список к первому выбранному. Снятие выбора не крутит, а цель,
19
+ * с которой значение сняли до кадра, отменяет. У меню выбор — отметка
20
+ * флажков и переключателей. Двигается только сам список (`revealValue`):
21
+ * страница от смены значения не прыгает.
22
+ * - **Подсветка** — `change:highlight` навигации списка, класс которой задаёт
23
+ * опция `navigation` (`IListScrollPluginOptions`): событие сообщает о видимой
24
+ * отметке, и позиция без неё — за выбором, на строке, с которой ушёл Tab, —
25
+ * список не двигает. Подсвеченный элемент встаёт ближайшим краем
26
+ * (`scrollIntoView` с `block: 'nearest'`), как от фокуса: при нужде и
27
+ * страница. Подсветку сняли — её ждущая цель отменена, цель значения нет.
28
+ *
29
+ * Центр всегда не годится — клик тоже значение, и срезанная строка уехала бы
30
+ * из-под курсора; край всегда — тоже: дальний выбранный терял бы контекст.
31
+ *
32
+ * **Цель одна — последняя**, и прокрутка к ней — в следующем кадре: узел
33
+ * элемента, который окно дорисовывает, и панель, открытую той же клавишей,
34
+ * адаптер рисует после обработчика. Кадр свой и отменяемый: новая цель, снятая
35
+ * подсветка, снятие корня и уничтожение плагина отменяют его. Кадр
36
+ * планируется, только пока у плагина есть узел корня (`ready` … `removed`):
37
+ * сборка вместе с подписками идёт и на сервере, где нет ни узла, ни
38
+ * `requestAnimationFrame`.
39
+ *
40
+ * **Начальная прокрутка** — список открывается на первом выбранном. Ей нужны
41
+ * и узел корня, и движок, а приходят они порознь: движок привязывают при
42
+ * сборке, узел корня плагин получает кадром после монтирования (`ready`).
43
+ * Поэтому её зовут оба события, а срабатывает то, что пришло вторым, — в
44
+ * жизни это `ready`. Попытка — сразу, без кадра: к `ready` узлы элементов уже
45
+ * привязаны, а строки измерены и предел строк поставлен (`TListHeightPlugin`
46
+ * мерит их на том же `ready` и стоит в наборе раньше). Она мгновенная и при
47
+ * `smooth`: анимировать не от чего, а плавный проход перерисовывал бы окно на
48
+ * каждом кадре. Список скрыт — попытка ждёт его показа (ниже, «Скрытый
49
+ * список»).
50
+ *
51
+ * **Скрытый список** — закрытая панель Select, ListBox в скрытой вкладке или
52
+ * поповере — не меряется: у строк нет высоты, а у списка своей прокрутки.
53
+ * Поэтому, пока строки не измерены (`measured` плагина высоты), любая цель
54
+ * закреплена в окне и ждёт, а дождавшаяся идёт мгновенно, как начальная:
55
+ * анимировать не от чего. Строки измерились — ждущая цель сразу, в том же
56
+ * колбэке (`change:measured`): плагин высоты сообщает о замере после записи
57
+ * предела, и список встаёт уже в пределе строк. Список спрятали, а цели нет —
58
+ * её место занимает первый выбранный: при каждом показе список открывается на
59
+ * нём, как нативный `<select>`, с окном и без. Так же при показе, если цель,
60
+ * ждавшую его, сняли: с элемента сняли выбор или подсветку. Панель, открытую с
61
+ * клавиатуры, ведёт подсветка — она новее, а цель одна, последняя. Показ — факт
62
+ * раскладки, а не открытия панели: он общий у Select и ListBox в скрытой
63
+ * вкладке, и ни подписки на `open`, ни веток «клик или клавиша» здесь нет. Без
64
+ * плагина высоты (меню) строки считаются измеренными, и закрытое меню
65
+ * открывается сверху.
66
+ *
67
+ * **Цели нет в документе** — окно (обёртка `Virtual`) её не нарисовало. Тогда
68
+ * плагин закрепляет её своей причиной в рисовании коллекции (`draw.pin`), и
69
+ * окно дорисовывает её после замера, а прокрутка ждёт, когда набор цели
70
+ * зарегистрируют, и идёт кадром позже: узел адаптер привязывает после
71
+ * регистрации. Закрепление снимает следующая цель или отмена, а не сама
72
+ * прокрутка: окно перемеряется кадром позже, и без закрепления оно на этот
73
+ * кадр убрало бы цель, к которой только что прокрутили, — список мигнул бы
74
+ * распорками. Скрытый список окно не мерит, и цель в нём ждёт и замера строк,
75
+ * и своего набора — в каком порядке они ни придут.
76
+ *
77
+ * Как прокручивать, решает `scrollBehavior` владельца (`IList`): свойством
78
+ * владеет ядро, плагин его только читает, в момент прокрутки. У меню свойства
79
+ * нет — умолчание списков. `none` — прокрутки нет, `instant` — сразу,
80
+ * `smooth` — плавно, только пока режим движения библиотеки движение не убрал
81
+ * (`smoothScrollBehavior`).
82
+ */
83
+ export declare class TListScrollPlugin extends TBasePlugin<any, TListScrollPluginEvents> {
84
+ /** Узел корня: без него крутить нечего — на сервере, до `ready`, после `removed`. */
85
+ private _root;
86
+ private _owner;
87
+ private _bundles;
88
+ private _elements;
89
+ /** Плагин высоты: измерены ли строки. У меню его нет. */
90
+ private _height;
91
+ /** Куда прокрутить — одна цель, последняя; `null` — некуда. */
92
+ private _target;
93
+ /** Кадр с прокруткой к цели; `null` — кадр не запланирован. */
94
+ private _frame;
95
+ install(ctx: IPluginContext, options?: IListScrollPluginOptions): void;
96
+ destroy(): void;
97
+ /**
98
+ * Значение — к элементу, который стал выбранным (`newlySelected`). Значение
99
+ * сняли с цели, к которой ещё не прокрутили, — цель отменена: крутить к
100
+ * невыбранному незачем.
101
+ */
102
+ private _subscribeToEngine;
103
+ /**
104
+ * Начальная прокрутка к первому выбранному — когда есть и узел корня, и
105
+ * движок, и когда список спрятали или показали, а цели нет. Попытка сразу и
106
+ * мгновенно; выбранного нет — прежняя цель отменена: она от прежнего движка.
107
+ */
108
+ private _revealSelected;
109
+ /** Случился факт: цель — его элемент, прокрутка — в следующем кадре. */
110
+ private _follow;
111
+ /** Новая цель вместо прежней: кадр и закрепление прежней сняты. */
112
+ private _aim;
113
+ /** Цели больше нет: кадр отменён, закрепление снято. */
114
+ private _drop;
115
+ /** Прокрутка к цели — в следующем кадре, только при узле корня. */
116
+ private _schedule;
117
+ private _cancel;
118
+ /**
119
+ * Прокрутить к цели — по правилу её факта. Строки не измерены — список
120
+ * скрыт или только что показан: закрепить цель, сделать её мгновенной и
121
+ * ждать замера (`change:measured`). Узла у цели нет — окно её не
122
+ * нарисовало: закрепить и ждать, когда зарегистрируют её набор.
123
+ * Прокрутили — цель исполнена, а закрепление остаётся до следующей цели
124
+ * (см. описание класса).
125
+ *
126
+ * `scrollIntoView` вызывается, если он есть: в jsdom его нет. Прокрутка —
127
+ * удобство, а не часть контракта.
128
+ */
129
+ private _attempt;
130
+ /** Рисование коллекции — у списков в окне; у меню его нет, и закреплять нечего. */
131
+ private _draw;
132
+ }
@@ -0,0 +1,286 @@
1
+ import { TBasePlugin } from "../../../base/base.class.js";
2
+ import { TCollectionBundlesPlugin } from "../../collection/bundles.plugin.js";
3
+ import { TElementPlugin } from "../../element/element.plugin.js";
4
+ import { TCollectionElements } from "../../collection/collection-elements.plugin.js";
5
+ import { scrollContainerOf } from "../row.js";
6
+ import { TListHeightPlugin } from "../height/height.plugin.js";
7
+ import { newlySelected } from "../newly-selected.js";
8
+ import { smoothScrollBehavior } from "../../../motion/motion.js";
9
+ import { LIST_DEFAULTS, drawOf, selectionOf } from "@soxa-ui/core";
10
+ //#region src/custom/list/scroll/scroll.plugin.ts
11
+ /** Причина закрепления цели в окне коллекции — к ней крутит прокрутка. */
12
+ var SCROLL = "scroll";
13
+ /**
14
+ * Допуск на субпиксельное округление: край, вышедший из окна списка на
15
+ * полпикселя, — ещё в окне. Список встаёт на целый пиксель, а края элементов
16
+ * дробные.
17
+ */
18
+ var TOLERANCE = .5;
19
+ /**
20
+ * Значение двигает только прокрутку самого списка, страница стоит. Элемент
21
+ * виден целиком — ничего; частью — до ближайшего края окна списка: срезанная
22
+ * строка после клика встаёт целиком и остаётся под курсором; не виден вовсе —
23
+ * в середину окна: дальний выбранный (монтирование, список лет) виден вместе с
24
+ * соседями. Окно — паддинг-бокс прокрутки. Своей прокрутки у списка нет
25
+ * (`scrollContainerOf`) — ничего: элементы помещаются или список скрыт.
26
+ */
27
+ function revealValue(node, behavior) {
28
+ const container = scrollContainerOf(node);
29
+ if (!container) return;
30
+ const top = container.getBoundingClientRect().top + container.clientTop;
31
+ const bottom = top + container.clientHeight;
32
+ const rect = node.getBoundingClientRect();
33
+ if (rect.top >= top - TOLERANCE && rect.bottom <= bottom + TOLERANCE) return;
34
+ let shift = rect.top + rect.height / 2 - (top + bottom) / 2;
35
+ if (rect.bottom > top && rect.top < bottom) shift = rect.top < top ? rect.top - top : rect.bottom - bottom;
36
+ container.scrollTo({
37
+ top: container.scrollTop + shift,
38
+ behavior
39
+ });
40
+ }
41
+ /**
42
+ * TListScrollPlugin — прокрутка списка к элементу: ListBox, Select, меню и
43
+ * подменю (и всего, что построено на них, — панели выбора месяца и года
44
+ * Calendar это ListBox).
45
+ *
46
+ * **Список докручивает к элементу ровно за двумя фактами** — элементу задали
47
+ * значение и на элементе встала видимая подсветка. Источник механизму
48
+ * безразличен: клик по строке, Enter и пробел, значение снаружи и
49
+ * монтирование — значение; стрелки, Home и End, буквы, наведение в меню и
50
+ * открытие с клавиатуры — подсветка. Флагов «откуда пришло» нет.
51
+ *
52
+ * - **Значение** — `change:selection` расширения выбора: к элементу, который
53
+ * стал выбранным (`newlySelected`), тем же правилом, что позиция клавиатуры
54
+ * ListBox. Не к первому выбранному: в `multiple` выбор видимого элемента
55
+ * уводил бы список к первому выбранному. Снятие выбора не крутит, а цель,
56
+ * с которой значение сняли до кадра, отменяет. У меню выбор — отметка
57
+ * флажков и переключателей. Двигается только сам список (`revealValue`):
58
+ * страница от смены значения не прыгает.
59
+ * - **Подсветка** — `change:highlight` навигации списка, класс которой задаёт
60
+ * опция `navigation` (`IListScrollPluginOptions`): событие сообщает о видимой
61
+ * отметке, и позиция без неё — за выбором, на строке, с которой ушёл Tab, —
62
+ * список не двигает. Подсвеченный элемент встаёт ближайшим краем
63
+ * (`scrollIntoView` с `block: 'nearest'`), как от фокуса: при нужде и
64
+ * страница. Подсветку сняли — её ждущая цель отменена, цель значения нет.
65
+ *
66
+ * Центр всегда не годится — клик тоже значение, и срезанная строка уехала бы
67
+ * из-под курсора; край всегда — тоже: дальний выбранный терял бы контекст.
68
+ *
69
+ * **Цель одна — последняя**, и прокрутка к ней — в следующем кадре: узел
70
+ * элемента, который окно дорисовывает, и панель, открытую той же клавишей,
71
+ * адаптер рисует после обработчика. Кадр свой и отменяемый: новая цель, снятая
72
+ * подсветка, снятие корня и уничтожение плагина отменяют его. Кадр
73
+ * планируется, только пока у плагина есть узел корня (`ready` … `removed`):
74
+ * сборка вместе с подписками идёт и на сервере, где нет ни узла, ни
75
+ * `requestAnimationFrame`.
76
+ *
77
+ * **Начальная прокрутка** — список открывается на первом выбранном. Ей нужны
78
+ * и узел корня, и движок, а приходят они порознь: движок привязывают при
79
+ * сборке, узел корня плагин получает кадром после монтирования (`ready`).
80
+ * Поэтому её зовут оба события, а срабатывает то, что пришло вторым, — в
81
+ * жизни это `ready`. Попытка — сразу, без кадра: к `ready` узлы элементов уже
82
+ * привязаны, а строки измерены и предел строк поставлен (`TListHeightPlugin`
83
+ * мерит их на том же `ready` и стоит в наборе раньше). Она мгновенная и при
84
+ * `smooth`: анимировать не от чего, а плавный проход перерисовывал бы окно на
85
+ * каждом кадре. Список скрыт — попытка ждёт его показа (ниже, «Скрытый
86
+ * список»).
87
+ *
88
+ * **Скрытый список** — закрытая панель Select, ListBox в скрытой вкладке или
89
+ * поповере — не меряется: у строк нет высоты, а у списка своей прокрутки.
90
+ * Поэтому, пока строки не измерены (`measured` плагина высоты), любая цель
91
+ * закреплена в окне и ждёт, а дождавшаяся идёт мгновенно, как начальная:
92
+ * анимировать не от чего. Строки измерились — ждущая цель сразу, в том же
93
+ * колбэке (`change:measured`): плагин высоты сообщает о замере после записи
94
+ * предела, и список встаёт уже в пределе строк. Список спрятали, а цели нет —
95
+ * её место занимает первый выбранный: при каждом показе список открывается на
96
+ * нём, как нативный `<select>`, с окном и без. Так же при показе, если цель,
97
+ * ждавшую его, сняли: с элемента сняли выбор или подсветку. Панель, открытую с
98
+ * клавиатуры, ведёт подсветка — она новее, а цель одна, последняя. Показ — факт
99
+ * раскладки, а не открытия панели: он общий у Select и ListBox в скрытой
100
+ * вкладке, и ни подписки на `open`, ни веток «клик или клавиша» здесь нет. Без
101
+ * плагина высоты (меню) строки считаются измеренными, и закрытое меню
102
+ * открывается сверху.
103
+ *
104
+ * **Цели нет в документе** — окно (обёртка `Virtual`) её не нарисовало. Тогда
105
+ * плагин закрепляет её своей причиной в рисовании коллекции (`draw.pin`), и
106
+ * окно дорисовывает её после замера, а прокрутка ждёт, когда набор цели
107
+ * зарегистрируют, и идёт кадром позже: узел адаптер привязывает после
108
+ * регистрации. Закрепление снимает следующая цель или отмена, а не сама
109
+ * прокрутка: окно перемеряется кадром позже, и без закрепления оно на этот
110
+ * кадр убрало бы цель, к которой только что прокрутили, — список мигнул бы
111
+ * распорками. Скрытый список окно не мерит, и цель в нём ждёт и замера строк,
112
+ * и своего набора — в каком порядке они ни придут.
113
+ *
114
+ * Как прокручивать, решает `scrollBehavior` владельца (`IList`): свойством
115
+ * владеет ядро, плагин его только читает, в момент прокрутки. У меню свойства
116
+ * нет — умолчание списков. `none` — прокрутки нет, `instant` — сразу,
117
+ * `smooth` — плавно, только пока режим движения библиотеки движение не убрал
118
+ * (`smoothScrollBehavior`).
119
+ */
120
+ var TListScrollPlugin = class extends TBasePlugin {
121
+ /** Узел корня: без него крутить нечего — на сервере, до `ready`, после `removed`. */
122
+ _root = null;
123
+ _owner = null;
124
+ _bundles = null;
125
+ _elements = null;
126
+ /** Плагин высоты: измерены ли строки. У меню его нет. */
127
+ _height = null;
128
+ /** Куда прокрутить — одна цель, последняя; `null` — некуда. */
129
+ _target = null;
130
+ /** Кадр с прокруткой к цели; `null` — кадр не запланирован. */
131
+ _frame = null;
132
+ install(ctx, options) {
133
+ super.install(ctx, options);
134
+ this._owner = ctx.getInstance();
135
+ this._bundles = ctx.get(TCollectionBundlesPlugin) ?? null;
136
+ this._elements = ctx.get(TCollectionElements) ?? null;
137
+ this._height = ctx.get(TListHeightPlugin) ?? null;
138
+ const elementPlugin = ctx.get(TElementPlugin);
139
+ elementPlugin?.events.on("ready", (element) => {
140
+ this._root = element;
141
+ this._revealSelected();
142
+ });
143
+ elementPlugin?.events.on("removed", () => {
144
+ this._root = null;
145
+ this._drop();
146
+ });
147
+ this._bundles?.events.on("engine:bound", (engine) => {
148
+ this._subscribeToEngine(engine);
149
+ this._revealSelected();
150
+ });
151
+ this._bundles?.events.on("bundle:registered", ({ uid }) => {
152
+ if (uid === this._target?.item.uid) this._schedule();
153
+ });
154
+ this._height?.events.on("change:measured", ({ newValue: measured }) => {
155
+ if (!this._target) this._revealSelected();
156
+ else if (measured) this._attempt();
157
+ });
158
+ (options?.navigation ? ctx.get(options.navigation) : void 0)?.events.on("change:highlight", ({ newValue: { item } }) => {
159
+ if (item) this._follow(item, "highlight");
160
+ else if (this._target?.fact === "highlight") this._drop();
161
+ });
162
+ }
163
+ destroy() {
164
+ this._drop();
165
+ this._root = null;
166
+ this._owner = null;
167
+ this._bundles = null;
168
+ this._elements = null;
169
+ this._height = null;
170
+ super.destroy();
171
+ }
172
+ /**
173
+ * Значение — к элементу, который стал выбранным (`newlySelected`). Значение
174
+ * сняли с цели, к которой ещё не прокрутили, — цель отменена: крутить к
175
+ * невыбранному незачем.
176
+ */
177
+ _subscribeToEngine(engine) {
178
+ this._listenTo(selectionOf(engine)?.events, "change:selection", (items, changed) => {
179
+ const item = newlySelected(items, changed);
180
+ const target = this._target;
181
+ if (item) this._follow(item, "value");
182
+ else if (target?.fact === "value" && !items.includes(target.item)) this._drop();
183
+ });
184
+ }
185
+ /**
186
+ * Начальная прокрутка к первому выбранному — когда есть и узел корня, и
187
+ * движок, и когда список спрятали или показали, а цели нет. Попытка сразу и
188
+ * мгновенно; выбранного нет — прежняя цель отменена: она от прежнего движка.
189
+ */
190
+ _revealSelected() {
191
+ const engine = this._bundles?.engine;
192
+ if (!this._root || !engine) return;
193
+ const [selected] = selectionOf(engine)?.selected ?? [];
194
+ if (!selected) {
195
+ this._drop();
196
+ return;
197
+ }
198
+ this._aim({
199
+ item: selected,
200
+ fact: "value",
201
+ instant: true
202
+ });
203
+ this._attempt();
204
+ }
205
+ /** Случился факт: цель — его элемент, прокрутка — в следующем кадре. */
206
+ _follow(item, fact) {
207
+ if (!this._root) return;
208
+ this._aim({
209
+ item,
210
+ fact,
211
+ instant: false
212
+ });
213
+ this._schedule();
214
+ }
215
+ /** Новая цель вместо прежней: кадр и закрепление прежней сняты. */
216
+ _aim(target) {
217
+ this._drop();
218
+ this._target = target;
219
+ }
220
+ /** Цели больше нет: кадр отменён, закрепление снято. */
221
+ _drop() {
222
+ this._cancel();
223
+ this._target = null;
224
+ this._draw()?.pin(SCROLL, void 0);
225
+ }
226
+ /** Прокрутка к цели — в следующем кадре, только при узле корня. */
227
+ _schedule() {
228
+ this._cancel();
229
+ if (!this._root) return;
230
+ this._frame = requestAnimationFrame(() => {
231
+ this._frame = null;
232
+ this._attempt();
233
+ });
234
+ }
235
+ _cancel() {
236
+ if (this._frame === null) return;
237
+ cancelAnimationFrame(this._frame);
238
+ this._frame = null;
239
+ }
240
+ /**
241
+ * Прокрутить к цели — по правилу её факта. Строки не измерены — список
242
+ * скрыт или только что показан: закрепить цель, сделать её мгновенной и
243
+ * ждать замера (`change:measured`). Узла у цели нет — окно её не
244
+ * нарисовало: закрепить и ждать, когда зарегистрируют её набор.
245
+ * Прокрутили — цель исполнена, а закрепление остаётся до следующей цели
246
+ * (см. описание класса).
247
+ *
248
+ * `scrollIntoView` вызывается, если он есть: в jsdom его нет. Прокрутка —
249
+ * удобство, а не часть контракта.
250
+ */
251
+ _attempt() {
252
+ const target = this._target;
253
+ if (!target || !this._root) return;
254
+ const behavior = this._owner?.scrollBehavior ?? LIST_DEFAULTS.scrollBehavior;
255
+ if (behavior === "none") {
256
+ this._drop();
257
+ return;
258
+ }
259
+ if (!(this._height?.measured ?? true)) {
260
+ this._target = {
261
+ ...target,
262
+ instant: true
263
+ };
264
+ this._draw()?.pin(SCROLL, target.item);
265
+ return;
266
+ }
267
+ const node = this._elements?.getElementByUid(target.item.uid) ?? null;
268
+ if (!node) {
269
+ this._draw()?.pin(SCROLL, target.item);
270
+ return;
271
+ }
272
+ this._target = null;
273
+ const scroll = target.instant || behavior === "instant" ? "instant" : smoothScrollBehavior(node);
274
+ if (target.fact === "highlight") node.scrollIntoView?.({
275
+ block: "nearest",
276
+ behavior: scroll
277
+ });
278
+ else revealValue(node, scroll);
279
+ }
280
+ /** Рисование коллекции — у списков в окне; у меню его нет, и закреплять нечего. */
281
+ _draw() {
282
+ return drawOf(this._bundles?.engine);
283
+ }
284
+ };
285
+ //#endregion
286
+ export { TListScrollPlugin };
@@ -0,0 +1,21 @@
1
+ import type { IPluginConstructor, TPluginEvents } from '../../../base';
2
+ import type { TListNavigationPlugin } from '../navigation';
3
+ export type TListScrollPluginEvents = TPluginEvents & {
4
+ 'change:scroll': () => void;
5
+ };
6
+ export interface IListScrollPluginOptions {
7
+ /**
8
+ * Навигация списка — класс плагина, за чьей видимой подсветкой
9
+ * (`change:highlight`) идёт прокрутка: `TListKeyboardPlugin` у ListBox,
10
+ * `TSelectKeyboardPlugin` у Select, `TMenuKeyboardPlugin` у меню,
11
+ * `TMenuSubmenuKeyboardPlugin` у подменю. Стоит в наборе раньше прокрутки.
12
+ *
13
+ * Опцией, а не поиском в наборе: набор находит плагин по точному классу
14
+ * (`ctx.get`), а наследников у базы навигации четыре. Не задана —
15
+ * прокрутка идёт только за значением.
16
+ *
17
+ * `any` — карта событий наследника инвариантна и бывает шире базовой (у
18
+ * Select — `escape`), а событие подсветки у всех наследников одно.
19
+ */
20
+ navigation?: IPluginConstructor<any, any, TListNavigationPlugin<any, any>>;
21
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Набор по первым буквам (APG, «type-ahead»): буква ведёт подсветку к
3
+ * элементу, чей текст с неё начинается.
4
+ *
5
+ * Правило одно на списки с подсветкой — меню и комбобокс Select. Поэтому оно
6
+ * — модуль с буфером и поиском, а не метод одного плагина: подсветку и
7
+ * клавиши каждый плагин держит сам, а что считать набором и куда он ведёт,
8
+ * решает этот модуль.
9
+ *
10
+ * - Буквы, набранные быстрее паузы (`timeout`), — одно слово: «со» ищет
11
+ * «Сохранить», а не следующий пункт на «о».
12
+ * - Поиск идёт по кругу от подсвеченного элемента. Слово ищется с него
13
+ * самого: дописанная буква не уводит с элемента, который ещё подходит.
14
+ * Одна буква ищется со следующего — так повтор буквы ходит по элементам на
15
+ * неё («с», «с», «с» — «Сохранить», «Сохранить как», «Создать»), и
16
+ * повторённая буква («ссс») значит то же, что одна.
17
+ * - Совпадения нет — подсветка остаётся на месте.
18
+ *
19
+ * Регистр не важен. Элементы — те, по которым идёт навигация: недоступные
20
+ * плагин отсеивает сам.
21
+ */
22
+ /** Пауза, после которой следующая буква начинает новый набор, мс. */
23
+ export declare const TYPEAHEAD_TIMEOUT = 500;
24
+ /**
25
+ * Текст элемента, по которому идёт набор, — его `text`. У элемента без
26
+ * текста — пусто, и набор его не находит.
27
+ */
28
+ export declare const itemText: (item: object) => string;
29
+ export declare class TTypeahead {
30
+ private readonly _timeout;
31
+ private _query;
32
+ private _at;
33
+ /** @param timeout — пауза, после которой следующая буква начинает новый набор, мс */
34
+ constructor(_timeout?: number);
35
+ /**
36
+ * Идёт ли набор: с последней буквы прошло не больше паузы. Пока он идёт,
37
+ * пробел — тоже буква («Сохранить как»), а не нажатие элемента.
38
+ */
39
+ typing(now?: number): boolean;
40
+ /**
41
+ * Буква набора: продолжить слово или начать новое — и найти элемент.
42
+ *
43
+ * @param char — набранная буква
44
+ * @param items — элементы по порядку, по которым идёт навигация
45
+ * @param current — подсвеченный элемент; `null` — поиск с первого
46
+ * @param textOf — текст элемента, по которому идёт сравнение
47
+ * @returns элемент, на который встать, или `null` — совпадения нет, и
48
+ * подсветка остаётся на месте
49
+ */
50
+ next<TItem>(char: string, items: readonly TItem[], current: TItem | null, textOf: (item: TItem) => string, now?: number): TItem | null;
51
+ /** Сбросить набор: следующая буква начнёт новый. */
52
+ reset(): void;
53
+ }