stimeo-ui 0.14.0 → 0.16.0
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 +212 -0
- package/README.md +120 -0
- package/dist/cable/index.js +123 -29
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +30 -3
- package/dist/controllers/accordion_controller.js +98 -9
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.d.ts +8 -7
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +3 -2
- package/dist/controllers/announcer_controller.js +96 -62
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.js +83 -7
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +1 -1
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.d.ts +10 -7
- package/dist/controllers/breadcrumb_controller.js +38 -11
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +4 -4
- package/dist/controllers/bulk_select_controller.js +7 -6
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +101 -23
- package/dist/controllers/calendar_controller.js +340 -123
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +67 -22
- package/dist/controllers/carousel_controller.js +263 -38
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +1 -1
- package/dist/controllers/character_counter_controller.js +40 -2
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.js +81 -12
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +28 -2
- package/dist/controllers/clipboard_controller.js +63 -5
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +25 -1
- package/dist/controllers/collapsible_controller.js +99 -14
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +29 -8
- package/dist/controllers/color_picker_controller.js +80 -34
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +10 -1
- package/dist/controllers/combobox_controller.js +106 -16
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +3 -3
- package/dist/controllers/command_palette_controller.js +35 -3
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.js +85 -17
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.js +3 -0
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +6 -0
- package/dist/controllers/context_menu_controller.js +32 -12
- 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 +30 -1
- package/dist/controllers/countdown_controller.js +129 -26
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +77 -16
- package/dist/controllers/currency_input_controller.js +221 -67
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +63 -18
- package/dist/controllers/data_grid_controller.js +195 -29
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +41 -6
- package/dist/controllers/date_range_picker_controller.js +151 -30
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +10 -3
- package/dist/controllers/dialog_controller.js +35 -8
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.js +22 -4
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.d.ts +2 -2
- package/dist/controllers/dirty_form_controller.js +46 -13
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.js +1 -0
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +18 -10
- package/dist/controllers/drawer_controller.js +54 -19
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +9 -3
- package/dist/controllers/dropdown_controller.js +36 -9
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.js +34 -0
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.js +144 -51
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.d.ts +10 -4
- package/dist/controllers/filter_controller.js +20 -6
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +26 -6
- package/dist/controllers/flash_controller.js +432 -71
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.js +1 -0
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +7 -5
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +19 -13
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.js +45 -8
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.js +82 -25
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +10 -2
- package/dist/controllers/hover_card_controller.js +40 -14
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +16 -3
- package/dist/controllers/idle_controller.js +90 -5
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +5 -2
- package/dist/controllers/input_mask_controller.js +65 -9
- 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.js +11 -2
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +50 -8
- package/dist/controllers/listbox_controller.js +203 -45
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.js +10 -5
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +3 -3
- package/dist/controllers/masonry_controller.js +31 -15
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +9 -3
- package/dist/controllers/menu_controller.js +45 -16
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +11 -0
- package/dist/controllers/menubar_controller.js +58 -24
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.js +9 -5
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +18 -3
- package/dist/controllers/multi_select_controller.js +278 -104
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +11 -0
- package/dist/controllers/navigation_menu_controller.js +48 -15
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.js +37 -8
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.js +9 -1
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +36 -8
- package/dist/controllers/number_input_controller.js +124 -21
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +42 -5
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +22 -7
- package/dist/controllers/otp_controller.js +198 -55
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.d.ts +8 -12
- package/dist/controllers/overflow_indicator_controller.js +115 -21
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +26 -6
- package/dist/controllers/overflow_menu_controller.js +141 -44
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +19 -11
- package/dist/controllers/pagination_controller.js +74 -28
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +15 -1
- package/dist/controllers/password_reveal_controller.js +59 -2
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/persist_controller.js +30 -8
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.js +131 -52
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +9 -3
- package/dist/controllers/popover_controller.js +45 -11
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +1 -1
- package/dist/controllers/portal_controller.js +6 -2
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.js +16 -1
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.js +8 -4
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +6 -4
- package/dist/controllers/radio_group_controller.js +42 -17
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +49 -1
- package/dist/controllers/range_slider_controller.js +88 -42
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +14 -3
- package/dist/controllers/rating_controller.js +39 -15
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +24 -2
- package/dist/controllers/read_more_controller.js +100 -7
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.js +65 -19
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.js +10 -5
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.d.ts +16 -2
- package/dist/controllers/resizable_controller.js +82 -22
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.js +75 -27
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.js +37 -16
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.js +49 -30
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +3 -2
- package/dist/controllers/scrollspy_controller.js +71 -26
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +41 -14
- package/dist/controllers/separator_controller.js +66 -37
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +20 -3
- package/dist/controllers/sidebar_controller.js +77 -18
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.js +6 -1
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +45 -7
- package/dist/controllers/slider_controller.js +82 -47
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.js +60 -26
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +17 -2
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.js +10 -2
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +19 -17
- package/dist/controllers/step_indicator_controller.js +18 -17
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +34 -9
- package/dist/controllers/stepper_controller.js +101 -19
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +19 -0
- package/dist/controllers/stick_to_bottom_controller.js +104 -8
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +3 -2
- package/dist/controllers/submit_once_controller.js +45 -9
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +29 -7
- package/dist/controllers/switch_controller.js +101 -10
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +12 -0
- package/dist/controllers/tabs_controller.js +21 -2
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +15 -3
- package/dist/controllers/tags_input_controller.js +209 -59
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.js +29 -3
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +20 -3
- package/dist/controllers/theme_controller.js +64 -14
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.js +23 -8
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +55 -15
- package/dist/controllers/toast_controller.js +451 -105
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +49 -7
- package/dist/controllers/toggle_group_controller.js +159 -23
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +32 -0
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +8 -0
- package/dist/controllers/tooltip_controller.js +39 -13
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.js +4 -0
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +39 -8
- package/dist/controllers/tree_view_controller.js +169 -16
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +5002 -1911
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +72 -6
- package/dist/inspector/cli.js +262 -51
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +309 -51
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +40 -40
- package/dist/inspector/manifest.json +529 -61
- package/dist/positioning/index.js +2 -0
- package/dist/positioning/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -64,10 +64,15 @@ var LayoutObserver = class {
|
|
|
64
64
|
#resizeObserverFactory;
|
|
65
65
|
#resizeObserver = null;
|
|
66
66
|
#observingViewport = false;
|
|
67
|
+
#loadContainer = null;
|
|
67
68
|
/** Stable bound handler so add/removeEventListener target the same reference. */
|
|
68
69
|
#handleViewportResize = () => {
|
|
69
70
|
this.#callback();
|
|
70
71
|
};
|
|
72
|
+
/** Stable bound handler for the capture-phase `load`; see {@link observeDescendantLoads}. */
|
|
73
|
+
#handleDescendantLoad = () => {
|
|
74
|
+
this.#callback();
|
|
75
|
+
};
|
|
71
76
|
constructor(callback, options = {}) {
|
|
72
77
|
this.#callback = callback;
|
|
73
78
|
this.#resizeObserverFactory = options.resizeObserverFactory ?? (typeof ResizeObserver === "undefined" ? null : (cb) => new ResizeObserver(cb));
|
|
@@ -103,14 +108,35 @@ var LayoutObserver = class {
|
|
|
103
108
|
window.removeEventListener("resize", this.#handleViewportResize);
|
|
104
109
|
}
|
|
105
110
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
111
|
+
* Starts reporting a `load` from anywhere inside `container` — an image or a
|
|
112
|
+
* frame settling changes the box it sits in, and it measures as zero high until
|
|
113
|
+
* then. `load` does not bubble, so the subscription is a capture-phase listener
|
|
114
|
+
* on the container itself and nothing the caller spells.
|
|
115
|
+
*
|
|
116
|
+
* **One container at a time.** A further call moves the observation, so a widget
|
|
117
|
+
* whose content element is swapped at runtime releases the element it let go by
|
|
118
|
+
* naming the new one — there is no second place for the release to drift from.
|
|
119
|
+
*/
|
|
120
|
+
observeDescendantLoads(container) {
|
|
121
|
+
this.unobserveDescendantLoads();
|
|
122
|
+
this.#loadContainer = container;
|
|
123
|
+
container.addEventListener("load", this.#handleDescendantLoad, true);
|
|
124
|
+
}
|
|
125
|
+
/** Stops reporting descendant loads without affecting element or viewport observation. */
|
|
126
|
+
unobserveDescendantLoads() {
|
|
127
|
+
this.#loadContainer?.removeEventListener("load", this.#handleDescendantLoad, true);
|
|
128
|
+
this.#loadContainer = null;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Releases every observation: disconnects the {@link ResizeObserver} and removes
|
|
132
|
+
* the viewport and descendant-load listeners. Safe to call multiple times. Call
|
|
133
|
+
* this from a controller's `disconnect()`.
|
|
109
134
|
*/
|
|
110
135
|
disconnect() {
|
|
111
136
|
this.#resizeObserver?.disconnect();
|
|
112
137
|
this.#resizeObserver = null;
|
|
113
138
|
this.unobserveViewport();
|
|
139
|
+
this.unobserveDescendantLoads();
|
|
114
140
|
}
|
|
115
141
|
};
|
|
116
142
|
|
|
@@ -199,15 +225,20 @@ var TabindexLoan = class {
|
|
|
199
225
|
};
|
|
200
226
|
|
|
201
227
|
// src/controllers/overflow_menu_controller.ts
|
|
202
|
-
var BANKED = "
|
|
203
|
-
var INDEX = "
|
|
204
|
-
var BOUNDARY = "
|
|
205
|
-
var SAVED_ROLE = "
|
|
206
|
-
var SAVED_TABINDEX = "
|
|
207
|
-
var SAVED_MENU_TARGET = "
|
|
228
|
+
var BANKED = "banked";
|
|
229
|
+
var INDEX = "index";
|
|
230
|
+
var BOUNDARY = "boundary";
|
|
231
|
+
var SAVED_ROLE = "role";
|
|
232
|
+
var SAVED_TABINDEX = "tabindex";
|
|
233
|
+
var SAVED_MENU_TARGET = "saved-menu";
|
|
208
234
|
var MENU_TARGET = "data-stimeo--menu-target";
|
|
209
235
|
var BOOKKEEPING = [BANKED, INDEX, SAVED_ROLE, SAVED_TABINDEX, SAVED_MENU_TARGET];
|
|
236
|
+
var OWNED_LABEL = "owns-label";
|
|
210
237
|
var OverflowMenuController = class extends Controller {
|
|
238
|
+
/** One bookkeeping attribute, in the namespace this controller is registered under. */
|
|
239
|
+
#attr(name) {
|
|
240
|
+
return `data-${this.identifier}-${name}`;
|
|
241
|
+
}
|
|
211
242
|
static targets = ["items", "more"];
|
|
212
243
|
static values = {
|
|
213
244
|
moreLabel: { type: String, default: "More" },
|
|
@@ -226,29 +257,42 @@ var OverflowMenuController = class extends Controller {
|
|
|
226
257
|
#lastHidden = null;
|
|
227
258
|
/** The `tabindex` this instance lends the root for the focus fallback. */
|
|
228
259
|
#tabindex = new TabindexLoan();
|
|
229
|
-
/** Hands Turbo a
|
|
260
|
+
/** Hands Turbo a snapshot of the bar with every item back in place. */
|
|
230
261
|
#beforeCache = new BeforeCacheReset(() => this.#restoreAll());
|
|
262
|
+
/**
|
|
263
|
+
* Whether `connect()` has run for this connection. Stimulus delivers Value
|
|
264
|
+
* callbacks ahead of it, and the first pass writes the label anyway.
|
|
265
|
+
*/
|
|
266
|
+
#connected = false;
|
|
231
267
|
connect() {
|
|
268
|
+
this.#connected = true;
|
|
232
269
|
if (!this.hasItemsTarget || !this.hasMoreTarget) return;
|
|
233
|
-
const trigger = this.#trigger();
|
|
234
|
-
if (trigger !== null && this.#isBareTrigger(trigger)) {
|
|
235
|
-
trigger.textContent = this.moreLabelValue;
|
|
236
|
-
}
|
|
237
270
|
this.#beforeCache.activate();
|
|
238
271
|
this.#layout.observe(this.element);
|
|
239
272
|
this.#layout.observeViewport();
|
|
240
273
|
this.update();
|
|
241
274
|
}
|
|
242
275
|
disconnect() {
|
|
276
|
+
this.#connected = false;
|
|
243
277
|
this.#layout.disconnect();
|
|
244
278
|
this.#timers.clearAll();
|
|
245
279
|
this.#beforeCache.deactivate();
|
|
246
280
|
this.#restoreAll();
|
|
247
281
|
this.#lastHidden = null;
|
|
248
282
|
}
|
|
283
|
+
/**
|
|
284
|
+
* Follows a More label swapped in place by a morph, on a trigger that still holds
|
|
285
|
+
* the label this controller wrote and nothing else. Render only: nothing is
|
|
286
|
+
* measured and `change` is not dispatched here; the next pass measures the bar.
|
|
287
|
+
*/
|
|
288
|
+
moreLabelValueChanged() {
|
|
289
|
+
if (!this.#connected || !this.hasItemsTarget || !this.hasMoreTarget) return;
|
|
290
|
+
this.#syncLabel();
|
|
291
|
+
}
|
|
249
292
|
/** Re-measures and rebalances items between the bar and the More menu. */
|
|
250
293
|
update() {
|
|
251
294
|
if (!this.hasItemsTarget || !this.hasMoreTarget) return;
|
|
295
|
+
this.#syncLabel();
|
|
252
296
|
this.#syncItems();
|
|
253
297
|
this.moreTarget.hidden = false;
|
|
254
298
|
if (this.#items.some((item) => item.parentElement !== this.itemsTarget && !this.#widths.has(item))) {
|
|
@@ -302,8 +346,8 @@ var OverflowMenuController = class extends Controller {
|
|
|
302
346
|
else if (active !== null && this.#lostFocus(active)) active.focus();
|
|
303
347
|
const count = hidden.size;
|
|
304
348
|
for (const item of this.#items) {
|
|
305
|
-
if (count > 0) item.setAttribute(INDEX, String(this.#indexOf(item)));
|
|
306
|
-
else item.removeAttribute(INDEX);
|
|
349
|
+
if (count > 0) item.setAttribute(this.#attr(INDEX), String(this.#indexOf(item)));
|
|
350
|
+
else item.removeAttribute(this.#attr(INDEX));
|
|
307
351
|
}
|
|
308
352
|
if (count > 0 && count === this.#items.length) this.#ensureBoundary();
|
|
309
353
|
else this.#removeBoundary();
|
|
@@ -318,7 +362,7 @@ var OverflowMenuController = class extends Controller {
|
|
|
318
362
|
this.element.setAttribute("data-overflow-count", String(count));
|
|
319
363
|
if (this.#lastHidden !== count) {
|
|
320
364
|
this.#lastHidden = count;
|
|
321
|
-
this.dispatch("change", { detail: {
|
|
365
|
+
this.dispatch("change", { detail: { overflowCount: count, total: this.#items.length } });
|
|
322
366
|
}
|
|
323
367
|
}
|
|
324
368
|
/** The flex `column-gap` on `el` in px (0 when none / unsupported). */
|
|
@@ -348,7 +392,7 @@ var OverflowMenuController = class extends Controller {
|
|
|
348
392
|
const bar = [];
|
|
349
393
|
let boundaryAt;
|
|
350
394
|
for (const el of this.itemsTarget.children) {
|
|
351
|
-
if (el instanceof HTMLTemplateElement && el.hasAttribute(BOUNDARY)) {
|
|
395
|
+
if (el instanceof HTMLTemplateElement && el.hasAttribute(this.#attr(BOUNDARY))) {
|
|
352
396
|
boundaryAt ??= bar.length;
|
|
353
397
|
continue;
|
|
354
398
|
}
|
|
@@ -356,14 +400,14 @@ var OverflowMenuController = class extends Controller {
|
|
|
356
400
|
}
|
|
357
401
|
const banked = [];
|
|
358
402
|
for (const el of this.#menuList().children) {
|
|
359
|
-
if (el instanceof HTMLElement && el.hasAttribute(BANKED)) banked.push(el);
|
|
403
|
+
if (el instanceof HTMLElement && el.hasAttribute(this.#attr(BANKED))) banked.push(el);
|
|
360
404
|
}
|
|
361
405
|
banked.sort((a, b) => this.#bankedIndex(a) - this.#bankedIndex(b));
|
|
362
406
|
const items = this.#merge(bar, banked, boundaryAt);
|
|
363
407
|
for (const el of previous) {
|
|
364
408
|
if (!items.includes(el)) {
|
|
365
409
|
this.#unbank(el);
|
|
366
|
-
el.removeAttribute(INDEX);
|
|
410
|
+
el.removeAttribute(this.#attr(INDEX));
|
|
367
411
|
}
|
|
368
412
|
}
|
|
369
413
|
this.#items = items;
|
|
@@ -436,7 +480,7 @@ var OverflowMenuController = class extends Controller {
|
|
|
436
480
|
}
|
|
437
481
|
/** A finite canonical index stored on either side of the overflow split. */
|
|
438
482
|
#savedIndex(item) {
|
|
439
|
-
const raw = item.getAttribute(INDEX);
|
|
483
|
+
const raw = item.getAttribute(this.#attr(INDEX));
|
|
440
484
|
if (raw === null) return void 0;
|
|
441
485
|
const value = Number(raw);
|
|
442
486
|
return Number.isFinite(value) ? value : void 0;
|
|
@@ -444,14 +488,14 @@ var OverflowMenuController = class extends Controller {
|
|
|
444
488
|
/** The inert split point written only when every managed item lives in More. */
|
|
445
489
|
#boundary() {
|
|
446
490
|
for (const el of this.itemsTarget.children) {
|
|
447
|
-
if (el instanceof HTMLTemplateElement && el.hasAttribute(BOUNDARY)) return el;
|
|
491
|
+
if (el instanceof HTMLTemplateElement && el.hasAttribute(this.#attr(BOUNDARY))) return el;
|
|
448
492
|
}
|
|
449
493
|
return null;
|
|
450
494
|
}
|
|
451
495
|
#ensureBoundary() {
|
|
452
496
|
if (this.#boundary() !== null) return;
|
|
453
497
|
const boundary = document.createElement("template");
|
|
454
|
-
boundary.setAttribute(BOUNDARY, "");
|
|
498
|
+
boundary.setAttribute(this.#attr(BOUNDARY), "");
|
|
455
499
|
this.itemsTarget.appendChild(boundary);
|
|
456
500
|
}
|
|
457
501
|
#removeBoundary() {
|
|
@@ -470,17 +514,68 @@ var OverflowMenuController = class extends Controller {
|
|
|
470
514
|
return this.moreTarget.querySelector('[data-stimeo--menu-target="trigger"]');
|
|
471
515
|
}
|
|
472
516
|
/**
|
|
473
|
-
*
|
|
474
|
-
*
|
|
475
|
-
*
|
|
476
|
-
* pass
|
|
477
|
-
*
|
|
478
|
-
*
|
|
479
|
-
*
|
|
480
|
-
|
|
517
|
+
* Keeps the More trigger's text on `moreLabel` wherever that text is this
|
|
518
|
+
* controller's to write: a bare trigger, or one still holding the label this
|
|
519
|
+
* controller wrote and nothing else. An empty `moreLabel` hands such a trigger
|
|
520
|
+
* back bare. A pass that finds the label already in place writes nothing, and a
|
|
521
|
+
* trigger that is neither is not written at all.
|
|
522
|
+
*
|
|
523
|
+
* @stimeoRenderRoot
|
|
524
|
+
*/
|
|
525
|
+
#syncLabel() {
|
|
526
|
+
const trigger = this.#trigger();
|
|
527
|
+
if (trigger === null) return;
|
|
528
|
+
const owned = this.#ownsLabel(trigger);
|
|
529
|
+
if (!owned && !this.#isBareTrigger(trigger)) return;
|
|
530
|
+
const label = this.moreLabelValue;
|
|
531
|
+
if (label === "") {
|
|
532
|
+
this.#releaseLabel(trigger);
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
if (owned && trigger.textContent === label) return;
|
|
536
|
+
trigger.textContent = label;
|
|
537
|
+
trigger.setAttribute(this.#attr(OWNED_LABEL), label);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Whether the trigger holds the label this controller wrote there and nothing
|
|
541
|
+
* else: the text still matches the marker, and the trigger carries nothing but
|
|
542
|
+
* text. Ownership is read afresh on every call, so a trigger the consumer adds to
|
|
543
|
+
* is theirs for as long as the addition is there.
|
|
544
|
+
*/
|
|
545
|
+
#ownsLabel(trigger) {
|
|
546
|
+
return trigger.getAttribute(this.#attr(OWNED_LABEL)) === trigger.textContent && this.#carriesOnlyText(trigger);
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Takes the label this controller wrote back out of the trigger, leaving it bare.
|
|
550
|
+
* A trigger that is not this controller's is left exactly as it is, marker
|
|
551
|
+
* included: taking the marker off would itself write to it.
|
|
552
|
+
*/
|
|
553
|
+
#releaseLabel(trigger) {
|
|
554
|
+
if (!this.#ownsLabel(trigger)) return;
|
|
555
|
+
trigger.textContent = "";
|
|
556
|
+
trigger.removeAttribute(this.#attr(OWNED_LABEL));
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Whether the More trigger is bare, so the label is safe to write: no text, no
|
|
560
|
+
* element child, no `aria-label` and no `aria-labelledby`. A trigger with neither
|
|
561
|
+
* text, nor children, nor a name has nothing to lose and gets the fallback; one
|
|
562
|
+
* that is empty *and* unnamed is the only case the label rescues.
|
|
481
563
|
*/
|
|
482
564
|
#isBareTrigger(trigger) {
|
|
483
|
-
return (trigger.textContent ?? "").trim() === "" &&
|
|
565
|
+
return (trigger.textContent ?? "").trim() === "" && this.#carriesOnlyText(trigger);
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Whether the trigger carries nothing but text: no element child, no
|
|
569
|
+
* `aria-label` and no `aria-labelledby`. Assigning `textContent` replaces
|
|
570
|
+
* *every* child node, so a trigger holding an icon would silently lose it — and
|
|
571
|
+
* the loss is permanent, since only the label this controller wrote is ever
|
|
572
|
+
* taken back. A trigger that carries an accessible name is left alone too:
|
|
573
|
+
* visible text written under a different `aria-label` would make the label and
|
|
574
|
+
* the name disagree. Only a trigger that carries nothing but text is ever
|
|
575
|
+
* written or emptied.
|
|
576
|
+
*/
|
|
577
|
+
#carriesOnlyText(trigger) {
|
|
578
|
+
return trigger.firstElementChild === null && !trigger.hasAttribute("aria-label") && !trigger.hasAttribute("aria-labelledby");
|
|
484
579
|
}
|
|
485
580
|
/**
|
|
486
581
|
* Whether the More menu is expanded. Menu owns that state and reflects it on the
|
|
@@ -551,9 +646,11 @@ var OverflowMenuController = class extends Controller {
|
|
|
551
646
|
this.#reorder(this.itemsTarget, this.#items);
|
|
552
647
|
for (const item of this.#items) {
|
|
553
648
|
this.#unbank(item);
|
|
554
|
-
item.removeAttribute(INDEX);
|
|
649
|
+
item.removeAttribute(this.#attr(INDEX));
|
|
555
650
|
}
|
|
556
651
|
this.#closeMenu();
|
|
652
|
+
const trigger = this.#trigger();
|
|
653
|
+
if (trigger !== null) this.#releaseLabel(trigger);
|
|
557
654
|
this.moreTarget.hidden = true;
|
|
558
655
|
this.element.removeAttribute("data-overflowing");
|
|
559
656
|
this.element.removeAttribute("data-overflow-count");
|
|
@@ -593,24 +690,24 @@ var OverflowMenuController = class extends Controller {
|
|
|
593
690
|
* saving every authored value it overwrites ("" means the attribute was absent).
|
|
594
691
|
*/
|
|
595
692
|
#bank(item) {
|
|
596
|
-
if (!item.hasAttribute(BANKED)) {
|
|
597
|
-
item.setAttribute(BANKED, "true");
|
|
598
|
-
item.setAttribute(SAVED_ROLE, item.getAttribute("role") ?? "");
|
|
599
|
-
item.setAttribute(SAVED_TABINDEX, item.getAttribute("tabindex") ?? "");
|
|
600
|
-
item.setAttribute(SAVED_MENU_TARGET, item.getAttribute(MENU_TARGET) ?? "");
|
|
693
|
+
if (!item.hasAttribute(this.#attr(BANKED))) {
|
|
694
|
+
item.setAttribute(this.#attr(BANKED), "true");
|
|
695
|
+
item.setAttribute(this.#attr(SAVED_ROLE), item.getAttribute("role") ?? "");
|
|
696
|
+
item.setAttribute(this.#attr(SAVED_TABINDEX), item.getAttribute("tabindex") ?? "");
|
|
697
|
+
item.setAttribute(this.#attr(SAVED_MENU_TARGET), item.getAttribute(MENU_TARGET) ?? "");
|
|
601
698
|
item.setAttribute("role", "menuitem");
|
|
602
699
|
item.setAttribute("tabindex", "-1");
|
|
603
700
|
item.setAttribute(MENU_TARGET, "item");
|
|
604
701
|
}
|
|
605
|
-
item.setAttribute(INDEX, String(this.#indexOf(item)));
|
|
702
|
+
item.setAttribute(this.#attr(INDEX), String(this.#indexOf(item)));
|
|
606
703
|
}
|
|
607
704
|
/** Undoes the banking: restores every authored value and drops the bookkeeping. */
|
|
608
705
|
#unbank(item) {
|
|
609
|
-
if (!item.hasAttribute(BANKED)) return;
|
|
610
|
-
this.#restoreAttr(item, "role", item.getAttribute(SAVED_ROLE));
|
|
611
|
-
this.#restoreAttr(item, "tabindex", item.getAttribute(SAVED_TABINDEX));
|
|
612
|
-
this.#restoreAttr(item, MENU_TARGET, item.getAttribute(SAVED_MENU_TARGET));
|
|
613
|
-
for (const name of BOOKKEEPING) item.removeAttribute(name);
|
|
706
|
+
if (!item.hasAttribute(this.#attr(BANKED))) return;
|
|
707
|
+
this.#restoreAttr(item, "role", item.getAttribute(this.#attr(SAVED_ROLE)));
|
|
708
|
+
this.#restoreAttr(item, "tabindex", item.getAttribute(this.#attr(SAVED_TABINDEX)));
|
|
709
|
+
this.#restoreAttr(item, MENU_TARGET, item.getAttribute(this.#attr(SAVED_MENU_TARGET)));
|
|
710
|
+
for (const name of BOOKKEEPING) item.removeAttribute(this.#attr(name));
|
|
614
711
|
}
|
|
615
712
|
/** Re-applies a saved attribute value, or removes the attribute when it was absent. */
|
|
616
713
|
#restoreAttr(item, name, original) {
|