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.
- package/CHANGELOG.md +136 -2
- package/README.md +19 -10
- package/dist/cable/index.d.ts +11 -9
- package/dist/cable/index.js +22 -14
- package/dist/cable/index.js.map +1 -1
- package/dist/coerce-JtZVNG5h.d.ts +20 -0
- package/dist/controllers/accordion_controller.js +14 -6
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.js +145 -118
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +5 -3
- package/dist/controllers/announcer_controller.js +113 -17
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.js +185 -60
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +55 -43
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +3 -3
- package/dist/controllers/bulk_select_controller.js +64 -50
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +15 -12
- package/dist/controllers/calendar_controller.js +55 -53
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +9 -5
- package/dist/controllers/carousel_controller.js +124 -86
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +27 -6
- package/dist/controllers/character_counter_controller.js +291 -95
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.js +6 -0
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.js +118 -27
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +1 -1
- package/dist/controllers/collapsible_controller.js +52 -49
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.js +29 -7
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +1 -1
- package/dist/controllers/combobox_controller.js +210 -71
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +9 -9
- package/dist/controllers/command_palette_controller.js +290 -140
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.js +145 -58
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.js +145 -118
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +49 -14
- package/dist/controllers/context_menu_controller.js +138 -73
- package/dist/controllers/context_menu_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/countdown_controller.d.ts +2 -2
- package/dist/controllers/countdown_controller.js +109 -21
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +75 -11
- package/dist/controllers/currency_input_controller.js +446 -72
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +10 -8
- package/dist/controllers/data_grid_controller.js +134 -28
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +12 -9
- package/dist/controllers/date_range_picker_controller.js +93 -72
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +4 -5
- package/dist/controllers/dialog_controller.js +145 -118
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +1 -1
- package/dist/controllers/direct_upload_controller.js +24 -14
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.d.ts +6 -1
- package/dist/controllers/dirty_form_controller.js +68 -31
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.js +66 -46
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.js +145 -118
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.js +76 -63
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.js +200 -62
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +13 -6
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +3 -0
- package/dist/controllers/file_dropzone_controller.js +55 -48
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +9 -2
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +4 -4
- package/dist/controllers/flash_controller.js +66 -33
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +3 -3
- package/dist/controllers/focus_controller.js +39 -14
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.d.ts +2 -1
- package/dist/controllers/form_field_controller.js +52 -43
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.d.ts +3 -3
- package/dist/controllers/form_validation_controller.js +18 -11
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +13 -12
- package/dist/controllers/frame_loading_controller.js +55 -48
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +5 -4
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +4 -1
- package/dist/controllers/hover_card_controller.js +67 -61
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +6 -5
- package/dist/controllers/idle_controller.js +10 -6
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +31 -13
- package/dist/controllers/input_mask_controller.js +434 -24
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.js +3 -0
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +3 -2
- package/dist/controllers/lazy_frame_controller.js +15 -3
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +10 -7
- package/dist/controllers/listbox_controller.js +260 -79
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +8 -6
- package/dist/controllers/local_time_controller.js +48 -13
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.js +11 -4
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +24 -5
- package/dist/controllers/menu_controller.js +138 -82
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +49 -7
- package/dist/controllers/menubar_controller.js +65 -19
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +13 -20
- package/dist/controllers/meter_controller.js +270 -24
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +19 -16
- package/dist/controllers/multi_select_controller.js +272 -95
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +19 -5
- package/dist/controllers/navigation_menu_controller.js +67 -19
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.js +98 -64
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.js +70 -52
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +24 -6
- package/dist/controllers/number_input_controller.js +344 -94
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.d.ts +8 -5
- package/dist/controllers/optimistic_controller.js +29 -11
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +35 -4
- package/dist/controllers/otp_controller.js +502 -104
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.js +6 -0
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +10 -9
- package/dist/controllers/overflow_menu_controller.js +136 -21
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +3 -2
- package/dist/controllers/pagination_controller.js +47 -14
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +5 -4
- package/dist/controllers/password_reveal_controller.js +52 -49
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +1 -1
- package/dist/controllers/password_strength_controller.js +13 -6
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.js +48 -128
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +20 -8
- package/dist/controllers/pointer_drag_controller.js +255 -24
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +9 -5
- package/dist/controllers/popover_controller.js +91 -65
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.js +6 -0
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.js +14 -3
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +9 -19
- package/dist/controllers/progress_controller.js +271 -27
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +11 -8
- package/dist/controllers/radio_group_controller.js +167 -80
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +4 -3
- package/dist/controllers/range_slider_controller.js +27 -7
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.js +93 -57
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.js +10 -6
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.js +22 -5
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +4 -4
- package/dist/controllers/relative_time_controller.js +75 -11
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +3 -3
- package/dist/controllers/reset_on_restore_controller.js +6 -0
- package/dist/controllers/reset_on_restore_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.d.ts +3 -0
- package/dist/controllers/resizable_controller.js +55 -22
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.d.ts +3 -3
- package/dist/controllers/roving_controller.js +10 -4
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.js +129 -88
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.d.ts +3 -3
- package/dist/controllers/scroll_restore_controller.js +14 -2
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.js +93 -60
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.js +11 -5
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +1 -1
- package/dist/controllers/separator_controller.js +59 -43
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +1 -1
- package/dist/controllers/sidebar_controller.js +150 -122
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.js +55 -48
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +2 -1
- package/dist/controllers/slider_controller.js +27 -6
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +1 -1
- package/dist/controllers/smart_sticky_header_controller.js +13 -5
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.d.ts +4 -4
- package/dist/controllers/sortable_controller.js +27 -14
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.js +55 -48
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +4 -4
- package/dist/controllers/step_indicator_controller.js +6 -0
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +2 -3
- package/dist/controllers/stepper_controller.js +6 -0
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +3 -1
- package/dist/controllers/stick_to_bottom_controller.js +19 -8
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.js +49 -43
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +2 -1
- package/dist/controllers/submit_once_controller.js +145 -85
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +7 -4
- package/dist/controllers/switch_controller.js +172 -28
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +7 -4
- package/dist/controllers/tabs_controller.js +6 -1
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +4 -3
- package/dist/controllers/tags_input_controller.js +157 -28
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +1 -1
- package/dist/controllers/textarea_autosize_controller.js +40 -19
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +3 -2
- package/dist/controllers/theme_controller.js +10 -4
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +38 -5
- package/dist/controllers/time_picker_controller.js +192 -54
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +4 -5
- package/dist/controllers/toast_controller.js +58 -27
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +2 -3
- package/dist/controllers/toggle_group_controller.js +158 -56
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.d.ts +8 -6
- package/dist/controllers/toolbar_controller.js +150 -21
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +4 -1
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +1 -1
- package/dist/controllers/tree_view_controller.js +134 -25
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2515 -1315
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +25 -12
- package/dist/inspector/cli.js +21 -3
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.d.ts +1 -1
- package/dist/inspector/cli_bin.js +62 -8
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +13 -13
- package/dist/inspector/manifest.json +19 -5
- package/dist/positioning/index.d.ts +9 -8
- package/dist/positioning/index.js +6 -0
- package/dist/positioning/index.js.map +1 -1
- 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.
|
|
36
|
-
* `
|
|
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
|
|
46
|
-
*
|
|
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
|
-
#
|
|
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
|
-
|
|
224
|
-
this.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
381
|
-
|
|
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
|
-
|
|
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() {
|