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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -0
  3. data/README.md +8 -1
  4. data/dist/cable/index.js +363 -436
  5. data/dist/controllers/accordion_controller.js +166 -55
  6. data/dist/controllers/alert_dialog_controller.js +862 -221
  7. data/dist/controllers/announcer_controller.js +135 -198
  8. data/dist/controllers/aspect_ratio_controller.js +0 -10
  9. data/dist/controllers/auto_submit_controller.js +271 -127
  10. data/dist/controllers/avatar_controller.js +171 -105
  11. data/dist/controllers/breadcrumb_controller.js +0 -130
  12. data/dist/controllers/bulk_select_controller.js +262 -52
  13. data/dist/controllers/calendar_controller.js +175 -209
  14. data/dist/controllers/carousel_controller.js +461 -399
  15. data/dist/controllers/character_counter_controller.js +246 -156
  16. data/dist/controllers/checkbox_controller.js +32 -74
  17. data/dist/controllers/clipboard_controller.js +168 -147
  18. data/dist/controllers/collapsible_controller.js +301 -120
  19. data/dist/controllers/color_picker_controller.js +149 -139
  20. data/dist/controllers/combobox_controller.js +360 -133
  21. data/dist/controllers/command_palette_controller.js +970 -358
  22. data/dist/controllers/conditional_fields_controller.js +166 -124
  23. data/dist/controllers/confirm_controller.js +939 -248
  24. data/dist/controllers/context_menu_controller.js +256 -128
  25. data/dist/controllers/count_up_controller.js +73 -21
  26. data/dist/controllers/countdown_controller.js +183 -148
  27. data/dist/controllers/currency_input_controller.js +134 -158
  28. data/dist/controllers/data_grid_controller.js +114 -186
  29. data/dist/controllers/date_range_picker_controller.js +288 -206
  30. data/dist/controllers/dialog_controller.js +858 -223
  31. data/dist/controllers/direct_upload_controller.js +73 -153
  32. data/dist/controllers/dirty_form_controller.js +14 -48
  33. data/dist/controllers/dismissible_controller.js +175 -21
  34. data/dist/controllers/drawer_controller.js +933 -341
  35. data/dist/controllers/dropdown_controller.js +312 -82
  36. data/dist/controllers/editable_controller.js +158 -68
  37. data/dist/controllers/empty_state_controller.js +67 -53
  38. data/dist/controllers/file_dropzone_controller.js +311 -207
  39. data/dist/controllers/filter_controller.js +67 -39
  40. data/dist/controllers/flash_controller.js +172 -314
  41. data/dist/controllers/focus_controller.js +654 -240
  42. data/dist/controllers/form_field_controller.js +147 -132
  43. data/dist/controllers/form_validation_controller.js +13 -86
  44. data/dist/controllers/frame_loading_controller.js +264 -213
  45. data/dist/controllers/highlight_controller.js +107 -75
  46. data/dist/controllers/hover_card_controller.js +309 -118
  47. data/dist/controllers/idle_controller.js +267 -101
  48. data/dist/controllers/input_mask_controller.js +71 -72
  49. data/dist/controllers/intersection_controller.js +147 -106
  50. data/dist/controllers/lazy_frame_controller.js +9 -65
  51. data/dist/controllers/listbox_controller.js +306 -204
  52. data/dist/controllers/local_time_controller.js +54 -64
  53. data/dist/controllers/masonry_controller.js +70 -93
  54. data/dist/controllers/menu_controller.js +214 -156
  55. data/dist/controllers/menubar_controller.js +170 -329
  56. data/dist/controllers/meter_controller.js +151 -67
  57. data/dist/controllers/multi_select_controller.js +593 -358
  58. data/dist/controllers/navigation_menu_controller.js +124 -232
  59. data/dist/controllers/nested_form_controller.js +352 -182
  60. data/dist/controllers/network_status_controller.js +242 -54
  61. data/dist/controllers/number_input_controller.js +320 -263
  62. data/dist/controllers/optimistic_controller.js +16 -76
  63. data/dist/controllers/otp_controller.js +198 -193
  64. data/dist/controllers/overflow_indicator_controller.js +116 -113
  65. data/dist/controllers/overflow_menu_controller.js +343 -283
  66. data/dist/controllers/pagination_controller.js +295 -119
  67. data/dist/controllers/password_reveal_controller.js +389 -121
  68. data/dist/controllers/password_strength_controller.js +99 -153
  69. data/dist/controllers/persist_controller.js +237 -103
  70. data/dist/controllers/pointer_drag_controller.js +185 -165
  71. data/dist/controllers/popover_controller.js +236 -97
  72. data/dist/controllers/portal_controller.js +209 -76
  73. data/dist/controllers/preview_guard_controller.js +232 -116
  74. data/dist/controllers/progress_controller.js +125 -56
  75. data/dist/controllers/radio_group_controller.js +117 -137
  76. data/dist/controllers/range_slider_controller.js +192 -105
  77. data/dist/controllers/rating_controller.js +418 -207
  78. data/dist/controllers/read_more_controller.js +134 -63
  79. data/dist/controllers/reading_progress_controller.js +147 -135
  80. data/dist/controllers/relative_time_controller.js +145 -110
  81. data/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +97 -38
  82. data/dist/controllers/resizable_controller.js +255 -139
  83. data/dist/controllers/roving_controller.js +39 -84
  84. data/dist/controllers/scroll_area_controller.js +428 -225
  85. data/dist/controllers/scroll_restore_controller.js +0 -53
  86. data/dist/controllers/scroll_visibility_controller.js +395 -145
  87. data/dist/controllers/scrollspy_controller.js +181 -242
  88. data/dist/controllers/separator_controller.js +267 -140
  89. data/dist/controllers/sidebar_controller.js +1023 -386
  90. data/dist/controllers/skeleton_controller.js +248 -97
  91. data/dist/controllers/slider_controller.js +159 -79
  92. data/dist/controllers/smart_sticky_header_controller.js +162 -63
  93. data/dist/controllers/sortable_controller.js +0 -112
  94. data/dist/controllers/spinner_controller.js +277 -169
  95. data/dist/controllers/step_indicator_controller.js +99 -46
  96. data/dist/controllers/stepper_controller.js +114 -73
  97. data/dist/controllers/stick_to_bottom_controller.js +262 -138
  98. data/dist/controllers/sticky_observer_controller.js +214 -49
  99. data/dist/controllers/submit_once_controller.js +294 -205
  100. data/dist/controllers/switch_controller.js +33 -60
  101. data/dist/controllers/tabs_controller.js +35 -29
  102. data/dist/controllers/tags_input_controller.js +136 -145
  103. data/dist/controllers/textarea_autosize_controller.js +71 -58
  104. data/dist/controllers/theme_controller.js +130 -112
  105. data/dist/controllers/time_picker_controller.js +146 -80
  106. data/dist/controllers/toast_controller.js +186 -297
  107. data/dist/controllers/toggle_group_controller.js +95 -136
  108. data/dist/controllers/toolbar_controller.js +68 -98
  109. data/dist/controllers/tooltip_controller.js +158 -124
  110. data/dist/controllers/transition_controller.js +123 -119
  111. data/dist/controllers/tree_view_controller.js +150 -345
  112. data/dist/index.js +6370 -9346
  113. data/dist/positioning/index.js +148 -47
  114. data/lib/stimeo/ui/version.rb +1 -1
  115. metadata +3 -3
@@ -1,6 +1,69 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- // src/controllers/filter_controller.ts
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