stimeo-ui 0.5.0 → 0.7.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 (230) hide show
  1. package/CHANGELOG.md +178 -0
  2. package/dist/controllers/alert_dialog_controller.d.ts +2 -0
  3. package/dist/controllers/alert_dialog_controller.js +75 -4
  4. package/dist/controllers/alert_dialog_controller.js.map +1 -1
  5. package/dist/controllers/aspect_ratio_controller.d.ts +1 -3
  6. package/dist/controllers/aspect_ratio_controller.js +19 -11
  7. package/dist/controllers/aspect_ratio_controller.js.map +1 -1
  8. package/dist/controllers/auto_submit_controller.d.ts +2 -0
  9. package/dist/controllers/auto_submit_controller.js.map +1 -1
  10. package/dist/controllers/avatar_controller.d.ts +36 -15
  11. package/dist/controllers/avatar_controller.js +237 -40
  12. package/dist/controllers/avatar_controller.js.map +1 -1
  13. package/dist/controllers/breadcrumb_controller.d.ts +2 -0
  14. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  15. package/dist/controllers/bulk_select_controller.d.ts +2 -0
  16. package/dist/controllers/bulk_select_controller.js.map +1 -1
  17. package/dist/controllers/calendar_controller.d.ts +2 -0
  18. package/dist/controllers/calendar_controller.js.map +1 -1
  19. package/dist/controllers/carousel_controller.d.ts +12 -3
  20. package/dist/controllers/carousel_controller.js +85 -9
  21. package/dist/controllers/carousel_controller.js.map +1 -1
  22. package/dist/controllers/character_counter_controller.d.ts +52 -20
  23. package/dist/controllers/character_counter_controller.js +338 -63
  24. package/dist/controllers/character_counter_controller.js.map +1 -1
  25. package/dist/controllers/checkbox_controller.d.ts +34 -5
  26. package/dist/controllers/checkbox_controller.js +136 -25
  27. package/dist/controllers/checkbox_controller.js.map +1 -1
  28. package/dist/controllers/color_picker_controller.d.ts +10 -1
  29. package/dist/controllers/color_picker_controller.js +35 -9
  30. package/dist/controllers/color_picker_controller.js.map +1 -1
  31. package/dist/controllers/combobox_controller.d.ts +2 -0
  32. package/dist/controllers/combobox_controller.js.map +1 -1
  33. package/dist/controllers/command_palette_controller.d.ts +2 -0
  34. package/dist/controllers/command_palette_controller.js +75 -4
  35. package/dist/controllers/command_palette_controller.js.map +1 -1
  36. package/dist/controllers/conditional_fields_controller.d.ts +42 -14
  37. package/dist/controllers/conditional_fields_controller.js +345 -51
  38. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  39. package/dist/controllers/confirm_controller.d.ts +2 -0
  40. package/dist/controllers/confirm_controller.js +75 -4
  41. package/dist/controllers/confirm_controller.js.map +1 -1
  42. package/dist/controllers/count_up_controller.d.ts +2 -0
  43. package/dist/controllers/count_up_controller.js.map +1 -1
  44. package/dist/controllers/countdown_controller.d.ts +4 -0
  45. package/dist/controllers/countdown_controller.js.map +1 -1
  46. package/dist/controllers/currency_input_controller.d.ts +2 -0
  47. package/dist/controllers/currency_input_controller.js.map +1 -1
  48. package/dist/controllers/data_grid_controller.d.ts +3 -0
  49. package/dist/controllers/data_grid_controller.js.map +1 -1
  50. package/dist/controllers/date_range_picker_controller.d.ts +23 -4
  51. package/dist/controllers/date_range_picker_controller.js +157 -30
  52. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  53. package/dist/controllers/dialog_controller.js +75 -4
  54. package/dist/controllers/dialog_controller.js.map +1 -1
  55. package/dist/controllers/direct_upload_controller.d.ts +56 -24
  56. package/dist/controllers/direct_upload_controller.js +201 -45
  57. package/dist/controllers/direct_upload_controller.js.map +1 -1
  58. package/dist/controllers/dirty_form_controller.d.ts +14 -6
  59. package/dist/controllers/dirty_form_controller.js +192 -29
  60. package/dist/controllers/dirty_form_controller.js.map +1 -1
  61. package/dist/controllers/dismissible_controller.d.ts +2 -0
  62. package/dist/controllers/dismissible_controller.js +83 -18
  63. package/dist/controllers/dismissible_controller.js.map +1 -1
  64. package/dist/controllers/drawer_controller.js +75 -4
  65. package/dist/controllers/drawer_controller.js.map +1 -1
  66. package/dist/controllers/empty_state_controller.d.ts +2 -0
  67. package/dist/controllers/empty_state_controller.js.map +1 -1
  68. package/dist/controllers/file_dropzone_controller.d.ts +9 -1
  69. package/dist/controllers/file_dropzone_controller.js +26 -3
  70. package/dist/controllers/file_dropzone_controller.js.map +1 -1
  71. package/dist/controllers/filter_controller.d.ts +2 -0
  72. package/dist/controllers/filter_controller.js.map +1 -1
  73. package/dist/controllers/flash_controller.d.ts +4 -0
  74. package/dist/controllers/flash_controller.js.map +1 -1
  75. package/dist/controllers/focus_controller.d.ts +4 -3
  76. package/dist/controllers/focus_controller.js +75 -4
  77. package/dist/controllers/focus_controller.js.map +1 -1
  78. package/dist/controllers/form_field_controller.d.ts +50 -10
  79. package/dist/controllers/form_field_controller.js +280 -62
  80. package/dist/controllers/form_field_controller.js.map +1 -1
  81. package/dist/controllers/form_validation_controller.d.ts +10 -8
  82. package/dist/controllers/form_validation_controller.js +208 -83
  83. package/dist/controllers/form_validation_controller.js.map +1 -1
  84. package/dist/controllers/frame_loading_controller.d.ts +2 -0
  85. package/dist/controllers/frame_loading_controller.js.map +1 -1
  86. package/dist/controllers/highlight_controller.d.ts +2 -0
  87. package/dist/controllers/highlight_controller.js.map +1 -1
  88. package/dist/controllers/hover_card_controller.d.ts +2 -2
  89. package/dist/controllers/hover_card_controller.js.map +1 -1
  90. package/dist/controllers/idle_controller.d.ts +5 -3
  91. package/dist/controllers/idle_controller.js +27 -5
  92. package/dist/controllers/idle_controller.js.map +1 -1
  93. package/dist/controllers/input_mask_controller.d.ts +2 -0
  94. package/dist/controllers/input_mask_controller.js.map +1 -1
  95. package/dist/controllers/lazy_frame_controller.d.ts +2 -0
  96. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  97. package/dist/controllers/listbox_controller.d.ts +2 -0
  98. package/dist/controllers/listbox_controller.js.map +1 -1
  99. package/dist/controllers/local_time_controller.d.ts +2 -0
  100. package/dist/controllers/local_time_controller.js.map +1 -1
  101. package/dist/controllers/masonry_controller.d.ts +2 -0
  102. package/dist/controllers/masonry_controller.js.map +1 -1
  103. package/dist/controllers/menubar_controller.js +5 -3
  104. package/dist/controllers/menubar_controller.js.map +1 -1
  105. package/dist/controllers/meter_controller.d.ts +2 -0
  106. package/dist/controllers/meter_controller.js.map +1 -1
  107. package/dist/controllers/multi_select_controller.d.ts +48 -12
  108. package/dist/controllers/multi_select_controller.js +460 -151
  109. package/dist/controllers/multi_select_controller.js.map +1 -1
  110. package/dist/controllers/nested_form_controller.d.ts +2 -0
  111. package/dist/controllers/nested_form_controller.js.map +1 -1
  112. package/dist/controllers/network_status_controller.d.ts +2 -0
  113. package/dist/controllers/network_status_controller.js.map +1 -1
  114. package/dist/controllers/number_input_controller.d.ts +26 -6
  115. package/dist/controllers/number_input_controller.js +317 -51
  116. package/dist/controllers/number_input_controller.js.map +1 -1
  117. package/dist/controllers/otp_controller.d.ts +3 -0
  118. package/dist/controllers/otp_controller.js.map +1 -1
  119. package/dist/controllers/overflow_indicator_controller.d.ts +2 -0
  120. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  121. package/dist/controllers/overflow_menu_controller.d.ts +2 -0
  122. package/dist/controllers/overflow_menu_controller.js +6 -1
  123. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  124. package/dist/controllers/pagination_controller.d.ts +2 -0
  125. package/dist/controllers/pagination_controller.js +35 -1
  126. package/dist/controllers/pagination_controller.js.map +1 -1
  127. package/dist/controllers/password_reveal_controller.d.ts +2 -0
  128. package/dist/controllers/password_reveal_controller.js.map +1 -1
  129. package/dist/controllers/password_strength_controller.d.ts +5 -3
  130. package/dist/controllers/password_strength_controller.js +20 -2
  131. package/dist/controllers/password_strength_controller.js.map +1 -1
  132. package/dist/controllers/persist_controller.d.ts +33 -19
  133. package/dist/controllers/persist_controller.js +449 -120
  134. package/dist/controllers/persist_controller.js.map +1 -1
  135. package/dist/controllers/pointer_drag_controller.d.ts +3 -0
  136. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  137. package/dist/controllers/popover_controller.d.ts +2 -2
  138. package/dist/controllers/popover_controller.js +77 -4
  139. package/dist/controllers/popover_controller.js.map +1 -1
  140. package/dist/controllers/portal_controller.d.ts +3 -2
  141. package/dist/controllers/portal_controller.js.map +1 -1
  142. package/dist/controllers/preview_guard_controller.d.ts +2 -0
  143. package/dist/controllers/preview_guard_controller.js.map +1 -1
  144. package/dist/controllers/progress_controller.d.ts +3 -0
  145. package/dist/controllers/progress_controller.js.map +1 -1
  146. package/dist/controllers/radio_group_controller.d.ts +44 -15
  147. package/dist/controllers/radio_group_controller.js +540 -56
  148. package/dist/controllers/radio_group_controller.js.map +1 -1
  149. package/dist/controllers/rating_controller.d.ts +38 -31
  150. package/dist/controllers/rating_controller.js +276 -89
  151. package/dist/controllers/rating_controller.js.map +1 -1
  152. package/dist/controllers/reading_progress_controller.d.ts +2 -0
  153. package/dist/controllers/reading_progress_controller.js.map +1 -1
  154. package/dist/controllers/resizable_controller.d.ts +2 -0
  155. package/dist/controllers/resizable_controller.js +33 -0
  156. package/dist/controllers/resizable_controller.js.map +1 -1
  157. package/dist/controllers/roving_controller.d.ts +6 -0
  158. package/dist/controllers/roving_controller.js +60 -5
  159. package/dist/controllers/roving_controller.js.map +1 -1
  160. package/dist/controllers/scroll_area_controller.d.ts +25 -11
  161. package/dist/controllers/scroll_area_controller.js +557 -125
  162. package/dist/controllers/scroll_area_controller.js.map +1 -1
  163. package/dist/controllers/scroll_visibility_controller.d.ts +2 -0
  164. package/dist/controllers/scroll_visibility_controller.js +33 -0
  165. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  166. package/dist/controllers/scrollspy_controller.d.ts +2 -0
  167. package/dist/controllers/scrollspy_controller.js.map +1 -1
  168. package/dist/controllers/separator_controller.d.ts +54 -11
  169. package/dist/controllers/separator_controller.js +354 -38
  170. package/dist/controllers/separator_controller.js.map +1 -1
  171. package/dist/controllers/sidebar_controller.js +83 -10
  172. package/dist/controllers/sidebar_controller.js.map +1 -1
  173. package/dist/controllers/skeleton_controller.d.ts +2 -0
  174. package/dist/controllers/skeleton_controller.js.map +1 -1
  175. package/dist/controllers/slider_controller.d.ts +2 -0
  176. package/dist/controllers/slider_controller.js.map +1 -1
  177. package/dist/controllers/smart_sticky_header_controller.d.ts +2 -0
  178. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  179. package/dist/controllers/spinner_controller.d.ts +2 -0
  180. package/dist/controllers/spinner_controller.js.map +1 -1
  181. package/dist/controllers/step_indicator_controller.d.ts +2 -0
  182. package/dist/controllers/step_indicator_controller.js.map +1 -1
  183. package/dist/controllers/stepper_controller.d.ts +2 -0
  184. package/dist/controllers/stepper_controller.js.map +1 -1
  185. package/dist/controllers/stick_to_bottom_controller.d.ts +2 -0
  186. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  187. package/dist/controllers/sticky_observer_controller.d.ts +2 -0
  188. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  189. package/dist/controllers/submit_once_controller.d.ts +94 -38
  190. package/dist/controllers/submit_once_controller.js +399 -121
  191. package/dist/controllers/submit_once_controller.js.map +1 -1
  192. package/dist/controllers/switch_controller.d.ts +2 -0
  193. package/dist/controllers/switch_controller.js.map +1 -1
  194. package/dist/controllers/tags_input_controller.d.ts +43 -11
  195. package/dist/controllers/tags_input_controller.js +356 -120
  196. package/dist/controllers/tags_input_controller.js.map +1 -1
  197. package/dist/controllers/textarea_autosize_controller.d.ts +2 -0
  198. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  199. package/dist/controllers/theme_controller.d.ts +2 -0
  200. package/dist/controllers/theme_controller.js +8 -6
  201. package/dist/controllers/theme_controller.js.map +1 -1
  202. package/dist/controllers/time_picker_controller.d.ts +44 -13
  203. package/dist/controllers/time_picker_controller.js +296 -107
  204. package/dist/controllers/time_picker_controller.js.map +1 -1
  205. package/dist/controllers/toast_controller.d.ts +4 -0
  206. package/dist/controllers/toast_controller.js.map +1 -1
  207. package/dist/controllers/toggle_group_controller.d.ts +41 -13
  208. package/dist/controllers/toggle_group_controller.js +378 -55
  209. package/dist/controllers/toggle_group_controller.js.map +1 -1
  210. package/dist/controllers/toolbar_controller.js +5 -3
  211. package/dist/controllers/toolbar_controller.js.map +1 -1
  212. package/dist/controllers/tooltip_controller.d.ts +2 -2
  213. package/dist/controllers/tooltip_controller.js.map +1 -1
  214. package/dist/controllers/transition_controller.d.ts +4 -3
  215. package/dist/controllers/transition_controller.js.map +1 -1
  216. package/dist/controllers/tree_view_controller.d.ts +2 -0
  217. package/dist/controllers/tree_view_controller.js +7 -4
  218. package/dist/controllers/tree_view_controller.js.map +1 -1
  219. package/dist/index.js +4963 -1581
  220. package/dist/index.js.map +1 -1
  221. package/dist/inspector/cli.d.ts +123 -6
  222. package/dist/inspector/cli.js +212 -18
  223. package/dist/inspector/cli.js.map +1 -1
  224. package/dist/inspector/cli_bin.js +274 -50
  225. package/dist/inspector/cli_bin.js.map +1 -1
  226. package/dist/inspector/examples.json +15 -15
  227. package/dist/inspector/manifest.json +602 -80
  228. package/dist/positioning/index.d.ts +4 -2
  229. package/dist/positioning/index.js.map +1 -1
  230. package/package.json +1 -1
@@ -1,48 +1,79 @@
1
1
  import { Controller } from '@hotwired/stimulus';
2
2
 
3
- /** Submit-capable controls this controller can disable. */
4
- type SubmitButton = HTMLButtonElement | HTMLInputElement;
3
+ /** Native controls that can submit a form. */
4
+ type SubmitControl = HTMLButtonElement | HTMLInputElement;
5
5
  /**
6
- * Headless "submit once" behavior: disables the form's submit button(s) on submit
7
- * to prevent a double submission, optionally swaps in a busy label, and restores
8
- * on completion. The Headless superset of Rails' `disable_with` (no dedicated APG
9
- * pattern; follows the WCAG "status messages" practice via `aria-busy`).
6
+ * Headless form-scoped double-submit guard (identifier:
7
+ * `stimeo--submit-once`). It disables every native submit control associated
8
+ * with the submitting form, publishes busy state, and restores only the state
9
+ * it still owns when the operation finishes.
10
10
  *
11
- * Markup contract (identifier: `stimeo--submit-once`):
12
- * <form data-controller="stimeo--submit-once"
13
- * data-stimeo--submit-once-busy-label-value="Submitting…">
14
- * <button type="submit" data-stimeo--submit-once-target="submit">Send</button>
15
- * </form>
11
+ * Turbo forms need no `data-action`: the controller observes
12
+ * `turbo:submit-start` and `turbo:submit-end` itself.
16
13
  *
17
- * Zero wiring for Turbo forms: `connect()` subscribes to `turbo:submit-start`
18
- * itself (symmetric with the `turbo:submit-end` it already listens for), so no
19
- * `data-action` is required. The public {@link start} action stays available for
20
- * **non-Turbo** forms, where you bind it to the native event yourself:
21
- * `data-action="submit->stimeo--submit-once#start"`. Re-entrancy is guarded — once
22
- * busy, a second `start` (auto + manual, or a duplicate event) no-ops.
14
+ * A non-Turbo async form owns its own lifecycle and declares each transition:
15
+ * `submit->stimeo--submit-once#start` applies the busy state synchronously,
16
+ * before the request is issued, and `#finish` / `#cancel` end it. Cancelling the
17
+ * event's default is how such a form suppresses the native navigation, so it
18
+ * never means the submission died — only `#cancel` does. A submit already
19
+ * cancelled by an earlier listener never starts a session at all.
23
20
  *
24
- * On submit it disables every `submit` target (or, with none, the form's native
25
- * `button[type=submit]` / `input[type=submit]`), sets `aria-busy` on them and
26
- * `data-submitting` on the form, and swaps the **triggering** button's visible
27
- * label for the busy label (per-button `data-submit-once-busy-label` overrides the
28
- * form's `busyLabel` Value). It restores on Turbo's `turbo:submit-end`, or after
29
- * `timeout` ms, re-enabling the buttons and putting the labels back.
21
+ * ```html
22
+ * <form data-controller="stimeo--submit-once"
23
+ * data-action="submit->stimeo--submit-once#start
24
+ * save:complete->stimeo--submit-once#finish
25
+ * save:error->stimeo--submit-once#cancel">
26
+ * <button type="submit">Save</button>
27
+ * </form>
28
+ * ```
29
+ *
30
+ * A form whose submit a later listener vetoes needs `#cancel` wired to that
31
+ * veto, or a non-zero `timeout`, to leave the busy state.
32
+ *
33
+ * Plain text buttons can use `busyLabel` (overridden by
34
+ * `data-submit-once-busy-label`). A button with authored structure instead uses
35
+ * an `idle` / `busy` target pair inside that button, so icons and descendants
36
+ * are never replaced with `textContent`:
37
+ *
38
+ * ```html
39
+ * <form data-controller="stimeo--submit-once"
40
+ * data-stimeo--submit-once-announce-text-value="Saving…"
41
+ * data-stimeo--submit-once-announce-ready-text-value="Saved.">
42
+ * <button type="submit" data-stimeo--submit-once-target="submit">
43
+ * <span data-stimeo--submit-once-target="idle">Save</span>
44
+ * <span data-stimeo--submit-once-target="busy" hidden>Saving…</span>
45
+ * </button>
46
+ * </form>
47
+ * ```
48
+ *
49
+ * Events:
50
+ * - `stimeo--submit-once:start` — `{ form, submitter }`.
51
+ * - `stimeo--submit-once:end` — `{ form, submitter, reason, success? }`, where
52
+ * `reason` is `"turbo"`, `"timeout"`, `"manual"`, or `"canceled"`. Only
53
+ * `"canceled"` skips the completion announcement, because no operation ran.
30
54
  *
31
55
  * @remarks
32
- * Behavior only — no spinner is drawn (pair with {@link "spinner"}). The submit-end
33
- * listener and the timeout are torn down on `disconnect()` (Turbo navigation
34
- * included), and `connect()` clears any stale busy state parked in a restored cache
35
- * snapshot so a button is never left disabled. Non-Turbo caveat: the buttons are
36
- * disabled synchronously inside the `submit` handler, and a plain HTML submission
37
- * builds its entry list *after* that event — so a disabled submitter's `name`/`value`
38
- * is excluded from the payload. Turbo is unaffected (it appends the submitter's
39
- * name/value from attributes when building `FormData`); mirror the value into a
40
- * hidden field when a non-Turbo form depends on it.
56
+ * Behavior only: the consumer owns every visual, label, and announcement
57
+ * string. `announceText` / `announceReadyText` are empty by default and speak
58
+ * through the page's shared `stimeo--announcer` only on real state transitions.
59
+ * Attribute writes use {@link AttributeLease}, so a consumer mutation made
60
+ * while busy wins over restoration. {@link DetachGate} preserves an in-flight
61
+ * session across an in-page move, while {@link BeforeCacheReset} rewinds the
62
+ * snapshot before Turbo caches it. Cache/detach rewinds are silent and never
63
+ * move focus.
41
64
  */
42
65
  declare class SubmitOnceController extends Controller<HTMLElement> {
43
66
  #private;
44
67
  static targets: string[];
45
68
  static values: {
69
+ announceText: {
70
+ type: StringConstructor;
71
+ default: string;
72
+ };
73
+ announceReadyText: {
74
+ type: StringConstructor;
75
+ default: string;
76
+ };
46
77
  busyLabel: {
47
78
  type: StringConstructor;
48
79
  default: string;
@@ -56,21 +87,46 @@ declare class SubmitOnceController extends Controller<HTMLElement> {
56
87
  default: boolean;
57
88
  };
58
89
  };
59
- static actions: readonly ["start"];
90
+ static actions: readonly ["cancel", "finish", "start"];
60
91
  static events: readonly ["start", "end"];
61
- readonly submitTargets: SubmitButton[];
62
- readonly hasSubmitTarget: boolean;
92
+ readonly submitTargets: SubmitControl[];
93
+ readonly idleTargets: HTMLElement[];
94
+ readonly busyTargets: HTMLElement[];
95
+ announceTextValue: string;
96
+ announceReadyTextValue: string;
63
97
  busyLabelValue: string;
64
98
  timeoutValue: number;
65
99
  restoreFocusValue: boolean;
66
100
  connect(): void;
67
101
  disconnect(): void;
68
102
  /**
69
- * Enters the busy state for the submission started by `event`. Accepts both a
70
- * native `SubmitEvent` (manual `submit->#start` on non-Turbo forms) and Turbo's
71
- * `turbo:submit-start` CustomEvent (auto-subscribed in `connect`).
103
+ * Begins the submission represented by `event`.
104
+ *
105
+ * Native `submit` events are intended for non-Turbo async forms. Turbo calls
106
+ * this path through its auto-subscribed `turbo:submit-start` event. An event
107
+ * whose default an earlier listener already cancelled carries no submission,
108
+ * so it starts nothing.
72
109
  */
73
110
  start(event: Event): void;
111
+ /**
112
+ * Completes a non-Turbo async submission for the form associated with
113
+ * `event`. When called directly with no event, it completes the controller's
114
+ * sole active form (or the controller element itself when it is a form).
115
+ */
116
+ finish(event?: Event): void;
117
+ /**
118
+ * Abandons the submission for the form associated with `event` because it
119
+ * never reached the network — a veto from validation, or a request the
120
+ * consumer gave up before sending. With no event it targets the controller's
121
+ * sole active form, exactly like {@link finish}.
122
+ *
123
+ * The distinction from `finish` is observable: a request that ran and failed
124
+ * is `finish` with `success: false` and still announces completion, while a
125
+ * submission that never happened announces nothing.
126
+ */
127
+ cancel(event?: Event): void;
128
+ /** Disables a newly connected explicit submit target during its form's session. */
129
+ submitTargetConnected(target: SubmitControl): void;
74
130
  }
75
131
 
76
132
  export { SubmitOnceController };