stimeo-ui 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +8 -1
- package/dist/cable/index.d.ts +79 -23
- package/dist/cable/index.js +363 -436
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +4 -2
- package/dist/controllers/accordion_controller.js +166 -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 +862 -221
- package/dist/controllers/alert_dialog_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.d.ts +35 -5
- package/dist/controllers/announcer_controller.js +135 -198
- 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 +271 -127
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/avatar_controller.js +171 -105
- 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 +18 -0
- package/dist/controllers/bulk_select_controller.js +262 -52
- package/dist/controllers/bulk_select_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +24 -5
- package/dist/controllers/calendar_controller.js +175 -209
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.d.ts +34 -7
- package/dist/controllers/carousel_controller.js +461 -399
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/character_counter_controller.d.ts +17 -1
- package/dist/controllers/character_counter_controller.js +246 -156
- 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 +32 -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 +168 -147
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +16 -4
- package/dist/controllers/collapsible_controller.js +301 -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 +149 -139
- package/dist/controllers/color_picker_controller.js.map +1 -1
- package/dist/controllers/combobox_controller.d.ts +23 -5
- package/dist/controllers/combobox_controller.js +360 -133
- package/dist/controllers/combobox_controller.js.map +1 -1
- package/dist/controllers/command_palette_controller.d.ts +45 -14
- package/dist/controllers/command_palette_controller.js +970 -358
- 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 +166 -124
- 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 +939 -248
- package/dist/controllers/confirm_controller.js.map +1 -1
- package/dist/controllers/context_menu_controller.d.ts +31 -4
- package/dist/controllers/context_menu_controller.js +256 -128
- 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 +45 -1
- package/dist/controllers/countdown_controller.js +183 -148
- package/dist/controllers/countdown_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +21 -2
- package/dist/controllers/currency_input_controller.js +134 -158
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/data_grid_controller.d.ts +15 -4
- package/dist/controllers/data_grid_controller.js +114 -186
- package/dist/controllers/data_grid_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +30 -5
- package/dist/controllers/date_range_picker_controller.js +288 -206
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +13 -1
- package/dist/controllers/dialog_controller.js +858 -223
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.d.ts +24 -7
- package/dist/controllers/direct_upload_controller.js +73 -153
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.js +14 -48
- 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 +175 -21
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/drawer_controller.d.ts +39 -11
- package/dist/controllers/drawer_controller.js +933 -341
- package/dist/controllers/drawer_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +31 -1
- package/dist/controllers/dropdown_controller.js +312 -82
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/editable_controller.d.ts +12 -1
- package/dist/controllers/editable_controller.js +158 -68
- package/dist/controllers/editable_controller.js.map +1 -1
- package/dist/controllers/empty_state_controller.js +67 -53
- package/dist/controllers/empty_state_controller.js.map +1 -1
- package/dist/controllers/file_dropzone_controller.d.ts +60 -18
- package/dist/controllers/file_dropzone_controller.js +311 -207
- package/dist/controllers/file_dropzone_controller.js.map +1 -1
- package/dist/controllers/filter_controller.js +67 -39
- package/dist/controllers/filter_controller.js.map +1 -1
- package/dist/controllers/flash_controller.d.ts +31 -8
- package/dist/controllers/flash_controller.js +172 -314
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/focus_controller.d.ts +12 -3
- package/dist/controllers/focus_controller.js +654 -240
- package/dist/controllers/focus_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +147 -132
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/form_validation_controller.js +13 -86
- package/dist/controllers/form_validation_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.d.ts +41 -9
- package/dist/controllers/frame_loading_controller.js +264 -213
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.d.ts +22 -2
- 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 +56 -3
- package/dist/controllers/hover_card_controller.js +309 -118
- package/dist/controllers/hover_card_controller.js.map +1 -1
- package/dist/controllers/idle_controller.d.ts +42 -1
- package/dist/controllers/idle_controller.js +267 -101
- package/dist/controllers/idle_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.js +71 -72
- 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 +147 -106
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.d.ts +16 -0
- package/dist/controllers/lazy_frame_controller.js +9 -65
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/listbox_controller.d.ts +34 -2
- package/dist/controllers/listbox_controller.js +306 -204
- package/dist/controllers/listbox_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +1 -1
- package/dist/controllers/local_time_controller.js +54 -64
- 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 +70 -93
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.d.ts +32 -7
- package/dist/controllers/menu_controller.js +214 -156
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.d.ts +4 -4
- package/dist/controllers/menubar_controller.js +170 -329
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/meter_controller.d.ts +20 -0
- package/dist/controllers/meter_controller.js +151 -67
- package/dist/controllers/meter_controller.js.map +1 -1
- package/dist/controllers/multi_select_controller.d.ts +32 -4
- package/dist/controllers/multi_select_controller.js +593 -358
- package/dist/controllers/multi_select_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.d.ts +8 -1
- package/dist/controllers/navigation_menu_controller.js +124 -232
- 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 +352 -182
- 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 +242 -54
- package/dist/controllers/network_status_controller.js.map +1 -1
- package/dist/controllers/number_input_controller.d.ts +26 -2
- package/dist/controllers/number_input_controller.js +320 -263
- package/dist/controllers/number_input_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +16 -76
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.d.ts +20 -4
- package/dist/controllers/otp_controller.js +198 -193
- 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 +116 -113
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.d.ts +48 -11
- package/dist/controllers/overflow_menu_controller.js +343 -283
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/pagination_controller.d.ts +35 -6
- package/dist/controllers/pagination_controller.js +295 -119
- package/dist/controllers/pagination_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +45 -8
- package/dist/controllers/password_reveal_controller.js +389 -121
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/password_strength_controller.d.ts +14 -5
- package/dist/controllers/password_strength_controller.js +99 -153
- 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 +237 -103
- package/dist/controllers/persist_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.d.ts +19 -7
- package/dist/controllers/pointer_drag_controller.js +185 -165
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/popover_controller.d.ts +38 -2
- package/dist/controllers/popover_controller.js +236 -97
- package/dist/controllers/popover_controller.js.map +1 -1
- package/dist/controllers/portal_controller.d.ts +44 -4
- package/dist/controllers/portal_controller.js +209 -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 +232 -116
- package/dist/controllers/preview_guard_controller.js.map +1 -1
- package/dist/controllers/progress_controller.d.ts +11 -0
- package/dist/controllers/progress_controller.js +125 -56
- package/dist/controllers/progress_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.d.ts +14 -5
- package/dist/controllers/radio_group_controller.js +117 -137
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/range_slider_controller.d.ts +43 -3
- package/dist/controllers/range_slider_controller.js +192 -105
- 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 +418 -207
- 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 +134 -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 +147 -135
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.d.ts +18 -4
- package/dist/controllers/relative_time_controller.js +145 -110
- 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} +97 -38
- package/dist/controllers/reset_on_restore_controller.js.map +1 -0
- package/dist/controllers/resizable_controller.d.ts +28 -2
- package/dist/controllers/resizable_controller.js +255 -139
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.js +39 -84
- 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 +428 -225
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.js +0 -53
- 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 +395 -145
- 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 +181 -242
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/separator_controller.d.ts +19 -4
- package/dist/controllers/separator_controller.js +267 -140
- package/dist/controllers/separator_controller.js.map +1 -1
- package/dist/controllers/sidebar_controller.d.ts +64 -7
- package/dist/controllers/sidebar_controller.js +1023 -386
- package/dist/controllers/sidebar_controller.js.map +1 -1
- package/dist/controllers/skeleton_controller.d.ts +23 -0
- package/dist/controllers/skeleton_controller.js +248 -97
- package/dist/controllers/skeleton_controller.js.map +1 -1
- package/dist/controllers/slider_controller.d.ts +27 -1
- package/dist/controllers/slider_controller.js +159 -79
- package/dist/controllers/slider_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.d.ts +21 -3
- package/dist/controllers/smart_sticky_header_controller.js +162 -63
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/sortable_controller.js +0 -112
- package/dist/controllers/sortable_controller.js.map +1 -1
- package/dist/controllers/spinner_controller.d.ts +39 -4
- package/dist/controllers/spinner_controller.js +277 -169
- package/dist/controllers/spinner_controller.js.map +1 -1
- package/dist/controllers/step_indicator_controller.d.ts +5 -0
- package/dist/controllers/step_indicator_controller.js +99 -46
- package/dist/controllers/step_indicator_controller.js.map +1 -1
- package/dist/controllers/stepper_controller.d.ts +12 -3
- package/dist/controllers/stepper_controller.js +114 -73
- package/dist/controllers/stepper_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.d.ts +6 -0
- package/dist/controllers/stick_to_bottom_controller.js +262 -138
- 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 +214 -49
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.d.ts +23 -8
- package/dist/controllers/submit_once_controller.js +294 -205
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +12 -1
- package/dist/controllers/switch_controller.js +33 -60
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +2 -2
- package/dist/controllers/tabs_controller.js +35 -29
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/tags_input_controller.d.ts +12 -0
- package/dist/controllers/tags_input_controller.js +136 -145
- package/dist/controllers/tags_input_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.d.ts +10 -0
- package/dist/controllers/textarea_autosize_controller.js +71 -58
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +21 -9
- package/dist/controllers/theme_controller.js +130 -112
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/time_picker_controller.d.ts +18 -1
- package/dist/controllers/time_picker_controller.js +146 -80
- package/dist/controllers/time_picker_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +36 -11
- package/dist/controllers/toast_controller.js +186 -297
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.d.ts +12 -3
- package/dist/controllers/toggle_group_controller.js +95 -136
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +68 -98
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/tooltip_controller.d.ts +45 -3
- 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 +21 -11
- package/dist/controllers/tree_view_controller.js +150 -345
- package/dist/controllers/tree_view_controller.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6370 -9346
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +23 -3
- package/dist/inspector/cli.js +92 -37
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +92 -56
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +8 -8
- package/dist/inspector/manifest.json +787 -100
- package/dist/positioning/index.d.ts +8 -0
- package/dist/positioning/index.js +148 -47
- package/dist/positioning/index.js.map +1 -1
- package/package.json +6 -6
- package/dist/controllers/reset_before_cache_controller.d.ts +0 -76
- package/dist/controllers/reset_before_cache_controller.js.map +0 -1
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { Controller } from '@hotwired/stimulus';
|
|
2
2
|
|
|
3
|
-
// src/controllers/currency_input_controller.ts
|
|
4
|
-
|
|
5
|
-
// src/utils/composition_tracker.ts
|
|
6
3
|
var COMPOSITION_INPUT_TYPES = /* @__PURE__ */ new Set([
|
|
7
4
|
"insertCompositionText",
|
|
8
5
|
"insertFromComposition",
|
|
@@ -14,13 +11,11 @@ var CompositionTracker = class {
|
|
|
14
11
|
#activeTargets = /* @__PURE__ */ new Set();
|
|
15
12
|
#onStart;
|
|
16
13
|
#onEnd;
|
|
17
|
-
/** The field whose confirming `input` is still owed, while the window is open. */
|
|
18
14
|
#confirmedTarget = null;
|
|
19
15
|
constructor(options = {}) {
|
|
20
16
|
this.#onStart = options.onStart;
|
|
21
17
|
this.#onEnd = options.onEnd;
|
|
22
18
|
}
|
|
23
|
-
/** Starts lifecycle tracking for `target`; repeated calls are idempotent. */
|
|
24
19
|
observe(target) {
|
|
25
20
|
if (this.#observedTargets.has(target)) return;
|
|
26
21
|
target.addEventListener("compositionstart", this.#handleStart);
|
|
@@ -28,7 +23,6 @@ var CompositionTracker = class {
|
|
|
28
23
|
target.addEventListener("keydown", this.#handleKeydown);
|
|
29
24
|
this.#observedTargets.add(target);
|
|
30
25
|
}
|
|
31
|
-
/** Stops tracking one target and clears any active composition it owned. */
|
|
32
26
|
unobserve(target) {
|
|
33
27
|
if (!this.#observedTargets.delete(target)) return;
|
|
34
28
|
target.removeEventListener("compositionstart", this.#handleStart);
|
|
@@ -37,7 +31,6 @@ var CompositionTracker = class {
|
|
|
37
31
|
this.#activeTargets.delete(target);
|
|
38
32
|
if (this.#confirmedTarget === target) this.#confirmedTarget = null;
|
|
39
33
|
}
|
|
40
|
-
/** Releases every listener and clears state so reconnect starts cleanly. */
|
|
41
34
|
disconnect() {
|
|
42
35
|
for (const target of this.#observedTargets) {
|
|
43
36
|
target.removeEventListener("compositionstart", this.#handleStart);
|
|
@@ -48,16 +41,9 @@ var CompositionTracker = class {
|
|
|
48
41
|
this.#activeTargets.clear();
|
|
49
42
|
this.#confirmedTarget = null;
|
|
50
43
|
}
|
|
51
|
-
/** True when lifecycle tracking or the current event reports composition. */
|
|
52
44
|
isComposing(event) {
|
|
53
45
|
return this.#activeTargets.size > 0 || event?.isComposing === true;
|
|
54
46
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Whether `event` is the `input` echoing the composition just confirmed.
|
|
57
|
-
*
|
|
58
|
-
* Asking closes the window either way, so one confirmation is folded at most
|
|
59
|
-
* once and a consumer asks once per `input`.
|
|
60
|
-
*/
|
|
61
47
|
consumesConfirmedInput(event) {
|
|
62
48
|
const confirmed = this.#confirmedTarget;
|
|
63
49
|
this.#confirmedTarget = null;
|
|
@@ -75,13 +61,11 @@ var CompositionTracker = class {
|
|
|
75
61
|
this.#confirmedTarget = event.target;
|
|
76
62
|
this.#onEnd?.(event);
|
|
77
63
|
};
|
|
78
|
-
/** A key on an observed field opens an edit of its own, so no echo is owed. */
|
|
79
64
|
#handleKeydown = () => {
|
|
80
65
|
this.#confirmedTarget = null;
|
|
81
66
|
};
|
|
82
67
|
};
|
|
83
68
|
|
|
84
|
-
// src/utils/half_width.ts
|
|
85
69
|
var FULL_WIDTH_SHIFT = 65248;
|
|
86
70
|
function halfWidthChar(char) {
|
|
87
71
|
if (char >= "\uFF01" && char <= "\uFF5E") {
|
|
@@ -90,7 +74,6 @@ function halfWidthChar(char) {
|
|
|
90
74
|
return char === "\u3000" ? " " : char;
|
|
91
75
|
}
|
|
92
76
|
|
|
93
|
-
// src/utils/intl_format.ts
|
|
94
77
|
var formatters = /* @__PURE__ */ new WeakMap();
|
|
95
78
|
function intlFormatter(factory, locale, options, fallbackLocale) {
|
|
96
79
|
const cache = cacheFor(factory);
|
|
@@ -120,51 +103,144 @@ function construct(factory, locale, options, fallbackLocale) {
|
|
|
120
103
|
}
|
|
121
104
|
}
|
|
122
105
|
|
|
123
|
-
// src/utils/locale.ts
|
|
124
106
|
function resolveLocale(element, declared = "") {
|
|
125
107
|
return declared || element.closest("[lang]")?.getAttribute("lang") || void 0;
|
|
126
108
|
}
|
|
127
109
|
|
|
128
|
-
|
|
110
|
+
var ListenerSet = class {
|
|
111
|
+
#abort = new AbortController();
|
|
112
|
+
add(target, type, handler, options) {
|
|
113
|
+
target.addEventListener(type, handler, { ...options, signal: this.#abort.signal });
|
|
114
|
+
}
|
|
115
|
+
dispose() {
|
|
116
|
+
this.#abort.abort();
|
|
117
|
+
this.#abort = new AbortController();
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
var MicrotaskCoalescer = class {
|
|
122
|
+
#run;
|
|
123
|
+
#queued = false;
|
|
124
|
+
#active = false;
|
|
125
|
+
#generation = 0;
|
|
126
|
+
constructor(run) {
|
|
127
|
+
this.#run = run;
|
|
128
|
+
}
|
|
129
|
+
activate() {
|
|
130
|
+
this.#active = true;
|
|
131
|
+
}
|
|
132
|
+
cancel() {
|
|
133
|
+
this.#active = false;
|
|
134
|
+
this.#queued = false;
|
|
135
|
+
this.#generation += 1;
|
|
136
|
+
}
|
|
137
|
+
schedule() {
|
|
138
|
+
if (!this.#active || this.#queued) return;
|
|
139
|
+
this.#queued = true;
|
|
140
|
+
const generation = this.#generation;
|
|
141
|
+
queueMicrotask(() => {
|
|
142
|
+
if (generation !== this.#generation || !this.#queued || !this.#active) return;
|
|
143
|
+
this.#queued = false;
|
|
144
|
+
this.#run();
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
var MorphRenderWatcher = class {
|
|
150
|
+
#listeners = new ListenerSet();
|
|
151
|
+
#pass;
|
|
152
|
+
#element = null;
|
|
153
|
+
#onMorph = () => this.#pass.schedule();
|
|
154
|
+
constructor(run) {
|
|
155
|
+
this.#pass = new MicrotaskCoalescer(run);
|
|
156
|
+
}
|
|
157
|
+
observe(element) {
|
|
158
|
+
if (this.#element === element) return;
|
|
159
|
+
this.disconnect();
|
|
160
|
+
this.#element = element;
|
|
161
|
+
this.#pass.activate();
|
|
162
|
+
this.#listeners.add(element, "turbo:morph-element", this.#onMorph);
|
|
163
|
+
}
|
|
164
|
+
schedule() {
|
|
165
|
+
this.#pass.schedule();
|
|
166
|
+
}
|
|
167
|
+
disconnect() {
|
|
168
|
+
this.#listeners.dispose();
|
|
169
|
+
this.#pass.cancel();
|
|
170
|
+
this.#element = null;
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
function matchesNumberBounds(value, bounds) {
|
|
175
|
+
if (!Number.isFinite(value)) {
|
|
176
|
+
const direction = value === Infinity ? "positive" : value === -Infinity ? "negative" : null;
|
|
177
|
+
if (direction === null) return false;
|
|
178
|
+
if (bounds.allowInfinity !== "both" && bounds.allowInfinity !== direction) return false;
|
|
179
|
+
}
|
|
180
|
+
if (bounds.min !== void 0 && value < bounds.min) return false;
|
|
181
|
+
if (bounds.max !== void 0 && value > bounds.max) return false;
|
|
182
|
+
if (bounds.exclusiveMin !== void 0 && value <= bounds.exclusiveMin) return false;
|
|
183
|
+
if (bounds.integer && !Number.isInteger(value)) return false;
|
|
184
|
+
if (bounds.allowedValues !== void 0 && !bounds.allowedValues.includes(value)) return false;
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function readNumber(raw, fallback, bounds) {
|
|
189
|
+
return matchesNumberBounds(raw, bounds) ? raw : fallback;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
var NumberValueReader = class {
|
|
193
|
+
#lastRejected = /* @__PURE__ */ new Map();
|
|
194
|
+
read(owner, name, raw, fallback, bounds) {
|
|
195
|
+
const resolved = readNumber(raw, fallback, bounds);
|
|
196
|
+
if (matchesNumberBounds(raw, bounds)) {
|
|
197
|
+
this.#lastRejected.delete(name);
|
|
198
|
+
return resolved;
|
|
199
|
+
}
|
|
200
|
+
const attribute = `data-${owner.identifier}-${name.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}-value`;
|
|
201
|
+
const literal = owner.element.getAttribute(attribute);
|
|
202
|
+
if (literal === null) {
|
|
203
|
+
this.#lastRejected.delete(name);
|
|
204
|
+
return resolved;
|
|
205
|
+
}
|
|
206
|
+
if (this.#lastRejected.get(name) !== literal) {
|
|
207
|
+
this.#lastRejected.set(name, literal);
|
|
208
|
+
console.warn(
|
|
209
|
+
`Stimeo UI: "${owner.identifier}" has an invalid number Value "${name}" declaration ${JSON.stringify(literal)}; using ${fallback}.`
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
return resolved;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
129
216
|
var FALLBACK_LOCALE = "en-US";
|
|
130
|
-
var CurrencyInputController = class extends Controller {
|
|
217
|
+
var CurrencyInputController = class _CurrencyInputController extends Controller {
|
|
218
|
+
#numbers = new NumberValueReader();
|
|
131
219
|
static targets = ["display", "field", "srValue"];
|
|
132
220
|
static values = {
|
|
133
221
|
locale: { type: String, default: "" },
|
|
134
222
|
currency: { type: String, default: "" },
|
|
135
223
|
precision: { type: Number, default: 2 }
|
|
136
224
|
};
|
|
225
|
+
static valueConstraints = {
|
|
226
|
+
precision: { finite: true, integer: true, min: 0, max: 100 }
|
|
227
|
+
};
|
|
137
228
|
static actions = ["format", "onInput"];
|
|
138
229
|
static events = ["change", "reconcile"];
|
|
139
|
-
/** The numeric value last committed; both events report only a move away from it. */
|
|
140
230
|
#lastValue = null;
|
|
141
231
|
#started = false;
|
|
142
|
-
/** A declaration change that arrived mid-composition, applied once nothing composes. */
|
|
143
232
|
#changeHeld = false;
|
|
144
|
-
/** The display a composition is running on, until that composition ends. */
|
|
145
233
|
#composing = null;
|
|
146
|
-
/**
|
|
147
|
-
* The display text this controller last rendered. It tells this controller's own
|
|
148
|
-
* text, written with the separators in force, from text the page wrote.
|
|
149
|
-
*/
|
|
150
234
|
#rendered = null;
|
|
151
|
-
/** Validated mirrors of the Values; the hot path never reads a raw Value. */
|
|
152
235
|
#locale;
|
|
153
236
|
#currency = "";
|
|
154
237
|
#precision = 2;
|
|
155
|
-
/** Formatters rebuilt when the declarations are taken in, never per keystroke. */
|
|
156
238
|
#grouping;
|
|
157
239
|
#fixed;
|
|
158
240
|
#accessible;
|
|
159
241
|
#group = ",";
|
|
160
242
|
#decimal = ".";
|
|
161
|
-
/** The locale's non-Latin digits mapped back to ASCII (empty for Latin locales). */
|
|
162
243
|
#digits = /* @__PURE__ */ new Map();
|
|
163
|
-
/**
|
|
164
|
-
* Holds mid-composition input so the IME's uncommitted text is never rewritten.
|
|
165
|
-
* The confirmed text is formatted once, and a declaration change the composition
|
|
166
|
-
* held back is applied after it.
|
|
167
|
-
*/
|
|
168
244
|
#composition = new CompositionTracker({
|
|
169
245
|
onStart: (event) => {
|
|
170
246
|
this.#composing = event.currentTarget;
|
|
@@ -175,10 +251,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
175
251
|
this.#applyHeldChange();
|
|
176
252
|
}
|
|
177
253
|
});
|
|
178
|
-
/**
|
|
179
|
-
* Re-validates on declaration changes and re-renders the committed display,
|
|
180
|
-
* reporting a value the re-render moved as `reconcile`.
|
|
181
|
-
*/
|
|
182
254
|
localeValueChanged() {
|
|
183
255
|
this.#applyValueChange();
|
|
184
256
|
}
|
|
@@ -188,18 +260,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
188
260
|
precisionValueChanged() {
|
|
189
261
|
this.#applyValueChange();
|
|
190
262
|
}
|
|
191
|
-
/**
|
|
192
|
-
* Reads the display with the declarations its text was written for, then
|
|
193
|
-
* re-renders it under the new ones — so a locale switch re-interprets the
|
|
194
|
-
* value, never the old text with new separators, and text the page wrote for
|
|
195
|
-
* the declarations it changes is never read with the old ones.
|
|
196
|
-
*
|
|
197
|
-
* While the display is composing, its text is the IME's: the change is held,
|
|
198
|
-
* configuration and all, until the composition ends, so the confirmed text is
|
|
199
|
-
* read with the separators it was typed against before the change applies.
|
|
200
|
-
*
|
|
201
|
-
* @stimeoRenderRoot
|
|
202
|
-
*/
|
|
203
263
|
#applyValueChange() {
|
|
204
264
|
if (this.#composition.isComposing()) {
|
|
205
265
|
this.#changeHeld = true;
|
|
@@ -215,42 +275,24 @@ var CurrencyInputController = class extends Controller {
|
|
|
215
275
|
this.#renderFixed(scan.value, "reconcile");
|
|
216
276
|
}
|
|
217
277
|
}
|
|
218
|
-
/** Applies a declaration change a composition held back. */
|
|
219
278
|
#applyHeldChange() {
|
|
220
279
|
if (!this.#changeHeld) return;
|
|
221
280
|
this.#changeHeld = false;
|
|
222
281
|
this.#applyValueChange();
|
|
223
282
|
}
|
|
224
|
-
/**
|
|
225
|
-
* Reads the display and takes in the declarations the page carries now. This
|
|
226
|
-
* controller's own rendering was written with the separators in force, so it
|
|
227
|
-
* is read before they change; any other text is the page's, written for the
|
|
228
|
-
* declarations it carries, so it is read after.
|
|
229
|
-
*/
|
|
230
283
|
#readDisplay() {
|
|
231
284
|
const text = this.displayTarget.value;
|
|
232
285
|
const own = text === this.#rendered ? this.#scan(text) : null;
|
|
233
286
|
this.#takeInDeclarations();
|
|
234
287
|
return own ?? this.#scan(text);
|
|
235
288
|
}
|
|
236
|
-
/** Takes in the declarations the page carries now, a change a composition held among them. */
|
|
237
289
|
#takeInDeclarations() {
|
|
238
290
|
this.#changeHeld = false;
|
|
239
291
|
this.#revalidate();
|
|
240
292
|
}
|
|
241
|
-
|
|
242
|
-
* Takes in the declarations the page carries now and normalizes the display
|
|
243
|
-
* to its fixed-precision form.
|
|
244
|
-
*
|
|
245
|
-
* A display still showing this controller's own last rendering is not read
|
|
246
|
-
* back: its separators may belong to declarations that changed while the
|
|
247
|
-
* controller was away, and the committed value is known anyway. That value is
|
|
248
|
-
* re-rendered at the current fixed precision, which rounds it whether
|
|
249
|
-
* `precision` changed meanwhile or the entry was left unrounded mid-typing, and
|
|
250
|
-
* a move the rounding causes is reported as `reconcile`. Any other text is the
|
|
251
|
-
* page's, written for the declarations it carries, so it is read with them.
|
|
252
|
-
*/
|
|
293
|
+
#morph = new MorphRenderWatcher(() => this.#applyValueChange());
|
|
253
294
|
connect() {
|
|
295
|
+
this.#morph.observe(this.element);
|
|
254
296
|
this.#started = true;
|
|
255
297
|
this.#takeInDeclarations();
|
|
256
298
|
if (!this.hasDisplayTarget) return;
|
|
@@ -262,44 +304,22 @@ var CurrencyInputController = class extends Controller {
|
|
|
262
304
|
this.#lastValue = value === null ? null : round(value, this.#precision);
|
|
263
305
|
this.#renderFixed(value, "reconcile");
|
|
264
306
|
}
|
|
265
|
-
/**
|
|
266
|
-
* Releases the composition listeners. A composition still running hears no
|
|
267
|
-
* `compositionend` once they are gone, so it ends here; a change it held is
|
|
268
|
-
* taken in on the next `connect()`.
|
|
269
|
-
*/
|
|
270
307
|
disconnect() {
|
|
308
|
+
this.#morph.disconnect();
|
|
271
309
|
this.#endUntrackedComposition();
|
|
272
310
|
this.#composition.disconnect();
|
|
273
311
|
this.#started = false;
|
|
274
312
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Tracks composition on an arriving (or swapped-in) display and normalizes it
|
|
277
|
-
* under the declarations the page carries now, reading this controller's own
|
|
278
|
-
* rendering with the separators it was written under; an amount that differs
|
|
279
|
-
* from the committed one is the page's, so it is reported as `reconcile`.
|
|
280
|
-
*/
|
|
281
313
|
displayTargetConnected(target) {
|
|
282
314
|
this.#composition.observe(target);
|
|
283
|
-
if (!this.#started) return;
|
|
315
|
+
if (!this.#started || !this.hasDisplayTarget || this.displayTarget !== target) return;
|
|
284
316
|
this.#renderFixed(this.#readDisplay().value, "reconcile");
|
|
285
317
|
}
|
|
286
|
-
/**
|
|
287
|
-
* Stops tracking a display that leaves. A composition running on it hears no
|
|
288
|
-
* `compositionend` any more, so it ends here; a change it held waits for the
|
|
289
|
-
* next display to be read.
|
|
290
|
-
*/
|
|
291
318
|
displayTargetDisconnected(target) {
|
|
292
319
|
this.#composition.unobserve(target);
|
|
293
|
-
this.#endUntrackedComposition();
|
|
320
|
+
if (target === this.#composing) this.#endUntrackedComposition();
|
|
321
|
+
this.#applyValueChange();
|
|
294
322
|
}
|
|
295
|
-
/**
|
|
296
|
-
* Ends a composition no `compositionend` will reach. A display still in place —
|
|
297
|
-
* one a move re-inserted, or the display of a controller that moves — holds the
|
|
298
|
-
* text the composition left, typed against the declarations in force, so it is
|
|
299
|
-
* read as `compositionend` would read it and becomes this controller's own
|
|
300
|
-
* rendering. The page's move ended the composition, so a value it moves is
|
|
301
|
-
* reported as `reconcile`. A display that left takes its composition along.
|
|
302
|
-
*/
|
|
303
323
|
#endUntrackedComposition() {
|
|
304
324
|
const display = this.#composing;
|
|
305
325
|
this.#composing = null;
|
|
@@ -307,28 +327,25 @@ var CurrencyInputController = class extends Controller {
|
|
|
307
327
|
this.#reformat(false, "reconcile");
|
|
308
328
|
}
|
|
309
329
|
}
|
|
310
|
-
/** Syncs a late-arriving hidden field without touching the display or events. */
|
|
311
330
|
fieldTargetConnected() {
|
|
312
331
|
if (this.#started) this.#resync();
|
|
313
332
|
}
|
|
314
|
-
|
|
333
|
+
fieldTargetDisconnected() {
|
|
334
|
+
if (this.#started) this.#resync();
|
|
335
|
+
}
|
|
315
336
|
srValueTargetConnected() {
|
|
316
337
|
if (this.#started) this.#resync();
|
|
317
338
|
}
|
|
318
|
-
|
|
339
|
+
srValueTargetDisconnected() {
|
|
340
|
+
if (this.#started) this.#resync();
|
|
341
|
+
}
|
|
319
342
|
onInput(event) {
|
|
320
343
|
if (this.#composition.isComposing(event)) return;
|
|
321
344
|
this.#reformat(false, "edit");
|
|
322
345
|
}
|
|
323
|
-
/** Applies the fixed-precision rounding on blur. */
|
|
324
346
|
format() {
|
|
325
347
|
this.#reformat(true, "edit");
|
|
326
348
|
}
|
|
327
|
-
/**
|
|
328
|
-
* Parses the display value, rewrites it grouped (optionally at fixed
|
|
329
|
-
* precision), keeps the caret stable by significant characters, and syncs the
|
|
330
|
-
* field, the screen-reader span, and the event `cause` selects.
|
|
331
|
-
*/
|
|
332
349
|
#reformat(fixedPrecision, cause) {
|
|
333
350
|
if (!this.hasDisplayTarget) return;
|
|
334
351
|
const raw = this.displayTarget.value;
|
|
@@ -347,10 +364,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
347
364
|
this.#rendered = formatted;
|
|
348
365
|
this.#reflect(value, formatted, cause);
|
|
349
366
|
}
|
|
350
|
-
/**
|
|
351
|
-
* Shows `value` at the fixed precision — an empty display for no value — and
|
|
352
|
-
* reports a move under the event `cause` selects.
|
|
353
|
-
*/
|
|
354
367
|
#renderFixed(value, cause) {
|
|
355
368
|
if (value === null) {
|
|
356
369
|
this.#show("");
|
|
@@ -362,20 +375,15 @@ var CurrencyInputController = class extends Controller {
|
|
|
362
375
|
this.#show(formatted);
|
|
363
376
|
this.#reflect(rounded, formatted, cause);
|
|
364
377
|
}
|
|
365
|
-
/** Writes `text` to the display as this controller's own rendering. */
|
|
366
378
|
#show(text) {
|
|
367
|
-
this.displayTarget.value = text;
|
|
379
|
+
if (this.displayTarget.value !== text) this.displayTarget.value = text;
|
|
368
380
|
this.#rendered = text;
|
|
369
381
|
}
|
|
370
|
-
/**
|
|
371
|
-
* The in-progress rendering: grouped integer, sign and fraction as typed.
|
|
372
|
-
*/
|
|
373
382
|
#render(parts) {
|
|
374
383
|
const int = parts.int === "" ? "" : this.#grouping.format(BigInt(parts.int));
|
|
375
384
|
const frac = parts.hasDot ? this.#decimal + parts.frac : "";
|
|
376
385
|
return parts.sign + int + frac;
|
|
377
386
|
}
|
|
378
|
-
/** Restores the caret to sit just after the n-th significant character. */
|
|
379
387
|
#restoreCaret(formatted, significantBefore) {
|
|
380
388
|
let seen = 0;
|
|
381
389
|
let position = formatted.length;
|
|
@@ -391,11 +399,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
391
399
|
} catch {
|
|
392
400
|
}
|
|
393
401
|
}
|
|
394
|
-
/**
|
|
395
|
-
* Counts the characters before `caret` that survive into the rendering,
|
|
396
|
-
* applying the same acceptance rules as {@link #scan} — a rejected keystroke
|
|
397
|
-
* (a mid-string sign, a second decimal mark) must not shift the anchor.
|
|
398
|
-
*/
|
|
399
402
|
#significantBefore(text, caret) {
|
|
400
403
|
let count = 0;
|
|
401
404
|
let sawSign = false;
|
|
@@ -415,13 +418,11 @@ var CurrencyInputController = class extends Controller {
|
|
|
415
418
|
}
|
|
416
419
|
return count;
|
|
417
420
|
}
|
|
418
|
-
/** Digits, signs, and the decimal mark anchor the caret; grouping does not. */
|
|
419
421
|
#isSignificant(ch) {
|
|
420
422
|
if (ch >= "0" && ch <= "9") return true;
|
|
421
423
|
if (ch === "-" || ch === "+") return true;
|
|
422
424
|
return ch === this.#decimal || ch === "." && this.#group !== ".";
|
|
423
425
|
}
|
|
424
|
-
/** Writes the normalized value to the field, the SR span, and the empty hook. */
|
|
425
426
|
#write(value) {
|
|
426
427
|
const isEmpty = value === null;
|
|
427
428
|
if (this.hasFieldTarget) this.fieldTarget.value = isEmpty ? "" : String(value);
|
|
@@ -430,13 +431,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
430
431
|
}
|
|
431
432
|
this.element.toggleAttribute(`data-${this.identifier}-empty`, isEmpty);
|
|
432
433
|
}
|
|
433
|
-
/**
|
|
434
|
-
* {@link #write}, then reports a moved value under the event `cause` selects:
|
|
435
|
-
* `change` for the user's edit, `reconcile` for a move the page caused. The
|
|
436
|
-
* display may hold an in-progress `-`, but a `null` value always rides with an
|
|
437
|
-
* empty `formatted`, whichever event reports it, so consumers can treat the
|
|
438
|
-
* pair as cleared.
|
|
439
|
-
*/
|
|
440
434
|
#reflect(value, formatted, cause) {
|
|
441
435
|
this.#write(value);
|
|
442
436
|
if (value === this.#lastValue) return;
|
|
@@ -445,13 +439,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
445
439
|
if (cause === "edit") this.dispatch("change", { detail });
|
|
446
440
|
else this.dispatch("reconcile", { detail });
|
|
447
441
|
}
|
|
448
|
-
/**
|
|
449
|
-
* Scans arbitrary input text into its number-shaped parts and value. Keeps
|
|
450
|
-
* digits, one leading sign, one decimal mark, and the fraction verbatim;
|
|
451
|
-
* everything else (grouping, symbols, words) is dropped. An ASCII "." is only
|
|
452
|
-
* a decimal mark where it is not the locale's grouping separator. Precision
|
|
453
|
-
* plays no part here — rounding belongs to the blur-time format.
|
|
454
|
-
*/
|
|
455
442
|
#scan(text) {
|
|
456
443
|
let sign = "";
|
|
457
444
|
let int = "";
|
|
@@ -471,32 +458,19 @@ var CurrencyInputController = class extends Controller {
|
|
|
471
458
|
const value = Number(`${sign}${int}.${frac}`);
|
|
472
459
|
return { parts, value: Number.isFinite(value) ? value : null };
|
|
473
460
|
}
|
|
474
|
-
/** Whether `ch` reads as this locale's decimal mark. */
|
|
475
461
|
#isDecimalMark(ch) {
|
|
476
462
|
return ch === this.#decimal || ch === "." && this.#group !== ".";
|
|
477
463
|
}
|
|
478
|
-
/**
|
|
479
|
-
* Re-syncs field / srValue / hook without dispatching: from the display, or —
|
|
480
|
-
* while it is composing, when its text is not committed yet — from the value
|
|
481
|
-
* last committed.
|
|
482
|
-
*/
|
|
483
464
|
#resync() {
|
|
484
465
|
if (!this.hasDisplayTarget) return;
|
|
485
466
|
const value = this.#composition.isComposing() ? this.#lastValue : this.#scan(this.displayTarget.value).value;
|
|
486
467
|
this.#write(value);
|
|
487
468
|
}
|
|
488
|
-
/**
|
|
489
|
-
* Validates the declared Values, falling back to each Value's default when a
|
|
490
|
-
* declaration cannot be interpreted (a malformed locale or currency tag, a
|
|
491
|
-
* precision outside `Intl`'s 0–100 integer range), and rebuilds the cached
|
|
492
|
-
* formatters from the validated set.
|
|
493
|
-
*/
|
|
494
469
|
#revalidate() {
|
|
495
470
|
const resolved = resolveLocale(this.element, this.localeValue);
|
|
496
471
|
const usable = intlFormatter(Intl.NumberFormat, resolved, {});
|
|
497
472
|
this.#locale = usable === null ? FALLBACK_LOCALE : resolved;
|
|
498
|
-
|
|
499
|
-
this.#precision = Number.isInteger(precision) && precision >= 0 && precision <= 100 ? precision : 2;
|
|
473
|
+
this.#precision = this.#safePrecision;
|
|
500
474
|
this.#currency = "";
|
|
501
475
|
if (this.currencyValue !== "") {
|
|
502
476
|
const declaredCurrency = intlFormatter(Intl.NumberFormat, this.#locale, {
|
|
@@ -544,12 +518,6 @@ var CurrencyInputController = class extends Controller {
|
|
|
544
518
|
if (digit !== String(i)) this.#digits.set(digit, String(i));
|
|
545
519
|
}
|
|
546
520
|
}
|
|
547
|
-
/**
|
|
548
|
-
* Maps the locale's own digits to ASCII, folds full-width forms (the digits,
|
|
549
|
-
* signs, and marks an IME confirms as 0-9+-.,) through the shared
|
|
550
|
-
* half-width mapping, and reads U+2212 MINUS SIGN as "-", which some locales'
|
|
551
|
-
* formatted output uses for negatives.
|
|
552
|
-
*/
|
|
553
521
|
#normalize(text) {
|
|
554
522
|
let out = "";
|
|
555
523
|
for (const ch of text) {
|
|
@@ -564,6 +532,15 @@ var CurrencyInputController = class extends Controller {
|
|
|
564
532
|
}
|
|
565
533
|
return out;
|
|
566
534
|
}
|
|
535
|
+
get #safePrecision() {
|
|
536
|
+
return this.#numbers.read(
|
|
537
|
+
this,
|
|
538
|
+
"precision",
|
|
539
|
+
this.precisionValue,
|
|
540
|
+
_CurrencyInputController.values.precision.default,
|
|
541
|
+
_CurrencyInputController.valueConstraints.precision
|
|
542
|
+
);
|
|
543
|
+
}
|
|
567
544
|
};
|
|
568
545
|
function round(value, precision) {
|
|
569
546
|
const factor = 10 ** Math.max(0, precision);
|
|
@@ -573,5 +550,4 @@ function round(value, precision) {
|
|
|
573
550
|
}
|
|
574
551
|
|
|
575
552
|
export { CurrencyInputController };
|
|
576
|
-
//# sourceMappingURL=currency_input_controller.js.map
|
|
577
553
|
//# sourceMappingURL=currency_input_controller.js.map
|