stimeo-ui 0.13.0 → 0.15.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 +73 -5
- package/dist/cable/index.d.ts +1 -1
- package/dist/cable/index.js +60 -14
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +1 -1
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.js +88 -61
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.js +40 -5
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js +29 -3
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +20 -4
- package/dist/controllers/calendar_controller.js +51 -10
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.js +8 -6
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.js +27 -2
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +1 -1
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +1 -1
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.js +36 -7
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +4 -2
- package/dist/controllers/currency_input_controller.js +77 -25
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +10 -3
- package/dist/controllers/date_range_picker_controller.js +43 -10
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +2 -2
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.js +21 -10
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.js +32 -12
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +1 -1
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +1 -1
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/flash_controller.js +145 -43
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +7 -1
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.js +29 -6
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.js +63 -23
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +3 -2
- package/dist/controllers/input_mask_controller.js +33 -12
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.js +10 -5
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.js +10 -5
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +3 -2
- package/dist/controllers/local_time_controller.js +43 -11
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +4 -4
- package/dist/controllers/masonry_controller.js +32 -14
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.js +10 -2
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.js +10 -2
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.js +8 -2
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +28 -4
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.js +23 -10
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.js +31 -8
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.js +39 -4
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +1 -1
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.js +10 -3
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/portal_controller.js +21 -10
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.js +11 -3
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +1 -1
- package/dist/controllers/read_more_controller.js +31 -5
- 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 +40 -9
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_before_cache_controller.js +23 -10
- package/dist/controllers/reset_before_cache_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.js +7 -2
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.js +7 -3
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.js +70 -26
- 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.d.ts +1 -1
- package/dist/controllers/scroll_visibility_controller.js +71 -42
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +1 -1
- package/dist/controllers/scrollspy_controller.js +76 -32
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.js +72 -37
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.js +29 -3
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.js +10 -5
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.js +29 -6
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +1 -1
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +1 -1
- package/dist/controllers/tabs_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 +2 -3
- package/dist/controllers/theme_controller.js +23 -13
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +3 -0
- package/dist/controllers/toast_controller.js +136 -73
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.js +11 -3
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +7 -3
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/index.js +629 -597
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +38 -1
- package/dist/inspector/cli.js +80 -7
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +103 -7
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +5 -5
- package/dist/inspector/manifest.json +131 -3
- package/package.json +9 -11
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,70 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
While the version is `0.x`, the public API (the `stimeo--*` data attributes) may
|
|
8
8
|
change between releases.
|
|
9
9
|
|
|
10
|
+
## [0.15.0] - 2026-09-20
|
|
11
|
+
|
|
12
|
+
Minor release with no new components. Shared internals were consolidated across
|
|
13
|
+
five refactors; toast and the locale-aware components change behaviour, so read
|
|
14
|
+
Changed before upgrading. The Inspector manifest stays on schema v12.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- calendar, date-range-picker: a `locale` Value.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- toast: a toast whose dismiss deadline has already lapsed is no longer removed
|
|
23
|
+
the moment a pointer or focus enters it. It stays, marked `data-paused="true"`,
|
|
24
|
+
and leaves 1ms after the last hold is released — so focus never drops to
|
|
25
|
+
`<body>` from under the close button it was on.
|
|
26
|
+
- calendar, date-range-picker: the month label resolves its locale as the
|
|
27
|
+
`locale` Value, then the nearest `lang` (the element itself included), then the
|
|
28
|
+
runtime default — instead of `<html lang>` with an `"en"` fallback.
|
|
29
|
+
- currency-input: `locale` no longer defaults to `"en-US"` and resolves the same
|
|
30
|
+
way, so a page under `<html lang="de">` reads and writes `1.234,56`. The hidden
|
|
31
|
+
value stays in its ASCII normal form, and a declaration `Intl` rejects still
|
|
32
|
+
falls back to `"en-US"`.
|
|
33
|
+
- auto-submit: the `stimeo--announcer:announce` it bridges carries
|
|
34
|
+
`assertive: false` and a trimmed `message`; a message of only whitespace is not
|
|
35
|
+
announced.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- announcer: region timers are released on `disconnect()` and before a Turbo
|
|
40
|
+
snapshot, so an announcement made after reconnecting can no longer cancel the
|
|
41
|
+
auto-clear of a different live region.
|
|
42
|
+
|
|
43
|
+
## [0.14.0] - 2026-09-19
|
|
44
|
+
|
|
45
|
+
Minor release with no new components. input-mask changes what a broken `tokens`
|
|
46
|
+
source falls back to, and currency-input, local-time, and relative-time narrow
|
|
47
|
+
which failures they absorb, so read Changed before upgrading. The Inspector
|
|
48
|
+
manifest stays on schema v12.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- Inspector: `missing-action-event` (error) — a `data-action` that omits the
|
|
53
|
+
event on an element with no default one binds nothing, while the markup still
|
|
54
|
+
reads as wired. The elements that have a default are `<a>`, `<button>`,
|
|
55
|
+
`<details>`, `<form>`, `<input>`, `<select>`, and `<textarea>`.
|
|
56
|
+
- Inspector: `valueSyntaxConstraints` reports a `stimeo--otp` `pattern` that is
|
|
57
|
+
not a regular expression, and a `stimeo--input-mask` `tokens` that is not a
|
|
58
|
+
JSON object of them, before the page runs.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- input-mask: a `tokens` source that does not compile leaves that key on its
|
|
63
|
+
default (`9`, `a`, `*`) instead of dropping the key, and a source that
|
|
64
|
+
compiles only against the anchors the controller adds — `0)|(1` — is refused.
|
|
65
|
+
- currency-input, local-time, and relative-time absorb only what a declaration
|
|
66
|
+
can get wrong: a locale, time zone, currency code, or digit count `Intl`
|
|
67
|
+
rejects. Any other failure surfaces.
|
|
68
|
+
- Inspector: a `data-action` that omits the event resolves to the one Stimulus
|
|
69
|
+
binds for that element, so a shorthand on a `<form>` reports
|
|
70
|
+
`missing-action-completion` where it passed in silence.
|
|
71
|
+
- The markup examples in the published types name the event
|
|
72
|
+
(`click->stimeo--dialog#open`).
|
|
73
|
+
|
|
10
74
|
## [0.13.0] - 2026-09-13
|
|
11
75
|
|
|
12
76
|
Minor release with no new components. The three server-bound components are
|
|
@@ -21,11 +85,13 @@ so read Changed before upgrading. The Inspector manifest stays on schema v12.
|
|
|
21
85
|
A delta carrying your own `id` is applied unless an optimistic add of the same
|
|
22
86
|
size is still outstanding. Runtime changes to `channel` / `params`
|
|
23
87
|
re-subscribe.
|
|
24
|
-
- presence: a leave notice is sent by the last element claiming
|
|
25
|
-
than by every element
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
88
|
+
- presence: on `disconnect()` a leave notice is sent by the last element claiming
|
|
89
|
+
that `id` rather than by every element; `pagehide` still sends from each one,
|
|
90
|
+
because the whole page is going away. A `channel` key in `params` no longer
|
|
91
|
+
overrides the declared `channel`, `heartbeat` / `timeout` fall back to their
|
|
92
|
+
defaults unless finite, positive and within the browser timer ceiling
|
|
93
|
+
(2147483647 ms) — typing-indicator's `timeout` takes the same bound — and
|
|
94
|
+
`template` clones only its root element.
|
|
29
95
|
- optimistic: `turbo:submit-end` is matched to the submission it names instead of
|
|
30
96
|
to any ending that reaches the element, so a submission whose ending never
|
|
31
97
|
arrives no longer strands the element. The `data-optimistic-toggled` marker
|
|
@@ -1035,6 +1101,8 @@ Initial public alpha: 101 behavior-only, accessible Stimulus controllers driven
|
|
|
1035
1101
|
by `data-*` attributes, shipping no CSS. Published to npm (with provenance) and
|
|
1036
1102
|
RubyGems.
|
|
1037
1103
|
|
|
1104
|
+
[0.15.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.15.0
|
|
1105
|
+
[0.14.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.14.0
|
|
1038
1106
|
[0.13.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.13.0
|
|
1039
1107
|
[0.12.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.12.0
|
|
1040
1108
|
[0.11.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.11.0
|
package/dist/cable/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { Controller, Application } from '@hotwired/stimulus';
|
|
|
14
14
|
* data-stimeo--live-counter-params-value='{"post":42}'
|
|
15
15
|
* data-stimeo--live-counter-id-value="<%= SecureRandom.uuid %>">
|
|
16
16
|
* <span data-stimeo--live-counter-target="value">128</span>
|
|
17
|
-
* <button type="button" data-action="stimeo--live-counter#increment"
|
|
17
|
+
* <button type="button" data-action="click->stimeo--live-counter#increment"
|
|
18
18
|
* data-stimeo--live-counter-target="trigger">♥</button>
|
|
19
19
|
* </div>
|
|
20
20
|
*
|
package/dist/cable/index.js
CHANGED
|
@@ -530,6 +530,51 @@ var LiveCounterController = class _LiveCounterController extends Controller {
|
|
|
530
530
|
}, _LiveCounterController.#announceDelay);
|
|
531
531
|
}
|
|
532
532
|
};
|
|
533
|
+
|
|
534
|
+
// src/utils/keyed_timers.ts
|
|
535
|
+
var KeyedTimers = class {
|
|
536
|
+
#timers = new SafeTimeout();
|
|
537
|
+
/** The pending timer of each key; an entry lives exactly as long as its timer. */
|
|
538
|
+
#pending = /* @__PURE__ */ new Map();
|
|
539
|
+
/**
|
|
540
|
+
* Arms `callback` after `delay` ms for `key`, cancelling the timer `key` had
|
|
541
|
+
* pending. The entry is dropped before the callback runs, so the callback sees
|
|
542
|
+
* the key unarmed and may arm it again for the next round.
|
|
543
|
+
*/
|
|
544
|
+
set(key, callback, delay) {
|
|
545
|
+
this.clear(key);
|
|
546
|
+
const id = this.#timers.set(() => {
|
|
547
|
+
this.#pending.delete(key);
|
|
548
|
+
callback();
|
|
549
|
+
}, delay);
|
|
550
|
+
this.#pending.set(key, id);
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Cancels `key`'s pending timer, if it has one.
|
|
554
|
+
*
|
|
555
|
+
* A timer id is a positive integer, so `-1` stands for "nothing pending" and
|
|
556
|
+
* the registry ignores an id it does not own — the unarmed case needs no
|
|
557
|
+
* branch of its own, and no other key's timer can be reached from here.
|
|
558
|
+
*/
|
|
559
|
+
clear(key) {
|
|
560
|
+
this.#timers.clear(this.#pending.get(key) ?? -1);
|
|
561
|
+
this.#pending.delete(key);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Cancels every pending timer and forgets every key. Call this from a
|
|
565
|
+
* controller's `disconnect()` so no timer, and no entry, outlives the element.
|
|
566
|
+
*/
|
|
567
|
+
clearAll() {
|
|
568
|
+
this.#timers.clearAll();
|
|
569
|
+
this.#pending.clear();
|
|
570
|
+
}
|
|
571
|
+
/** Whether `key` has a timer pending. */
|
|
572
|
+
has(key) {
|
|
573
|
+
return this.#pending.has(key);
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
// src/cable/presence_controller.ts
|
|
533
578
|
var BEACON_THROTTLE_MS = 2e3;
|
|
534
579
|
var DEFAULT_HEARTBEAT_MS = 15e3;
|
|
535
580
|
var DEFAULT_TIMEOUT_MS = 4e4;
|
|
@@ -554,6 +599,8 @@ var PresenceController = class _PresenceController extends Controller {
|
|
|
554
599
|
#subscription = null;
|
|
555
600
|
/** Present peers keyed by id (insertion order = join order). */
|
|
556
601
|
#peers = /* @__PURE__ */ new Map();
|
|
602
|
+
/** Each peer's auto-expiry timer, restarted by every beacon from that peer. */
|
|
603
|
+
#expiry = new KeyedTimers();
|
|
557
604
|
#timers = new SafeTimeout();
|
|
558
605
|
#intervals = new SafeInterval();
|
|
559
606
|
/** Epoch ms of the last outgoing beacon, for the convergence throttle. */
|
|
@@ -739,9 +786,8 @@ ${this.idValue}`;
|
|
|
739
786
|
}
|
|
740
787
|
const name = typeof beacon?.name === "string" ? beacon.name : "";
|
|
741
788
|
const existing = this.#peers.get(id);
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
this.#peers.set(id, { name, timer });
|
|
789
|
+
this.#expiry.set(id, () => this.#drop(id), this.#timeout);
|
|
790
|
+
this.#peers.set(id, { name });
|
|
745
791
|
if (existing === void 0) {
|
|
746
792
|
this.#appendClone(id, name);
|
|
747
793
|
this.#render();
|
|
@@ -757,7 +803,7 @@ ${this.idValue}`;
|
|
|
757
803
|
#drop(id) {
|
|
758
804
|
const peer = this.#peers.get(id);
|
|
759
805
|
if (peer === void 0) return;
|
|
760
|
-
this.#
|
|
806
|
+
this.#expiry.clear(id);
|
|
761
807
|
this.#peers.delete(id);
|
|
762
808
|
this.#removeClone(id);
|
|
763
809
|
this.#render();
|
|
@@ -834,6 +880,7 @@ ${this.idValue}`;
|
|
|
834
880
|
/** Clears the transient roster state (connect reset + disconnect teardown). */
|
|
835
881
|
#reset() {
|
|
836
882
|
this.#timers.clearAll();
|
|
883
|
+
this.#expiry.clearAll();
|
|
837
884
|
this.#pendingBeacon = null;
|
|
838
885
|
this.#announceId = null;
|
|
839
886
|
this.#peers.clear();
|
|
@@ -871,8 +918,10 @@ var TypingIndicatorController = class _TypingIndicatorController extends Control
|
|
|
871
918
|
/** Identifier parameters parsed once from their declaration, never in the hot path. */
|
|
872
919
|
#params = {};
|
|
873
920
|
#subscription = null;
|
|
874
|
-
/** Names currently typing (other clients),
|
|
875
|
-
#typers = /* @__PURE__ */ new
|
|
921
|
+
/** Names currently typing (other clients), in the order their first signal arrived. */
|
|
922
|
+
#typers = /* @__PURE__ */ new Set();
|
|
923
|
+
/** Each typer's auto-clear timer, restarted by every further signal from that name. */
|
|
924
|
+
#expiry = new KeyedTimers();
|
|
876
925
|
#timers = new SafeTimeout();
|
|
877
926
|
/** Epoch ms of the last broadcast, for leading-edge throttling. */
|
|
878
927
|
#lastSentAt = 0;
|
|
@@ -922,6 +971,7 @@ var TypingIndicatorController = class _TypingIndicatorController extends Control
|
|
|
922
971
|
this.#subscription?.unsubscribe();
|
|
923
972
|
this.#subscription = null;
|
|
924
973
|
this.#timers.clearAll();
|
|
974
|
+
this.#expiry.clearAll();
|
|
925
975
|
this.#announceId = null;
|
|
926
976
|
this.#typers.clear();
|
|
927
977
|
this.element.removeAttribute("data-typing");
|
|
@@ -945,13 +995,9 @@ var TypingIndicatorController = class _TypingIndicatorController extends Control
|
|
|
945
995
|
#onReceived(data) {
|
|
946
996
|
const name = data?.name;
|
|
947
997
|
if (typeof name !== "string" || name === "" || name === this.nameValue) return;
|
|
948
|
-
const
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
this.#typers.set(
|
|
952
|
-
name,
|
|
953
|
-
this.#timers.set(() => this.#untrack(name), this.#timeout)
|
|
954
|
-
);
|
|
998
|
+
const added = !this.#typers.has(name);
|
|
999
|
+
this.#typers.add(name);
|
|
1000
|
+
this.#expiry.set(name, () => this.#untrack(name), this.#timeout);
|
|
955
1001
|
if (added) this.#render();
|
|
956
1002
|
}
|
|
957
1003
|
/**
|
|
@@ -1011,7 +1057,7 @@ var TypingIndicatorController = class _TypingIndicatorController extends Control
|
|
|
1011
1057
|
}
|
|
1012
1058
|
/** Writes the current typer set onto the hook and the status slot. */
|
|
1013
1059
|
#paint() {
|
|
1014
|
-
const names = [...this.#typers
|
|
1060
|
+
const names = [...this.#typers];
|
|
1015
1061
|
this.element.setAttribute("data-typing", names.length > 0 ? "true" : "false");
|
|
1016
1062
|
if (this.hasStatusTarget) {
|
|
1017
1063
|
this.statusTarget.textContent = this.#message(names);
|