stimeo-ui 0.16.0 → 0.17.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +31 -0
- data/README.md +8 -1
- data/dist/cable/index.js +363 -436
- data/dist/controllers/accordion_controller.js +166 -55
- data/dist/controllers/alert_dialog_controller.js +862 -221
- data/dist/controllers/announcer_controller.js +135 -198
- data/dist/controllers/aspect_ratio_controller.js +0 -10
- data/dist/controllers/auto_submit_controller.js +271 -127
- data/dist/controllers/avatar_controller.js +171 -105
- data/dist/controllers/breadcrumb_controller.js +0 -130
- data/dist/controllers/bulk_select_controller.js +262 -52
- data/dist/controllers/calendar_controller.js +175 -209
- data/dist/controllers/carousel_controller.js +461 -399
- data/dist/controllers/character_counter_controller.js +246 -156
- data/dist/controllers/checkbox_controller.js +32 -74
- data/dist/controllers/clipboard_controller.js +168 -147
- data/dist/controllers/collapsible_controller.js +301 -120
- data/dist/controllers/color_picker_controller.js +149 -139
- data/dist/controllers/combobox_controller.js +360 -133
- data/dist/controllers/command_palette_controller.js +970 -358
- data/dist/controllers/conditional_fields_controller.js +166 -124
- data/dist/controllers/confirm_controller.js +939 -248
- data/dist/controllers/context_menu_controller.js +256 -128
- data/dist/controllers/count_up_controller.js +73 -21
- data/dist/controllers/countdown_controller.js +183 -148
- data/dist/controllers/currency_input_controller.js +134 -158
- data/dist/controllers/data_grid_controller.js +114 -186
- data/dist/controllers/date_range_picker_controller.js +288 -206
- data/dist/controllers/dialog_controller.js +858 -223
- data/dist/controllers/direct_upload_controller.js +73 -153
- data/dist/controllers/dirty_form_controller.js +14 -48
- data/dist/controllers/dismissible_controller.js +175 -21
- data/dist/controllers/drawer_controller.js +933 -341
- data/dist/controllers/dropdown_controller.js +312 -82
- data/dist/controllers/editable_controller.js +158 -68
- data/dist/controllers/empty_state_controller.js +67 -53
- data/dist/controllers/file_dropzone_controller.js +311 -207
- data/dist/controllers/filter_controller.js +67 -39
- data/dist/controllers/flash_controller.js +172 -314
- data/dist/controllers/focus_controller.js +654 -240
- data/dist/controllers/form_field_controller.js +147 -132
- data/dist/controllers/form_validation_controller.js +13 -86
- data/dist/controllers/frame_loading_controller.js +264 -213
- data/dist/controllers/highlight_controller.js +107 -75
- data/dist/controllers/hover_card_controller.js +309 -118
- data/dist/controllers/idle_controller.js +267 -101
- data/dist/controllers/input_mask_controller.js +71 -72
- data/dist/controllers/intersection_controller.js +147 -106
- data/dist/controllers/lazy_frame_controller.js +9 -65
- data/dist/controllers/listbox_controller.js +306 -204
- data/dist/controllers/local_time_controller.js +54 -64
- data/dist/controllers/masonry_controller.js +70 -93
- data/dist/controllers/menu_controller.js +214 -156
- data/dist/controllers/menubar_controller.js +170 -329
- data/dist/controllers/meter_controller.js +151 -67
- data/dist/controllers/multi_select_controller.js +593 -358
- data/dist/controllers/navigation_menu_controller.js +124 -232
- data/dist/controllers/nested_form_controller.js +352 -182
- data/dist/controllers/network_status_controller.js +242 -54
- data/dist/controllers/number_input_controller.js +320 -263
- data/dist/controllers/optimistic_controller.js +16 -76
- data/dist/controllers/otp_controller.js +198 -193
- data/dist/controllers/overflow_indicator_controller.js +116 -113
- data/dist/controllers/overflow_menu_controller.js +343 -283
- data/dist/controllers/pagination_controller.js +295 -119
- data/dist/controllers/password_reveal_controller.js +389 -121
- data/dist/controllers/password_strength_controller.js +99 -153
- data/dist/controllers/persist_controller.js +237 -103
- data/dist/controllers/pointer_drag_controller.js +185 -165
- data/dist/controllers/popover_controller.js +236 -97
- data/dist/controllers/portal_controller.js +209 -76
- data/dist/controllers/preview_guard_controller.js +232 -116
- data/dist/controllers/progress_controller.js +125 -56
- data/dist/controllers/radio_group_controller.js +117 -137
- data/dist/controllers/range_slider_controller.js +192 -105
- data/dist/controllers/rating_controller.js +418 -207
- data/dist/controllers/read_more_controller.js +134 -63
- data/dist/controllers/reading_progress_controller.js +147 -135
- data/dist/controllers/relative_time_controller.js +145 -110
- data/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
- data/dist/controllers/resizable_controller.js +255 -139
- data/dist/controllers/roving_controller.js +39 -84
- data/dist/controllers/scroll_area_controller.js +428 -225
- data/dist/controllers/scroll_restore_controller.js +0 -53
- data/dist/controllers/scroll_visibility_controller.js +395 -145
- data/dist/controllers/scrollspy_controller.js +181 -242
- data/dist/controllers/separator_controller.js +267 -140
- data/dist/controllers/sidebar_controller.js +1023 -386
- data/dist/controllers/skeleton_controller.js +248 -97
- data/dist/controllers/slider_controller.js +159 -79
- data/dist/controllers/smart_sticky_header_controller.js +162 -63
- data/dist/controllers/sortable_controller.js +0 -112
- data/dist/controllers/spinner_controller.js +277 -169
- data/dist/controllers/step_indicator_controller.js +99 -46
- data/dist/controllers/stepper_controller.js +114 -73
- data/dist/controllers/stick_to_bottom_controller.js +262 -138
- data/dist/controllers/sticky_observer_controller.js +214 -49
- data/dist/controllers/submit_once_controller.js +294 -205
- data/dist/controllers/switch_controller.js +33 -60
- data/dist/controllers/tabs_controller.js +35 -29
- data/dist/controllers/tags_input_controller.js +136 -145
- data/dist/controllers/textarea_autosize_controller.js +71 -58
- data/dist/controllers/theme_controller.js +130 -112
- data/dist/controllers/time_picker_controller.js +146 -80
- data/dist/controllers/toast_controller.js +186 -297
- data/dist/controllers/toggle_group_controller.js +95 -136
- data/dist/controllers/toolbar_controller.js +68 -98
- data/dist/controllers/tooltip_controller.js +158 -124
- data/dist/controllers/transition_controller.js +123 -119
- data/dist/controllers/tree_view_controller.js +150 -345
- data/dist/index.js +6370 -9346
- data/dist/positioning/index.js +148 -47
- data/lib/stimeo/ui/version.rb +1 -1
- metadata +3 -3
|
@@ -1,6 +1,69 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var ListenerSet = class {
|
|
4
|
+
#abort = new AbortController();
|
|
5
|
+
add(target, type, handler, options) {
|
|
6
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
7
|
+
}
|
|
8
|
+
dispose() {
|
|
9
|
+
this.#abort.abort();
|
|
10
|
+
this.#abort = new AbortController();
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
var MicrotaskCoalescer = class {
|
|
15
|
+
#run;
|
|
16
|
+
#queued = false;
|
|
17
|
+
#active = false;
|
|
18
|
+
#generation = 0;
|
|
19
|
+
constructor(run) {
|
|
20
|
+
this.#run = run;
|
|
21
|
+
}
|
|
22
|
+
activate() {
|
|
23
|
+
this.#active = true;
|
|
24
|
+
}
|
|
25
|
+
cancel() {
|
|
26
|
+
this.#active = false;
|
|
27
|
+
this.#queued = false;
|
|
28
|
+
this.#generation += 1;
|
|
29
|
+
}
|
|
30
|
+
schedule() {
|
|
31
|
+
if (!this.#active || this.#queued) return;
|
|
32
|
+
this.#queued = true;
|
|
33
|
+
const generation = this.#generation;
|
|
34
|
+
queueMicrotask(() => {
|
|
35
|
+
if (generation !== this.#generation || !this.#queued || !this.#active) return;
|
|
36
|
+
this.#queued = false;
|
|
37
|
+
this.#run();
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
var MorphRenderWatcher = class {
|
|
43
|
+
#listeners = new ListenerSet();
|
|
44
|
+
#pass;
|
|
45
|
+
#element = null;
|
|
46
|
+
#onMorph = () => this.#pass.schedule();
|
|
47
|
+
constructor(run) {
|
|
48
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
49
|
+
}
|
|
50
|
+
observe(element) {
|
|
51
|
+
if (this.#element === element) return;
|
|
52
|
+
this.disconnect();
|
|
53
|
+
this.#element = element;
|
|
54
|
+
this.#pass.activate();
|
|
55
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
56
|
+
}
|
|
57
|
+
schedule() {
|
|
58
|
+
this.#pass.schedule();
|
|
59
|
+
}
|
|
60
|
+
disconnect() {
|
|
61
|
+
this.#listeners.dispose();
|
|
62
|
+
this.#pass.cancel();
|
|
63
|
+
this.#element = null;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
4
67
|
var FilterController = class extends Controller {
|
|
5
68
|
static targets = ["item", "control", "group", "empty"];
|
|
6
69
|
static values = { match: { type: String, default: "all" } };
|
|
@@ -9,55 +72,28 @@ var FilterController = class extends Controller {
|
|
|
9
72
|
#onChange = () => {
|
|
10
73
|
this.apply();
|
|
11
74
|
};
|
|
12
|
-
/**
|
|
13
|
-
* The outcome the last `change` reported, which the next evaluation is compared
|
|
14
|
-
* with; `null` until the first evaluation after `connect()`, which reports
|
|
15
|
-
* whatever it finds.
|
|
16
|
-
*/
|
|
17
75
|
#reported = null;
|
|
18
|
-
/**
|
|
19
|
-
* Gates the declaration callback to the connected window.
|
|
20
|
-
*
|
|
21
|
-
* Stimulus delivers a Value callback ahead of `connect()` and again for every
|
|
22
|
-
* runtime change; without the gate, merely connecting would emit an evaluation
|
|
23
|
-
* — and its `change` — before `connect()` runs its own.
|
|
24
|
-
*/
|
|
25
76
|
#connected = false;
|
|
77
|
+
#morphRender = new MorphRenderWatcher(() => this.#evaluate());
|
|
26
78
|
connect() {
|
|
79
|
+
this.#morphRender.observe(this.element);
|
|
27
80
|
this.#reported = null;
|
|
28
81
|
this.#evaluate();
|
|
29
82
|
this.element.addEventListener("change", this.#onChange);
|
|
30
83
|
this.#connected = true;
|
|
31
84
|
}
|
|
32
85
|
disconnect() {
|
|
86
|
+
this.#morphRender.disconnect();
|
|
33
87
|
this.#connected = false;
|
|
34
88
|
this.element.removeEventListener("change", this.#onChange);
|
|
35
89
|
}
|
|
36
|
-
/**
|
|
37
|
-
* Re-evaluates when the match declaration changes at runtime.
|
|
38
|
-
*
|
|
39
|
-
* The declaration decides which items are shown, so an element kept across a
|
|
40
|
-
* morph — where `connect()` does not run again — still has to follow it instead
|
|
41
|
-
* of waiting for the next control interaction. The evaluation is the ordinary
|
|
42
|
-
* one, `change` included: a declaration swap is an evaluation like any other.
|
|
43
|
-
*/
|
|
44
90
|
matchValueChanged() {
|
|
45
91
|
if (!this.#connected) return;
|
|
46
92
|
this.#evaluate();
|
|
47
93
|
}
|
|
48
|
-
/** Re-derives every item's visibility from the active tokens and syncs groups/empty. */
|
|
49
94
|
apply() {
|
|
50
95
|
this.#evaluate();
|
|
51
96
|
}
|
|
52
|
-
/**
|
|
53
|
-
* The evaluation itself: every item's visibility from the active tokens, then
|
|
54
|
-
* the groups and the empty element, then `change` when the outcome moved from
|
|
55
|
-
* the one last reported. Several triggers can land on the same outcome — a
|
|
56
|
-
* `clear` evaluates, and a toggle group wired to `apply` reports the presses it
|
|
57
|
-
* turned off — so an evaluation that changes nothing reports nothing.
|
|
58
|
-
*
|
|
59
|
-
* @stimeoRenderRoot
|
|
60
|
-
*/
|
|
61
97
|
#evaluate() {
|
|
62
98
|
const active = this.#activeTokens();
|
|
63
99
|
let visibleCount = 0;
|
|
@@ -80,7 +116,6 @@ var FilterController = class extends Controller {
|
|
|
80
116
|
this.#reported = { active, visibleCount, total };
|
|
81
117
|
this.dispatch("change", { detail: { active: [...active], visibleCount, total } });
|
|
82
118
|
}
|
|
83
|
-
/** Turns every control off (uncheck / aria-pressed="false") and re-applies. */
|
|
84
119
|
clear() {
|
|
85
120
|
for (const control of this.controlTargets) {
|
|
86
121
|
if (control instanceof HTMLInputElement) {
|
|
@@ -91,7 +126,6 @@ var FilterController = class extends Controller {
|
|
|
91
126
|
}
|
|
92
127
|
this.apply();
|
|
93
128
|
}
|
|
94
|
-
/** The tokens of every control currently "on" (checked or aria-pressed="true"). */
|
|
95
129
|
#activeTokens() {
|
|
96
130
|
const tokens = [];
|
|
97
131
|
for (const control of this.controlTargets) {
|
|
@@ -99,33 +133,27 @@ var FilterController = class extends Controller {
|
|
|
99
133
|
}
|
|
100
134
|
return tokens.filter(Boolean);
|
|
101
135
|
}
|
|
102
|
-
/** Whether a control is in its "on" state. */
|
|
103
136
|
#isOn(control) {
|
|
104
137
|
if (control instanceof HTMLInputElement) return control.checked;
|
|
105
138
|
return control.getAttribute("aria-pressed") === "true";
|
|
106
139
|
}
|
|
107
|
-
/** A control's token: explicit `data-stimeo--filter-token`, else `data-value` / value. */
|
|
108
140
|
#tokenOf(control) {
|
|
109
141
|
const explicit = control.getAttribute(`data-${this.identifier}-token`) ?? control.dataset.value;
|
|
110
142
|
if (explicit) return explicit;
|
|
111
143
|
return control instanceof HTMLInputElement ? control.value : "";
|
|
112
144
|
}
|
|
113
|
-
/** Whether an item satisfies the active token set per `match` (empty active → shown). */
|
|
114
145
|
#matches(item, active) {
|
|
115
146
|
if (active.length === 0) return true;
|
|
116
147
|
const tokens = this.#tokensOf(item);
|
|
117
148
|
return this.matchValue === "any" ? active.some((token) => tokens.includes(token)) : active.every((token) => tokens.includes(token));
|
|
118
149
|
}
|
|
119
|
-
/** An item's declared tokens (`data-stimeo--filter-tokens`, space-separated). */
|
|
120
150
|
#tokensOf(item) {
|
|
121
151
|
return (item.getAttribute(`data-${this.identifier}-tokens`) ?? "").split(/\s+/).filter(Boolean);
|
|
122
152
|
}
|
|
123
|
-
/** Whether a group still contains at least one non-hidden item. */
|
|
124
153
|
#hasVisibleItem(group) {
|
|
125
154
|
return this.itemTargets.some((item) => !item.hidden && group.contains(item));
|
|
126
155
|
}
|
|
127
156
|
};
|
|
128
157
|
|
|
129
158
|
export { FilterController };
|
|
130
|
-
//# sourceMappingURL=filter_controller.js.map
|
|
131
159
|
//# sourceMappingURL=filter_controller.js.map
|