stimeo-ui 0.16.0 → 0.18.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 +136 -0
- package/README.md +27 -11
- package/dist/cable/index.d.ts +88 -31
- package/dist/cable/index.js +384 -449
- package/dist/cable/index.js.map +1 -1
- package/dist/coerce-JtZVNG5h.d.ts +20 -0
- package/dist/controllers/accordion_controller.d.ts +4 -2
- package/dist/controllers/accordion_controller.js +174 -55
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/alert_dialog_controller.d.ts +12 -2
- package/dist/controllers/alert_dialog_controller.js +903 -235
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +37 -5
- package/dist/controllers/announcer_controller.js +238 -205
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/aspect_ratio_controller.js +0 -10
- package/dist/controllers/aspect_ratio_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.d.ts +30 -6
- package/dist/controllers/auto_submit_controller.js +414 -145
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +185 -107
- package/dist/controllers/avatar_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js +0 -130
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/bulk_select_controller.d.ts +21 -3
- package/dist/controllers/bulk_select_controller.js +282 -58
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +38 -16
- package/dist/controllers/calendar_controller.js +228 -260
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +43 -12
- package/dist/controllers/carousel_controller.js +536 -436
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +44 -7
- package/dist/controllers/character_counter_controller.js +493 -207
- package/dist/controllers/character_counter_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.d.ts +7 -2
- package/dist/controllers/checkbox_controller.js +38 -74
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +16 -5
- package/dist/controllers/clipboard_controller.js +261 -149
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +17 -5
- package/dist/controllers/collapsible_controller.js +304 -120
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/color_picker_controller.d.ts +18 -6
- package/dist/controllers/color_picker_controller.js +178 -146
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +24 -6
- package/dist/controllers/combobox_controller.js +522 -156
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +51 -20
- package/dist/controllers/command_palette_controller.js +1156 -395
- package/dist/controllers/command_palette_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.d.ts +15 -2
- package/dist/controllers/conditional_fields_controller.js +300 -171
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/confirm_controller.d.ts +49 -12
- package/dist/controllers/confirm_controller.js +980 -262
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +80 -18
- package/dist/controllers/context_menu_controller.js +346 -153
- package/dist/controllers/context_menu_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.d.ts +13 -1
- package/dist/controllers/count_up_controller.js +73 -21
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/countdown_controller.d.ts +47 -3
- package/dist/controllers/countdown_controller.js +281 -158
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +93 -10
- package/dist/controllers/currency_input_controller.js +575 -225
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +25 -12
- package/dist/controllers/data_grid_controller.js +248 -214
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +42 -14
- package/dist/controllers/date_range_picker_controller.js +338 -235
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +17 -6
- package/dist/controllers/dialog_controller.js +899 -237
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +25 -8
- package/dist/controllers/direct_upload_controller.js +97 -167
- 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 +72 -69
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +19 -0
- package/dist/controllers/dismissible_controller.js +196 -24
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +39 -11
- package/dist/controllers/drawer_controller.js +974 -355
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +31 -1
- package/dist/controllers/dropdown_controller.js +339 -96
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +315 -88
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +79 -58
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +63 -18
- package/dist/controllers/file_dropzone_controller.js +322 -211
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +77 -42
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +35 -12
- package/dist/controllers/flash_controller.js +238 -347
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +15 -6
- package/dist/controllers/focus_controller.js +679 -240
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +156 -132
- 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 +31 -97
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +47 -14
- package/dist/controllers/frame_loading_controller.js +275 -217
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +27 -6
- package/dist/controllers/highlight_controller.js +107 -75
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/hover_card_controller.d.ts +60 -4
- package/dist/controllers/hover_card_controller.js +327 -130
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +48 -6
- package/dist/controllers/idle_controller.js +271 -101
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +30 -13
- package/dist/controllers/input_mask_controller.js +483 -97
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.d.ts +32 -13
- package/dist/controllers/intersection_controller.js +150 -106
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +19 -2
- package/dist/controllers/lazy_frame_controller.js +24 -68
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +44 -9
- package/dist/controllers/listbox_controller.js +523 -240
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +9 -7
- package/dist/controllers/local_time_controller.js +102 -77
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +11 -3
- package/dist/controllers/masonry_controller.js +80 -96
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +55 -11
- package/dist/controllers/menu_controller.js +302 -188
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +51 -9
- package/dist/controllers/menubar_controller.js +232 -345
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +33 -20
- package/dist/controllers/meter_controller.js +417 -87
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +48 -18
- package/dist/controllers/multi_select_controller.js +785 -393
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +27 -6
- package/dist/controllers/navigation_menu_controller.js +190 -250
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/nested_form_controller.d.ts +10 -0
- package/dist/controllers/nested_form_controller.js +396 -192
- package/dist/controllers/nested_form_controller.js.map +1 -1
- package/dist/controllers/network_status_controller.d.ts +23 -0
- package/dist/controllers/network_status_controller.js +268 -62
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +50 -8
- package/dist/controllers/number_input_controller.js +610 -303
- 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 +45 -87
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +55 -8
- package/dist/controllers/otp_controller.js +658 -255
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.d.ts +5 -0
- package/dist/controllers/overflow_indicator_controller.js +122 -113
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +58 -20
- package/dist/controllers/overflow_menu_controller.js +470 -295
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +37 -7
- package/dist/controllers/pagination_controller.js +332 -123
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +46 -8
- package/dist/controllers/password_reveal_controller.js +392 -121
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +15 -6
- package/dist/controllers/password_strength_controller.js +111 -158
- package/dist/controllers/password_strength_controller.js.map +1 -1
- package/dist/controllers/persist_controller.d.ts +11 -4
- package/dist/controllers/persist_controller.js +165 -111
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +35 -12
- package/dist/controllers/pointer_drag_controller.js +434 -188
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +41 -5
- package/dist/controllers/popover_controller.js +269 -113
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +44 -4
- package/dist/controllers/portal_controller.js +215 -76
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/preview_guard_controller.d.ts +10 -4
- package/dist/controllers/preview_guard_controller.js +243 -116
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +20 -19
- package/dist/controllers/progress_controller.js +391 -78
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +21 -9
- package/dist/controllers/radio_group_controller.js +278 -211
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +47 -6
- package/dist/controllers/range_slider_controller.js +220 -113
- package/dist/controllers/range_slider_controller.js.map +1 -1
- package/dist/controllers/rating_controller.d.ts +20 -4
- package/dist/controllers/rating_controller.js +458 -211
- package/dist/controllers/rating_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +2 -0
- package/dist/controllers/read_more_controller.js +138 -63
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.d.ts +1 -1
- package/dist/controllers/reading_progress_controller.js +166 -137
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +20 -6
- package/dist/controllers/relative_time_controller.js +211 -112
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_on_restore_controller.d.ts +85 -0
- package/dist/controllers/{reset_before_cache_controller.js → reset_on_restore_controller.js} +103 -38
- package/dist/controllers/reset_on_restore_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +31 -2
- package/dist/controllers/resizable_controller.js +299 -150
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.d.ts +3 -3
- package/dist/controllers/roving_controller.js +49 -88
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.d.ts +7 -3
- package/dist/controllers/scroll_area_controller.js +490 -246
- 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 -55
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.d.ts +28 -12
- package/dist/controllers/scroll_visibility_controller.js +432 -149
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +6 -1
- package/dist/controllers/scrollspy_controller.js +193 -248
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +20 -5
- package/dist/controllers/separator_controller.js +285 -142
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +65 -8
- package/dist/controllers/sidebar_controller.js +1069 -404
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.d.ts +23 -0
- package/dist/controllers/skeleton_controller.js +259 -101
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +29 -2
- package/dist/controllers/slider_controller.js +187 -86
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +22 -4
- package/dist/controllers/smart_sticky_header_controller.js +173 -66
- 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 +26 -125
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.d.ts +39 -4
- package/dist/controllers/spinner_controller.js +288 -173
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +9 -4
- package/dist/controllers/step_indicator_controller.js +105 -46
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +14 -6
- package/dist/controllers/stepper_controller.js +120 -73
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +9 -1
- package/dist/controllers/stick_to_bottom_controller.js +275 -140
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.d.ts +11 -0
- package/dist/controllers/sticky_observer_controller.js +220 -49
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +24 -8
- package/dist/controllers/submit_once_controller.js +376 -227
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +18 -4
- package/dist/controllers/switch_controller.js +201 -84
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +9 -6
- package/dist/controllers/tabs_controller.js +41 -30
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +16 -3
- package/dist/controllers/tags_input_controller.js +293 -173
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +11 -1
- package/dist/controllers/textarea_autosize_controller.js +108 -74
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +24 -11
- package/dist/controllers/theme_controller.js +140 -116
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +55 -5
- package/dist/controllers/time_picker_controller.js +331 -127
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +40 -16
- package/dist/controllers/toast_controller.js +244 -324
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +14 -6
- package/dist/controllers/toggle_group_controller.js +252 -191
- 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 +219 -120
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +49 -4
- package/dist/controllers/tooltip_controller.js +158 -124
- package/dist/controllers/tooltip_controller.js.map +1 -1
- package/dist/controllers/transition_controller.d.ts +22 -4
- package/dist/controllers/transition_controller.js +123 -119
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/controllers/tree_view_controller.d.ts +22 -12
- package/dist/controllers/tree_view_controller.js +283 -369
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.js +8573 -10410
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +38 -14
- package/dist/inspector/cli.js +108 -40
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +145 -64
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +20 -20
- package/dist/inspector/manifest.json +802 -101
- package/dist/positioning/index.d.ts +15 -7
- package/dist/positioning/index.js +154 -47
- package/dist/positioning/index.js.map +1 -1
- package/package.json +11 -10
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,139 @@ 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
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
## [0.18.0] - 2026-10-22
|
|
13
|
+
|
|
14
|
+
Minor release with no new components. IME composition, Turbo morphs, and form
|
|
15
|
+
submission now behave consistently across the input components, and several
|
|
16
|
+
contracts change, so read Changed before upgrading. The Inspector manifest moves
|
|
17
|
+
to schema v16; update `stimeo check` and the VS Code extension together and run
|
|
18
|
+
`stimeo check` before deploying.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- time-picker: `amLabel` and `pmLabel` Values set the meridiem text and its
|
|
23
|
+
speech, and `hour12ZeroBased` shows and enters a twelve-hour clock's hours as
|
|
24
|
+
0–11, as `午前` / `午後` time is written. The submitted value stays on the
|
|
25
|
+
24-hour clock.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **Breaking** input-mask: a synchronized hidden field carries a unique internal
|
|
30
|
+
DOM name; native FormData and native / Turbo submission restore the original
|
|
31
|
+
name, and removing the source submits an empty entry. Find managed fields by id
|
|
32
|
+
or the pairing attribute, use native FormData, and call
|
|
33
|
+
`prepareInputMaskForm(form)` before reading FormData from a new detached form.
|
|
34
|
+
input-mask clears only the raw value it wrote.
|
|
35
|
+
- **Breaking** otp: a pattern drop held for a composition is reported as
|
|
36
|
+
`reconcile` before the edit's own `change` / `complete` / `invalid`, and a
|
|
37
|
+
reconnect under another `pattern` drops what it rejects as `reconcile`. Use the
|
|
38
|
+
edit events for submission.
|
|
39
|
+
- **Breaking** number-input: a range or step change made during IME composition
|
|
40
|
+
applies when the user confirms, reported as `change`; a morph that changes
|
|
41
|
+
neither holds nothing.
|
|
42
|
+
- **Breaking** currency-input: actions and events act only on the first `display`
|
|
43
|
+
target, and a display already focused when the controller connects starts
|
|
44
|
+
formatting at its next ordinary edit or composition end. Render the initial
|
|
45
|
+
hidden and accessible values on the server. `stimeo check` warns about extra
|
|
46
|
+
displays.
|
|
47
|
+
- **Breaking** tabs, calendar, date-range-picker, slider, range-slider,
|
|
48
|
+
color-picker, multi-select, and tags-input read the writing direction from their
|
|
49
|
+
layout targets instead of the root; carousel gains a `pickerList` and
|
|
50
|
+
navigation-menu a `list` target.
|
|
51
|
+
- **Breaking** dirty-form and optimistic accept only the terminal event matching
|
|
52
|
+
the latest start's source and token, and only `success: true` succeeds. For a
|
|
53
|
+
custom save, call `markClean` or dispatch the paired events with `success`.
|
|
54
|
+
- **Breaking** local-time and relative-time read `datetime` strictly: a clock
|
|
55
|
+
without a zone is UTC (relative-time read it as local time), and an incomplete
|
|
56
|
+
or invalid value keeps the current display.
|
|
57
|
+
- **Breaking** presence and typing-indicator templates use `{count}`, `{name}`,
|
|
58
|
+
and `{names}` instead of `%{…}`.
|
|
59
|
+
- **Breaking** modified `Home` / `End` / `PageUp` / `PageDown` go to the browser
|
|
60
|
+
in widgets without a dedicated binding; pointer-drag cancels a keyboard grab
|
|
61
|
+
when focus leaves the handle; time-picker accepts digits typed with `Shift`.
|
|
62
|
+
- **Breaking** progress, meter, pointer-drag, countdown, overflow-menu, listbox,
|
|
63
|
+
submit-once, clipboard, announcer, and currency-input change their ownership
|
|
64
|
+
markers (pointer-drag: `data-stimeo--pointer-drag-tabindex-loan`, listbox:
|
|
65
|
+
`owns-label`); re-render persisted HTML from authored markup. progress and meter
|
|
66
|
+
restore the authored `aria-valuetext` when the template is cleared or the
|
|
67
|
+
controller disconnects.
|
|
68
|
+
- **Breaking** menubar, navigation-menu, menu, and context-menu treat an entry
|
|
69
|
+
inside an `aria-disabled="true"` ancestor as disabled (it stays reachable with
|
|
70
|
+
the arrow keys), and with nested entries refuse an action when any entry holding
|
|
71
|
+
its target is disabled. A click is judged when it reaches the component, so a
|
|
72
|
+
handler inside the component that disables its entry during the click keeps the
|
|
73
|
+
open or close it started; a menubar top it leaves natively `disabled` then has
|
|
74
|
+
its menu closed again, without a `close` event.
|
|
75
|
+
- **Breaking** pointer-drag: `reset()` returns the inline `translate` to the
|
|
76
|
+
origin only when `follow` is on; otherwise it cancels the gesture in flight and
|
|
77
|
+
leaves the author's `translate` alone.
|
|
78
|
+
- toggle-group writes `aria-pressed`, time-picker `aria-valuenow`, and radio-group
|
|
79
|
+
its arrival and release `tabindex` only when the value changes.
|
|
80
|
+
- context-menu: the region contract drops `aria-haspopup`; give the region a role
|
|
81
|
+
and name that fit its content and advertise the key with
|
|
82
|
+
`aria-keyshortcuts="Shift+F10"`.
|
|
83
|
+
- `stimeo check` reports `missing-announcer` for the `stimeo-ui/cable`
|
|
84
|
+
controllers (live-counter, presence, typing-indicator), and the
|
|
85
|
+
`stimeo:install` generator writes commented-out pins and registrations for the
|
|
86
|
+
opt-in `stimeo-ui/cable` and `stimeo-ui/positioning` entry points.
|
|
87
|
+
|
|
88
|
+
### Removed
|
|
89
|
+
|
|
90
|
+
- character-counter: the `announceTextValueChanged()` callback is gone from the
|
|
91
|
+
shipped types; pending announcements still read the current `announceText`.
|
|
92
|
+
|
|
93
|
+
### Fixed
|
|
94
|
+
|
|
95
|
+
- IME composition no longer sticks after a page write, a move, or a Turbo morph
|
|
96
|
+
in auto-submit, character-counter, combobox, command-palette, currency-input,
|
|
97
|
+
editable, input-mask, multi-select, number-input, otp, tags-input, and toolbar.
|
|
98
|
+
A morph leaves a field mid-composition alone, and a focused draft survives
|
|
99
|
+
morphs and reconnection.
|
|
100
|
+
- switch, otp, currency-input, and input-mask keep their hidden form values right
|
|
101
|
+
across Turbo morphs and removal.
|
|
102
|
+
- State events and reconciliation stay right when a `change` listener disconnects
|
|
103
|
+
the controller or the page edits state during a repair.
|
|
104
|
+
- Components release what an earlier connection registered when connected twice,
|
|
105
|
+
and keep authored text, ARIA, and tab stops through restores.
|
|
106
|
+
- relative-time follows live `datetime` changes; template substitution leaves
|
|
107
|
+
inherited names such as `{constructor}` unchanged.
|
|
108
|
+
- menubar, navigation-menu, menu, and context-menu refuse a `hidden`, natively
|
|
109
|
+
`disabled`, or `aria-disabled` entry on every route — an explicit element, any
|
|
110
|
+
event, or hover — as a click on it already was; `context-menu#activate` takes
|
|
111
|
+
the optional event.
|
|
112
|
+
- The MCP server accepts JSON-RPC batches in sessions that negotiated protocol
|
|
113
|
+
version 2025-03-26; other versions, and batches before `initialize`, are still
|
|
114
|
+
rejected.
|
|
115
|
+
|
|
116
|
+
## [0.17.0] - 2026-10-04
|
|
117
|
+
|
|
118
|
+
### Changed
|
|
119
|
+
|
|
120
|
+
- **Breaking** Replace `reset-before-cache` with `reset-on-restore` (class, export,
|
|
121
|
+
and subpath).
|
|
122
|
+
Reset runs on restoration; remove `dispatchReset` and `:request` bindings.
|
|
123
|
+
Restored drawers and command palettes start closed.
|
|
124
|
+
- **Breaking** Rename calendar, combobox, and command-palette `selectByClick`, and
|
|
125
|
+
tree-view `onClick`, to `select`; replace calendar `selectDayElement` with
|
|
126
|
+
`select(element)`.
|
|
127
|
+
Accordion `toggle`, theme `set`, and scrollspy `scrollTo` require owned targets.
|
|
128
|
+
- **Breaking** State events are silent for unchanged state and superseded pending
|
|
129
|
+
reports.
|
|
130
|
+
For child edits within partial checkbox groups, use the children's native `change`.
|
|
131
|
+
Number Values and action params enforce finite values and their declared domains.
|
|
132
|
+
Update Inspector integrations to schema v15 and run `stimeo check` before deploying.
|
|
133
|
+
- Target actions accept owned elements; user state reports include `detail.reason`.
|
|
134
|
+
Toast duration, persist debounce, and count-up duration changes apply to the next
|
|
135
|
+
operation. Portal destination changes update mounts; Cable params cannot replace
|
|
136
|
+
the declared channel.
|
|
137
|
+
|
|
138
|
+
### Fixed
|
|
139
|
+
|
|
140
|
+
- Preserve live state across Turbo caching, repair derived state after retained
|
|
141
|
+
morphs, and restore focus reliably across nested layers and Shadow DOM.
|
|
142
|
+
|
|
10
143
|
## [0.16.0] - 2026-09-26
|
|
11
144
|
|
|
12
145
|
Minor release with no new components. Widgets now report their own state
|
|
@@ -1278,6 +1411,9 @@ Initial public alpha: 101 behavior-only, accessible Stimulus controllers driven
|
|
|
1278
1411
|
by `data-*` attributes, shipping no CSS. Published to npm (with provenance) and
|
|
1279
1412
|
RubyGems.
|
|
1280
1413
|
|
|
1414
|
+
[Unreleased]: https://github.com/taiyaky/stimeo-ui/compare/v0.18.0...HEAD
|
|
1415
|
+
[0.18.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.18.0
|
|
1416
|
+
[0.17.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.17.0
|
|
1281
1417
|
[0.16.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.16.0
|
|
1282
1418
|
[0.15.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.15.0
|
|
1283
1419
|
[0.14.0]: https://github.com/taiyaky/stimeo-ui/releases/tag/v0.14.0
|
package/README.md
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
owns the look entirely.
|
|
16
16
|
|
|
17
17
|
- Lean by design: the **core** needs only `@hotwired/stimulus` at runtime (kept
|
|
18
|
-
external in the build).
|
|
19
|
-
|
|
20
|
-
Peer dependencies note below
|
|
18
|
+
external in the build). Two opt-in subpaths each add one optional **peer
|
|
19
|
+
dependency**: `stimeo-ui/positioning` (`@floating-ui/dom`) and `stimeo-ui/cable`
|
|
20
|
+
(`@rails/actioncable`); see the Peer dependencies note below.
|
|
21
21
|
- Accessibility first: every controller follows the relevant WAI-ARIA APG pattern
|
|
22
22
|
and the related WCAG 2.2 AA criteria.
|
|
23
23
|
- Public controller identifiers use the `stimeo--` namespace (e.g.
|
|
@@ -36,8 +36,12 @@ bin/rails generate stimeo:install
|
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
The generator vendors the prebuilt JS into `vendor/javascript/stimeo/`, pins
|
|
39
|
-
`stimeo-ui` in `config/importmap.rb`, and registers
|
|
40
|
-
Stimulus application.
|
|
39
|
+
`stimeo-ui` in `config/importmap.rb`, and registers the core controllers with your
|
|
40
|
+
Stimulus application (`app/javascript/controllers/stimeo.js`). It writes the opt-in
|
|
41
|
+
`stimeo-ui/positioning` and `stimeo-ui/cable` entry points into those two files
|
|
42
|
+
commented out; to enable one, uncomment its lines. The cable lines include the pin
|
|
43
|
+
for its `@rails/actioncable` peer; positioning also needs a pin for
|
|
44
|
+
`@floating-ui/dom`. Then drive components from HTML alone:
|
|
41
45
|
|
|
42
46
|
```erb
|
|
43
47
|
<div data-controller="stimeo--dropdown">
|
|
@@ -58,15 +62,26 @@ import { Application } from "@hotwired/stimulus";
|
|
|
58
62
|
import { registerStimeo } from "stimeo-ui";
|
|
59
63
|
|
|
60
64
|
const application = Application.start();
|
|
61
|
-
registerStimeo(application); // registers every
|
|
65
|
+
registerStimeo(application); // registers every controller of the core entry point
|
|
62
66
|
```
|
|
63
67
|
|
|
68
|
+
The opt-in `stimeo-ui/positioning` and `stimeo-ui/cable` entry points register
|
|
69
|
+
theirs with `registerPositioning` / `registerCable`.
|
|
70
|
+
|
|
64
71
|
Need only a few controllers? Import them individually from
|
|
65
|
-
`stimeo-ui/controllers/*` and register them under your own identifiers.
|
|
72
|
+
`stimeo-ui/controllers/*` and register them under your own identifiers. Each
|
|
73
|
+
file loads on its own, yet the coordination between components — which layer
|
|
74
|
+
Escape closes, a focus trap's `Tab` and background, the value two components
|
|
75
|
+
lend the same attribute — is kept once per page, whichever files the
|
|
76
|
+
controllers came from, `stimeo-ui` itself included.
|
|
77
|
+
Copies of the same controller also share dirty-form confirmations, highlight
|
|
78
|
+
deadlines and portal origins. Opt-in Cable copies share the consumer, subscriptions
|
|
79
|
+
and peer departure decisions; generated ARIA ids stay distinct across copies too.
|
|
66
80
|
|
|
67
81
|
- **Peer dependencies:** `@hotwired/stimulus` (always), `@floating-ui/dom` (only
|
|
68
82
|
if you use the opt-in `stimeo-ui/positioning` module — tooltips, popovers, etc.
|
|
69
|
-
work without it via the default flow layout)
|
|
83
|
+
work without it via the default flow layout), and `@rails/actioncable` (only if
|
|
84
|
+
you use the opt-in `stimeo-ui/cable` module).
|
|
70
85
|
- **No CSS is shipped.** Style the components yourself; controllers only toggle
|
|
71
86
|
ARIA state and `data-*` hooks.
|
|
72
87
|
|
|
@@ -111,8 +126,9 @@ keep the rules on everywhere else. For Biome:
|
|
|
111
126
|
The `eslint-plugin-jsx-a11y` equivalents are
|
|
112
127
|
`no-noninteractive-element-to-interactive-role`, `no-redundant-roles`,
|
|
113
128
|
`prefer-tag-over-role`, `interactive-supports-focus`, and
|
|
114
|
-
`no-noninteractive-tabindex`.
|
|
115
|
-
with axe-core and
|
|
129
|
+
`no-noninteractive-tabindex`. This repository's tests check these components
|
|
130
|
+
with axe-core and with a virtual screen reader for speech order; neither stands
|
|
131
|
+
in for a real screen reader on your own pages.
|
|
116
132
|
|
|
117
133
|
## Composing components
|
|
118
134
|
|
|
@@ -272,7 +288,7 @@ or in `.mcp.json` (Claude Code) / `.cursor/mcp.json` (Cursor):
|
|
|
272
288
|
It exposes four read-only tools — `stimeo_check` (validate a source string),
|
|
273
289
|
`stimeo_catalog`, `stimeo_controller` (one controller's full contract,
|
|
274
290
|
accessibility requirements included), and `stimeo_example` (verified example
|
|
275
|
-
markup: the
|
|
291
|
+
markup: the controller's demo under [`examples/`](examples/), bundled at
|
|
276
292
|
build time and guaranteed to pass the checker) — plus MCP resources
|
|
277
293
|
(`stimeo://manifest`, `stimeo://examples/<id>`) for preloading context without
|
|
278
294
|
a tool round-trip. The server reads only its bundled manifest and example
|
package/dist/cable/index.d.ts
CHANGED
|
@@ -62,9 +62,10 @@ import { Controller, Application } from '@hotwired/stimulus';
|
|
|
62
62
|
* (local-only) counters never disable their triggers. `announceText` is opt-in
|
|
63
63
|
* and empty by default; when set, reconciled counts reach the page's shared
|
|
64
64
|
* announcer, debounced so a burst is one message. The subscription follows the
|
|
65
|
-
* declaration — a `channel` or `params` change moves it
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* declaration — a `channel` or `params` change moves it, once per batch of
|
|
66
|
+
* changes and only when the identifier they name differs from the one it was
|
|
67
|
+
* opened for — and is released on `disconnect()` (Turbo navigation included)
|
|
68
|
+
* along with any pending announcement.
|
|
68
69
|
*/
|
|
69
70
|
declare class LiveCounterController extends Controller<HTMLElement> {
|
|
70
71
|
#private;
|
|
@@ -96,13 +97,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
|
|
|
96
97
|
paramsValue: string;
|
|
97
98
|
idValue: string;
|
|
98
99
|
announceTextValue: string;
|
|
99
|
-
/**
|
|
100
|
-
* Re-parses the identifier parameters and moves the subscription to the
|
|
101
|
-
* identifier they now name.
|
|
102
|
-
*
|
|
103
|
-
* A malformed declaration falls back to no parameters, so the identifier keeps
|
|
104
|
-
* naming the channel instead of the subscription never being created at all.
|
|
105
|
-
*/
|
|
100
|
+
/** Moves the subscription to the identifier the parameters now name. */
|
|
106
101
|
paramsValueChanged(): void;
|
|
107
102
|
/** Moves the subscription when the declaration names a different channel. */
|
|
108
103
|
channelValueChanged(): void;
|
|
@@ -150,7 +145,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
|
|
|
150
145
|
* data-stimeo--presence-channel-value="PresenceChannel"
|
|
151
146
|
* data-stimeo--presence-params-value='{"room":"doc_7"}'
|
|
152
147
|
* data-stimeo--presence-id-value="17" data-stimeo--presence-name-value="Alice">
|
|
153
|
-
* <span data-stimeo--presence-target="count" data-other="
|
|
148
|
+
* <span data-stimeo--presence-target="count" data-other="{count} viewing"></span>
|
|
154
149
|
* <ul data-stimeo--presence-target="list"></ul>
|
|
155
150
|
* <template data-stimeo--presence-target="template">
|
|
156
151
|
* <li><span data-presence-name></span></li>
|
|
@@ -174,7 +169,7 @@ declare class LiveCounterController extends Controller<HTMLElement> {
|
|
|
174
169
|
* `template` pair, one clone per peer is appended (elements marked
|
|
175
170
|
* `data-presence-name` receive the name; the clone root is tagged
|
|
176
171
|
* `data-presence-id`), and the `count` target renders through localizable
|
|
177
|
-
* `data-zero` / `data-one` / `data-other` templates (
|
|
172
|
+
* `data-zero` / `data-one` / `data-other` templates (`{count}`). Richer
|
|
178
173
|
* per-user rendering (avatars, links) belongs to the consumer via the `join` /
|
|
179
174
|
* `leave` / `change` events or a server-rendered Turbo Stream. A `template` holds
|
|
180
175
|
* one root element: the clone appended for a peer, and the node removed when the
|
|
@@ -194,9 +189,26 @@ declare class LiveCounterController extends Controller<HTMLElement> {
|
|
|
194
189
|
* whatever a Turbo cache snapshot preserved (hooks + rendered clones), renders
|
|
195
190
|
* the known-empty count (the `data-present*` hooks stay absent until the first
|
|
196
191
|
* beacon), and the stream re-populates; a `count` or `list` target swapped in by a
|
|
197
|
-
* Stream or a morph arrives empty and is drawn from the roster as it connects;
|
|
198
|
-
* per-peer expiry timers, and the
|
|
199
|
-
* `disconnect()` (Turbo navigation
|
|
192
|
+
* Stream or a morph arrives empty and is drawn from the roster as it connects;
|
|
193
|
+
* the subscription, heartbeat interval, per-peer expiry timers, and the
|
|
194
|
+
* `pagehide` listener are all released on `disconnect()` (Turbo navigation
|
|
195
|
+
* included).
|
|
196
|
+
*
|
|
197
|
+
* The live resources follow the declaration; Values changed together move them
|
|
198
|
+
* once, after the batch, and nothing moves before `connect()` or after
|
|
199
|
+
* `disconnect()`. A `channel` or `params` change moves the subscription: the room
|
|
200
|
+
* being left gets the leaving notice under the same rules as `disconnect()`
|
|
201
|
+
* (confirmed, an own `id`, the last voice for it), and its roster, expiry timers,
|
|
202
|
+
* pending beacon and announcement, throttle window and rejected hook are dropped
|
|
203
|
+
* without an event, as a fresh connection would, since none of them is a fact of
|
|
204
|
+
* the new room. An `id` change keeps the subscription and its roster: the old id's
|
|
205
|
+
* voice is released once (the last voice leaves), the new id beacons at once —
|
|
206
|
+
* which also stands in for a convergence answer still queued — and a peer already
|
|
207
|
+
* listed under the new id is this client now, so it stops being counted without a
|
|
208
|
+
* `leave`: it went nowhere. A `heartbeat` change re-arms the running interval,
|
|
209
|
+
* counted from the change. `timeout` arms each peer's expiry when its beacon
|
|
210
|
+
* arrives, so a change applies from that peer's next beacon and never moves a
|
|
211
|
+
* deadline already set.
|
|
200
212
|
*/
|
|
201
213
|
declare class PresenceController extends Controller<HTMLElement> {
|
|
202
214
|
#private;
|
|
@@ -235,6 +247,18 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
235
247
|
default: string;
|
|
236
248
|
};
|
|
237
249
|
};
|
|
250
|
+
static valueConstraints: {
|
|
251
|
+
heartbeat: {
|
|
252
|
+
readonly finite: true;
|
|
253
|
+
readonly exclusiveMin: 0;
|
|
254
|
+
readonly max: 2147483647;
|
|
255
|
+
};
|
|
256
|
+
timeout: {
|
|
257
|
+
readonly finite: true;
|
|
258
|
+
readonly exclusiveMin: 0;
|
|
259
|
+
readonly max: 2147483647;
|
|
260
|
+
};
|
|
261
|
+
};
|
|
238
262
|
static events: readonly ["join", "leave", "change"];
|
|
239
263
|
readonly hasCountTarget: boolean;
|
|
240
264
|
readonly countTarget: HTMLElement;
|
|
@@ -250,13 +274,14 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
250
274
|
timeoutValue: number;
|
|
251
275
|
announceJoinTextValue: string;
|
|
252
276
|
announceLeaveTextValue: string;
|
|
253
|
-
/**
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
* A malformed declaration falls back to no parameters, so the identifier keeps
|
|
257
|
-
* naming the channel instead of the subscription never being created at all.
|
|
258
|
-
*/
|
|
277
|
+
/** Moves the subscription to the declared channel. */
|
|
278
|
+
channelValueChanged(): void;
|
|
279
|
+
/** Moves the subscription to the identifier the parameters name. */
|
|
259
280
|
paramsValueChanged(): void;
|
|
281
|
+
/** Moves this element's voice to the declared id. */
|
|
282
|
+
idValueChanged(): void;
|
|
283
|
+
/** Re-arms a running heartbeat on the declared period. */
|
|
284
|
+
heartbeatValueChanged(): void;
|
|
260
285
|
/**
|
|
261
286
|
* Draws the roster into a list target, which arrives empty from a Turbo Stream
|
|
262
287
|
* replacement or a morph. Stimulus runs this before `connect()` on the first mount
|
|
@@ -264,8 +289,12 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
264
289
|
* preserved is what `connect()` goes on to do anyway.
|
|
265
290
|
*/
|
|
266
291
|
listTargetConnected(): void;
|
|
292
|
+
/** Draws the roster into the list target that stays when an earlier one leaves. */
|
|
293
|
+
listTargetDisconnected(): void;
|
|
267
294
|
/** Paints the roster size into a count target that arrives blank, for the same reason. */
|
|
268
295
|
countTargetConnected(): void;
|
|
296
|
+
/** Paints the roster size into the count target that stays when an earlier one leaves. */
|
|
297
|
+
countTargetDisconnected(): void;
|
|
269
298
|
connect(): void;
|
|
270
299
|
disconnect(): void;
|
|
271
300
|
}
|
|
@@ -288,7 +317,7 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
288
317
|
* data-stimeo--typing-indicator-announce-one-text-value="{name} is typing">
|
|
289
318
|
* <textarea data-stimeo--typing-indicator-target="input"></textarea>
|
|
290
319
|
* <p data-stimeo--typing-indicator-target="status"
|
|
291
|
-
* data-one="
|
|
320
|
+
* data-one="{name} is typing…" data-many="{names} are typing…"></p>
|
|
292
321
|
* </div>
|
|
293
322
|
*
|
|
294
323
|
* Server contract (a trivial rebroadcast channel):
|
|
@@ -309,8 +338,8 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
309
338
|
* @remarks
|
|
310
339
|
* Behavior only — the indicator's look is the consumer's CSS, keyed off the
|
|
311
340
|
* `data-typing` hook; the copy is localizable through the `data-one` /
|
|
312
|
-
* `data-many` templates (
|
|
313
|
-
*
|
|
341
|
+
* `data-many` templates (`{name}` / `{names}` / `{count}`), with terse English
|
|
342
|
+
* as the fallback. The own echo is
|
|
314
343
|
* dropped by comparing the broadcast `name` against `name` (a same-name guard,
|
|
315
344
|
* not authentication — identity belongs to the server). Sending tracks the full
|
|
316
345
|
* subscription lifecycle (via the shared confirmation-aware subscription):
|
|
@@ -324,6 +353,22 @@ declare class PresenceController extends Controller<HTMLElement> {
|
|
|
324
353
|
* from the stream. The subscription, the per-typer timers, and the delegated
|
|
325
354
|
* `input` listener are all released on `disconnect()` (Turbo navigation
|
|
326
355
|
* included).
|
|
356
|
+
*
|
|
357
|
+
* The declared `channel` names the subscription: `params` *adds* identifier
|
|
358
|
+
* parameters except `channel`, which is ignored. Without a declared channel
|
|
359
|
+
* nothing is subscribed whatever `params` holds.
|
|
360
|
+
*
|
|
361
|
+
* The subscription follows the declaration: a `channel` or `params` change moves
|
|
362
|
+
* it — once, after the batch, however many of the two changed together, and never
|
|
363
|
+
* before `connect()` or after `disconnect()` — and drops the typers, their expiry
|
|
364
|
+
* timers, a pending announcement, the throttle window and the rejected hook
|
|
365
|
+
* without an event, as a fresh connection would, since none of them is a fact of
|
|
366
|
+
* the new room. A `name` change keeps the subscription and the typers, except one
|
|
367
|
+
* shown under the new name: that is this client now, so it is dropped with its
|
|
368
|
+
* expiry and the display redrawn, without a `change` — it did not stop typing.
|
|
369
|
+
* The own echo is still filtered by the current `name`. `timeout` arms each
|
|
370
|
+
* typer's expiry when its signal arrives, so a change applies from that typer's
|
|
371
|
+
* next signal and never moves a deadline already set.
|
|
327
372
|
*/
|
|
328
373
|
declare class TypingIndicatorController extends Controller<HTMLElement> {
|
|
329
374
|
#private;
|
|
@@ -358,6 +403,17 @@ declare class TypingIndicatorController extends Controller<HTMLElement> {
|
|
|
358
403
|
default: string;
|
|
359
404
|
};
|
|
360
405
|
};
|
|
406
|
+
static valueConstraints: {
|
|
407
|
+
timeout: {
|
|
408
|
+
readonly finite: true;
|
|
409
|
+
readonly min: 0;
|
|
410
|
+
readonly max: 2147483647;
|
|
411
|
+
};
|
|
412
|
+
throttle: {
|
|
413
|
+
readonly finite: true;
|
|
414
|
+
readonly min: 0;
|
|
415
|
+
};
|
|
416
|
+
};
|
|
361
417
|
static events: readonly ["change"];
|
|
362
418
|
readonly hasStatusTarget: boolean;
|
|
363
419
|
readonly statusTarget: HTMLElement;
|
|
@@ -368,22 +424,23 @@ declare class TypingIndicatorController extends Controller<HTMLElement> {
|
|
|
368
424
|
throttleValue: number;
|
|
369
425
|
announceOneTextValue: string;
|
|
370
426
|
announceManyTextValue: string;
|
|
371
|
-
/**
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
* A malformed declaration falls back to no parameters, so the identifier keeps
|
|
375
|
-
* naming the channel instead of the subscription never being created at all.
|
|
376
|
-
*/
|
|
427
|
+
/** Moves the subscription to the declared channel. */
|
|
428
|
+
channelValueChanged(): void;
|
|
429
|
+
/** Moves the subscription to the identifier the parameters name. */
|
|
377
430
|
paramsValueChanged(): void;
|
|
431
|
+
/** Stops showing a typer under the name this client now declares. */
|
|
432
|
+
nameValueChanged(): void;
|
|
378
433
|
/**
|
|
379
434
|
* Paints the current copy into a `status` target that arrived at runtime.
|
|
380
435
|
*
|
|
381
436
|
* No event: the set of typers did not change, only the element that displays it.
|
|
382
437
|
* Without this a region swapped in mid-conversation stays empty while `data-typing`
|
|
383
438
|
* still says someone is typing, leaving the state in the visual hook alone. An empty
|
|
384
|
-
* set
|
|
439
|
+
* set paints the empty copy, so a region that arrives with an old one is cleared.
|
|
385
440
|
*/
|
|
386
441
|
statusTargetConnected(): void;
|
|
442
|
+
/** Paints the current copy, empty when nobody types, into the `status` target that stays. */
|
|
443
|
+
statusTargetDisconnected(): void;
|
|
387
444
|
connect(): void;
|
|
388
445
|
disconnect(): void;
|
|
389
446
|
}
|