stimeo-ui 0.17.0 → 0.18.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 (299) hide show
  1. package/CHANGELOG.md +136 -2
  2. package/README.md +19 -10
  3. package/dist/cable/index.d.ts +11 -9
  4. package/dist/cable/index.js +22 -14
  5. package/dist/cable/index.js.map +1 -1
  6. package/dist/coerce-JtZVNG5h.d.ts +20 -0
  7. package/dist/controllers/accordion_controller.js +14 -6
  8. package/dist/controllers/accordion_controller.js.map +1 -1
  9. package/dist/controllers/alert_dialog_controller.js +145 -118
  10. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  11. package/dist/controllers/announcer_controller.d.ts +5 -3
  12. package/dist/controllers/announcer_controller.js +113 -17
  13. package/dist/controllers/announcer_controller.js.map +1 -1
  14. package/dist/controllers/auto_submit_controller.js +185 -60
  15. package/dist/controllers/auto_submit_controller.js.map +1 -1
  16. package/dist/controllers/avatar_controller.js +55 -43
  17. package/dist/controllers/avatar_controller.js.map +1 -1
  18. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  19. package/dist/controllers/bulk_select_controller.d.ts +3 -3
  20. package/dist/controllers/bulk_select_controller.js +64 -50
  21. package/dist/controllers/bulk_select_controller.js.map +1 -1
  22. package/dist/controllers/calendar_controller.d.ts +15 -12
  23. package/dist/controllers/calendar_controller.js +55 -53
  24. package/dist/controllers/calendar_controller.js.map +1 -1
  25. package/dist/controllers/carousel_controller.d.ts +9 -5
  26. package/dist/controllers/carousel_controller.js +124 -86
  27. package/dist/controllers/carousel_controller.js.map +1 -1
  28. package/dist/controllers/character_counter_controller.d.ts +27 -6
  29. package/dist/controllers/character_counter_controller.js +291 -95
  30. package/dist/controllers/character_counter_controller.js.map +1 -1
  31. package/dist/controllers/checkbox_controller.js +6 -0
  32. package/dist/controllers/checkbox_controller.js.map +1 -1
  33. package/dist/controllers/clipboard_controller.js +118 -27
  34. package/dist/controllers/clipboard_controller.js.map +1 -1
  35. package/dist/controllers/collapsible_controller.d.ts +1 -1
  36. package/dist/controllers/collapsible_controller.js +52 -49
  37. package/dist/controllers/collapsible_controller.js.map +1 -1
  38. package/dist/controllers/color_picker_controller.js +29 -7
  39. package/dist/controllers/color_picker_controller.js.map +1 -1
  40. package/dist/controllers/combobox_controller.d.ts +1 -1
  41. package/dist/controllers/combobox_controller.js +210 -71
  42. package/dist/controllers/combobox_controller.js.map +1 -1
  43. package/dist/controllers/command_palette_controller.d.ts +9 -9
  44. package/dist/controllers/command_palette_controller.js +290 -140
  45. package/dist/controllers/command_palette_controller.js.map +1 -1
  46. package/dist/controllers/conditional_fields_controller.js +145 -58
  47. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  48. package/dist/controllers/confirm_controller.js +145 -118
  49. package/dist/controllers/confirm_controller.js.map +1 -1
  50. package/dist/controllers/context_menu_controller.d.ts +49 -14
  51. package/dist/controllers/context_menu_controller.js +138 -73
  52. package/dist/controllers/context_menu_controller.js.map +1 -1
  53. package/dist/controllers/count_up_controller.js.map +1 -1
  54. package/dist/controllers/countdown_controller.d.ts +2 -2
  55. package/dist/controllers/countdown_controller.js +109 -21
  56. package/dist/controllers/countdown_controller.js.map +1 -1
  57. package/dist/controllers/currency_input_controller.d.ts +75 -11
  58. package/dist/controllers/currency_input_controller.js +446 -72
  59. package/dist/controllers/currency_input_controller.js.map +1 -1
  60. package/dist/controllers/data_grid_controller.d.ts +10 -8
  61. package/dist/controllers/data_grid_controller.js +134 -28
  62. package/dist/controllers/data_grid_controller.js.map +1 -1
  63. package/dist/controllers/date_range_picker_controller.d.ts +12 -9
  64. package/dist/controllers/date_range_picker_controller.js +93 -72
  65. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  66. package/dist/controllers/dialog_controller.d.ts +4 -5
  67. package/dist/controllers/dialog_controller.js +145 -118
  68. package/dist/controllers/dialog_controller.js.map +1 -1
  69. package/dist/controllers/direct_upload_controller.d.ts +1 -1
  70. package/dist/controllers/direct_upload_controller.js +24 -14
  71. package/dist/controllers/direct_upload_controller.js.map +1 -1
  72. package/dist/controllers/dirty_form_controller.d.ts +6 -1
  73. package/dist/controllers/dirty_form_controller.js +68 -31
  74. package/dist/controllers/dirty_form_controller.js.map +1 -1
  75. package/dist/controllers/dismissible_controller.js +66 -46
  76. package/dist/controllers/dismissible_controller.js.map +1 -1
  77. package/dist/controllers/drawer_controller.js +145 -118
  78. package/dist/controllers/drawer_controller.js.map +1 -1
  79. package/dist/controllers/dropdown_controller.js +76 -63
  80. package/dist/controllers/dropdown_controller.js.map +1 -1
  81. package/dist/controllers/editable_controller.js +200 -62
  82. package/dist/controllers/editable_controller.js.map +1 -1
  83. package/dist/controllers/empty_state_controller.js +13 -6
  84. package/dist/controllers/empty_state_controller.js.map +1 -1
  85. package/dist/controllers/file_dropzone_controller.d.ts +3 -0
  86. package/dist/controllers/file_dropzone_controller.js +55 -48
  87. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  88. package/dist/controllers/filter_controller.js +9 -2
  89. package/dist/controllers/filter_controller.js.map +1 -1
  90. package/dist/controllers/flash_controller.d.ts +4 -4
  91. package/dist/controllers/flash_controller.js +66 -33
  92. package/dist/controllers/flash_controller.js.map +1 -1
  93. package/dist/controllers/focus_controller.d.ts +3 -3
  94. package/dist/controllers/focus_controller.js +39 -14
  95. package/dist/controllers/focus_controller.js.map +1 -1
  96. package/dist/controllers/form_field_controller.d.ts +2 -1
  97. package/dist/controllers/form_field_controller.js +52 -43
  98. package/dist/controllers/form_field_controller.js.map +1 -1
  99. package/dist/controllers/form_validation_controller.d.ts +3 -3
  100. package/dist/controllers/form_validation_controller.js +18 -11
  101. package/dist/controllers/form_validation_controller.js.map +1 -1
  102. package/dist/controllers/frame_loading_controller.d.ts +13 -12
  103. package/dist/controllers/frame_loading_controller.js +55 -48
  104. package/dist/controllers/frame_loading_controller.js.map +1 -1
  105. package/dist/controllers/highlight_controller.d.ts +5 -4
  106. package/dist/controllers/highlight_controller.js.map +1 -1
  107. package/dist/controllers/hover_card_controller.d.ts +4 -1
  108. package/dist/controllers/hover_card_controller.js +67 -61
  109. package/dist/controllers/hover_card_controller.js.map +1 -1
  110. package/dist/controllers/idle_controller.d.ts +6 -5
  111. package/dist/controllers/idle_controller.js +10 -6
  112. package/dist/controllers/idle_controller.js.map +1 -1
  113. package/dist/controllers/input_mask_controller.d.ts +31 -13
  114. package/dist/controllers/input_mask_controller.js +434 -24
  115. package/dist/controllers/input_mask_controller.js.map +1 -1
  116. package/dist/controllers/intersection_controller.js +3 -0
  117. package/dist/controllers/intersection_controller.js.map +1 -1
  118. package/dist/controllers/lazy_frame_controller.d.ts +3 -2
  119. package/dist/controllers/lazy_frame_controller.js +15 -3
  120. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  121. package/dist/controllers/listbox_controller.d.ts +10 -7
  122. package/dist/controllers/listbox_controller.js +260 -79
  123. package/dist/controllers/listbox_controller.js.map +1 -1
  124. package/dist/controllers/local_time_controller.d.ts +8 -6
  125. package/dist/controllers/local_time_controller.js +48 -13
  126. package/dist/controllers/local_time_controller.js.map +1 -1
  127. package/dist/controllers/masonry_controller.js +11 -4
  128. package/dist/controllers/masonry_controller.js.map +1 -1
  129. package/dist/controllers/menu_controller.d.ts +24 -5
  130. package/dist/controllers/menu_controller.js +138 -82
  131. package/dist/controllers/menu_controller.js.map +1 -1
  132. package/dist/controllers/menubar_controller.d.ts +49 -7
  133. package/dist/controllers/menubar_controller.js +65 -19
  134. package/dist/controllers/menubar_controller.js.map +1 -1
  135. package/dist/controllers/meter_controller.d.ts +13 -20
  136. package/dist/controllers/meter_controller.js +270 -24
  137. package/dist/controllers/meter_controller.js.map +1 -1
  138. package/dist/controllers/multi_select_controller.d.ts +19 -16
  139. package/dist/controllers/multi_select_controller.js +272 -95
  140. package/dist/controllers/multi_select_controller.js.map +1 -1
  141. package/dist/controllers/navigation_menu_controller.d.ts +19 -5
  142. package/dist/controllers/navigation_menu_controller.js +67 -19
  143. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  144. package/dist/controllers/nested_form_controller.js +98 -64
  145. package/dist/controllers/nested_form_controller.js.map +1 -1
  146. package/dist/controllers/network_status_controller.js +70 -52
  147. package/dist/controllers/network_status_controller.js.map +1 -1
  148. package/dist/controllers/number_input_controller.d.ts +24 -6
  149. package/dist/controllers/number_input_controller.js +344 -94
  150. package/dist/controllers/number_input_controller.js.map +1 -1
  151. package/dist/controllers/optimistic_controller.d.ts +8 -5
  152. package/dist/controllers/optimistic_controller.js +29 -11
  153. package/dist/controllers/optimistic_controller.js.map +1 -1
  154. package/dist/controllers/otp_controller.d.ts +35 -4
  155. package/dist/controllers/otp_controller.js +502 -104
  156. package/dist/controllers/otp_controller.js.map +1 -1
  157. package/dist/controllers/overflow_indicator_controller.js +6 -0
  158. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  159. package/dist/controllers/overflow_menu_controller.d.ts +10 -9
  160. package/dist/controllers/overflow_menu_controller.js +136 -21
  161. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  162. package/dist/controllers/pagination_controller.d.ts +3 -2
  163. package/dist/controllers/pagination_controller.js +47 -14
  164. package/dist/controllers/pagination_controller.js.map +1 -1
  165. package/dist/controllers/password_reveal_controller.d.ts +5 -4
  166. package/dist/controllers/password_reveal_controller.js +52 -49
  167. package/dist/controllers/password_reveal_controller.js.map +1 -1
  168. package/dist/controllers/password_strength_controller.d.ts +1 -1
  169. package/dist/controllers/password_strength_controller.js +13 -6
  170. package/dist/controllers/password_strength_controller.js.map +1 -1
  171. package/dist/controllers/persist_controller.js +48 -128
  172. package/dist/controllers/persist_controller.js.map +1 -1
  173. package/dist/controllers/pointer_drag_controller.d.ts +20 -8
  174. package/dist/controllers/pointer_drag_controller.js +255 -24
  175. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  176. package/dist/controllers/popover_controller.d.ts +9 -5
  177. package/dist/controllers/popover_controller.js +91 -65
  178. package/dist/controllers/popover_controller.js.map +1 -1
  179. package/dist/controllers/portal_controller.js +6 -0
  180. package/dist/controllers/portal_controller.js.map +1 -1
  181. package/dist/controllers/preview_guard_controller.js +14 -3
  182. package/dist/controllers/preview_guard_controller.js.map +1 -1
  183. package/dist/controllers/progress_controller.d.ts +9 -19
  184. package/dist/controllers/progress_controller.js +271 -27
  185. package/dist/controllers/progress_controller.js.map +1 -1
  186. package/dist/controllers/radio_group_controller.d.ts +11 -8
  187. package/dist/controllers/radio_group_controller.js +167 -80
  188. package/dist/controllers/radio_group_controller.js.map +1 -1
  189. package/dist/controllers/range_slider_controller.d.ts +4 -3
  190. package/dist/controllers/range_slider_controller.js +27 -7
  191. package/dist/controllers/range_slider_controller.js.map +1 -1
  192. package/dist/controllers/rating_controller.js +93 -57
  193. package/dist/controllers/rating_controller.js.map +1 -1
  194. package/dist/controllers/read_more_controller.js +10 -6
  195. package/dist/controllers/read_more_controller.js.map +1 -1
  196. package/dist/controllers/reading_progress_controller.js +22 -5
  197. package/dist/controllers/reading_progress_controller.js.map +1 -1
  198. package/dist/controllers/relative_time_controller.d.ts +4 -4
  199. package/dist/controllers/relative_time_controller.js +75 -11
  200. package/dist/controllers/relative_time_controller.js.map +1 -1
  201. package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
  202. package/dist/controllers/reset_on_restore_controller.js +6 -0
  203. package/dist/controllers/reset_on_restore_controller.js.map +1 -1
  204. package/dist/controllers/resizable_controller.d.ts +3 -0
  205. package/dist/controllers/resizable_controller.js +55 -22
  206. package/dist/controllers/resizable_controller.js.map +1 -1
  207. package/dist/controllers/roving_controller.d.ts +3 -3
  208. package/dist/controllers/roving_controller.js +10 -4
  209. package/dist/controllers/roving_controller.js.map +1 -1
  210. package/dist/controllers/scroll_area_controller.js +129 -88
  211. package/dist/controllers/scroll_area_controller.js.map +1 -1
  212. package/dist/controllers/scroll_restore_controller.d.ts +3 -3
  213. package/dist/controllers/scroll_restore_controller.js +14 -2
  214. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  215. package/dist/controllers/scroll_visibility_controller.js +93 -60
  216. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  217. package/dist/controllers/scrollspy_controller.js +11 -5
  218. package/dist/controllers/scrollspy_controller.js.map +1 -1
  219. package/dist/controllers/separator_controller.d.ts +1 -1
  220. package/dist/controllers/separator_controller.js +59 -43
  221. package/dist/controllers/separator_controller.js.map +1 -1
  222. package/dist/controllers/sidebar_controller.d.ts +1 -1
  223. package/dist/controllers/sidebar_controller.js +150 -122
  224. package/dist/controllers/sidebar_controller.js.map +1 -1
  225. package/dist/controllers/skeleton_controller.js +55 -48
  226. package/dist/controllers/skeleton_controller.js.map +1 -1
  227. package/dist/controllers/slider_controller.d.ts +2 -1
  228. package/dist/controllers/slider_controller.js +27 -6
  229. package/dist/controllers/slider_controller.js.map +1 -1
  230. package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
  231. package/dist/controllers/smart_sticky_header_controller.js +13 -5
  232. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  233. package/dist/controllers/sortable_controller.d.ts +4 -4
  234. package/dist/controllers/sortable_controller.js +27 -14
  235. package/dist/controllers/sortable_controller.js.map +1 -1
  236. package/dist/controllers/spinner_controller.js +55 -48
  237. package/dist/controllers/spinner_controller.js.map +1 -1
  238. package/dist/controllers/step_indicator_controller.d.ts +4 -4
  239. package/dist/controllers/step_indicator_controller.js +6 -0
  240. package/dist/controllers/step_indicator_controller.js.map +1 -1
  241. package/dist/controllers/stepper_controller.d.ts +2 -3
  242. package/dist/controllers/stepper_controller.js +6 -0
  243. package/dist/controllers/stepper_controller.js.map +1 -1
  244. package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
  245. package/dist/controllers/stick_to_bottom_controller.js +19 -8
  246. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  247. package/dist/controllers/sticky_observer_controller.js +49 -43
  248. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  249. package/dist/controllers/submit_once_controller.d.ts +2 -1
  250. package/dist/controllers/submit_once_controller.js +145 -85
  251. package/dist/controllers/submit_once_controller.js.map +1 -1
  252. package/dist/controllers/switch_controller.d.ts +7 -4
  253. package/dist/controllers/switch_controller.js +172 -28
  254. package/dist/controllers/switch_controller.js.map +1 -1
  255. package/dist/controllers/tabs_controller.d.ts +7 -4
  256. package/dist/controllers/tabs_controller.js +6 -1
  257. package/dist/controllers/tabs_controller.js.map +1 -1
  258. package/dist/controllers/tags_input_controller.d.ts +4 -3
  259. package/dist/controllers/tags_input_controller.js +157 -28
  260. package/dist/controllers/tags_input_controller.js.map +1 -1
  261. package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
  262. package/dist/controllers/textarea_autosize_controller.js +40 -19
  263. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  264. package/dist/controllers/theme_controller.d.ts +3 -2
  265. package/dist/controllers/theme_controller.js +10 -4
  266. package/dist/controllers/theme_controller.js.map +1 -1
  267. package/dist/controllers/time_picker_controller.d.ts +38 -5
  268. package/dist/controllers/time_picker_controller.js +192 -54
  269. package/dist/controllers/time_picker_controller.js.map +1 -1
  270. package/dist/controllers/toast_controller.d.ts +4 -5
  271. package/dist/controllers/toast_controller.js +58 -27
  272. package/dist/controllers/toast_controller.js.map +1 -1
  273. package/dist/controllers/toggle_group_controller.d.ts +2 -3
  274. package/dist/controllers/toggle_group_controller.js +158 -56
  275. package/dist/controllers/toggle_group_controller.js.map +1 -1
  276. package/dist/controllers/toolbar_controller.d.ts +8 -6
  277. package/dist/controllers/toolbar_controller.js +150 -21
  278. package/dist/controllers/toolbar_controller.js.map +1 -1
  279. package/dist/controllers/tooltip_controller.d.ts +4 -1
  280. package/dist/controllers/tooltip_controller.js.map +1 -1
  281. package/dist/controllers/transition_controller.js.map +1 -1
  282. package/dist/controllers/tree_view_controller.d.ts +1 -1
  283. package/dist/controllers/tree_view_controller.js +134 -25
  284. package/dist/controllers/tree_view_controller.js.map +1 -1
  285. package/dist/index.d.ts +4 -1
  286. package/dist/index.js +2515 -1315
  287. package/dist/index.js.map +1 -1
  288. package/dist/inspector/cli.d.ts +25 -12
  289. package/dist/inspector/cli.js +21 -3
  290. package/dist/inspector/cli.js.map +1 -1
  291. package/dist/inspector/cli_bin.d.ts +1 -1
  292. package/dist/inspector/cli_bin.js +62 -8
  293. package/dist/inspector/cli_bin.js.map +1 -1
  294. package/dist/inspector/examples.json +13 -13
  295. package/dist/inspector/manifest.json +19 -5
  296. package/dist/positioning/index.d.ts +9 -8
  297. package/dist/positioning/index.js +6 -0
  298. package/dist/positioning/index.js.map +1 -1
  299. package/package.json +11 -10
@@ -5,7 +5,7 @@ import { Controller } from '@hotwired/stimulus';
5
5
  *
6
6
  * Markup contract (identifier: `stimeo--navigation-menu`):
7
7
  * <nav data-controller="stimeo--navigation-menu" aria-label="Main">
8
- * <ul>
8
+ * <ul data-stimeo--navigation-menu-target="list">
9
9
  * <li>
10
10
  * <button data-stimeo--navigation-menu-target="trigger"
11
11
  * aria-expanded="false" aria-controls="nav-products"
@@ -32,8 +32,9 @@ import { Controller } from '@hotwired/stimulus';
32
32
  * destination, closes it. `ArrowLeft`/`ArrowRight` move focus between the
33
33
  * *navigable* triggers without rewriting `tabindex` (they keep their natural Tab
34
34
  * order); a modified press (`Alt`/`Ctrl`/`Meta`/`Shift`, e.g. the browser's
35
- * `Alt+←` history back) is left to the browser. Hover open/close is opt-in via
36
- * `openOnHover`.
35
+ * `Alt+←` history back) is left to the browser. `ArrowLeft`/`ArrowRight` follow
36
+ * the writing direction of the optional `list` target, or of the root while there
37
+ * is none. Hover open/close is opt-in via `openOnHover`.
37
38
  *
38
39
  * Every `panel` must be a **descendant of the nav element**: Stimulus resolves
39
40
  * targets within the controller's own scope, so a panel moved outside it (a
@@ -42,8 +43,9 @@ import { Controller } from '@hotwired/stimulus';
42
43
  * By default the hover region is each trigger and its panel. An optional
43
44
  * `hoverArea` target widens it: mark a wrapper that contains **exactly one**
44
45
  * trigger (e.g. the `<li>` holding a top-level *link*, its disclosure button, and
45
- * its panel — the APG "Disclosure Navigation with Top-Level Links" arrangement)
46
- * and hovering anywhere over that wrapper opens the contained trigger's panel.
46
+ * its panel — the arrangement of the APG example
47
+ * "Disclosure (Show/Hide) Navigation Menu with Top-Level Links") and hovering
48
+ * anywhere over that wrapper opens the contained trigger's panel.
47
49
  * Wrapping several triggers at once (marking the whole `<ul>`, say) is not
48
50
  * supported: every hover over the area then resolves to the *first* contained
49
51
  * trigger. A trigger or panel inside a `hoverArea` defers to the wrapper (its own
@@ -109,6 +111,8 @@ declare class NavigationMenuController extends Controller<HTMLElement> {
109
111
  readonly triggerTargets: HTMLElement[];
110
112
  readonly panelTargets: HTMLElement[];
111
113
  readonly hoverAreaTargets: HTMLElement[];
114
+ readonly listTarget: HTMLElement;
115
+ readonly hasListTarget: boolean;
112
116
  openOnHoverValue: boolean;
113
117
  hoverDelayValue: number;
114
118
  /** Establishes the closed baseline and the dismissal listeners. */
@@ -146,6 +150,16 @@ declare class NavigationMenuController extends Controller<HTMLElement> {
146
150
  * would be unopenable until the pointer left and came back. Keyboard
147
151
  * activation (pointer elsewhere) still toggles it closed, and `Escape` and
148
152
  * outside clicks dismiss either way.
153
+ *
154
+ * A trigger that is `hidden`, natively `disabled` or `aria-disabled` (itself or
155
+ * through an ancestor) never opens, whether this receives a DOM event of any
156
+ * type or an explicit element: the refusal leaves an open panel open and reports
157
+ * nothing, and only the pending hover timer is dropped, as for every explicit
158
+ * activation. Nor does a trigger whose target lies inside a nested trigger that
159
+ * refuses. A click keeps the verdict taken as it started, before the handlers
160
+ * inside the nav element ran, when the trigger held its target then; a trigger that
161
+ * verdict was not taken for, and anything else, is judged now. A panel already open
162
+ * behind such a trigger still closes.
149
163
  */
150
164
  toggle(source: Event | HTMLElement): void;
151
165
  /**
@@ -22,6 +22,13 @@ function actionSource(source) {
22
22
  };
23
23
  }
24
24
 
25
+ function isAriaDisabled(element) {
26
+ for (let current = element; current; current = current.parentElement) {
27
+ if (current.getAttribute("aria-disabled") === "true") return true;
28
+ }
29
+ return false;
30
+ }
31
+
25
32
  function isRtl(element) {
26
33
  return window.getComputedStyle(element).direction === "rtl";
27
34
  }
@@ -31,6 +38,18 @@ function isReservedArrowChord(event, allow = []) {
31
38
  return event.altKey && !allow.includes("alt") || event.ctrlKey && !allow.includes("ctrl") || event.metaKey && !allow.includes("meta") || event.shiftKey && !allow.includes("shift");
32
39
  }
33
40
 
41
+ var ClickVerdicts = class {
42
+ #verdicts = /* @__PURE__ */ new WeakMap();
43
+ record(event, entries, refused) {
44
+ this.#verdicts.set(event, { entries, refused });
45
+ }
46
+ for(event, entry) {
47
+ const verdict = event && this.#verdicts.get(event);
48
+ if (!verdict?.entries.includes(entry)) return void 0;
49
+ return verdict.refused;
50
+ }
51
+ };
52
+
34
53
  function sharedRegistry(key, create) {
35
54
  const symbol = Symbol.for(key);
36
55
  const scope = globalThis;
@@ -114,6 +133,21 @@ function ownerIndex(candidates, node) {
114
133
  if (!(node instanceof Node)) return -1;
115
134
  return candidates.findIndex((candidate) => candidate.contains(node));
116
135
  }
136
+ function ownersOf(candidates, node) {
137
+ if (!(node instanceof Node)) return [];
138
+ return candidates.filter((candidate) => candidate.contains(node));
139
+ }
140
+
141
+ var ListenerSet = class {
142
+ #abort = new AbortController();
143
+ add(target, type, handler, options) {
144
+ target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
145
+ }
146
+ dispose() {
147
+ this.#abort.abort();
148
+ this.#abort = new AbortController();
149
+ }
150
+ };
117
151
 
118
152
  var MAX_TIMER_DELAY_MS = 2147483647;
119
153
 
@@ -201,7 +235,7 @@ function targetSelector(identifier, name) {
201
235
 
202
236
  var NavigationMenuController = class _NavigationMenuController extends Controller {
203
237
  #numbers = new NumberValueReader();
204
- static targets = ["trigger", "panel", "hoverArea"];
238
+ static targets = ["trigger", "panel", "hoverArea", "list"];
205
239
  static values = {
206
240
  openOnHover: { type: Boolean, default: false },
207
241
  hoverDelay: { type: Number, default: 150 }
@@ -212,16 +246,19 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
212
246
  static actions = ["onTriggerKeydown", "toggle"];
213
247
  static events = ["close", "open"];
214
248
  #hoverTimers = new SafeTimeout();
215
- #hoverWired = /* @__PURE__ */ new Set();
249
+ #hoverListeners = new ListenerSet();
216
250
  #hoveredTrigger = null;
217
251
  #connected = false;
218
252
  #reporting = false;
219
253
  #escapeLayer = new EscapeLayer();
254
+ #listeners = new ListenerSet();
255
+ #clickVerdicts = new ClickVerdicts();
220
256
  connect() {
221
257
  this.#connected = true;
222
258
  this.#closeAll("api");
223
- document.addEventListener("click", this.#onOutsideClick, true);
224
- this.element.addEventListener("focusout", this.#onFocusOut);
259
+ this.#listeners.add(this.element, "click", this.#onClickCapture, { capture: true });
260
+ this.#listeners.add(document, "click", this.#onOutsideClick, { capture: true });
261
+ this.#listeners.add(this.element, "focusout", this.#onFocusOut);
225
262
  if (this.openOnHoverValue) this.#addHoverListeners();
226
263
  this.#reporting = true;
227
264
  }
@@ -229,8 +266,7 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
229
266
  this.#connected = false;
230
267
  this.#reporting = false;
231
268
  this.#escapeLayer.deactivate();
232
- document.removeEventListener("click", this.#onOutsideClick, true);
233
- this.element.removeEventListener("focusout", this.#onFocusOut);
269
+ this.#listeners.dispose();
234
270
  this.#removeHoverListeners();
235
271
  this.#hoverTimers.clearAll();
236
272
  }
@@ -258,14 +294,14 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
258
294
  this.#rewireHoverListeners();
259
295
  }
260
296
  toggle(source) {
261
- const { host, origin, reason } = actionSource(source);
297
+ const { event, host, origin, reason } = actionSource(source);
262
298
  const trigger = host?.closest(targetSelector(this.identifier, "trigger"));
263
299
  if (!trigger || !this.triggerTargets.includes(trigger)) return;
264
300
  if (origin && origin.closest(`[data-controller~="${this.identifier}"]`) !== this.element)
265
301
  return;
266
302
  this.#hoverTimers.clearAll();
267
303
  if (!this.#isExpanded(trigger)) {
268
- this.#openPanel(trigger, reason);
304
+ if (!this.#refuses(trigger, event, origin)) this.#openPanel(trigger, reason);
269
305
  return;
270
306
  }
271
307
  if (this.openOnHoverValue && this.#hoveredTrigger === trigger) return;
@@ -282,12 +318,11 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
282
318
  const index = triggers.indexOf(current);
283
319
  if (index === -1 || triggers.length < 2) return;
284
320
  event.preventDefault();
285
- const forward = isRtl(this.element) ? "ArrowLeft" : "ArrowRight";
321
+ const forward = isRtl(this.hasListTarget ? this.listTarget : this.element) ? "ArrowLeft" : "ArrowRight";
286
322
  const step = event.key === forward ? 1 : -1;
287
323
  triggers[(index + step + triggers.length) % triggers.length]?.focus();
288
324
  }
289
325
  #openPanel(trigger, reason) {
290
- if (trigger.getAttribute("aria-disabled") === "true") return;
291
326
  if (this.#isExpanded(trigger)) {
292
327
  this.#syncEscapeLayer();
293
328
  return;
@@ -322,6 +357,16 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
322
357
  if (trigger.hasAttribute("hidden")) return false;
323
358
  return !trigger.disabled;
324
359
  }
360
+ #isActivationDisabled(trigger) {
361
+ return !this.#isNavigable(trigger) || isAriaDisabled(trigger);
362
+ }
363
+ #refuses(trigger, event, origin) {
364
+ const recorded = this.#clickVerdicts.for(event, trigger);
365
+ if (recorded !== void 0) return recorded;
366
+ if (this.#isActivationDisabled(trigger)) return true;
367
+ const target = event ? event.target : origin;
368
+ return ownersOf(this.triggerTargets, target).some((owner) => this.#isActivationDisabled(owner));
369
+ }
325
370
  #syncEscapeLayer() {
326
371
  if (this.#isAnyOpen) {
327
372
  this.#escapeLayer.activate(document, {
@@ -339,6 +384,14 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
339
384
  this.#closePanel(open, "escape");
340
385
  open.focus();
341
386
  }
387
+ #onClickCapture = (event) => {
388
+ const triggers = ownersOf(this.triggerTargets, event.target);
389
+ this.#clickVerdicts.record(
390
+ event,
391
+ triggers,
392
+ triggers.some((trigger) => this.#isActivationDisabled(trigger))
393
+ );
394
+ };
342
395
  #onOutsideClick = (event) => {
343
396
  if (this.#isAnyOpen && !this.element.contains(event.target)) this.#closeAll("outside");
344
397
  };
@@ -362,7 +415,7 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
362
415
  this.#hoverTimers.set(() => this.#closeFromHover(), this.#safeHoverDelay);
363
416
  };
364
417
  #openFromHover(trigger) {
365
- if (trigger.getAttribute("aria-disabled") === "true") return;
418
+ if (this.#refuses(trigger, null, trigger)) return;
366
419
  const open = this.#openTrigger;
367
420
  if (open && open !== trigger && this.#holdsFocus(this.#panelFor(open))) open.focus();
368
421
  this.#openPanel(trigger, "pointer");
@@ -377,17 +430,12 @@ var NavigationMenuController = class _NavigationMenuController extends Controlle
377
430
  }
378
431
  #addHoverListeners() {
379
432
  for (const element of this.#hoverElements) {
380
- element.addEventListener("mouseenter", this.#onPointerEnter);
381
- element.addEventListener("mouseleave", this.#onPointerLeave);
382
- this.#hoverWired.add(element);
433
+ this.#hoverListeners.add(element, "mouseenter", this.#onPointerEnter);
434
+ this.#hoverListeners.add(element, "mouseleave", this.#onPointerLeave);
383
435
  }
384
436
  }
385
437
  #removeHoverListeners() {
386
- for (const element of this.#hoverWired) {
387
- element.removeEventListener("mouseenter", this.#onPointerEnter);
388
- element.removeEventListener("mouseleave", this.#onPointerLeave);
389
- }
390
- this.#hoverWired.clear();
438
+ this.#hoverListeners.dispose();
391
439
  this.#hoveredTrigger = null;
392
440
  }
393
441
  #rewireHoverListeners() {