@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,44 @@
1
+ import { TBasePlugin } from "../../../base/base.class.js";
2
+ import { TIdPlugin } from "../../id/id.plugin.js";
3
+ //#region src/custom/accordion/item-ids/item-ids.plugin.ts
4
+ /**
5
+ * TAccordionItemIdsPlugin — связка «заголовок ↔ панель» секции Accordion в
6
+ * документе.
7
+ *
8
+ * Обе стороны — в наборах секции. В `aria` (он стоит на заголовке) — `id`
9
+ * заголовка и `aria-controls` на панель. В `contentAria` (он стоит на панели) —
10
+ * `id` панели и `aria-labelledby` на заголовок. Формула одна, здесь.
11
+ *
12
+ * `id` заголовка, заданный приложением (`TIdPlugin` секции), главнее: он и
13
+ * встаёт на заголовок, и на него ссылается панель. Сменили — плагин
14
+ * переписывает обе стороны ссылки на заголовок, сняли — снова `id` от
15
+ * монтирования. У панели `id` приложения нет, её `id` — формула.
16
+ *
17
+ * Без него — `id` от монтирования секции (`createId`), а не от экземпляра: он
18
+ * нужен только документу, и на сервере и в браузере обязан совпасть. Секция
19
+ * из данных рисуется с готовым экземпляром (`ctrl`), и его конструктор адаптер
20
+ * не зовёт, а монтирование у неё своё. Пишется при установке, синхронно, —
21
+ * связка есть уже в первой (и серверной) отрисовке.
22
+ */
23
+ var TAccordionItemIdsPlugin = class extends TBasePlugin {
24
+ install(ctx) {
25
+ super.install(ctx);
26
+ const section = ctx.getInstance();
27
+ if (!section) return;
28
+ const idPlugin = ctx.get(TIdPlugin);
29
+ const mountId = ctx.createId("header");
30
+ const contentId = ctx.createId("content");
31
+ /** Обе стороны ссылки на заголовок: его `id` и `aria-labelledby` панели. */
32
+ const linkHeader = () => {
33
+ const headerId = idPlugin?.id ?? mountId;
34
+ section.aria.add("id", headerId);
35
+ section.contentAria.add("aria-labelledby", headerId);
36
+ };
37
+ section.contentAria.add("id", contentId);
38
+ linkHeader();
39
+ section.aria.add("aria-controls", contentId);
40
+ idPlugin?.events.on("change:id", linkHeader);
41
+ }
42
+ };
43
+ //#endregion
44
+ export { TAccordionItemIdsPlugin };
@@ -0,0 +1,178 @@
1
+ import { TBasePlugin } from '../../base';
2
+ import type { IPluginContext } from '../../base';
3
+ import type { IActionPluginOptions, TActionPluginEvents } from './types';
4
+ /**
5
+ * TActionPlugin — взаимодействие контрола с пользователем.
6
+ *
7
+ * Ядру DOM недоступен, поэтому слушатели живут здесь. Элемент плагин не
8
+ * добывает сам, а берёт у TElementPlugin — тот же приём, что в
9
+ * TListKeyboardPlugin: композиция плагинов, а не наследование.
10
+ *
11
+ * Делает три вещи:
12
+ *
13
+ * 1. Нормализует активацию. `press` — клик, не пришедший на disabled, —
14
+ * независимо от того, `<button>` под компонентом или `<div>`. Из Enter и
15
+ * пробела на корне, где браузер клика не делает, клик делает плагин, как
16
+ * браузер у `<button>`: Enter — на keydown, пробел — на keyup. Поэтому на
17
+ * клавишу приходит и `click` потребителя, а отмена клика (`preventDefault`)
18
+ * одинакова для мыши и клавиатуры. Enter/Space нормализуются, только когда
19
+ * фокус на самом корне: вложенные поле, чекбокс или кнопка знают, что с
20
+ * ними делать, сами, а их клик всплывёт в корень и даст `press`, как клик
21
+ * мышью. Отмени корень их keydown — в Input не напечатается пробел,
22
+ * чекбокс не переключится, кнопка не нажмётся.
23
+ *
24
+ * 2. Связывает `focused` с настоящим фокусом. До этого плагина `focused` был
25
+ * булевым флагом, который никто не выставлял и который ничего не делал.
26
+ * Связь двусторонняя: фокус на корне или внутри него пишет в инстанс, а
27
+ * запись в инстанс ставит фокус на узел фокуса компонента. Его называет
28
+ * правило дескриптора (`focusTarget`): у поля фокус держит вложенный
29
+ * `<input>`, у ListBox — узел списка, у Tabs — таб-остановка, а корень у
30
+ * них — коробка вокруг. Без правила, и когда оно узла не нашло, узел
31
+ * фокуса — корень. Фокус уже внутри корня запись не двигает: компонент и
32
+ * так в фокусе. Запись `false` снимает фокус с того узла внутри корня, на
33
+ * котором он стоит. Писатель фокуса один — этот плагин: своего обработчика
34
+ * `change:focused` у плагинов компонентов нет.
35
+ *
36
+ * Узла правило не нашло, корень фокус не принял, а компонент — владелец
37
+ * коллекции (`TCollectionElements` в наборе): остановка в модели уже
38
+ * новая, а её узел ещё не нарисован — день нового месяца календаря,
39
+ * страница за окном пагинации, таб, добавленный в том же такте. Тогда
40
+ * запись ждёт узла: элемент вошёл в коллекцию или объявлен его узел —
41
+ * правило зовётся снова, и узел, который оно нашло, получает фокус.
42
+ * Ожидание одно; снимают его запись `false` и `blur()`, любой `focusin` в
43
+ * документе, снятие корня и `destroy()`. `focus()` идёт тем же путём, что
44
+ * запись `true`. `focused` назад не пишется ни после записи, после которой
45
+ * фокус не встал, ни после снятого ожидания.
46
+ *
47
+ * 3. Пробрасывает сырой `click`. Нужен той стороне, у которой на руках только
48
+ * инстанс: в шаблоне DOM-события и так доступны через fallthrough
49
+ * (`<Button @click="...">`), а через ctrl — только отсюда.
50
+ */
51
+ export declare class TActionPlugin extends TBasePlugin<any, TActionPluginEvents> {
52
+ private _element;
53
+ private _instance;
54
+ /** Контекст набора: его получает правило узла фокуса. */
55
+ private _ctx;
56
+ private _keys;
57
+ /** Правило узла фокуса из опций дескриптора; нет — фокус держит корень. */
58
+ private _focusTarget;
59
+ private _syncingFocus;
60
+ /** Снять ожидание узла фокуса (`_wait`); `null` — фокус узла не ждёт. */
61
+ private _waiting;
62
+ /** Пробел нажат на корне: клик — когда его отпустят, как у `<button>`. */
63
+ private _spaceDown;
64
+ install(ctx: IPluginContext, options?: IActionPluginOptions): void;
65
+ destroy(): void;
66
+ /** Корневой элемент контрола. Появляется только после монтирования. */
67
+ get element(): Element | null;
68
+ /**
69
+ * Перевести фокус на контрол — на его узел фокуса (`_moveFocus`): у поля
70
+ * это `<input>`, а не коробка вокруг. Путь тот же, что у записи
71
+ * `focused = true`, и узла, которого ещё нет, `focus()` ждёт так же.
72
+ */
73
+ focus(): void;
74
+ /**
75
+ * Снять фокус с контрола — с того узла внутри корня, на котором он стоит,
76
+ * как запись `focused = false`: у поля фокус держит вложенный `<input>`, и
77
+ * `blur()` корня его бы не снял. Фокус, который ещё ждёт узла, снимается
78
+ * тоже: иначе узел, нарисованный позже, получил бы фокус после `blur()`.
79
+ */
80
+ blur(): void;
81
+ private _attach;
82
+ private _detach;
83
+ private get _disabled();
84
+ /**
85
+ * Сам ли браузер сделает click из Enter/Space на корне.
86
+ * Для `<a href>` — только Enter, но Space на ссылке и не должен активировать,
87
+ * поэтому весь тег целиком отдаём нативному поведению.
88
+ *
89
+ * Смотрит на тег корня, а не цели события: клавиши из вложенных элементов
90
+ * до этой проверки не доходят — `_onKeyDown` нормализует только нажатия с
91
+ * фокусом на корне.
92
+ */
93
+ private get _nativeActivation();
94
+ private readonly _onClick;
95
+ /**
96
+ * Клавиша активации на корне, который браузер в клик не превращает.
97
+ *
98
+ * Клик, а не сразу `press`: так у `<button>`, и клавиша проходит тот же
99
+ * путь, что мышь, — `click` потребителя, его отмена, `press`. Пробел
100
+ * кликает, когда его отпустят, Enter — сразу.
101
+ *
102
+ * Нажатие для `<button>` — действие клавиши по умолчанию: его отменяет
103
+ * `preventDefault` любого обработчика на пути клавиши, и на предке тоже.
104
+ * Поэтому решение — в конце рассылки, а не здесь, на корне, где обработчики
105
+ * предков ещё не прошли: так клавиша, которую взял себе предок (Enter со
106
+ * строки ListBox выбирает подсвеченный элемент), строку не нажмёт. Конец
107
+ * рассылки — окно: дальше событие не всплывает. Клавишу, всплытие которой
108
+ * остановили, корень тоже не нажимает — её взял себе тот, кто остановил.
109
+ */
110
+ private readonly _onKeyDown;
111
+ private readonly _onKeyUp;
112
+ /** Клавиша активации — на самом корне не-нативного тега, не на disabled. */
113
+ private _ownKey;
114
+ /** Клик по корню — тот, что браузер делает из клавиши у `<button>`. */
115
+ private _click;
116
+ private readonly _onFocusIn;
117
+ private readonly _onFocusOut;
118
+ /**
119
+ * Инстанс → DOM. Флаг `_syncingFocus` рвёт цикл: focus() вызовет focusin,
120
+ * тот запишет focused, тот снова придёт сюда.
121
+ *
122
+ * В фокусе ли компонент, считается по корню, как в обратную сторону
123
+ * (`focusin` и `focusout` корня): фокус внутри корня — на кнопке очистки
124
+ * поля или в поле шапки ListBox — `focused = true` не двигает. Ставит
125
+ * фокус запись на узел фокуса (`_moveFocus`), снимает — с узла внутри
126
+ * корня, на котором он стоит.
127
+ *
128
+ * Запись `false` снимает и ожидание узла — до проверки, есть ли что
129
+ * снимать: пока узла ждут, фокуса в корне нет.
130
+ */
131
+ private readonly _onFocusedChange;
132
+ /**
133
+ * Фокус — на узел фокуса компонента: что нашло правило дескриптора, иначе
134
+ * корень. Узла правило не нашло, а корень фокус не принял — ждать узла
135
+ * (`_wait`). Попытка заменяет прежнее ожидание: оно всегда одно.
136
+ *
137
+ * Правило зовётся на каждую запись, а не один раз на `ready`: узел фокуса
138
+ * бывает новым — у Tabs остановка переезжает с активацией.
139
+ *
140
+ * Узел плагину приходит как `Element`, поэтому фокусируемость проверяется
141
+ * гардом: у корня-`svg` фокус есть, а у произвольного `Element` — нет.
142
+ */
143
+ private _moveFocus;
144
+ /** Узел, который нашло правило дескриптора; без правила и когда не нашло — `null`. */
145
+ private _ruleNode;
146
+ /**
147
+ * Ждать узла фокуса, которого правило не нашло: у владельца коллекции
148
+ * остановка в модели уже новая, а её узел ещё не нарисован — день нового
149
+ * месяца, страница за окном, таб, добавленный в том же такте. Узел приносит
150
+ * элемент коллекции, и ждёт его помощник реестра узлов
151
+ * (`TCollectionElements.waitFor`), взятого в момент записи, как его берут
152
+ * правила. Без правила и без коллекции ждать нечего: узел фокуса — корень,
153
+ * и он уже отказал.
154
+ *
155
+ * Пока ждём, слушаем `focusin` документа в фазе перехвата: фокус, пришедший
156
+ * куда угодно, ожидание снимает (`_onDocumentFocusIn`).
157
+ */
158
+ private _wait;
159
+ /**
160
+ * Проверка ожидания — на регистрацию элемента коллекции и на `ready` его
161
+ * узла: правило зовётся снова, и цель — его ответ сейчас, а не узел,
162
+ * запомненный при записи. Нашло — ожидание снимается до `focus()`: свой
163
+ * `focusin` слушатель документа иначе счёл бы чужим. Не нашло — ждать
164
+ * дальше.
165
+ */
166
+ private readonly _focusFound;
167
+ /**
168
+ * Фокус пришёл куда-то, пока узла ждали. В корень — компонент уже в
169
+ * фокусе; мимо него — пользователь ушёл туда сам, и узел, нарисованный
170
+ * позже, увёл бы фокус из поля, где уже печатают. Ожидание снимается,
171
+ * `focused` не трогается.
172
+ */
173
+ private readonly _onDocumentFocusIn;
174
+ private _stopWaiting;
175
+ /** Узел под фокусом, если фокус на корне или внутри него; иначе `null`. */
176
+ private _activeWithin;
177
+ private _writeFocused;
178
+ }
@@ -0,0 +1,339 @@
1
+ import { TBasePlugin } from "../../base/base.class.js";
2
+ import { TElementPlugin } from "../element/element.plugin.js";
3
+ import { TCollectionElements } from "../collection/collection-elements.plugin.js";
4
+ import { isFocusableElement } from "../../utils/isFocusableElement.js";
5
+ //#region src/custom/action/action.plugin.ts
6
+ /** Теги, где браузер сам превращает Enter/Space в click. */
7
+ var NATIVE_ACTIVATION = /* @__PURE__ */ new Set([
8
+ "button",
9
+ "input",
10
+ "select",
11
+ "textarea"
12
+ ]);
13
+ /**
14
+ * TActionPlugin — взаимодействие контрола с пользователем.
15
+ *
16
+ * Ядру DOM недоступен, поэтому слушатели живут здесь. Элемент плагин не
17
+ * добывает сам, а берёт у TElementPlugin — тот же приём, что в
18
+ * TListKeyboardPlugin: композиция плагинов, а не наследование.
19
+ *
20
+ * Делает три вещи:
21
+ *
22
+ * 1. Нормализует активацию. `press` — клик, не пришедший на disabled, —
23
+ * независимо от того, `<button>` под компонентом или `<div>`. Из Enter и
24
+ * пробела на корне, где браузер клика не делает, клик делает плагин, как
25
+ * браузер у `<button>`: Enter — на keydown, пробел — на keyup. Поэтому на
26
+ * клавишу приходит и `click` потребителя, а отмена клика (`preventDefault`)
27
+ * одинакова для мыши и клавиатуры. Enter/Space нормализуются, только когда
28
+ * фокус на самом корне: вложенные поле, чекбокс или кнопка знают, что с
29
+ * ними делать, сами, а их клик всплывёт в корень и даст `press`, как клик
30
+ * мышью. Отмени корень их keydown — в Input не напечатается пробел,
31
+ * чекбокс не переключится, кнопка не нажмётся.
32
+ *
33
+ * 2. Связывает `focused` с настоящим фокусом. До этого плагина `focused` был
34
+ * булевым флагом, который никто не выставлял и который ничего не делал.
35
+ * Связь двусторонняя: фокус на корне или внутри него пишет в инстанс, а
36
+ * запись в инстанс ставит фокус на узел фокуса компонента. Его называет
37
+ * правило дескриптора (`focusTarget`): у поля фокус держит вложенный
38
+ * `<input>`, у ListBox — узел списка, у Tabs — таб-остановка, а корень у
39
+ * них — коробка вокруг. Без правила, и когда оно узла не нашло, узел
40
+ * фокуса — корень. Фокус уже внутри корня запись не двигает: компонент и
41
+ * так в фокусе. Запись `false` снимает фокус с того узла внутри корня, на
42
+ * котором он стоит. Писатель фокуса один — этот плагин: своего обработчика
43
+ * `change:focused` у плагинов компонентов нет.
44
+ *
45
+ * Узла правило не нашло, корень фокус не принял, а компонент — владелец
46
+ * коллекции (`TCollectionElements` в наборе): остановка в модели уже
47
+ * новая, а её узел ещё не нарисован — день нового месяца календаря,
48
+ * страница за окном пагинации, таб, добавленный в том же такте. Тогда
49
+ * запись ждёт узла: элемент вошёл в коллекцию или объявлен его узел —
50
+ * правило зовётся снова, и узел, который оно нашло, получает фокус.
51
+ * Ожидание одно; снимают его запись `false` и `blur()`, любой `focusin` в
52
+ * документе, снятие корня и `destroy()`. `focus()` идёт тем же путём, что
53
+ * запись `true`. `focused` назад не пишется ни после записи, после которой
54
+ * фокус не встал, ни после снятого ожидания.
55
+ *
56
+ * 3. Пробрасывает сырой `click`. Нужен той стороне, у которой на руках только
57
+ * инстанс: в шаблоне DOM-события и так доступны через fallthrough
58
+ * (`<Button @click="...">`), а через ctrl — только отсюда.
59
+ */
60
+ var TActionPlugin = class extends TBasePlugin {
61
+ _element = null;
62
+ _instance = null;
63
+ /** Контекст набора: его получает правило узла фокуса. */
64
+ _ctx = null;
65
+ _keys = ["Enter", " "];
66
+ /** Правило узла фокуса из опций дескриптора; нет — фокус держит корень. */
67
+ _focusTarget = null;
68
+ _syncingFocus = false;
69
+ /** Снять ожидание узла фокуса (`_wait`); `null` — фокус узла не ждёт. */
70
+ _waiting = null;
71
+ /** Пробел нажат на корне: клик — когда его отпустят, как у `<button>`. */
72
+ _spaceDown = false;
73
+ install(ctx, options) {
74
+ super.install(ctx, options);
75
+ this._ctx = ctx;
76
+ this._instance = ctx.getInstance();
77
+ if (options?.keys) this._keys = options.keys;
78
+ this._focusTarget = options?.focusTarget ?? null;
79
+ const elementPlugin = ctx.get(TElementPlugin);
80
+ elementPlugin?.events.on("ready", (element) => this._attach(element));
81
+ elementPlugin?.events.on("removed", () => this._detach());
82
+ this._listenTo(this._instance?.events, "change:focused", ({ newValue }) => this._onFocusedChange(newValue));
83
+ }
84
+ destroy() {
85
+ this._detach();
86
+ this._instance = null;
87
+ this._ctx = null;
88
+ super.destroy();
89
+ }
90
+ /** Корневой элемент контрола. Появляется только после монтирования. */
91
+ get element() {
92
+ return this._element;
93
+ }
94
+ /**
95
+ * Перевести фокус на контрол — на его узел фокуса (`_moveFocus`): у поля
96
+ * это `<input>`, а не коробка вокруг. Путь тот же, что у записи
97
+ * `focused = true`, и узла, которого ещё нет, `focus()` ждёт так же.
98
+ */
99
+ focus() {
100
+ const element = this._element;
101
+ if (element) this._moveFocus(element);
102
+ }
103
+ /**
104
+ * Снять фокус с контрола — с того узла внутри корня, на котором он стоит,
105
+ * как запись `focused = false`: у поля фокус держит вложенный `<input>`, и
106
+ * `blur()` корня его бы не снял. Фокус, который ещё ждёт узла, снимается
107
+ * тоже: иначе узел, нарисованный позже, получил бы фокус после `blur()`.
108
+ */
109
+ blur() {
110
+ this._stopWaiting();
111
+ const element = this._element;
112
+ const active = element ? this._activeWithin(element) : null;
113
+ if (isFocusableElement(active)) active.blur();
114
+ }
115
+ _attach(element) {
116
+ this._detach();
117
+ this._element = element;
118
+ const target = element;
119
+ target.addEventListener("click", this._onClick);
120
+ target.addEventListener("keydown", this._onKeyDown);
121
+ target.addEventListener("keyup", this._onKeyUp);
122
+ target.addEventListener("focusin", this._onFocusIn);
123
+ target.addEventListener("focusout", this._onFocusOut);
124
+ if (this._instance?.focused) this._onFocusedChange(true);
125
+ }
126
+ _detach() {
127
+ this._stopWaiting();
128
+ const target = this._element;
129
+ if (!target) return;
130
+ target.removeEventListener("click", this._onClick);
131
+ target.removeEventListener("keydown", this._onKeyDown);
132
+ target.removeEventListener("keyup", this._onKeyUp);
133
+ target.removeEventListener("focusin", this._onFocusIn);
134
+ target.removeEventListener("focusout", this._onFocusOut);
135
+ this._element = null;
136
+ this._spaceDown = false;
137
+ }
138
+ get _disabled() {
139
+ return this._instance?.disabled === true;
140
+ }
141
+ /**
142
+ * Сам ли браузер сделает click из Enter/Space на корне.
143
+ * Для `<a href>` — только Enter, но Space на ссылке и не должен активировать,
144
+ * поэтому весь тег целиком отдаём нативному поведению.
145
+ *
146
+ * Смотрит на тег корня, а не цели события: клавиши из вложенных элементов
147
+ * до этой проверки не доходят — `_onKeyDown` нормализует только нажатия с
148
+ * фокусом на корне.
149
+ */
150
+ get _nativeActivation() {
151
+ const element = this._element;
152
+ if (!element) return false;
153
+ const tag = element.tagName.toLowerCase();
154
+ return NATIVE_ACTIVATION.has(tag) || tag === "a" && element.hasAttribute("href");
155
+ }
156
+ _onClick = (event) => {
157
+ this.events.emit("click", event);
158
+ if (this._disabled) return;
159
+ this.events.emit("press", event);
160
+ };
161
+ /**
162
+ * Клавиша активации на корне, который браузер в клик не превращает.
163
+ *
164
+ * Клик, а не сразу `press`: так у `<button>`, и клавиша проходит тот же
165
+ * путь, что мышь, — `click` потребителя, его отмена, `press`. Пробел
166
+ * кликает, когда его отпустят, Enter — сразу.
167
+ *
168
+ * Нажатие для `<button>` — действие клавиши по умолчанию: его отменяет
169
+ * `preventDefault` любого обработчика на пути клавиши, и на предке тоже.
170
+ * Поэтому решение — в конце рассылки, а не здесь, на корне, где обработчики
171
+ * предков ещё не прошли: так клавиша, которую взял себе предок (Enter со
172
+ * строки ListBox выбирает подсвеченный элемент), строку не нажмёт. Конец
173
+ * рассылки — окно: дальше событие не всплывает. Клавишу, всплытие которой
174
+ * остановили, корень тоже не нажимает — её взял себе тот, кто остановил.
175
+ */
176
+ _onKeyDown = (event) => {
177
+ if (!this._ownKey(event)) return;
178
+ const view = this._element?.ownerDocument.defaultView;
179
+ if (!view) return;
180
+ view.addEventListener("keydown", (passed) => {
181
+ if (passed !== event || event.defaultPrevented) return;
182
+ event.preventDefault();
183
+ if (event.key === " ") this._spaceDown = true;
184
+ else this._click();
185
+ }, { once: true });
186
+ };
187
+ _onKeyUp = (event) => {
188
+ if (event.key !== " " || !this._spaceDown) return;
189
+ this._spaceDown = false;
190
+ if (this._ownKey(event)) this._click();
191
+ };
192
+ /** Клавиша активации — на самом корне не-нативного тега, не на disabled. */
193
+ _ownKey(event) {
194
+ if (!this._keys.includes(event.key)) return false;
195
+ if (event.target !== this._element) return false;
196
+ if (this._nativeActivation) return false;
197
+ return !this._disabled;
198
+ }
199
+ /** Клик по корню — тот, что браузер делает из клавиши у `<button>`. */
200
+ _click() {
201
+ this._element?.dispatchEvent(new MouseEvent("click", {
202
+ bubbles: true,
203
+ cancelable: true,
204
+ composed: true
205
+ }));
206
+ }
207
+ _onFocusIn = (event) => {
208
+ this.events.emit("focus", event);
209
+ this._writeFocused(true);
210
+ };
211
+ _onFocusOut = (event) => {
212
+ if (event.target === this._element) this._spaceDown = false;
213
+ this.events.emit("blur", event);
214
+ this._writeFocused(false);
215
+ };
216
+ /**
217
+ * Инстанс → DOM. Флаг `_syncingFocus` рвёт цикл: focus() вызовет focusin,
218
+ * тот запишет focused, тот снова придёт сюда.
219
+ *
220
+ * В фокусе ли компонент, считается по корню, как в обратную сторону
221
+ * (`focusin` и `focusout` корня): фокус внутри корня — на кнопке очистки
222
+ * поля или в поле шапки ListBox — `focused = true` не двигает. Ставит
223
+ * фокус запись на узел фокуса (`_moveFocus`), снимает — с узла внутри
224
+ * корня, на котором он стоит.
225
+ *
226
+ * Запись `false` снимает и ожидание узла — до проверки, есть ли что
227
+ * снимать: пока узла ждут, фокуса в корне нет.
228
+ */
229
+ _onFocusedChange = (value) => {
230
+ if (!value) this._stopWaiting();
231
+ if (this._syncingFocus) return;
232
+ const element = this._element;
233
+ if (!element) return;
234
+ const active = this._activeWithin(element);
235
+ if (value === (active !== null)) return;
236
+ this._syncingFocus = true;
237
+ try {
238
+ if (value) this._moveFocus(element);
239
+ else if (isFocusableElement(active)) active.blur();
240
+ } finally {
241
+ this._syncingFocus = false;
242
+ }
243
+ };
244
+ /**
245
+ * Фокус — на узел фокуса компонента: что нашло правило дескриптора, иначе
246
+ * корень. Узла правило не нашло, а корень фокус не принял — ждать узла
247
+ * (`_wait`). Попытка заменяет прежнее ожидание: оно всегда одно.
248
+ *
249
+ * Правило зовётся на каждую запись, а не один раз на `ready`: узел фокуса
250
+ * бывает новым — у Tabs остановка переезжает с активацией.
251
+ *
252
+ * Узел плагину приходит как `Element`, поэтому фокусируемость проверяется
253
+ * гардом: у корня-`svg` фокус есть, а у произвольного `Element` — нет.
254
+ */
255
+ _moveFocus(root) {
256
+ this._stopWaiting();
257
+ const node = this._ruleNode(root);
258
+ if (node) {
259
+ if (isFocusableElement(node)) node.focus();
260
+ return;
261
+ }
262
+ if (isFocusableElement(root)) root.focus();
263
+ if (this._activeWithin(root) === null) this._wait(root);
264
+ }
265
+ /** Узел, который нашло правило дескриптора; без правила и когда не нашло — `null`. */
266
+ _ruleNode(root) {
267
+ const rule = this._focusTarget;
268
+ const ctx = this._ctx;
269
+ return rule && ctx ? rule(root, ctx) : null;
270
+ }
271
+ /**
272
+ * Ждать узла фокуса, которого правило не нашло: у владельца коллекции
273
+ * остановка в модели уже новая, а её узел ещё не нарисован — день нового
274
+ * месяца, страница за окном, таб, добавленный в том же такте. Узел приносит
275
+ * элемент коллекции, и ждёт его помощник реестра узлов
276
+ * (`TCollectionElements.waitFor`), взятого в момент записи, как его берут
277
+ * правила. Без правила и без коллекции ждать нечего: узел фокуса — корень,
278
+ * и он уже отказал.
279
+ *
280
+ * Пока ждём, слушаем `focusin` документа в фазе перехвата: фокус, пришедший
281
+ * куда угодно, ожидание снимает (`_onDocumentFocusIn`).
282
+ */
283
+ _wait(root) {
284
+ const elements = this._focusTarget ? this._ctx?.get(TCollectionElements) : void 0;
285
+ if (!elements) return;
286
+ const doc = root.ownerDocument;
287
+ const stop = elements.waitFor(this._focusFound);
288
+ doc.addEventListener("focusin", this._onDocumentFocusIn, true);
289
+ this._waiting = () => {
290
+ stop();
291
+ doc.removeEventListener("focusin", this._onDocumentFocusIn, true);
292
+ };
293
+ }
294
+ /**
295
+ * Проверка ожидания — на регистрацию элемента коллекции и на `ready` его
296
+ * узла: правило зовётся снова, и цель — его ответ сейчас, а не узел,
297
+ * запомненный при записи. Нашло — ожидание снимается до `focus()`: свой
298
+ * `focusin` слушатель документа иначе счёл бы чужим. Не нашло — ждать
299
+ * дальше.
300
+ */
301
+ _focusFound = () => {
302
+ const root = this._element;
303
+ const node = root ? this._ruleNode(root) : null;
304
+ if (!node) return false;
305
+ this._stopWaiting();
306
+ if (isFocusableElement(node)) node.focus();
307
+ return true;
308
+ };
309
+ /**
310
+ * Фокус пришёл куда-то, пока узла ждали. В корень — компонент уже в
311
+ * фокусе; мимо него — пользователь ушёл туда сам, и узел, нарисованный
312
+ * позже, увёл бы фокус из поля, где уже печатают. Ожидание снимается,
313
+ * `focused` не трогается.
314
+ */
315
+ _onDocumentFocusIn = () => {
316
+ this._stopWaiting();
317
+ };
318
+ _stopWaiting() {
319
+ const stop = this._waiting;
320
+ this._waiting = null;
321
+ stop?.();
322
+ }
323
+ /** Узел под фокусом, если фокус на корне или внутри него; иначе `null`. */
324
+ _activeWithin(root) {
325
+ const active = root.ownerDocument.activeElement;
326
+ return active && root.contains(active) ? active : null;
327
+ }
328
+ _writeFocused(value) {
329
+ if (!this._instance || this._instance.focused === value) return;
330
+ this._syncingFocus = true;
331
+ try {
332
+ this._instance.focused = value;
333
+ } finally {
334
+ this._syncingFocus = false;
335
+ }
336
+ }
337
+ };
338
+ //#endregion
339
+ export { TActionPlugin };
@@ -0,0 +1,2 @@
1
+ export type { TActionPluginEvents, IActionPluginOptions, TFocusTarget } from './types';
2
+ export { TActionPlugin } from './action.plugin';
@@ -0,0 +1,65 @@
1
+ import type { IPluginContext, TPluginEvents } from '../../base';
2
+ /**
3
+ * События взаимодействия с пользователем.
4
+ *
5
+ * Разделены намеренно: `click` — то, что реально произошло в DOM, `press` —
6
+ * намерение активировать контрол. Они не совпадают. У нативной `<button
7
+ * disabled>` клик не приходит вообще, а у `<div aria-disabled="true">` —
8
+ * приходит. `press` сглаживает это, `click` оставляет как есть — иначе с
9
+ * инстанса не добраться до правды. Enter и пробел на корне-`<div>` плагин
10
+ * превращает в клик сам, как браузер у `<button>`, поэтому `press` всегда
11
+ * приходит из клика.
12
+ */
13
+ export type TActionPluginEvents = TPluginEvents & {
14
+ /**
15
+ * Активация контрола: клик — мышью или из Enter/Space с фокусом на корне.
16
+ * Не приходит на disabled.
17
+ */
18
+ press: (event: MouseEvent) => void;
19
+ /** Сырой DOM-клик, без фильтра по disabled. */
20
+ click: (event: MouseEvent) => void;
21
+ /** Фокус внутри корневого элемента. */
22
+ focus: (event: FocusEvent) => void;
23
+ /** Фокус ушёл из корневого элемента. */
24
+ blur: (event: FocusEvent) => void;
25
+ };
26
+ /**
27
+ * Правило узла фокуса: по корню компонента и контексту его набора находит
28
+ * узел внутри корня, который держит фокус компонента, — поле формы, узел
29
+ * списка, таб-остановку. `null` — такого узла нет, и фокус получает корень.
30
+ *
31
+ * Корень фокус не принял, а у компонента есть коллекция (`TCollectionElements`
32
+ * в наборе), — `null` значит «узла ещё нет»: остановка в модели уже новая, а
33
+ * разметка её не нарисовала. Тогда плагин действия ждёт узла и зовёт правило
34
+ * снова — на каждую регистрацию элемента коллекции и на `ready` его узла.
35
+ * Поэтому правило ищет узел заново на каждый вызов, у модели, и ничего не
36
+ * помнит между вызовами.
37
+ *
38
+ * Модель фокуса у каждого компонента своя, и знают её плагины компонента.
39
+ * Поэтому правило — функция слоя плагинов рядом с теми, кто этот узел уже
40
+ * ищет (`fieldOf`, `listOf`, `tabStopOf`), а называет его дескриптор
41
+ * компонента опцией плагина действия.
42
+ */
43
+ export type TFocusTarget = (root: Element, ctx: IPluginContext) => Element | null;
44
+ export interface IActionPluginOptions {
45
+ /**
46
+ * Клавиши, активирующие контрол с фокусом на корне не-нативного тега.
47
+ * По умолчанию Enter и Space — как требует WAI-ARIA для role="button".
48
+ */
49
+ keys?: readonly string[];
50
+ /**
51
+ * Куда ставят фокус запись `focused = true` и `focus()` — правило узла
52
+ * фокуса: `ActionPluginDescriptor.with({ focusTarget: listOf })`. Без
53
+ * правила, и когда оно вернуло `null`, фокус получает корень. Корень фокус
54
+ * не принял, а компонент — владелец коллекции, — запись ждёт узла и зовёт
55
+ * правило снова, когда элемент коллекции вошёл в неё или объявлен его узел
56
+ * (`TFocusTarget`).
57
+ *
58
+ * Нужна компоненту, у которого фокус держит не корень: у поля — вложенный
59
+ * `<input>`, у ListBox — узел списка рядом с шапкой и подвалом, у Tabs —
60
+ * таб-остановка. Общего правила «первая остановка Tab внутри» нет: кнопка
61
+ * в слоте `leading` и поле поиска в шапке — свои остановки перед главной
62
+ * частью, и фокус ушёл бы на них.
63
+ */
64
+ focusTarget?: TFocusTarget;
65
+ }