@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,58 @@
1
+ /**
2
+ * Текст элемента, по которому идёт набор, — его `text`. У элемента без
3
+ * текста — пусто, и набор его не находит.
4
+ */
5
+ var itemText = (item) => "text" in item && typeof item.text === "string" ? item.text : "";
6
+ var TTypeahead = class {
7
+ _timeout;
8
+ _query = "";
9
+ _at = 0;
10
+ /** @param timeout — пауза, после которой следующая буква начинает новый набор, мс */
11
+ constructor(_timeout = 500) {
12
+ this._timeout = _timeout;
13
+ }
14
+ /**
15
+ * Идёт ли набор: с последней буквы прошло не больше паузы. Пока он идёт,
16
+ * пробел — тоже буква («Сохранить как»), а не нажатие элемента.
17
+ */
18
+ typing(now = Date.now()) {
19
+ return this._query !== "" && now - this._at <= this._timeout;
20
+ }
21
+ /**
22
+ * Буква набора: продолжить слово или начать новое — и найти элемент.
23
+ *
24
+ * @param char — набранная буква
25
+ * @param items — элементы по порядку, по которым идёт навигация
26
+ * @param current — подсвеченный элемент; `null` — поиск с первого
27
+ * @param textOf — текст элемента, по которому идёт сравнение
28
+ * @returns элемент, на который встать, или `null` — совпадения нет, и
29
+ * подсветка остаётся на месте
30
+ */
31
+ next(char, items, current, textOf, now = Date.now()) {
32
+ this._query = this.typing(now) ? this._query + char : char;
33
+ this._at = now;
34
+ return match(items, current, this._query, textOf);
35
+ }
36
+ /** Сбросить набор: следующая буква начнёт новый. */
37
+ reset() {
38
+ this._query = "";
39
+ this._at = 0;
40
+ }
41
+ };
42
+ /**
43
+ * Первый по кругу элемент, чей текст начинается с набранного. Повторённая
44
+ * буква — это одна буква: ищется со следующего за подсвеченным.
45
+ */
46
+ function match(items, current, query, textOf) {
47
+ const needle = query.toLowerCase();
48
+ const search = [...needle].every((char) => char === needle[0]) ? needle[0] : needle;
49
+ const index = current === null ? -1 : items.indexOf(current);
50
+ const from = index === -1 ? 0 : index + (search.length === 1 ? 1 : 0);
51
+ for (let step = 0; step < items.length; step++) {
52
+ const item = items[(from + step) % items.length];
53
+ if (textOf(item).trim().toLowerCase().startsWith(search)) return item;
54
+ }
55
+ return null;
56
+ }
57
+ //#endregion
58
+ export { TTypeahead, itemText };
@@ -0,0 +1,61 @@
1
+ import type { IPluginContext } from '../../../base';
2
+ import { TPopoverFocusPlugin } from '../../popover/focus';
3
+ import type { IOverlayOpenOptions } from '../../overlay/types';
4
+ /**
5
+ * TMenuFocusPlugin — модель фокуса меню у кнопки (APG Menu Button) и
6
+ * контекстного меню.
7
+ *
8
+ * Немодальная, как у Popover, и от него наследует всё общее: запомнить,
9
+ * откуда открыли, увести фокус в панель кадром позже, вернуть его при
10
+ * закрытии, закрыться по Escape, не возвращать фокус после нажатия и фокуса
11
+ * мимо, а запасной возврат — на триггер в корне. Поэтому Escape и нажатие
12
+ * пункта возвращают фокус на триггер, а нажатие мимо — нет: пользователь уже
13
+ * там, куда нажал.
14
+ *
15
+ * Своё у меню — три вещи:
16
+ *
17
+ * - **куда при открытии.** Фокус в меню идёт за подсветкой
18
+ * (`TMenuKeyboardPlugin`): открыли клавишей — подсвечен крайний пункт, и
19
+ * фокус встаёт на его строку; открыли кликом — подсветки нет, фокус на самой
20
+ * панели (`tabindex="-1"`), и первая стрелка подсветит первый пункт. Первая
21
+ * остановка Tab панели не годится: у пунктов её нет вовсе. У контекстного
22
+ * меню так же: клавиша контекстного меню — первый пункт, правая кнопка и
23
+ * касание — панель;
24
+ * - **Tab.** Остановок Tab в меню нет, и Tab из него закрывает меню (APG): Tab
25
+ * ведёт к первой остановке после корня — будто панель стоит в документе
26
+ * сразу за триггером — и фокус не возвращает; остановок после корня нет —
27
+ * Tab не гасится, фокус уводит браузер. Shift+Tab закрывает с возвратом:
28
+ * предыдущая остановка перед панелью — сам триггер. Tab в подменю и с
29
+ * последней остановки панели пункта — так же: о нём сообщает модель фокуса
30
+ * слоя (`tab`), и меню закрывается целиком, со всеми подменю и панелями.
31
+ * Остановки самого меню и его слоёв — пунктов с панелью, гаснущих вместе с
32
+ * ним, — в кандидаты не идут: панель пункта ещё на экране, и её остановки
33
+ * стоят в документе после корня;
34
+ * - **куда вернуть фокус, когда возвращать некуда** — фокус был на `body`.
35
+ * Запасной возврат Popover — на кнопку в корне — годится кнопке. У
36
+ * контекстного меню в корне область, а она бывает нефокусируемой, и её
37
+ * первая остановка Tab — не то место, откуда меню вызвали: фокус не
38
+ * возвращается никуда. Запасной возврат выбирает подписка на смену способа
39
+ * открытия, а не проверка при закрытии.
40
+ */
41
+ export declare class TMenuFocusPlugin extends TPopoverFocusPlugin {
42
+ private _owner;
43
+ private _keyboard;
44
+ /** Запасной возврат фокуса — по способу открытия (`openOn`). */
45
+ private _fallback;
46
+ install(ctx: IPluginContext, options?: IOverlayOpenOptions): void;
47
+ destroy(): void;
48
+ /** Фокус при открытии — строке подсвеченного пункта, без подсветки — панели. */
49
+ protected _focusCandidates(panel: Element): readonly Element[];
50
+ /** Запомненного элемента нет — у кнопки на неё, у области никуда. */
51
+ protected _returnCandidates(root: Element): readonly Element[];
52
+ protected _onTab(event: KeyboardEvent): void;
53
+ /**
54
+ * Tab из меню — из его панели, из подменю или из панели пункта: Shift+Tab
55
+ * закрывает с возвратом на триггер, Tab — без возврата, к остановке за
56
+ * корнем.
57
+ */
58
+ private _leave;
59
+ /** Запасной возврат: у области — никуда, у кнопки — остановки корня, как у Popover. */
60
+ private _syncFallback;
61
+ }
@@ -0,0 +1,105 @@
1
+ import { tabStopsAfter } from "../../../utils/tabStopsAfter.js";
2
+ import { focusFirst } from "../../../utils/focusFirst.js";
3
+ import { TMenuKeyboardPlugin } from "../keyboard/keyboard.plugin.js";
4
+ import { TPopoverFocusPlugin } from "../../popover/focus/focus.plugin.js";
5
+ import { listenNestedTabs } from "../submenu-focus/focus.plugin.js";
6
+ //#region src/custom/menu/focus/focus.plugin.ts
7
+ /** Возвращать фокус некуда. */
8
+ var NOWHERE = () => [];
9
+ /**
10
+ * TMenuFocusPlugin — модель фокуса меню у кнопки (APG Menu Button) и
11
+ * контекстного меню.
12
+ *
13
+ * Немодальная, как у Popover, и от него наследует всё общее: запомнить,
14
+ * откуда открыли, увести фокус в панель кадром позже, вернуть его при
15
+ * закрытии, закрыться по Escape, не возвращать фокус после нажатия и фокуса
16
+ * мимо, а запасной возврат — на триггер в корне. Поэтому Escape и нажатие
17
+ * пункта возвращают фокус на триггер, а нажатие мимо — нет: пользователь уже
18
+ * там, куда нажал.
19
+ *
20
+ * Своё у меню — три вещи:
21
+ *
22
+ * - **куда при открытии.** Фокус в меню идёт за подсветкой
23
+ * (`TMenuKeyboardPlugin`): открыли клавишей — подсвечен крайний пункт, и
24
+ * фокус встаёт на его строку; открыли кликом — подсветки нет, фокус на самой
25
+ * панели (`tabindex="-1"`), и первая стрелка подсветит первый пункт. Первая
26
+ * остановка Tab панели не годится: у пунктов её нет вовсе. У контекстного
27
+ * меню так же: клавиша контекстного меню — первый пункт, правая кнопка и
28
+ * касание — панель;
29
+ * - **Tab.** Остановок Tab в меню нет, и Tab из него закрывает меню (APG): Tab
30
+ * ведёт к первой остановке после корня — будто панель стоит в документе
31
+ * сразу за триггером — и фокус не возвращает; остановок после корня нет —
32
+ * Tab не гасится, фокус уводит браузер. Shift+Tab закрывает с возвратом:
33
+ * предыдущая остановка перед панелью — сам триггер. Tab в подменю и с
34
+ * последней остановки панели пункта — так же: о нём сообщает модель фокуса
35
+ * слоя (`tab`), и меню закрывается целиком, со всеми подменю и панелями.
36
+ * Остановки самого меню и его слоёв — пунктов с панелью, гаснущих вместе с
37
+ * ним, — в кандидаты не идут: панель пункта ещё на экране, и её остановки
38
+ * стоят в документе после корня;
39
+ * - **куда вернуть фокус, когда возвращать некуда** — фокус был на `body`.
40
+ * Запасной возврат Popover — на кнопку в корне — годится кнопке. У
41
+ * контекстного меню в корне область, а она бывает нефокусируемой, и её
42
+ * первая остановка Tab — не то место, откуда меню вызвали: фокус не
43
+ * возвращается никуда. Запасной возврат выбирает подписка на смену способа
44
+ * открытия, а не проверка при закрытии.
45
+ */
46
+ var TMenuFocusPlugin = class extends TPopoverFocusPlugin {
47
+ _owner = null;
48
+ _keyboard = null;
49
+ /** Запасной возврат фокуса — по способу открытия (`openOn`). */
50
+ _fallback = NOWHERE;
51
+ install(ctx, options) {
52
+ super.install(ctx, options);
53
+ this._owner = ctx.getInstance() ?? null;
54
+ this._keyboard = ctx.get(TMenuKeyboardPlugin) ?? null;
55
+ this._syncFallback();
56
+ this._listenTo(this._owner?.events, "change:openOn", () => this._syncFallback());
57
+ listenNestedTabs(ctx, (event) => this._leave(event));
58
+ }
59
+ destroy() {
60
+ this._owner = null;
61
+ this._keyboard = null;
62
+ super.destroy();
63
+ }
64
+ /** Фокус при открытии — строке подсвеченного пункта, без подсветки — панели. */
65
+ _focusCandidates(panel) {
66
+ const row = this._keyboard?.highlightedRow;
67
+ return row ? [row, panel] : [panel];
68
+ }
69
+ /** Запомненного элемента нет — у кнопки на неё, у области никуда. */
70
+ _returnCandidates(root) {
71
+ return this._fallback(root);
72
+ }
73
+ _onTab(event) {
74
+ const root = this._root;
75
+ const panel = this._panel;
76
+ const active = root?.ownerDocument.activeElement;
77
+ if (!root || !panel || !active || !panel.contains(active)) return;
78
+ this._leave(event);
79
+ }
80
+ /**
81
+ * Tab из меню — из его панели, из подменю или из панели пункта: Shift+Tab
82
+ * закрывает с возвратом на триггер, Tab — без возврата, к остановке за
83
+ * корнем.
84
+ */
85
+ _leave(event) {
86
+ const root = this._root;
87
+ const panel = this._panel;
88
+ if (!root || !panel) return;
89
+ if (event.shiftKey) {
90
+ this._close();
91
+ event.preventDefault();
92
+ return;
93
+ }
94
+ const after = tabStopsAfter(root, panel).filter((stop) => !this._dismiss?.isInside(stop));
95
+ this._restore = false;
96
+ this._close();
97
+ if (focusFirst(after)) event.preventDefault();
98
+ }
99
+ /** Запасной возврат: у области — никуда, у кнопки — остановки корня, как у Popover. */
100
+ _syncFallback() {
101
+ this._fallback = this._owner?.openOn === "contextmenu" ? NOWHERE : (root) => super._returnCandidates(root);
102
+ }
103
+ };
104
+ //#endregion
105
+ export { TMenuFocusPlugin };
@@ -0,0 +1,2 @@
1
+ export { TMenuFocusPlugin } from './focus.plugin';
2
+ export type { TMenuFocusPluginEvents } from './types';
@@ -0,0 +1,2 @@
1
+ import type { TPluginEvents } from '../../../base';
2
+ export type TMenuFocusPluginEvents = TPluginEvents;
@@ -0,0 +1,99 @@
1
+ import { TBasePlugin } from '../../../base';
2
+ import type { IPluginContext } from '../../../base';
3
+ import type { TMenuHoverPluginEvents } from './types';
4
+ /**
5
+ * TMenuHoverPlugin — указатель в панели одного уровня меню: корня или
6
+ * подменю.
7
+ *
8
+ * **Подсветка**, пока меню открыто: мышь и перо над доступным пунктом
9
+ * подсвечивают его, уход с пункта — на разделитель, подпись группы, поле
10
+ * панели или за панель — и выключенный пункт подсветку снимают. Подсветка —
11
+ * фокус (навигация уровня, без прокрутки), а пункт, срезанный краем списка,
12
+ * докручивает прокрутка списка — тем же правилом, что подсветку от клавиш.
13
+ * Своего наведения у строки нет: иначе после стрелок горели бы две строки —
14
+ * подсвеченная и та, что под указателем. Касание не подсвечивает: у пальца
15
+ * наведения нет, а нажатие пункта — его клик.
16
+ *
17
+ * **Панели пунктов** — подменю и панель пункта с панелью
18
+ * (`Menu.PopoverItem`) — намерение указателя (APG Menu, как Radix и React
19
+ * Aria):
20
+ *
21
+ * - указатель, простоявший на пункте со своей панелью `PANEL_OPEN_DELAY`,
22
+ * открывает её — через коллекцию (`openItem`): выключенному она откажет.
23
+ * Фокус остаётся на строке: в панель он входит указателем или клавишами.
24
+ * Подменю на открытии фокус на строке и так оставляет, а модель фокуса
25
+ * пункта с панелью увела бы его в панель, как после нажатия, — ей плагин
26
+ * сообщает, что панель открыл указатель (`keepFocusOnRow`). Нажали строку,
27
+ * пока указатель ждал, — панель уже открыта нажатием, и фокус у неё;
28
+ * - указатель ушёл со строки пункта с открытой панелью — от точки ухода к
29
+ * панели ложится путь (`graceArea`): пока указатель на нём, пункты по
30
+ * дороге подсветку не перехватывают, и панель открыта. Путь держит
31
+ * `PANEL_GRACE_DELAY`, а сходит с него указатель — подсветка уходит к
32
+ * пункту под ним, и панель закрывается тем же путём, что от клавиш: фокус
33
+ * ушёл из пункта — его панель закрылась (`TDismissPlugin` с
34
+ * `focusOutside`);
35
+ * - указатель ушёл с панели меню, пока панель пункта открыта, — подсветка
36
+ * остаётся у его строки: указатель уходит в его панель.
37
+ *
38
+ * Панель пункта (`TDismissPlugin` по пометке владельцем) и его модель фокуса
39
+ * плагин берёт у набора пункта, а набор — в реестре коллекции.
40
+ *
41
+ * Слушатели висят на панели, пока меню открыто: панель телепортирована, и
42
+ * находит её `TDismissPlugin` по пометке владельцем.
43
+ */
44
+ export declare class TMenuHoverPlugin extends TBasePlugin<any, TMenuHoverPluginEvents> {
45
+ private _owner;
46
+ private _dismiss;
47
+ private _navigation;
48
+ private _elements;
49
+ private _bundles;
50
+ /** Корень объявлен — панель есть где искать. */
51
+ private _root;
52
+ /** Узел нужен только под слушатели — отсюда и тип. */
53
+ private _panel;
54
+ /** Пункт, над которым указатель был прошлым ходом. */
55
+ private _lastUid;
56
+ private _grace;
57
+ private _pendingOpen;
58
+ install(ctx: IPluginContext): void;
59
+ destroy(): void;
60
+ /** Слушать панель, пока меню открыто и корень объявлен. */
61
+ private _syncPanel;
62
+ private _unlistenPanel;
63
+ /** Пункт под указателем: показанный, чей узел содержит цель события. */
64
+ private _uidAt;
65
+ private _shown;
66
+ /** Пункт этого уровня с открытой панелью — подменю или своей; `null` — такого нет. */
67
+ private _opened;
68
+ private readonly _onPointerMove;
69
+ /**
70
+ * Указатель ушёл с панели: пункт с открытой панелью держит подсветку своей
71
+ * строки. Путь к ней снят — указатель до панели дошёл или ушёл мимо, и
72
+ * вернувшийся указатель решает заново.
73
+ */
74
+ private readonly _onPointerLeave;
75
+ /**
76
+ * Идёт ли указатель к открытой панели пункта. Только что ушёл с его строки
77
+ * — путь ложится от точки ухода; путь есть и указатель на нём — да; сошёл
78
+ * с пути — путь снят.
79
+ */
80
+ private _onGrace;
81
+ /** Путь от точки ухода к панели пункта — на время `PANEL_GRACE_DELAY`. */
82
+ private _layGrace;
83
+ private _dropGrace;
84
+ /**
85
+ * Пункт со своей панелью под указателем — подменю или пункт с панелью —
86
+ * откроется, если указатель на нём простоит: доступный, закрытый, —
87
+ * открытый, выключенный и пункт без своей панели ожидание снимают.
88
+ */
89
+ private _scheduleOpen;
90
+ /**
91
+ * Открыть панель пункта указателем: фокус остаётся на строке. Панель уже
92
+ * открыта — строку нажали, пока указатель ждал, — фокус ведёт нажатие, и
93
+ * трогать его нечего. Модель фокуса пункта с панелью увела бы фокус в
94
+ * панель, как после нажатия, — ей сказано оставить его на строке; у
95
+ * подменю её нет, и фокус на строке оно оставляет само.
96
+ */
97
+ private _openByPointer;
98
+ private _cancelOpen;
99
+ }
@@ -0,0 +1,235 @@
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 { graceArea, isPointInPolygon } from "../../../utils/graceArea.js";
6
+ import { TDismissPlugin } from "../../dismiss/dismiss.plugin.js";
7
+ import { TMenuKeyboardPlugin } from "../keyboard/keyboard.plugin.js";
8
+ import { TMenuSubmenuKeyboardPlugin } from "../submenu-keyboard/keyboard.plugin.js";
9
+ import { TMenuPopoverItemFocusPlugin } from "../popover-item-focus/focus.plugin.js";
10
+ import { batchOf, isMenuPopupItem, menuOf } from "@soxa-ui/core";
11
+ //#region src/custom/menu/hover/hover.plugin.ts
12
+ /**
13
+ * Сколько указатель стоит на пункте со своей панелью, пока она не откроется,
14
+ * мс: указатель, который проходит мимо, панель не раскрывает (Radix — те же
15
+ * 100 мс у подменю).
16
+ */
17
+ var PANEL_OPEN_DELAY = 100;
18
+ /**
19
+ * Сколько держит путь к открытой панели пункта после ухода со строки, мс:
20
+ * дольше указатель идёт к панели только стоя, а стоящий на соседнем пункте
21
+ * его и выбрал (Radix — те же 300 мс).
22
+ */
23
+ var PANEL_GRACE_DELAY = 300;
24
+ /** Указатель, который наводят, — мышь и перо. У пальца наведения нет. */
25
+ var hovers = (e) => e.pointerType === "mouse" || e.pointerType === "pen";
26
+ /**
27
+ * TMenuHoverPlugin — указатель в панели одного уровня меню: корня или
28
+ * подменю.
29
+ *
30
+ * **Подсветка**, пока меню открыто: мышь и перо над доступным пунктом
31
+ * подсвечивают его, уход с пункта — на разделитель, подпись группы, поле
32
+ * панели или за панель — и выключенный пункт подсветку снимают. Подсветка —
33
+ * фокус (навигация уровня, без прокрутки), а пункт, срезанный краем списка,
34
+ * докручивает прокрутка списка — тем же правилом, что подсветку от клавиш.
35
+ * Своего наведения у строки нет: иначе после стрелок горели бы две строки —
36
+ * подсвеченная и та, что под указателем. Касание не подсвечивает: у пальца
37
+ * наведения нет, а нажатие пункта — его клик.
38
+ *
39
+ * **Панели пунктов** — подменю и панель пункта с панелью
40
+ * (`Menu.PopoverItem`) — намерение указателя (APG Menu, как Radix и React
41
+ * Aria):
42
+ *
43
+ * - указатель, простоявший на пункте со своей панелью `PANEL_OPEN_DELAY`,
44
+ * открывает её — через коллекцию (`openItem`): выключенному она откажет.
45
+ * Фокус остаётся на строке: в панель он входит указателем или клавишами.
46
+ * Подменю на открытии фокус на строке и так оставляет, а модель фокуса
47
+ * пункта с панелью увела бы его в панель, как после нажатия, — ей плагин
48
+ * сообщает, что панель открыл указатель (`keepFocusOnRow`). Нажали строку,
49
+ * пока указатель ждал, — панель уже открыта нажатием, и фокус у неё;
50
+ * - указатель ушёл со строки пункта с открытой панелью — от точки ухода к
51
+ * панели ложится путь (`graceArea`): пока указатель на нём, пункты по
52
+ * дороге подсветку не перехватывают, и панель открыта. Путь держит
53
+ * `PANEL_GRACE_DELAY`, а сходит с него указатель — подсветка уходит к
54
+ * пункту под ним, и панель закрывается тем же путём, что от клавиш: фокус
55
+ * ушёл из пункта — его панель закрылась (`TDismissPlugin` с
56
+ * `focusOutside`);
57
+ * - указатель ушёл с панели меню, пока панель пункта открыта, — подсветка
58
+ * остаётся у его строки: указатель уходит в его панель.
59
+ *
60
+ * Панель пункта (`TDismissPlugin` по пометке владельцем) и его модель фокуса
61
+ * плагин берёт у набора пункта, а набор — в реестре коллекции.
62
+ *
63
+ * Слушатели висят на панели, пока меню открыто: панель телепортирована, и
64
+ * находит её `TDismissPlugin` по пометке владельцем.
65
+ */
66
+ var TMenuHoverPlugin = class extends TBasePlugin {
67
+ _owner = null;
68
+ _dismiss = null;
69
+ _navigation = null;
70
+ _elements = null;
71
+ _bundles = null;
72
+ /** Корень объявлен — панель есть где искать. */
73
+ _root = null;
74
+ /** Узел нужен только под слушатели — отсюда и тип. */
75
+ _panel = null;
76
+ /** Пункт, над которым указатель был прошлым ходом. */
77
+ _lastUid = void 0;
78
+ _grace = null;
79
+ _pendingOpen = null;
80
+ install(ctx) {
81
+ super.install(ctx);
82
+ this._owner = ctx.getInstance() ?? null;
83
+ this._dismiss = ctx.get(TDismissPlugin) ?? null;
84
+ this._navigation = ctx.get(TMenuKeyboardPlugin) ?? ctx.get(TMenuSubmenuKeyboardPlugin) ?? null;
85
+ this._elements = ctx.get(TCollectionElements) ?? null;
86
+ this._bundles = ctx.get(TCollectionBundlesPlugin) ?? null;
87
+ const elementPlugin = ctx.get(TElementPlugin);
88
+ elementPlugin?.events.on("ready", (element) => {
89
+ this._root = element;
90
+ this._syncPanel();
91
+ });
92
+ elementPlugin?.events.on("removed", () => {
93
+ this._root = null;
94
+ this._syncPanel();
95
+ });
96
+ this._listenTo(this._owner?.events, "change:open", () => this._syncPanel());
97
+ }
98
+ destroy() {
99
+ this._unlistenPanel();
100
+ this._root = null;
101
+ this._owner = null;
102
+ this._dismiss = null;
103
+ this._navigation = null;
104
+ this._elements = null;
105
+ this._bundles = null;
106
+ super.destroy();
107
+ }
108
+ /** Слушать панель, пока меню открыто и корень объявлен. */
109
+ _syncPanel() {
110
+ const panel = this._root && this._owner?.open ? this._dismiss?.findPanel() ?? null : null;
111
+ if (panel === this._panel) return;
112
+ this._unlistenPanel();
113
+ if (!panel) return;
114
+ this._panel = panel;
115
+ panel.addEventListener("pointermove", this._onPointerMove);
116
+ panel.addEventListener("pointerleave", this._onPointerLeave);
117
+ }
118
+ _unlistenPanel() {
119
+ this._panel?.removeEventListener("pointermove", this._onPointerMove);
120
+ this._panel?.removeEventListener("pointerleave", this._onPointerLeave);
121
+ this._panel = null;
122
+ this._lastUid = void 0;
123
+ this._dropGrace();
124
+ this._cancelOpen();
125
+ }
126
+ /** Пункт под указателем: показанный, чей узел содержит цель события. */
127
+ _uidAt(target) {
128
+ if (!(target instanceof Node)) return void 0;
129
+ return this._shown().find((item) => this._elements?.getElementByUid(item.uid)?.contains(target))?.uid;
130
+ }
131
+ _shown() {
132
+ return batchOf(this._elements?.engine)?.shown ?? [];
133
+ }
134
+ /** Пункт этого уровня с открытой панелью — подменю или своей; `null` — такого нет. */
135
+ _opened() {
136
+ return menuOf(this._elements?.engine)?.opened ?? null;
137
+ }
138
+ _onPointerMove = (e) => {
139
+ if (!hovers(e)) return;
140
+ const point = {
141
+ x: e.clientX,
142
+ y: e.clientY
143
+ };
144
+ const uid = this._uidAt(e.target);
145
+ const last = this._lastUid;
146
+ this._lastUid = uid;
147
+ if (this._onGrace(point, uid, last)) return;
148
+ this._scheduleOpen(uid);
149
+ if (uid !== void 0 && this._navigation?.highlightItem(uid)) return;
150
+ this._navigation?.unhighlight();
151
+ };
152
+ /**
153
+ * Указатель ушёл с панели: пункт с открытой панелью держит подсветку своей
154
+ * строки. Путь к ней снят — указатель до панели дошёл или ушёл мимо, и
155
+ * вернувшийся указатель решает заново.
156
+ */
157
+ _onPointerLeave = (e) => {
158
+ if (!hovers(e)) return;
159
+ this._lastUid = void 0;
160
+ this._dropGrace();
161
+ this._cancelOpen();
162
+ if (this._opened()) return;
163
+ this._navigation?.unhighlight();
164
+ };
165
+ /**
166
+ * Идёт ли указатель к открытой панели пункта. Только что ушёл с его строки
167
+ * — путь ложится от точки ухода; путь есть и указатель на нём — да; сошёл
168
+ * с пути — путь снят.
169
+ */
170
+ _onGrace(point, uid, last) {
171
+ const opened = this._opened();
172
+ if (!opened || uid === opened.uid) {
173
+ this._dropGrace();
174
+ return false;
175
+ }
176
+ if (last === opened.uid) this._layGrace(point, opened);
177
+ if (this._grace && isPointInPolygon(point, this._grace.area)) return true;
178
+ this._dropGrace();
179
+ return false;
180
+ }
181
+ /** Путь от точки ухода к панели пункта — на время `PANEL_GRACE_DELAY`. */
182
+ _layGrace(exit, item) {
183
+ this._dropGrace();
184
+ const box = (this._bundles?.getByUid(item.uid)?.get(TDismissPlugin)?.findPanel())?.getBoundingClientRect();
185
+ if (!box || box.width === 0 || box.height === 0) return;
186
+ this._grace = {
187
+ area: graceArea(exit, box),
188
+ timer: setTimeout(() => {
189
+ this._grace = null;
190
+ }, PANEL_GRACE_DELAY)
191
+ };
192
+ }
193
+ _dropGrace() {
194
+ if (this._grace) clearTimeout(this._grace.timer);
195
+ this._grace = null;
196
+ }
197
+ /**
198
+ * Пункт со своей панелью под указателем — подменю или пункт с панелью —
199
+ * откроется, если указатель на нём простоит: доступный, закрытый, —
200
+ * открытый, выключенный и пункт без своей панели ожидание снимают.
201
+ */
202
+ _scheduleOpen(uid) {
203
+ const item = uid === void 0 ? void 0 : this._shown().find((shown) => shown.uid === uid);
204
+ if (!isMenuPopupItem(item) || item.open || item.disabled) {
205
+ this._cancelOpen();
206
+ return;
207
+ }
208
+ if (this._pendingOpen?.uid === item.uid) return;
209
+ this._cancelOpen();
210
+ this._pendingOpen = {
211
+ uid: item.uid,
212
+ timer: setTimeout(() => {
213
+ this._pendingOpen = null;
214
+ this._openByPointer(item);
215
+ }, PANEL_OPEN_DELAY)
216
+ };
217
+ }
218
+ /**
219
+ * Открыть панель пункта указателем: фокус остаётся на строке. Панель уже
220
+ * открыта — строку нажали, пока указатель ждал, — фокус ведёт нажатие, и
221
+ * трогать его нечего. Модель фокуса пункта с панелью увела бы фокус в
222
+ * панель, как после нажатия, — ей сказано оставить его на строке; у
223
+ * подменю её нет, и фокус на строке оно оставляет само.
224
+ */
225
+ _openByPointer(item) {
226
+ if (item.open || !menuOf(this._elements?.engine)?.openItem(item)) return;
227
+ this._bundles?.getByUid(item.uid)?.get(TMenuPopoverItemFocusPlugin)?.keepFocusOnRow();
228
+ }
229
+ _cancelOpen() {
230
+ if (this._pendingOpen) clearTimeout(this._pendingOpen.timer);
231
+ this._pendingOpen = null;
232
+ }
233
+ };
234
+ //#endregion
235
+ export { TMenuHoverPlugin };
@@ -0,0 +1,2 @@
1
+ export { TMenuHoverPlugin } from './hover.plugin';
2
+ export type { TMenuHoverPluginEvents } from './types';
@@ -0,0 +1,2 @@
1
+ import type { TPluginEvents } from '../../../base';
2
+ export type TMenuHoverPluginEvents = TPluginEvents;
@@ -0,0 +1,29 @@
1
+ import { TBasePlugin } from '../../../base';
2
+ import type { IPluginContext } from '../../../base';
3
+ /**
4
+ * TMenuIdsPlugin — связка «кнопка ↔ меню» в документе (APG Menu Button).
5
+ *
6
+ * Обе стороны ссылаются друг на друга: у триггера — `id` и `aria-controls`
7
+ * на панель (`triggerAria`), у панели — `id` и `aria-labelledby` на триггер
8
+ * (`aria` меню, его разметка раскладывает на панель). Имя меню — текст
9
+ * кнопки: скринридер объявляет «Действия, меню». Пишутся обе стороны здесь,
10
+ * от двух `id` одного монтирования: формула одна на обе.
11
+ *
12
+ * Связка — у кнопки (`openOn: 'press'`). Контекстное меню вызывают над
13
+ * областью, а она не кнопка: у неё ни `id` триггера, ни ссылки на панель, а
14
+ * у панели — ссылки на имя, которого нет. Остаётся `id` панели — он её
15
+ * собственный. Режим меняется на лету — связка ставится и снимается вместе
16
+ * с ним, как подпись группы у `TItemGroupIdsPlugin`.
17
+ *
18
+ * `id` — от монтирования (`createId`), а не от экземпляра: он нужен только
19
+ * документу, и на сервере и в браузере обязан совпасть. Пишется при
20
+ * установке, синхронно, — связка есть уже в первой (и серверной) отрисовке.
21
+ * Ссылки стоят и у закрытого меню: панель всегда в документе, закрытие её
22
+ * только прячет.
23
+ *
24
+ * Шина меню бывает долговечнее плагина — приложение передаёт свой `ctrl`, —
25
+ * поэтому подписка через `_listenTo`.
26
+ */
27
+ export declare class TMenuIdsPlugin extends TBasePlugin {
28
+ install(ctx: IPluginContext): void;
29
+ }
@@ -0,0 +1,46 @@
1
+ import { TBasePlugin } from "../../../base/base.class.js";
2
+ //#region src/custom/menu/ids/ids.plugin.ts
3
+ /**
4
+ * TMenuIdsPlugin — связка «кнопка ↔ меню» в документе (APG Menu Button).
5
+ *
6
+ * Обе стороны ссылаются друг на друга: у триггера — `id` и `aria-controls`
7
+ * на панель (`triggerAria`), у панели — `id` и `aria-labelledby` на триггер
8
+ * (`aria` меню, его разметка раскладывает на панель). Имя меню — текст
9
+ * кнопки: скринридер объявляет «Действия, меню». Пишутся обе стороны здесь,
10
+ * от двух `id` одного монтирования: формула одна на обе.
11
+ *
12
+ * Связка — у кнопки (`openOn: 'press'`). Контекстное меню вызывают над
13
+ * областью, а она не кнопка: у неё ни `id` триггера, ни ссылки на панель, а
14
+ * у панели — ссылки на имя, которого нет. Остаётся `id` панели — он её
15
+ * собственный. Режим меняется на лету — связка ставится и снимается вместе
16
+ * с ним, как подпись группы у `TItemGroupIdsPlugin`.
17
+ *
18
+ * `id` — от монтирования (`createId`), а не от экземпляра: он нужен только
19
+ * документу, и на сервере и в браузере обязан совпасть. Пишется при
20
+ * установке, синхронно, — связка есть уже в первой (и серверной) отрисовке.
21
+ * Ссылки стоят и у закрытого меню: панель всегда в документе, закрытие её
22
+ * только прячет.
23
+ *
24
+ * Шина меню бывает долговечнее плагина — приложение передаёт свой `ctrl`, —
25
+ * поэтому подписка через `_listenTo`.
26
+ */
27
+ var TMenuIdsPlugin = class extends TBasePlugin {
28
+ install(ctx) {
29
+ super.install(ctx);
30
+ const menu = ctx.getInstance();
31
+ if (!menu) return;
32
+ const triggerId = ctx.createId("trigger");
33
+ const panelId = ctx.createId("panel");
34
+ menu.aria.add("id", panelId);
35
+ const link = () => {
36
+ const button = menu.openOn === "press";
37
+ menu.triggerAria.add("id", button ? triggerId : null);
38
+ menu.triggerAria.add("aria-controls", button ? panelId : null);
39
+ menu.aria.add("aria-labelledby", button ? triggerId : null);
40
+ };
41
+ link();
42
+ this._listenTo(menu.events, "change:openOn", link);
43
+ }
44
+ };
45
+ //#endregion
46
+ export { TMenuIdsPlugin };