@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,206 @@
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 { isFocusableElement } from "../../../utils/isFocusableElement.js";
6
+ import { tabStopsAfter } from "../../../utils/tabStopsAfter.js";
7
+ import { focusFirst } from "../../../utils/focusFirst.js";
8
+ import { listOf } from "../parts.js";
9
+ import { TLeavingFocus } from "../../collection/leaving-focus.js";
10
+ import { tabOf } from "../tab.js";
11
+ //#region src/custom/tabs/keyboard/keyboard.plugin.ts
12
+ /** Стрелки «к предыдущему» и «к следующему» — на оси ориентации списка. */
13
+ var AXIS_KEYS = {
14
+ horizontal: ["ArrowLeft", "ArrowRight"],
15
+ vertical: ["ArrowUp", "ArrowDown"]
16
+ };
17
+ /**
18
+ * TTabsKeyboardPlugin — клавиатура Tabs по паттерну APG Tabs и фокус после
19
+ * закрытия таба.
20
+ *
21
+ * Стрелки по оси списка (у горизонтального ←/→, у вертикального ↑/↓) ведут к
22
+ * соседнему табу по кругу, `Home`/`End` — к первому и последнему. Табы, на
23
+ * которые нельзя перейти (`TTabsExtension.isEnabledTab`), пропускаются.
24
+ * `Delete` закрывает таб, если его можно закрыть.
25
+ *
26
+ * **Активация автоматическая**: переход сразу активирует таб. APG советует
27
+ * так, когда панель показывается без задержки, а `Tabs.Content` рисуется
28
+ * локально. Поэтому фокус и активный таб не расходятся, и остановка Tab —
29
+ * активный таб — считается в коллекции без знания о фокусе. `Enter` и пробел
30
+ * здесь не обрабатываются: таб — нативная `<button>`, и активирует её клик.
31
+ *
32
+ * **Закрытый таб отдаёт фокус остановке Tab** — любым закрытием: клавишей,
33
+ * крестиком, из кода. Крестик фокус от клика принимает, и узел таба уходит из
34
+ * документа вместе с ним: фокус ушёл бы на страницу, и следующий Tab начинал
35
+ * бы обход заново. Переносится только фокус из узла закрываемого таба — на
36
+ * таб-остановку после удаления (`tabStop`): закрыли активный — это сосед,
37
+ * которого уже активировал `TTabsExtension`; закрыли неактивный — прежний
38
+ * активный, соседа такое закрытие не активирует. Остановки нет — к первой
39
+ * остановке Tab после списка; нет и её — фокус не трогается.
40
+ *
41
+ * Когда переносить фокус, решает помощник коллекции (`TLeavingFocus`), общий с
42
+ * Tags: таб бывает снят ещё до того, как закрытие дойдёт до плагина, —
43
+ * подписчиком `item:close`, который стоит раньше, например приложением в
44
+ * обработчике события фасада. Удаление, отменённое в `item:remove:before`, и
45
+ * уход таба без закрытия фокус не трогают. Закрыть таб из кода можно и на
46
+ * сервере, поэтому фокус читается только при узле корня.
47
+ *
48
+ * Сами `tabindex` плагин не пишет: roving tabindex ставит `TTabsExtension`,
49
+ * потому что атрибут обязан стоять с первой отрисовки, включая серверную.
50
+ * Здесь только то, что требует DOM: слушатель клавиш и перенос фокуса.
51
+ *
52
+ * От `TListNavigationPlugin` не наследуется: там модель подсветки при фокусе
53
+ * на контейнере, а у табов по APG фокус ходит по самим табам (см. AGENTS.md,
54
+ * «Граница переиспользования между похожими компонентами»).
55
+ */
56
+ var TTabsKeyboardPlugin = class extends TBasePlugin {
57
+ _owner = null;
58
+ /** Корень: на нём слушатель, по нему же направление письма. */
59
+ _element = null;
60
+ _elements = null;
61
+ _engine = null;
62
+ /** Фокус закрываемого таба — ждёт, пока таб закроют и он уйдёт из списка. */
63
+ _leaving = null;
64
+ install(ctx) {
65
+ super.install(ctx);
66
+ this._owner = ctx.getInstance();
67
+ this._elements = ctx.get(TCollectionElements) ?? null;
68
+ this._leaving = new TLeavingFocus(this._elements, {
69
+ root: () => this._element,
70
+ place: () => void 0,
71
+ pass: (root) => this._pass(root)
72
+ });
73
+ const elementPlugin = ctx.get(TElementPlugin);
74
+ elementPlugin?.events.on("ready", (element) => this._attach(element));
75
+ elementPlugin?.events.on("removed", () => {
76
+ this._detach();
77
+ this._leaving?.reset();
78
+ });
79
+ ctx.get(TCollectionBundlesPlugin)?.events.on("engine:bound", (engine) => this._bindEngine(engine));
80
+ }
81
+ destroy() {
82
+ this._detach();
83
+ this._bindEngine(null);
84
+ this._owner = null;
85
+ this._elements = null;
86
+ this._leaving = null;
87
+ super.destroy();
88
+ }
89
+ _attach(element) {
90
+ this._detach();
91
+ this._element = element;
92
+ element.addEventListener("keydown", this._onKeyDown);
93
+ }
94
+ _detach() {
95
+ this._element?.removeEventListener("keydown", this._onKeyDown);
96
+ this._element = null;
97
+ }
98
+ /** Движок сменился — закрытие табов и их уход слушаются у нового. */
99
+ _bindEngine(engine) {
100
+ this._engine?.extensions.tabs.events.off("item:close", this._onClose);
101
+ this._engine = engine;
102
+ engine?.extensions.tabs.events.on("item:close", this._onClose);
103
+ this._leaving?.bind(engine?.extensions.plain ?? null);
104
+ }
105
+ _onKeyDown = (event) => {
106
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
107
+ const engine = this._engine;
108
+ if (!engine) return;
109
+ const tab = this._tabOf(engine, event.target);
110
+ if (!tab) return;
111
+ if (event.key === "Delete") {
112
+ if (engine.extensions.tabs.closeTab(tab)) event.preventDefault();
113
+ return;
114
+ }
115
+ const candidates = this._candidates(engine, event.key, tab);
116
+ if (candidates.length === 0) return;
117
+ event.preventDefault();
118
+ const next = candidates.find((item) => engine.extensions.activation.activate(item));
119
+ if (next) this._focus(next);
120
+ };
121
+ /**
122
+ * Таб, с которого пришла клавиша, — тот, чей узел содержит цель события.
123
+ *
124
+ * Слушатель висит на корне, и до него всплывают клавиши панелей, слотов
125
+ * списка и вложенных Tabs: их перехватывать нельзя. Кнопка закрытия лежит
126
+ * внутри узла таба и считается его частью.
127
+ */
128
+ _tabOf(engine, target) {
129
+ if (!(target instanceof Node)) return void 0;
130
+ return engine.extensions.batch.shown.find((item) => this._elements?.getElementByUid(item.uid)?.contains(target));
131
+ }
132
+ /**
133
+ * Куда ведёт клавиша — табы по порядку, от первого кандидата; пусто —
134
+ * клавиша не наша или перейти некуда. `Home` идёт от первого вперёд,
135
+ * `End` — от последнего назад, стрелка — от соседа в своём направлении.
136
+ */
137
+ _candidates(engine, key, tab) {
138
+ if (key === "Home") return this._available(engine);
139
+ if (key === "End") return this._available(engine).reverse();
140
+ const step = this._step(key);
141
+ return step === null ? [] : this._neighbours(engine, tab, step);
142
+ }
143
+ /**
144
+ * Шаг по списку от стрелки; клавиши чужой оси не перехватываются. В RTL
145
+ * горизонтальный список идёт справа налево, и ←/→ меняются местами.
146
+ */
147
+ _step(key) {
148
+ const orientation = this._owner?.orientation ?? "horizontal";
149
+ const [back, forward] = AXIS_KEYS[orientation];
150
+ const step = key === forward ? 1 : key === back ? -1 : null;
151
+ if (step === null || orientation === "vertical") return step;
152
+ return this._rtl ? -step : step;
153
+ }
154
+ /**
155
+ * Направление письма берётся вычисленным: `direction` компонента бывает
156
+ * `inherit`, и тогда его задаёт предок.
157
+ */
158
+ get _rtl() {
159
+ return this._element !== null && getComputedStyle(this._element).direction === "rtl";
160
+ }
161
+ /** Табы в порядке списка, на которые можно перейти. */
162
+ _available(engine) {
163
+ return engine.extensions.batch.shown.filter((item) => engine.extensions.tabs.isEnabledTab(item));
164
+ }
165
+ /**
166
+ * Табы в направлении шага, по кругу, от ближайшего: с последнего вперёд —
167
+ * на первый. Отсчёт от позиции таба в списке, а не среди доступных: таб
168
+ * могли выключить, пока на нём фокус.
169
+ */
170
+ _neighbours(engine, tab, step) {
171
+ const shown = engine.extensions.batch.shown;
172
+ const count = shown.length;
173
+ const from = shown.indexOf(tab);
174
+ const neighbours = [];
175
+ for (let offset = 1; offset <= count; offset++) {
176
+ const candidate = shown[((from + step * offset) % count + count) % count];
177
+ if (engine.extensions.tabs.isEnabledTab(candidate)) neighbours.push(candidate);
178
+ }
179
+ return neighbours;
180
+ }
181
+ /** Фокус на узел таба с ролью. Гард нужен: узел плагину приходит `Element`. */
182
+ _focus(item) {
183
+ const tab = tabOf(this._elements, item.uid);
184
+ if (isFocusableElement(tab)) tab.focus();
185
+ }
186
+ /**
187
+ * Таб закрывают — любым путём: клавишей, крестиком, из кода. Переносить
188
+ * ли фокус, решает помощник: фокус мог стоять и не в этом табе.
189
+ */
190
+ _onClose = (tab) => this._leaving?.close(tab);
191
+ /**
192
+ * Фокус закрытого таба — на таб-остановку. Остановка берётся по модели
193
+ * (`tabStop`), а не по `[tabindex="0"]`: в такте закрытия разметка ещё
194
+ * старая. Остановки нет — на первую остановку Tab после списка: за ним
195
+ * слот `trailing` и панели; нет и её — фокус остаётся, где был.
196
+ */
197
+ _pass(root) {
198
+ const stop = this._engine?.extensions.tabs.tabStop;
199
+ const tab = stop ? tabOf(this._elements, stop.uid) : null;
200
+ if (tab && focusFirst([tab])) return;
201
+ const list = this._owner ? listOf(this._owner, root) : null;
202
+ if (list) focusFirst(tabStopsAfter(list, null));
203
+ }
204
+ };
205
+ //#endregion
206
+ export { TTabsKeyboardPlugin };
@@ -0,0 +1,6 @@
1
+ import type { TPluginEvents } from '../../../base';
2
+ /**
3
+ * Своих событий у плагина нет: результат нажатия виден и так — активацию
4
+ * сообщает коллекция (`change:activation`), фокус — DOM.
5
+ */
6
+ export type TTabsKeyboardPluginEvents = TPluginEvents;
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export * from './layout.plugin';
@@ -0,0 +1,37 @@
1
+ import type { ITabs } from '@soxa-ui/core';
2
+ import { TBasePlugin } from '../../../base';
3
+ import type { IPluginContext } from '../../../base';
4
+ import type { TTabsLayoutPluginEvents } from './types';
5
+ /**
6
+ * TTabsLayoutPlugin — отслеживает изменения размеров табов через ResizeObserver.
7
+ *
8
+ * Наблюдает:
9
+ * - корень набора;
10
+ * - свой список табов — ребёнка своего ряда. При выравнивании `center` и `end`
11
+ * слот ряда меняет ширину, и табы сдвигаются, а размеры табов и корня — нет:
12
+ * меняется только место, которое список забирает между слотами;
13
+ * - DOM-элементы каждого таба (через реестр bundles + TElementPlugin).
14
+ *
15
+ * Эмитит change:layout при изменении размеров — нужно для обновления позиции/размера
16
+ * активного таба, по которым тема рисует его отметку, и при переносе табов на
17
+ * другую строку.
18
+ *
19
+ * Все наблюдатели смотрят border-box: наблюдать надо ровно то, что меряется
20
+ * по `change:layout`, — `TTabsActiveTabPlugin` берёт позицию и размер таба из
21
+ * `offsetLeft`/`offsetTop` и `offsetWidth`/`offsetHeight`. Умолчание
22
+ * `content-box` пропустило бы смену одного паддинга или рамки таба (паддинг
23
+ * по размеру, толщина рамки по состоянию), и геометрия активного таба
24
+ * держалась бы по старому размеру до ближайшего пересчёта по другой причине.
25
+ */
26
+ export declare class TTabsLayoutPlugin extends TBasePlugin<ITabs, TTabsLayoutPluginEvents> {
27
+ private _tabs;
28
+ private _rootObserver;
29
+ private _listObserver;
30
+ private readonly _itemObservers;
31
+ install(ctx: IPluginContext): void;
32
+ destroy(): void;
33
+ /** Наблюдатель размеров узла по border-box (см. шапку). */
34
+ private _observe;
35
+ /** Снять наблюдение за корнем и списком: узел снят, заменён или плагин уничтожен. */
36
+ private _disconnect;
37
+ }
@@ -0,0 +1,81 @@
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 { listOf } from "../parts.js";
5
+ //#region src/custom/tabs/layout/layout.plugin.ts
6
+ /**
7
+ * TTabsLayoutPlugin — отслеживает изменения размеров табов через ResizeObserver.
8
+ *
9
+ * Наблюдает:
10
+ * - корень набора;
11
+ * - свой список табов — ребёнка своего ряда. При выравнивании `center` и `end`
12
+ * слот ряда меняет ширину, и табы сдвигаются, а размеры табов и корня — нет:
13
+ * меняется только место, которое список забирает между слотами;
14
+ * - DOM-элементы каждого таба (через реестр bundles + TElementPlugin).
15
+ *
16
+ * Эмитит change:layout при изменении размеров — нужно для обновления позиции/размера
17
+ * активного таба, по которым тема рисует его отметку, и при переносе табов на
18
+ * другую строку.
19
+ *
20
+ * Все наблюдатели смотрят border-box: наблюдать надо ровно то, что меряется
21
+ * по `change:layout`, — `TTabsActiveTabPlugin` берёт позицию и размер таба из
22
+ * `offsetLeft`/`offsetTop` и `offsetWidth`/`offsetHeight`. Умолчание
23
+ * `content-box` пропустило бы смену одного паддинга или рамки таба (паддинг
24
+ * по размеру, толщина рамки по состоянию), и геометрия активного таба
25
+ * держалась бы по старому размеру до ближайшего пересчёта по другой причине.
26
+ */
27
+ var TTabsLayoutPlugin = class extends TBasePlugin {
28
+ _tabs = null;
29
+ _rootObserver = null;
30
+ _listObserver = null;
31
+ _itemObservers = /* @__PURE__ */ new Map();
32
+ install(ctx) {
33
+ super.install(ctx);
34
+ this._tabs = ctx.getInstance();
35
+ ctx.get(TElementPlugin)?.events.on("ready", (element) => {
36
+ this._disconnect();
37
+ this._rootObserver = this._observe(element);
38
+ const list = this._tabs ? listOf(this._tabs, element) : null;
39
+ this._listObserver = list ? this._observe(list) : null;
40
+ });
41
+ ctx.get(TElementPlugin)?.events.on("removed", () => this._disconnect());
42
+ const bundles = ctx.get(TCollectionBundlesPlugin);
43
+ bundles?.events.on("bundle:registered", ({ uid, bundle }) => {
44
+ const elementPlugin = bundle.get(TElementPlugin);
45
+ elementPlugin?.events.on("ready", (element) => {
46
+ this._itemObservers.get(uid)?.disconnect();
47
+ this._itemObservers.set(uid, this._observe(element));
48
+ });
49
+ elementPlugin?.events.on("removed", () => {
50
+ this._itemObservers.get(uid)?.disconnect();
51
+ this._itemObservers.delete(uid);
52
+ });
53
+ });
54
+ bundles?.events.on("bundle:unregistered", ({ uid }) => {
55
+ this._itemObservers.get(uid)?.disconnect();
56
+ this._itemObservers.delete(uid);
57
+ });
58
+ }
59
+ destroy() {
60
+ this._disconnect();
61
+ this._tabs = null;
62
+ for (const observer of this._itemObservers.values()) observer.disconnect();
63
+ this._itemObservers.clear();
64
+ super.destroy();
65
+ }
66
+ /** Наблюдатель размеров узла по border-box (см. шапку). */
67
+ _observe(element) {
68
+ const observer = new ResizeObserver(() => this.events.emit("change:layout"));
69
+ observer.observe(element, { box: "border-box" });
70
+ return observer;
71
+ }
72
+ /** Снять наблюдение за корнем и списком: узел снят, заменён или плагин уничтожен. */
73
+ _disconnect() {
74
+ this._rootObserver?.disconnect();
75
+ this._rootObserver = null;
76
+ this._listObserver?.disconnect();
77
+ this._listObserver = null;
78
+ }
79
+ };
80
+ //#endregion
81
+ export { TTabsLayoutPlugin };
@@ -0,0 +1,4 @@
1
+ import type { TPluginEvents } from '../../../base';
2
+ export type TTabsLayoutPluginEvents = TPluginEvents & {
3
+ 'change:layout': () => void;
4
+ };
@@ -0,0 +1,15 @@
1
+ import type { ITabs } from '@soxa-ui/core';
2
+ /**
3
+ * Узлы набора — один поиск на плагины раскладки Tabs: место активного таба
4
+ * меряется от ряда (`TTabsActiveTabPlugin`), а сдвиг табов без смены их
5
+ * размеров ловит наблюдатель списка (`TTabsLayoutPlugin`).
6
+ *
7
+ * Узлы находят по классам владельца (`classes.resolve`), а не строкой в
8
+ * плагине, и прямым путём от корня: Tabs бывают вложены — в слот ряда или в
9
+ * панель других, — и поиск по потомкам нашёл бы чужой узел первым: слот
10
+ * `leading` стоит в ряду раньше списка.
11
+ */
12
+ /** Ряд набора — ребёнок корня: список табов и слоты по его краям. */
13
+ export declare function barOf(owner: ITabs, root: Element): Element | null;
14
+ /** Список табов набора — ребёнок его ряда, `[role=tablist]`. */
15
+ export declare function listOf(owner: ITabs, root: Element): Element | null;
@@ -0,0 +1,21 @@
1
+ //#region src/custom/tabs/parts.ts
2
+ /**
3
+ * Узлы набора — один поиск на плагины раскладки Tabs: место активного таба
4
+ * меряется от ряда (`TTabsActiveTabPlugin`), а сдвиг табов без смены их
5
+ * размеров ловит наблюдатель списка (`TTabsLayoutPlugin`).
6
+ *
7
+ * Узлы находят по классам владельца (`classes.resolve`), а не строкой в
8
+ * плагине, и прямым путём от корня: Tabs бывают вложены — в слот ряда или в
9
+ * панель других, — и поиск по потомкам нашёл бы чужой узел первым: слот
10
+ * `leading` стоит в ряду раньше списка.
11
+ */
12
+ /** Ряд набора — ребёнок корня: список табов и слоты по его краям. */
13
+ function barOf(owner, root) {
14
+ return root.querySelector(`:scope > ${owner.classes.resolve("__bar", { point: true })}`);
15
+ }
16
+ /** Список табов набора — ребёнок его ряда, `[role=tablist]`. */
17
+ function listOf(owner, root) {
18
+ return barOf(owner, root)?.querySelector(`:scope > ${owner.classes.resolve("__list", { point: true })}`) ?? null;
19
+ }
20
+ //#endregion
21
+ export { barOf, listOf };
@@ -0,0 +1,29 @@
1
+ import type { IPluginContext } from '../../base';
2
+ import { TCollectionElements } from '../collection';
3
+ /**
4
+ * Узел таба — строка с ролью `tab` внутри узла элемента. `null` — элемента нет
5
+ * в документе.
6
+ *
7
+ * Одна на клавиатуру Tabs (куда перевести фокус стрелкой) и фокус набора
8
+ * (`tabStopOf`): узел таба оба ищут одним правилом.
9
+ */
10
+ export declare function tabOf(elements: TCollectionElements | null, uid: string | number): Element | null;
11
+ /**
12
+ * Узел таба внутри узла элемента — тем же правилом, что `tabOf`, когда узел
13
+ * уже на руках. `null` — узла нет или таба в нём нет.
14
+ *
15
+ * Он же узел фокуса `Tabs.Item` (`focusTarget` плагина действия): запись
16
+ * `focused = true` ставит фокус на строку таба, а не на обёртку элемента.
17
+ */
18
+ export declare function tabIn(node: Element | null): Element | null;
19
+ /**
20
+ * Таб-остановка — узел таба, который держит остановку Tab. `null` — табов, на
21
+ * которые можно перейти, нет, или узла таба нет в документе.
22
+ *
23
+ * Узел фокуса Tabs (`focusTarget` плагина действия): запись `focused = true`
24
+ * ставит фокус туда же, куда ведёт Tab, а не на кнопку в слоте `leading`.
25
+ * Таб берётся по модели — `tabStop` расширения табов, — а не по
26
+ * `[tabindex="0"]` в разметке: в такте смены активного таба разметка ещё
27
+ * старая, и фокус ушёл бы на прежний таб.
28
+ */
29
+ export declare function tabStopOf(_root: Element, ctx: IPluginContext): Element | null;
@@ -0,0 +1,44 @@
1
+ import { TCollectionElements } from "../collection/collection-elements.plugin.js";
2
+ //#region src/custom/tabs/tab.ts
3
+ /**
4
+ * Узел таба внутри узла элемента. Корень элемента — обёртка для темы, а табом
5
+ * со своей ролью является вложенная строка: на неё и уходит фокус.
6
+ */
7
+ var TAB_SELECTOR = "[role=\"tab\"]";
8
+ /**
9
+ * Узел таба — строка с ролью `tab` внутри узла элемента. `null` — элемента нет
10
+ * в документе.
11
+ *
12
+ * Одна на клавиатуру Tabs (куда перевести фокус стрелкой) и фокус набора
13
+ * (`tabStopOf`): узел таба оба ищут одним правилом.
14
+ */
15
+ function tabOf(elements, uid) {
16
+ return tabIn(elements?.getElementByUid(uid) ?? null);
17
+ }
18
+ /**
19
+ * Узел таба внутри узла элемента — тем же правилом, что `tabOf`, когда узел
20
+ * уже на руках. `null` — узла нет или таба в нём нет.
21
+ *
22
+ * Он же узел фокуса `Tabs.Item` (`focusTarget` плагина действия): запись
23
+ * `focused = true` ставит фокус на строку таба, а не на обёртку элемента.
24
+ */
25
+ function tabIn(node) {
26
+ return node?.querySelector(TAB_SELECTOR) ?? null;
27
+ }
28
+ /**
29
+ * Таб-остановка — узел таба, который держит остановку Tab. `null` — табов, на
30
+ * которые можно перейти, нет, или узла таба нет в документе.
31
+ *
32
+ * Узел фокуса Tabs (`focusTarget` плагина действия): запись `focused = true`
33
+ * ставит фокус туда же, куда ведёт Tab, а не на кнопку в слоте `leading`.
34
+ * Таб берётся по модели — `tabStop` расширения табов, — а не по
35
+ * `[tabindex="0"]` в разметке: в такте смены активного таба разметка ещё
36
+ * старая, и фокус ушёл бы на прежний таб.
37
+ */
38
+ function tabStopOf(_root, ctx) {
39
+ const elements = ctx.get(TCollectionElements) ?? null;
40
+ const stop = (elements?.engine ?? null)?.extensions.tabs.tabStop;
41
+ return stop ? tabOf(elements, stop.uid) : null;
42
+ }
43
+ //#endregion
44
+ export { tabIn, tabOf, tabStopOf };
@@ -0,0 +1,4 @@
1
+ export * from './keyboard';
2
+ export * from './scroll';
3
+ export * from './item-names';
4
+ export { tagStopIn, tagStopOf } from './tag';
@@ -0,0 +1 @@
1
+ export * from './item-names.plugin';
@@ -0,0 +1,12 @@
1
+ import type { ITagsItem } from '@soxa-ui/core';
2
+ import { TNamesPlugin } from '../../../locale/names.plugin';
3
+ import type { TTranslations } from '../../../locale/types';
4
+ /**
5
+ * TTagsItemNamesPlugin — имя кнопки закрытия тега от локали: в `closeAria`,
6
+ * вместе с текстом тега, как у таба (`TTabsItemNamesPlugin`). `tabindex` того
7
+ * же набора пишет коллекция, а не плагин.
8
+ */
9
+ export declare class TTagsItemNamesPlugin extends TNamesPlugin<ITagsItem> {
10
+ protected _name(owner: ITagsItem, translations: TTranslations): void;
11
+ protected _watch(owner: ITagsItem, name: () => void): void;
12
+ }
@@ -0,0 +1,18 @@
1
+ import { formatName } from "../../../locale/locale.js";
2
+ import { TNamesPlugin } from "../../../locale/names.plugin.js";
3
+ //#region src/custom/tags/item-names/item-names.plugin.ts
4
+ /**
5
+ * TTagsItemNamesPlugin — имя кнопки закрытия тега от локали: в `closeAria`,
6
+ * вместе с текстом тега, как у таба (`TTabsItemNamesPlugin`). `tabindex` того
7
+ * же набора пишет коллекция, а не плагин.
8
+ */
9
+ var TTagsItemNamesPlugin = class extends TNamesPlugin {
10
+ _name(owner, translations) {
11
+ owner.closeAria.add("aria-label", formatName(translations.tags.close, owner.text));
12
+ }
13
+ _watch(owner, name) {
14
+ this._listenTo(owner.events, "change:text", name);
15
+ }
16
+ };
17
+ //#endregion
18
+ export { TTagsItemNamesPlugin };
@@ -0,0 +1,2 @@
1
+ export * from './types';
2
+ export * from './keyboard.plugin';
@@ -0,0 +1,133 @@
1
+ import type { ITags } from '@soxa-ui/core';
2
+ import { TBasePlugin } from '../../../base';
3
+ import type { IPluginContext } from '../../../base';
4
+ import type { TTagsKeyboardPluginEvents } from './types';
5
+ /**
6
+ * TTagsKeyboardPlugin — клавиатура Tags с выбором по паттерну APG Listbox и
7
+ * фокус после закрытия тега в любом режиме.
8
+ *
9
+ * Весь набор — одна остановка Tab (roving tabindex), по тегам ходят стрелки:
10
+ * ←/→ (в RTL наоборот) и ↑/↓ — к соседнему тегу по кругу, `Home`/`End` — к
11
+ * крайним. Теги, на которые нельзя перейти (`TTagsExtension.isEnabledTag`),
12
+ * пропускаются. `Delete` и `Backspace` закрывают тег, если его можно закрыть.
13
+ *
14
+ * **Фокус и выбор расходятся**, в отличие от Tabs: стрелка переносит только
15
+ * фокус, выбирает пробел. `Enter` и пробел здесь не обрабатываются — строку
16
+ * под фокусом переключает её собственный `press` (`TActionPlugin`). Поэтому
17
+ * остановку Tab коллекция не может посчитать по одному выбору: `focusin` на
18
+ * корне сообщает ей тег под фокусом (`notifyFocus`) — и от стрелок, и от
19
+ * клика, и от `focus()` из кода.
20
+ *
21
+ * Слушатели клавиш висят, пока у набора включён выбор. В `none` строка —
22
+ * `listitem` без действия, остановкой она не бывает, и перехватывать клавиши
23
+ * незачем. Режим выражен подпиской на `change:mode`, а не проверкой в
24
+ * обработчике.
25
+ *
26
+ * **Закрытый тег отдаёт фокус соседу** — в любом режиме и любым закрытием:
27
+ * клавишей, крестиком, из кода. Узел тега уходит из документа, и фокус,
28
+ * стоявший в нём, ушёл бы на страницу: следующий Tab начинал бы обход
29
+ * заново, а в поле Select стрелки прокручивали бы страницу. Переносится
30
+ * только фокус из узла закрываемого тега — к следующему соседу, у последнего
31
+ * к предыдущему, недоступные и без остановки пропускаются, — на его остановку
32
+ * (`tagStopIn`): с выбором — строку, без выбора — крестик. Соседа нет — к
33
+ * первой остановке Tab после ряда и вне его: в поле Select ряд стоит перед
34
+ * полем ввода, и фокус встаёт в поле без своего правила Select. Нет и её —
35
+ * фокус не трогается.
36
+ *
37
+ * Где фокус и кто соседи, видно только до удаления: после него узла тега нет
38
+ * в реестре, а места — в наборе. Когда переносить фокус, решает помощник
39
+ * коллекции (`TLeavingFocus`), общий с Tabs: он снимает фокус и соседей и на
40
+ * закрытии, и в хуке удаления, а переносит тем из фактов «закрыли» и «ушёл»,
41
+ * что пришёл вторым. Порядок у них разный: набор удаляет тег сам, следом за
42
+ * `item:close`, а поле Select снимает выбор с опции ещё в своём обработчике
43
+ * `item:close`, раньше плагина, — и её тег уходит до того, как закрытие
44
+ * дойдёт сюда. Удаление, отменённое в `item:remove:before`, фокус не трогает.
45
+ * Тег, ушедший без закрытия, — снятый из данных или размонтированный, — фокус
46
+ * не переносит: иначе ряд, который снимают целиком, гонял бы фокус по своим
47
+ * уходящим тегам. Здесь — только кто соседи и куда идёт фокус.
48
+ *
49
+ * Сами `tabindex` плагин не пишет: их ставит `TTagsExtension`, потому что
50
+ * атрибут обязан стоять с первой отрисовки, включая серверную. Здесь только
51
+ * то, что требует DOM: слушатели и перенос фокуса. Тег, на который ушёл
52
+ * фокус, в окно ряда `scroll` доводит `TTagsScrollPlugin` по `focusin`,
53
+ * который даёт и `focus()` этого плагина. Закрыть тег из кода можно и на
54
+ * сервере, поэтому фокус читается только при узле корня.
55
+ *
56
+ * От `TListNavigationPlugin` не наследуется: там фокус на контейнере и
57
+ * подсветка через `aria-activedescendant`, а здесь фокус ходит по самим
58
+ * тегам — у каждого свой крестик (см. AGENTS.md, «Граница переиспользования
59
+ * между похожими компонентами»).
60
+ */
61
+ export declare class TTagsKeyboardPlugin extends TBasePlugin<ITags, TTagsKeyboardPluginEvents> {
62
+ /** Корень: на нём слушатели, по нему же направление письма. */
63
+ private _element;
64
+ /** Узел, на котором слушатели висят сейчас; `null` — не висят. */
65
+ private _listening;
66
+ private _elements;
67
+ private _engine;
68
+ /** Фокус закрываемого тега — ждёт, пока тег закроют и он уйдёт из набора. */
69
+ private _leaving;
70
+ install(ctx: IPluginContext): void;
71
+ destroy(): void;
72
+ /**
73
+ * Движок сменился — подписки на режим выбора, закрытие и удаление тегов
74
+ * переезжают вместе с ним. Закрытие и удаление слушаются в любом режиме:
75
+ * фокус после закрытия переносится и без выбора.
76
+ */
77
+ private _bindEngine;
78
+ private readonly _onModeChange;
79
+ /** Слушатели висят на корне, пока узел есть и у набора включён выбор. */
80
+ private _syncListeners;
81
+ private readonly _onKeyDown;
82
+ /**
83
+ * Фокус пришёл на тег — остановка Tab переходит к нему. Один путь для
84
+ * стрелок (их `focus()` тоже даёт `focusin`), клика и фокуса из кода.
85
+ */
86
+ private readonly _onFocusIn;
87
+ /**
88
+ * Тег, с которого пришло событие, — тот, чей узел содержит его цель.
89
+ *
90
+ * Слушатель висит на корне, и до него всплывают события содержимого слота
91
+ * набора (поле ввода нового тега и т. п.): их перехватывать нельзя. Кнопка
92
+ * закрытия лежит внутри узла тега и считается его частью.
93
+ */
94
+ private _tagOf;
95
+ /** Куда ведёт клавиша; `undefined` — клавиша не наша. */
96
+ private _target;
97
+ /**
98
+ * Шаг по набору от стрелки. Теги идут в ряд с переносом, поэтому ↑/↓ —
99
+ * тоже шаг по порядку. В RTL ряд идёт справа налево, и ←/→ меняются
100
+ * местами.
101
+ */
102
+ private _step;
103
+ /**
104
+ * Направление письма берётся вычисленным: `direction` компонента бывает
105
+ * `inherit`, и тогда его задаёт предок.
106
+ */
107
+ private get _rtl();
108
+ /** Теги в порядке набора, на которые можно перейти. */
109
+ private _available;
110
+ /**
111
+ * Ближайший тег в направлении шага, по кругу: с последнего вперёд — на
112
+ * первый. Отсчёт от позиции тега в наборе, а не среди доступных: тег могли
113
+ * выключить, пока на нём фокус.
114
+ */
115
+ private _neighbour;
116
+ /** Фокус на строку тега с ролью. Гард нужен: узел плагину приходит `Element`. */
117
+ private _focus;
118
+ /**
119
+ * Тег закрывают — любым путём: клавишей, крестиком, из кода. Переносить
120
+ * ли фокус, решает помощник: фокус мог стоять и не в этом теге.
121
+ */
122
+ private readonly _onClose;
123
+ /**
124
+ * Соседи тега в порядке, в котором им отдаётся фокус: следующие за ним в
125
+ * наборе от ближнего, затем предыдущие от ближнего.
126
+ */
127
+ private _neighbours;
128
+ /**
129
+ * Фокус — на остановку ближайшего соседа, на которого можно перейти, а
130
+ * нет такого — на первую остановку Tab после ряда.
131
+ */
132
+ private _pass;
133
+ }