stimulus-library 0.7.5 → 0.8.0-beta
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/dist/controllers/ajax/async_block_controller.js +30 -0
- package/dist/controllers/ajax/{index.d.ts → index.js} +0 -1
- package/dist/controllers/ajax/lazy_block_controller.js +37 -0
- package/dist/controllers/ajax/load_block_controller.js +63 -0
- package/dist/controllers/ajax/poll_block_controller.js +35 -0
- package/dist/controllers/anchor_spy_controller.js +47 -0
- package/dist/controllers/back_link_controller.js +25 -0
- package/dist/controllers/clipboard_controller.js +35 -0
- package/dist/controllers/confirm_controller.js +33 -0
- package/dist/controllers/confirm_navigation_controller.js +29 -0
- package/dist/controllers/debug_controller.js +7 -0
- package/dist/controllers/disable_with_controller.js +66 -0
- package/dist/controllers/dismissable_controller.js +8 -0
- package/dist/controllers/element_save_controller.js +80 -0
- package/dist/controllers/empty_dom_controller.js +42 -0
- package/dist/controllers/equalize_controller.js +39 -0
- package/dist/controllers/forms/auto_submit_form_controller.js +62 -0
- package/dist/controllers/forms/autosize_controller.js +32 -0
- package/dist/controllers/forms/char_count_controller.js +37 -0
- package/dist/controllers/forms/checkbox_disable_inputs_controller.js +32 -0
- package/dist/controllers/forms/checkbox_enable_inputs_controller.js +32 -0
- package/dist/controllers/forms/checkbox_select_all_controller.js +35 -0
- package/dist/controllers/forms/checkbox_xor_controller.js +24 -0
- package/dist/controllers/forms/detect_dirty_controller.js +98 -0
- package/dist/controllers/forms/detect_dirty_form_controller.js +107 -0
- package/dist/controllers/forms/enable_inputs_controller.js +21 -0
- package/dist/controllers/forms/focus_steal_controller.js +28 -0
- package/dist/controllers/forms/form_rc_controller.js +47 -0
- package/dist/controllers/forms/form_save_controller.js +109 -0
- package/dist/controllers/forms/{index.d.ts → index.js} +0 -1
- package/dist/controllers/forms/limited_selection_checkboxes_controller.js +28 -0
- package/dist/controllers/forms/navigate_form_errors_controller.js +154 -0
- package/dist/controllers/forms/nested_form_controller.js +49 -0
- package/dist/controllers/forms/password_confirm_controller.js +26 -0
- package/dist/controllers/forms/password_peek_controller.js +21 -0
- package/dist/controllers/forms/remote_form_controller.js +26 -0
- package/dist/controllers/forms/sync_inputs_controller.js +67 -0
- package/dist/controllers/forms/value_warn_controller.js +45 -0
- package/dist/controllers/forms/word_count_controller.js +37 -0
- package/dist/controllers/{index.d.ts → index.js} +2 -1
- package/dist/controllers/media/fallback_image_controller.js +44 -0
- package/dist/controllers/media/{index.d.ts → index.js} +0 -1
- package/dist/controllers/media/lightbox_image_controller.js +71 -0
- package/dist/controllers/media/media_player_controller.js +31 -0
- package/dist/controllers/prefetch_controller.js +74 -0
- package/dist/controllers/print_button_controller.js +18 -0
- package/dist/controllers/responsive_iframe_controller.js +35 -0
- package/dist/controllers/scroll/{index.d.ts → index.js} +0 -1
- package/dist/controllers/scroll/scroll_container_controller.js +81 -0
- package/dist/controllers/scroll/scroll_into_focus_controller.js +20 -0
- package/dist/controllers/scroll/scroll_to_bottom_controller.js +37 -0
- package/dist/controllers/scroll/scroll_to_controller.js +22 -0
- package/dist/controllers/scroll/scroll_to_top_controller.js +37 -0
- package/dist/controllers/self_destruct_controller.js +11 -0
- package/dist/controllers/signal/events.js +12 -0
- package/dist/controllers/signal/expressions.js +54 -0
- package/dist/controllers/signal/{index.d.ts → index.js} +0 -1
- package/dist/controllers/signal/signal_action_controller.js +31 -0
- package/dist/controllers/signal/signal_dom_children_controller.js +40 -0
- package/dist/controllers/signal/signal_input_controller.js +36 -0
- package/dist/controllers/signal/signal_visibility_controller.js +44 -0
- package/dist/controllers/sticky_controller.js +44 -0
- package/dist/controllers/tables/{index.d.ts → index.js} +0 -1
- package/dist/controllers/tables/table_sort_controller.js +97 -0
- package/dist/controllers/tables/table_truncate_controller.js +81 -0
- package/dist/controllers/teleport_controller.js +48 -0
- package/dist/controllers/temporary_state_controller.js +65 -0
- package/dist/controllers/toggle_class_controller.js +115 -0
- package/dist/controllers/trix_modifier_controller.js +121 -0
- package/dist/controllers/turbo_frame_rc_controller.js +65 -0
- package/dist/controllers/turbo_frame_refresh_controller.js +32 -0
- package/dist/controllers/utility/alert_controller.js +7 -0
- package/dist/controllers/utility/fullscreen_controller.js +10 -0
- package/dist/controllers/utility/{index.d.ts → index.js} +0 -1
- package/dist/controllers/utility/intersection_controller.js +25 -0
- package/dist/controllers/utility/interval_controller.js +16 -0
- package/dist/controllers/utility/presence_controller.js +19 -0
- package/dist/controllers/utility/print_controller.js +7 -0
- package/dist/controllers/utility/timeout_controller.js +13 -0
- package/dist/controllers/utility/user_focus_controller.js +23 -0
- package/dist/controllers/visual/clock_controller.js +51 -0
- package/dist/controllers/visual/countdown_controller.js +116 -0
- package/dist/controllers/visual/duration_controller.js +79 -0
- package/dist/controllers/visual/{index.d.ts → index.js} +0 -1
- package/dist/controllers/visual/tabs_controller.js +79 -0
- package/dist/controllers/visual/time_distance_controller.js +50 -0
- package/dist/controllers/visual/tree_view_controller.js +92 -0
- package/dist/{index.d.ts → index.js} +3 -1
- package/dist/mixins/create_mixin.js +11 -0
- package/dist/mixins/{index.d.ts → index.js} +0 -1
- package/dist/mixins/install_class_methods.js +28 -0
- package/dist/mixins/use_click_outside.js +17 -0
- package/dist/mixins/use_event_bus.js +19 -0
- package/dist/mixins/use_event_listener.js +34 -0
- package/dist/mixins/use_fullscreen.js +42 -0
- package/dist/mixins/use_geolocation.js +62 -0
- package/dist/mixins/use_hover.js +29 -0
- package/dist/mixins/use_injected_html.js +37 -0
- package/dist/mixins/use_intersection.js +45 -0
- package/dist/mixins/use_interval.js +13 -0
- package/dist/mixins/use_localstorage.js +122 -0
- package/dist/mixins/use_mutation_observer.js +9 -0
- package/dist/mixins/use_temporary_content.js +38 -0
- package/dist/mixins/use_timeout.js +20 -0
- package/dist/mixins/use_trix_modifiers.js +71 -0
- package/dist/polyfills/string.replaceAll.js +13 -0
- package/dist/utilities/arrays.js +3 -0
- package/dist/utilities/base_controller.js +56 -0
- package/dist/utilities/elements.js +102 -0
- package/dist/utilities/ephemeral_controller.js +42 -0
- package/dist/utilities/event_bus.js +2 -0
- package/dist/utilities/events.js +10 -0
- package/dist/utilities/fetchRetry.js +22 -0
- package/dist/utilities/{index.d.ts → index.js} +0 -1
- package/dist/utilities/logging.js +82 -0
- package/dist/utilities/reactive.js +23 -0
- package/dist/utilities/request_submit.js +20 -0
- package/dist/utilities/scroll.js +89 -0
- package/dist/utilities/stimulus.js +13 -0
- package/dist/utilities/strings.js +5 -0
- package/dist/utilities/turbo.js +3 -0
- package/package.json +13 -20
- package/CHANGELOG.md +0 -513
- package/dist/controllers/ajax/async_block_controller.d.ts +0 -18
- package/dist/controllers/ajax/async_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/index.d.ts.map +0 -1
- package/dist/controllers/ajax/lazy_block_controller.d.ts +0 -10
- package/dist/controllers/ajax/lazy_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/load_block_controller.d.ts +0 -24
- package/dist/controllers/ajax/load_block_controller.d.ts.map +0 -1
- package/dist/controllers/ajax/poll_block_controller.d.ts +0 -16
- package/dist/controllers/ajax/poll_block_controller.d.ts.map +0 -1
- package/dist/controllers/anchor_spy_controller.d.ts +0 -21
- package/dist/controllers/anchor_spy_controller.d.ts.map +0 -1
- package/dist/controllers/back_link_controller.d.ts +0 -17
- package/dist/controllers/back_link_controller.d.ts.map +0 -1
- package/dist/controllers/clipboard_controller.d.ts +0 -19
- package/dist/controllers/clipboard_controller.d.ts.map +0 -1
- package/dist/controllers/confirm_controller.d.ts +0 -13
- package/dist/controllers/confirm_controller.d.ts.map +0 -1
- package/dist/controllers/confirm_navigation_controller.d.ts +0 -15
- package/dist/controllers/confirm_navigation_controller.d.ts.map +0 -1
- package/dist/controllers/debug_controller.d.ts +0 -7
- package/dist/controllers/debug_controller.d.ts.map +0 -1
- package/dist/controllers/disable_with_controller.d.ts +0 -20
- package/dist/controllers/disable_with_controller.d.ts.map +0 -1
- package/dist/controllers/dismissable_controller.d.ts +0 -7
- package/dist/controllers/dismissable_controller.d.ts.map +0 -1
- package/dist/controllers/element_save_controller.d.ts +0 -31
- package/dist/controllers/element_save_controller.d.ts.map +0 -1
- package/dist/controllers/empty_dom_controller.d.ts +0 -22
- package/dist/controllers/empty_dom_controller.d.ts.map +0 -1
- package/dist/controllers/equalize_controller.d.ts +0 -16
- package/dist/controllers/equalize_controller.d.ts.map +0 -1
- package/dist/controllers/forms/auto_submit_form_controller.d.ts +0 -23
- package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/autosize_controller.d.ts +0 -9
- package/dist/controllers/forms/autosize_controller.d.ts.map +0 -1
- package/dist/controllers/forms/char_count_controller.d.ts +0 -21
- package/dist/controllers/forms/char_count_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts +0 -17
- package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts +0 -17
- package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts +0 -14
- package/dist/controllers/forms/checkbox_select_all_controller.d.ts.map +0 -1
- package/dist/controllers/forms/checkbox_xor_controller.d.ts +0 -9
- package/dist/controllers/forms/checkbox_xor_controller.d.ts.map +0 -1
- package/dist/controllers/forms/detect_dirty_controller.d.ts +0 -15
- package/dist/controllers/forms/detect_dirty_controller.d.ts.map +0 -1
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts +0 -18
- package/dist/controllers/forms/detect_dirty_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/enable_inputs_controller.d.ts +0 -14
- package/dist/controllers/forms/enable_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/focus_steal_controller.d.ts +0 -12
- package/dist/controllers/forms/focus_steal_controller.d.ts.map +0 -1
- package/dist/controllers/forms/form_rc_controller.d.ts +0 -18
- package/dist/controllers/forms/form_rc_controller.d.ts.map +0 -1
- package/dist/controllers/forms/form_save_controller.d.ts +0 -32
- package/dist/controllers/forms/form_save_controller.d.ts.map +0 -1
- package/dist/controllers/forms/index.d.ts.map +0 -1
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +0 -17
- package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts.map +0 -1
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts +0 -41
- package/dist/controllers/forms/navigate_form_errors_controller.d.ts.map +0 -1
- package/dist/controllers/forms/nested_form_controller.d.ts +0 -22
- package/dist/controllers/forms/nested_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/password_confirm_controller.d.ts +0 -12
- package/dist/controllers/forms/password_confirm_controller.d.ts.map +0 -1
- package/dist/controllers/forms/password_peek_controller.d.ts +0 -9
- package/dist/controllers/forms/password_peek_controller.d.ts.map +0 -1
- package/dist/controllers/forms/remote_form_controller.d.ts +0 -14
- package/dist/controllers/forms/remote_form_controller.d.ts.map +0 -1
- package/dist/controllers/forms/sync_inputs_controller.d.ts +0 -20
- package/dist/controllers/forms/sync_inputs_controller.d.ts.map +0 -1
- package/dist/controllers/forms/value_warn_controller.d.ts +0 -31
- package/dist/controllers/forms/value_warn_controller.d.ts.map +0 -1
- package/dist/controllers/forms/word_count_controller.d.ts +0 -21
- package/dist/controllers/forms/word_count_controller.d.ts.map +0 -1
- package/dist/controllers/index.d.ts.map +0 -1
- package/dist/controllers/media/fallback_image_controller.d.ts +0 -20
- package/dist/controllers/media/fallback_image_controller.d.ts.map +0 -1
- package/dist/controllers/media/index.d.ts.map +0 -1
- package/dist/controllers/media/lightbox_image_controller.d.ts +0 -31
- package/dist/controllers/media/lightbox_image_controller.d.ts.map +0 -1
- package/dist/controllers/media/media_player_controller.d.ts +0 -10
- package/dist/controllers/media/media_player_controller.d.ts.map +0 -1
- package/dist/controllers/prefetch_controller.d.ts +0 -17
- package/dist/controllers/prefetch_controller.d.ts.map +0 -1
- package/dist/controllers/print_button_controller.d.ts +0 -8
- package/dist/controllers/print_button_controller.d.ts.map +0 -1
- package/dist/controllers/responsive_iframe_controller.d.ts +0 -17
- package/dist/controllers/responsive_iframe_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/index.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_container_controller.d.ts +0 -22
- package/dist/controllers/scroll/scroll_container_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_into_focus_controller.d.ts +0 -16
- package/dist/controllers/scroll/scroll_into_focus_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts +0 -12
- package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_controller.d.ts +0 -18
- package/dist/controllers/scroll/scroll_to_controller.d.ts.map +0 -1
- package/dist/controllers/scroll/scroll_to_top_controller.d.ts +0 -12
- package/dist/controllers/scroll/scroll_to_top_controller.d.ts.map +0 -1
- package/dist/controllers/self_destruct_controller.d.ts +0 -9
- package/dist/controllers/self_destruct_controller.d.ts.map +0 -1
- package/dist/controllers/signal/events.d.ts +0 -5
- package/dist/controllers/signal/events.d.ts.map +0 -1
- package/dist/controllers/signal/expressions.d.ts +0 -2
- package/dist/controllers/signal/expressions.d.ts.map +0 -1
- package/dist/controllers/signal/index.d.ts.map +0 -1
- package/dist/controllers/signal/signal_action_controller.d.ts +0 -15
- package/dist/controllers/signal/signal_action_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_dom_children_controller.d.ts +0 -17
- package/dist/controllers/signal/signal_dom_children_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_input_controller.d.ts +0 -20
- package/dist/controllers/signal/signal_input_controller.d.ts.map +0 -1
- package/dist/controllers/signal/signal_visibility_controller.d.ts +0 -18
- package/dist/controllers/signal/signal_visibility_controller.d.ts.map +0 -1
- package/dist/controllers/sticky_controller.d.ts +0 -16
- package/dist/controllers/sticky_controller.d.ts.map +0 -1
- package/dist/controllers/tables/index.d.ts.map +0 -1
- package/dist/controllers/tables/table_sort_controller.d.ts +0 -20
- package/dist/controllers/tables/table_sort_controller.d.ts.map +0 -1
- package/dist/controllers/tables/table_truncate_controller.d.ts +0 -26
- package/dist/controllers/tables/table_truncate_controller.d.ts.map +0 -1
- package/dist/controllers/teleport_controller.d.ts +0 -16
- package/dist/controllers/teleport_controller.d.ts.map +0 -1
- package/dist/controllers/temporary_state_controller.d.ts +0 -27
- package/dist/controllers/temporary_state_controller.d.ts.map +0 -1
- package/dist/controllers/toggle_class_controller.d.ts +0 -36
- package/dist/controllers/toggle_class_controller.d.ts.map +0 -1
- package/dist/controllers/trix_modifier_controller.d.ts +0 -88
- package/dist/controllers/trix_modifier_controller.d.ts.map +0 -1
- package/dist/controllers/turbo_frame_rc_controller.d.ts +0 -21
- package/dist/controllers/turbo_frame_rc_controller.d.ts.map +0 -1
- package/dist/controllers/turbo_frame_refresh_controller.d.ts +0 -14
- package/dist/controllers/turbo_frame_refresh_controller.d.ts.map +0 -1
- package/dist/controllers/utility/alert_controller.d.ts +0 -9
- package/dist/controllers/utility/alert_controller.d.ts.map +0 -1
- package/dist/controllers/utility/fullscreen_controller.d.ts +0 -8
- package/dist/controllers/utility/fullscreen_controller.d.ts.map +0 -1
- package/dist/controllers/utility/index.d.ts.map +0 -1
- package/dist/controllers/utility/intersection_controller.d.ts +0 -14
- package/dist/controllers/utility/intersection_controller.d.ts.map +0 -1
- package/dist/controllers/utility/interval_controller.d.ts +0 -11
- package/dist/controllers/utility/interval_controller.d.ts.map +0 -1
- package/dist/controllers/utility/presence_controller.d.ts +0 -14
- package/dist/controllers/utility/presence_controller.d.ts.map +0 -1
- package/dist/controllers/utility/print_controller.d.ts +0 -5
- package/dist/controllers/utility/print_controller.d.ts.map +0 -1
- package/dist/controllers/utility/timeout_controller.d.ts +0 -10
- package/dist/controllers/utility/timeout_controller.d.ts.map +0 -1
- package/dist/controllers/utility/user_focus_controller.d.ts +0 -9
- package/dist/controllers/utility/user_focus_controller.d.ts.map +0 -1
- package/dist/controllers/visual/clock_controller.d.ts +0 -16
- package/dist/controllers/visual/clock_controller.d.ts.map +0 -1
- package/dist/controllers/visual/countdown_controller.d.ts +0 -46
- package/dist/controllers/visual/countdown_controller.d.ts.map +0 -1
- package/dist/controllers/visual/duration_controller.d.ts +0 -26
- package/dist/controllers/visual/duration_controller.d.ts.map +0 -1
- package/dist/controllers/visual/index.d.ts.map +0 -1
- package/dist/controllers/visual/tabs_controller.d.ts +0 -30
- package/dist/controllers/visual/tabs_controller.d.ts.map +0 -1
- package/dist/controllers/visual/time_distance_controller.d.ts +0 -16
- package/dist/controllers/visual/time_distance_controller.d.ts.map +0 -1
- package/dist/controllers/visual/tree_view_controller.d.ts +0 -26
- package/dist/controllers/visual/tree_view_controller.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mixins/create_mixin.d.ts +0 -3
- package/dist/mixins/create_mixin.d.ts.map +0 -1
- package/dist/mixins/index.d.ts.map +0 -1
- package/dist/mixins/install_class_methods.d.ts +0 -6
- package/dist/mixins/install_class_methods.d.ts.map +0 -1
- package/dist/mixins/use_click_outside.d.ts +0 -5
- package/dist/mixins/use_click_outside.d.ts.map +0 -1
- package/dist/mixins/use_event_bus.d.ts +0 -8
- package/dist/mixins/use_event_bus.d.ts.map +0 -1
- package/dist/mixins/use_event_listener.d.ts +0 -20
- package/dist/mixins/use_event_listener.d.ts.map +0 -1
- package/dist/mixins/use_fullscreen.d.ts +0 -9
- package/dist/mixins/use_fullscreen.d.ts.map +0 -1
- package/dist/mixins/use_geolocation.d.ts +0 -19
- package/dist/mixins/use_geolocation.d.ts.map +0 -1
- package/dist/mixins/use_hover.d.ts +0 -5
- package/dist/mixins/use_hover.d.ts.map +0 -1
- package/dist/mixins/use_injected_html.d.ts +0 -11
- package/dist/mixins/use_injected_html.d.ts.map +0 -1
- package/dist/mixins/use_intersection.d.ts +0 -14
- package/dist/mixins/use_intersection.d.ts.map +0 -1
- package/dist/mixins/use_interval.d.ts +0 -3
- package/dist/mixins/use_interval.d.ts.map +0 -1
- package/dist/mixins/use_localstorage.d.ts +0 -21
- package/dist/mixins/use_localstorage.d.ts.map +0 -1
- package/dist/mixins/use_mutation_observer.d.ts +0 -3
- package/dist/mixins/use_mutation_observer.d.ts.map +0 -1
- package/dist/mixins/use_temporary_content.d.ts +0 -6
- package/dist/mixins/use_temporary_content.d.ts.map +0 -1
- package/dist/mixins/use_timeout.d.ts +0 -3
- package/dist/mixins/use_timeout.d.ts.map +0 -1
- package/dist/mixins/use_trix_modifiers.d.ts +0 -11
- package/dist/mixins/use_trix_modifiers.d.ts.map +0 -1
- package/dist/stimulus-library.cjs.js +0 -2
- package/dist/stimulus-library.cjs.js.map +0 -1
- package/dist/stimulus-library.es.js +0 -5094
- package/dist/stimulus-library.es.js.map +0 -1
- package/dist/stimulus-library.umd.js +0 -2
- package/dist/stimulus-library.umd.js.map +0 -1
- package/dist/utilities/arrays.d.ts +0 -2
- package/dist/utilities/arrays.d.ts.map +0 -1
- package/dist/utilities/base_controller.d.ts +0 -11
- package/dist/utilities/base_controller.d.ts.map +0 -1
- package/dist/utilities/elements.d.ts +0 -49
- package/dist/utilities/elements.d.ts.map +0 -1
- package/dist/utilities/ephemeral_controller.d.ts +0 -6
- package/dist/utilities/ephemeral_controller.d.ts.map +0 -1
- package/dist/utilities/event_bus.d.ts +0 -4
- package/dist/utilities/event_bus.d.ts.map +0 -1
- package/dist/utilities/events.d.ts +0 -3
- package/dist/utilities/events.d.ts.map +0 -1
- package/dist/utilities/fetchRetry.d.ts +0 -2
- package/dist/utilities/fetchRetry.d.ts.map +0 -1
- package/dist/utilities/index.d.ts.map +0 -1
- package/dist/utilities/logging.d.ts +0 -6
- package/dist/utilities/logging.d.ts.map +0 -1
- package/dist/utilities/reactive.d.ts +0 -2
- package/dist/utilities/reactive.d.ts.map +0 -1
- package/dist/utilities/request_submit.d.ts +0 -3
- package/dist/utilities/request_submit.d.ts.map +0 -1
- package/dist/utilities/scroll.d.ts +0 -11
- package/dist/utilities/scroll.d.ts.map +0 -1
- package/dist/utilities/stimulus.d.ts +0 -3
- package/dist/utilities/stimulus.d.ts.map +0 -1
- package/dist/utilities/strings.d.ts +0 -2
- package/dist/utilities/strings.d.ts.map +0 -1
- package/dist/utilities/turbo.d.ts +0 -2
- package/dist/utilities/turbo.d.ts.map +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { reactive } from "../utilities/reactive";
|
|
2
|
+
import { useMixin } from "./create_mixin";
|
|
3
|
+
export function useGeolocation(controller, options = {}, update, error) {
|
|
4
|
+
// Ensure passed functions are bound to the correct controller scope
|
|
5
|
+
if (update) {
|
|
6
|
+
update = update.bind(controller);
|
|
7
|
+
}
|
|
8
|
+
if (error) {
|
|
9
|
+
error = error.bind(controller);
|
|
10
|
+
}
|
|
11
|
+
// Default options to pass to the navigator.geolocation.watchPosition() method
|
|
12
|
+
const { enableHighAccuracy = true, maximumAge = 30000, timeout = 27000, } = options;
|
|
13
|
+
const isSupported = navigator && 'geolocation' in navigator;
|
|
14
|
+
// Create a reactive object to store the geolocation data
|
|
15
|
+
const values = reactive({
|
|
16
|
+
locatedAt: null,
|
|
17
|
+
error: null,
|
|
18
|
+
coords: {
|
|
19
|
+
accuracy: 0,
|
|
20
|
+
latitude: Infinity,
|
|
21
|
+
longitude: Infinity,
|
|
22
|
+
altitude: null,
|
|
23
|
+
altitudeAccuracy: null,
|
|
24
|
+
heading: null,
|
|
25
|
+
speed: null,
|
|
26
|
+
},
|
|
27
|
+
teardown: () => {
|
|
28
|
+
if (watcher) {
|
|
29
|
+
navigator.geolocation.clearWatch(watcher);
|
|
30
|
+
watcher = null;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
let setup = () => {
|
|
35
|
+
if (isSupported) {
|
|
36
|
+
watcher = navigator.geolocation.watchPosition((position) => {
|
|
37
|
+
// Update reactive values
|
|
38
|
+
values.locatedAt = position.timestamp;
|
|
39
|
+
values.coords = position.coords;
|
|
40
|
+
values.error = null;
|
|
41
|
+
// Fire user callback if provided
|
|
42
|
+
if (update) {
|
|
43
|
+
update(position);
|
|
44
|
+
}
|
|
45
|
+
}, (err) => {
|
|
46
|
+
// Update reactive values
|
|
47
|
+
values.error = err;
|
|
48
|
+
// Fire user callback if provided
|
|
49
|
+
if (error) {
|
|
50
|
+
error(err);
|
|
51
|
+
}
|
|
52
|
+
}, {
|
|
53
|
+
enableHighAccuracy,
|
|
54
|
+
maximumAge,
|
|
55
|
+
timeout,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
let watcher = null;
|
|
60
|
+
useMixin(controller, setup, values.teardown);
|
|
61
|
+
return values;
|
|
62
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useEventListener } from "../mixins/use_event_listener";
|
|
2
|
+
import { useMixin } from "./create_mixin";
|
|
3
|
+
export function useHover(controller, element, enter, leave) {
|
|
4
|
+
let teardownEnter = null;
|
|
5
|
+
let teardownLeave = null;
|
|
6
|
+
if (enter) {
|
|
7
|
+
enter = enter.bind(controller);
|
|
8
|
+
let { teardown: _teardownEnter } = useEventListener(controller, element, "mouseenter", enter);
|
|
9
|
+
teardownEnter = _teardownEnter;
|
|
10
|
+
}
|
|
11
|
+
if (leave) {
|
|
12
|
+
leave = leave.bind(controller);
|
|
13
|
+
let { teardown: _teardownLeave } = useEventListener(controller, element, "mouseleave", leave);
|
|
14
|
+
teardownLeave = _teardownLeave;
|
|
15
|
+
}
|
|
16
|
+
let setup = () => void 0;
|
|
17
|
+
let teardown = () => {
|
|
18
|
+
if (teardownEnter) {
|
|
19
|
+
teardownEnter();
|
|
20
|
+
}
|
|
21
|
+
if (teardownLeave) {
|
|
22
|
+
teardownLeave();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
useMixin(controller, setup, teardown);
|
|
26
|
+
return {
|
|
27
|
+
teardown,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
export function useInjectedFragment(controller, targetElement, insertPosition, fragment, options = {}) {
|
|
3
|
+
let nodes = Array.from(fragment.childNodes);
|
|
4
|
+
let setup = () => {
|
|
5
|
+
let parent = targetElement.parentElement;
|
|
6
|
+
if (["beforebegin", "afterend"].includes(insertPosition) && parent == null) {
|
|
7
|
+
throw new Error("Cannot insert beforebegin into a node with no parent");
|
|
8
|
+
}
|
|
9
|
+
switch (insertPosition) {
|
|
10
|
+
case 'beforeend':
|
|
11
|
+
targetElement.append(fragment);
|
|
12
|
+
break;
|
|
13
|
+
case "afterbegin":
|
|
14
|
+
targetElement.prepend(fragment);
|
|
15
|
+
break;
|
|
16
|
+
case "beforebegin":
|
|
17
|
+
parent.insertBefore(fragment, targetElement);
|
|
18
|
+
break;
|
|
19
|
+
case "afterend":
|
|
20
|
+
parent.insertBefore(fragment, targetElement);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
let teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0;
|
|
25
|
+
useMixin(controller, setup, teardown);
|
|
26
|
+
return [nodes, teardown];
|
|
27
|
+
}
|
|
28
|
+
export function useInjectedHTML(controller, targetElement, insertPosition, html, options = {}) {
|
|
29
|
+
const fragment = document.createRange().createContextualFragment(html);
|
|
30
|
+
return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);
|
|
31
|
+
}
|
|
32
|
+
export function useInjectedElement(controller, targetElement, insertPosition, element, options = {}) {
|
|
33
|
+
const fragment = new DocumentFragment();
|
|
34
|
+
fragment.append(element);
|
|
35
|
+
let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);
|
|
36
|
+
return [nodes[0], teardown];
|
|
37
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
export function useIntersectionObserver(controller, handler, options) {
|
|
3
|
+
handler = handler.bind(controller);
|
|
4
|
+
let observer = new IntersectionObserver(handler, options);
|
|
5
|
+
let teardown = () => {
|
|
6
|
+
observer === null || observer === void 0 ? void 0 : observer.disconnect();
|
|
7
|
+
observer = null;
|
|
8
|
+
};
|
|
9
|
+
let observe = (element) => observer === null || observer === void 0 ? void 0 : observer.observe(element);
|
|
10
|
+
let unobserve = (element) => observer === null || observer === void 0 ? void 0 : observer.unobserve(element);
|
|
11
|
+
return {
|
|
12
|
+
observer,
|
|
13
|
+
teardown,
|
|
14
|
+
observe,
|
|
15
|
+
unobserve,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function useIntersection(controller, element, appear, disappear, options) {
|
|
19
|
+
if (appear) {
|
|
20
|
+
appear = appear.bind(controller);
|
|
21
|
+
}
|
|
22
|
+
if (disappear) {
|
|
23
|
+
disappear = disappear.bind(controller);
|
|
24
|
+
}
|
|
25
|
+
let opts = options !== null && options !== void 0 ? options : {};
|
|
26
|
+
let processEntries = (entries) => {
|
|
27
|
+
entries.forEach((entry) => {
|
|
28
|
+
if (entry.isIntersecting) {
|
|
29
|
+
appear && appear(entry);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
disappear && disappear(entry);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
let { observer, observe, unobserve, teardown } = useIntersectionObserver(controller, processEntries, opts);
|
|
37
|
+
let setup = () => observe(element);
|
|
38
|
+
useMixin(controller, setup, teardown);
|
|
39
|
+
return {
|
|
40
|
+
observer,
|
|
41
|
+
observe: () => observe(element),
|
|
42
|
+
unobserve: () => unobserve(element),
|
|
43
|
+
teardown,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
export function useInterval(controller, handler, interval) {
|
|
3
|
+
handler = handler.bind(controller);
|
|
4
|
+
let intervalHandle = null;
|
|
5
|
+
let setup = () => intervalHandle = setInterval(handler, interval);
|
|
6
|
+
let teardown = () => {
|
|
7
|
+
if (intervalHandle !== null) {
|
|
8
|
+
clearInterval(intervalHandle);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
useMixin(controller, setup, teardown);
|
|
12
|
+
return teardown;
|
|
13
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { reactive } from "../utilities/reactive";
|
|
2
|
+
export const StorageSerializers = {
|
|
3
|
+
boolean: {
|
|
4
|
+
deserialize: (v) => v === 'true',
|
|
5
|
+
serialize: (v) => String(v),
|
|
6
|
+
isEmpty: (v) => v === '' || v === null,
|
|
7
|
+
},
|
|
8
|
+
object: {
|
|
9
|
+
deserialize: (v) => JSON.parse(v),
|
|
10
|
+
serialize: (v) => JSON.stringify(v),
|
|
11
|
+
isEmpty: (v) => {
|
|
12
|
+
const values = Object.values(JSON.parse(v));
|
|
13
|
+
return values.length === 0 || values.every(v => v === '' || v === null);
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
number: {
|
|
17
|
+
deserialize: (v) => Number.parseFloat(v),
|
|
18
|
+
serialize: (v) => String(v),
|
|
19
|
+
isEmpty: (v) => v === '' || v === null,
|
|
20
|
+
},
|
|
21
|
+
any: {
|
|
22
|
+
deserialize: (v) => v,
|
|
23
|
+
serialize: (v) => String(v),
|
|
24
|
+
isEmpty: (v) => v === '' || v === null,
|
|
25
|
+
},
|
|
26
|
+
string: {
|
|
27
|
+
deserialize: (v) => v,
|
|
28
|
+
serialize: (v) => String(v),
|
|
29
|
+
isEmpty: (v) => v === '' || v === null,
|
|
30
|
+
},
|
|
31
|
+
map: {
|
|
32
|
+
deserialize: (v) => new Map(JSON.parse(v)),
|
|
33
|
+
serialize: (v) => JSON.stringify(Array.from(v.entries())),
|
|
34
|
+
isEmpty: (v) => {
|
|
35
|
+
const values = Array.from(v.values());
|
|
36
|
+
return values.length === 0 || values.every(v => v === '' || v === null);
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
set: {
|
|
40
|
+
deserialize: (v) => new Set(JSON.parse(v)),
|
|
41
|
+
serialize: (v) => JSON.stringify(Array.from(v.entries())),
|
|
42
|
+
isEmpty: (v) => {
|
|
43
|
+
const values = Array.from(v.values());
|
|
44
|
+
return values.length === 0 || values.every(v => v === '' || v === null);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
export function useLocalStorage(controller, key, defaultValue, opts = { writeDefaults: true }) {
|
|
49
|
+
let type;
|
|
50
|
+
let { writeDefaults } = opts;
|
|
51
|
+
if (defaultValue == null) {
|
|
52
|
+
type = 'any';
|
|
53
|
+
}
|
|
54
|
+
else if (defaultValue instanceof Set) {
|
|
55
|
+
type = 'set';
|
|
56
|
+
}
|
|
57
|
+
else if (defaultValue instanceof Map) {
|
|
58
|
+
type = 'map';
|
|
59
|
+
}
|
|
60
|
+
else if (typeof defaultValue === 'boolean') {
|
|
61
|
+
type = 'boolean';
|
|
62
|
+
}
|
|
63
|
+
else if (typeof defaultValue === 'string') {
|
|
64
|
+
type = 'string';
|
|
65
|
+
}
|
|
66
|
+
else if (typeof defaultValue === 'object') {
|
|
67
|
+
type = 'object';
|
|
68
|
+
}
|
|
69
|
+
else if (Array.isArray(defaultValue)) {
|
|
70
|
+
type = 'object';
|
|
71
|
+
}
|
|
72
|
+
else if (!Number.isNaN(defaultValue)) {
|
|
73
|
+
type = 'number';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
type = 'any';
|
|
77
|
+
}
|
|
78
|
+
let data = reactive({
|
|
79
|
+
value: defaultValue,
|
|
80
|
+
});
|
|
81
|
+
let storage = localStorage;
|
|
82
|
+
const serializer = StorageSerializers[type];
|
|
83
|
+
const read = () => {
|
|
84
|
+
const rawValue = storage.getItem(key);
|
|
85
|
+
if (rawValue == null) {
|
|
86
|
+
data.value = defaultValue;
|
|
87
|
+
if (writeDefaults && defaultValue !== null) {
|
|
88
|
+
storage.setItem(key, serializer.serialize(defaultValue));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
data.value = serializer.deserialize(rawValue);
|
|
93
|
+
}
|
|
94
|
+
return data.value;
|
|
95
|
+
};
|
|
96
|
+
const write = (value) => {
|
|
97
|
+
storage.setItem(key, serializer.serialize(value));
|
|
98
|
+
data.value = value;
|
|
99
|
+
};
|
|
100
|
+
const clear = () => {
|
|
101
|
+
storage.removeItem(key);
|
|
102
|
+
data.value = defaultValue;
|
|
103
|
+
return data.value;
|
|
104
|
+
};
|
|
105
|
+
const isEmpty = () => {
|
|
106
|
+
let rawValue = storage.getItem(key);
|
|
107
|
+
return serializer.isEmpty(rawValue);
|
|
108
|
+
};
|
|
109
|
+
read();
|
|
110
|
+
return {
|
|
111
|
+
get value() {
|
|
112
|
+
return read();
|
|
113
|
+
},
|
|
114
|
+
set value(value) {
|
|
115
|
+
write(value);
|
|
116
|
+
},
|
|
117
|
+
read,
|
|
118
|
+
clear,
|
|
119
|
+
write,
|
|
120
|
+
isEmpty,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
export function useMutationObserver(controller, element, handler, options) {
|
|
3
|
+
handler = handler.bind(controller);
|
|
4
|
+
let observer = new MutationObserver(handler);
|
|
5
|
+
let setup = () => observer.observe(element, options);
|
|
6
|
+
let teardown = () => observer.disconnect();
|
|
7
|
+
useMixin(controller, setup, teardown);
|
|
8
|
+
return teardown;
|
|
9
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
import { useTimeout } from "./use_timeout";
|
|
3
|
+
import { isHTMLInputElement } from "../utilities/elements";
|
|
4
|
+
export function useTemporaryContent(controller, target, content, timeout, teardownCallback) {
|
|
5
|
+
const setContent = (element, text) => {
|
|
6
|
+
if (isHTMLInputElement(element)) {
|
|
7
|
+
element.value = text;
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
element.textContent = text;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const getContent = (element) => {
|
|
14
|
+
return isHTMLInputElement(element) ? element.value : element.innerHTML;
|
|
15
|
+
};
|
|
16
|
+
let cleanupTimeout = () => void 0;
|
|
17
|
+
let originalText = getContent(target);
|
|
18
|
+
const teardown = () => {
|
|
19
|
+
setContent(target, originalText);
|
|
20
|
+
cleanupTimeout();
|
|
21
|
+
if (teardownCallback) {
|
|
22
|
+
teardownCallback.call(controller);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const setup = () => {
|
|
26
|
+
setContent(target, content);
|
|
27
|
+
if (timeout !== undefined) {
|
|
28
|
+
cleanupTimeout = useTimeout(controller, teardown, timeout);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
useMixin(controller, setup, teardown);
|
|
32
|
+
return {
|
|
33
|
+
teardown,
|
|
34
|
+
update(newContent) {
|
|
35
|
+
setContent(target, newContent);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useMixin } from "./create_mixin";
|
|
2
|
+
export function useTimeout(controller, handler, timeout) {
|
|
3
|
+
let controllerDisconnect;
|
|
4
|
+
let timeoutHandle = null;
|
|
5
|
+
handler = handler.bind(controller);
|
|
6
|
+
let newHandler = () => {
|
|
7
|
+
handler();
|
|
8
|
+
timeoutHandle = null;
|
|
9
|
+
Object.assign(controller, { disconnect: controllerDisconnect });
|
|
10
|
+
};
|
|
11
|
+
let setup = () => timeoutHandle = setTimeout(newHandler, timeout);
|
|
12
|
+
let teardown = () => {
|
|
13
|
+
if (timeoutHandle !== null) {
|
|
14
|
+
clearTimeout(timeoutHandle);
|
|
15
|
+
timeoutHandle = null;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
controllerDisconnect = useMixin(controller, setup, teardown);
|
|
19
|
+
return teardown;
|
|
20
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { controllerMethod } from "../utilities/stimulus";
|
|
2
|
+
import { Controller } from "@hotwired/stimulus";
|
|
3
|
+
export class TrixComposableController extends Controller {
|
|
4
|
+
}
|
|
5
|
+
export function useTrixModifiers(controller) {
|
|
6
|
+
// keep a copy of the lifecycle function of the controller
|
|
7
|
+
const controllerDisconnect = controller.disconnect.bind(controller);
|
|
8
|
+
let observing = false;
|
|
9
|
+
let observerCallback = (entries, observer) => {
|
|
10
|
+
entries.forEach(mutation => {
|
|
11
|
+
if (mutation.type === 'childList' && Array.from(mutation.addedNodes).some((el) => el.tagName === 'TRIX-TOOLBAR')) {
|
|
12
|
+
attemptSetup();
|
|
13
|
+
observer.disconnect();
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
let pasteHandler = (event) => controllerMethod(controller, 'pasteEvent').call(controller, event);
|
|
18
|
+
let observer = new MutationObserver(observerCallback);
|
|
19
|
+
let attemptSetup = () => {
|
|
20
|
+
if (controller.element.tagName !== 'TRIX-EDITOR') {
|
|
21
|
+
throw new Error('Expected controller to be mounted on an instance of <trix-editor>');
|
|
22
|
+
}
|
|
23
|
+
let editor = controller.element;
|
|
24
|
+
let editorParent = controller.element.parentElement;
|
|
25
|
+
if (editorParent == null) {
|
|
26
|
+
throw new Error('Could not traverse DOM tree from <trix-editor>');
|
|
27
|
+
}
|
|
28
|
+
editor.addEventListener('trix-paste', pasteHandler);
|
|
29
|
+
let toolbar = editorParent.querySelector('trix-toolbar');
|
|
30
|
+
if (!observing && !toolbar) {
|
|
31
|
+
// toolbar is not in the DOM yet, wait for it to arrive before running setup
|
|
32
|
+
observing = true;
|
|
33
|
+
observer.observe(editorParent, { childList: true });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
else if (!toolbar) {
|
|
37
|
+
// Fallback, in case this runs twice, or mutation observer logic fails
|
|
38
|
+
throw new Error('Could not find an instance of <trix-toolbar> that is a sibling of this <trix-editor>');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Do not need MutationObserver, all elements are present and correct
|
|
42
|
+
observer.disconnect();
|
|
43
|
+
}
|
|
44
|
+
controllerMethod(controller, 'install').call(controller, { toolbar, editor });
|
|
45
|
+
};
|
|
46
|
+
let teardown = () => {
|
|
47
|
+
if (controller.element.tagName !== 'TRIX-EDITOR') {
|
|
48
|
+
throw new Error('Expected controller to be mounted on an instance of <trix-editor>');
|
|
49
|
+
}
|
|
50
|
+
let editor = controller.element;
|
|
51
|
+
let editorParent = controller.element.parentElement;
|
|
52
|
+
if (editorParent == null) {
|
|
53
|
+
throw new Error('Could not traverse DOM tree from <trix-editor>');
|
|
54
|
+
}
|
|
55
|
+
editor.removeEventListener('trix-paste', pasteHandler);
|
|
56
|
+
let toolbar = editorParent.querySelector('trix-toolbar');
|
|
57
|
+
if (!toolbar) {
|
|
58
|
+
throw new Error('Could not find <trix-toolbar> that is a sibling of this <trix-editor> element');
|
|
59
|
+
}
|
|
60
|
+
controllerMethod(controller, 'uninstall').call(controller, { toolbar, editor });
|
|
61
|
+
};
|
|
62
|
+
attemptSetup();
|
|
63
|
+
Object.assign(controller, {
|
|
64
|
+
disconnect() {
|
|
65
|
+
observer.disconnect();
|
|
66
|
+
teardown();
|
|
67
|
+
controllerMethod(controller, 'uninstall').call({ toolbar, editor: controller.element });
|
|
68
|
+
controllerDisconnect();
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-ignore
|
|
3
|
+
if (!String.prototype.replaceAll) {
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
String.prototype.replaceAll = function (str, newStr) {
|
|
6
|
+
// If a regex pattern
|
|
7
|
+
if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]') {
|
|
8
|
+
return this.replace(str, newStr);
|
|
9
|
+
}
|
|
10
|
+
// If a string
|
|
11
|
+
return this.replace(new RegExp(str, 'g'), newStr);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus";
|
|
2
|
+
import { log, logProperty } from "./logging";
|
|
3
|
+
import { dispatchEvent } from "./events";
|
|
4
|
+
export class BaseController extends Controller {
|
|
5
|
+
constructor(context) {
|
|
6
|
+
super(context);
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
if (!this.application.debug) {
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
return new Proxy(this, {
|
|
12
|
+
get: (obj, prop) => {
|
|
13
|
+
let returnVal = Reflect.get(obj, prop);
|
|
14
|
+
let self = this;
|
|
15
|
+
if ("logFormattedMessage" in this.application) {
|
|
16
|
+
return returnVal;
|
|
17
|
+
}
|
|
18
|
+
if (logProperty(prop.toString())) {
|
|
19
|
+
if (typeof returnVal == "function") {
|
|
20
|
+
return new Proxy(returnVal, {
|
|
21
|
+
apply(target, thisArg, argArray) {
|
|
22
|
+
log(self, prop.toString(), {
|
|
23
|
+
args: argArray,
|
|
24
|
+
});
|
|
25
|
+
return Reflect.apply(target, thisArg, argArray);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
log(this, prop.toString());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return returnVal;
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
get el() {
|
|
38
|
+
return this.element;
|
|
39
|
+
}
|
|
40
|
+
get isTurboPreview() {
|
|
41
|
+
return document.documentElement.hasAttribute('data-turbo-preview') || document.documentElement.hasAttribute('data-turbolinks-preview');
|
|
42
|
+
}
|
|
43
|
+
get isTurbolinksPreview() {
|
|
44
|
+
return this.isTurboPreview;
|
|
45
|
+
}
|
|
46
|
+
get csrfToken() {
|
|
47
|
+
return this.metaValue('csrf-token');
|
|
48
|
+
}
|
|
49
|
+
metaValue(name) {
|
|
50
|
+
const element = document.head.querySelector(`meta[name="${name}"]`);
|
|
51
|
+
return (element === null || element === void 0 ? void 0 : element.getAttribute('content')) || null;
|
|
52
|
+
}
|
|
53
|
+
dispatchEvent(element, eventName, options = {}) {
|
|
54
|
+
dispatchEvent(this, element, eventName, options);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export function isHTMLLinkElement(element) {
|
|
2
|
+
return element.nodeName == "LINK";
|
|
3
|
+
}
|
|
4
|
+
export function isHTMLAnchorElement(element) {
|
|
5
|
+
return element.nodeName == "A";
|
|
6
|
+
}
|
|
7
|
+
export function isHTMLFormElement(element) {
|
|
8
|
+
return element.nodeName == "FORM";
|
|
9
|
+
}
|
|
10
|
+
export function isHTMLInputElement(element) {
|
|
11
|
+
return element.nodeName == "INPUT";
|
|
12
|
+
}
|
|
13
|
+
export function isHTMLLabelElement(element) {
|
|
14
|
+
return element.nodeName == "LABEL";
|
|
15
|
+
}
|
|
16
|
+
export function isHTMLTextAreaElement(element) {
|
|
17
|
+
return element.nodeName == "TEXTAREA";
|
|
18
|
+
}
|
|
19
|
+
export function isHTMLButtonElement(element) {
|
|
20
|
+
return element.nodeName == "BUTTON";
|
|
21
|
+
}
|
|
22
|
+
export function isHTMLSelectElement(element) {
|
|
23
|
+
return element.nodeName == "SELECT";
|
|
24
|
+
}
|
|
25
|
+
export function isHTMLImageElement(element) {
|
|
26
|
+
return element.nodeName == "IMG";
|
|
27
|
+
}
|
|
28
|
+
export function isHTMLButtonInputElement(element) {
|
|
29
|
+
return element.nodeName == "INPUT" && element.type == "button";
|
|
30
|
+
}
|
|
31
|
+
export function isHTMLSubmitInputElement(element) {
|
|
32
|
+
return element.nodeName == "INPUT" && element.type == "submit";
|
|
33
|
+
}
|
|
34
|
+
export function isHTMLResetInputElement(element) {
|
|
35
|
+
return element.nodeName == "INPUT" && element.type == "reset";
|
|
36
|
+
}
|
|
37
|
+
export function isHTMLButtonButtonElement(element) {
|
|
38
|
+
return element.nodeName == "BUTTON" && element.type == "button";
|
|
39
|
+
}
|
|
40
|
+
export function isHTMLSubmitButtonElement(element) {
|
|
41
|
+
return element.nodeName == "BUTTON" && element.type == "submit";
|
|
42
|
+
}
|
|
43
|
+
export function isHTMLResetButtonElement(element) {
|
|
44
|
+
return element.nodeName == "BUTTON" && element.type == "reset";
|
|
45
|
+
}
|
|
46
|
+
export function isTypeOfResetButtonElement(element) {
|
|
47
|
+
return isHTMLResetButtonElement(element) || isHTMLResetInputElement(element);
|
|
48
|
+
}
|
|
49
|
+
export function isTypeOfSubmitButtonElement(element) {
|
|
50
|
+
return isHTMLSubmitButtonElement(element) || isHTMLSubmitInputElement(element);
|
|
51
|
+
}
|
|
52
|
+
export function isTypeOfButtonableElement(element) {
|
|
53
|
+
return isTypeOfResetButtonElement(element) || isTypeOfSubmitButtonElement(element) || isHTMLButtonButtonElement(element);
|
|
54
|
+
}
|
|
55
|
+
export function isElementCheckable(element) {
|
|
56
|
+
return isHTMLInputElement(element) && (element.type === "radio" || element.type === "checkbox");
|
|
57
|
+
}
|
|
58
|
+
export function isTypeOfFormInputElement(element) {
|
|
59
|
+
return isHTMLInputElement(element) || isHTMLSelectElement(element) || isHTMLTextAreaElement(element);
|
|
60
|
+
}
|
|
61
|
+
export function createHiddenButton(type) {
|
|
62
|
+
let button = document.createElement('button');
|
|
63
|
+
button.type = type;
|
|
64
|
+
button.style.display = 'none';
|
|
65
|
+
button.dataset.sythentic = 'true';
|
|
66
|
+
return button;
|
|
67
|
+
}
|
|
68
|
+
export function createHiddenInput(name, value) {
|
|
69
|
+
let input = document.createElement('input');
|
|
70
|
+
input.type = 'hidden';
|
|
71
|
+
input.name = name;
|
|
72
|
+
input.value = value;
|
|
73
|
+
return input;
|
|
74
|
+
}
|
|
75
|
+
export function insertElement(targetElement, insertPosition, element) {
|
|
76
|
+
let createdElement = targetElement.insertAdjacentElement(insertPosition, element);
|
|
77
|
+
if (!createdElement) {
|
|
78
|
+
throw new Error(`Failed to insert element ${element.nodeName} into ${targetElement.nodeName}`);
|
|
79
|
+
}
|
|
80
|
+
return createdElement;
|
|
81
|
+
}
|
|
82
|
+
export function insertHiddenInput(name, value, targetElement, insertPosition) {
|
|
83
|
+
return insertElement(targetElement, insertPosition, createHiddenInput(name, value));
|
|
84
|
+
}
|
|
85
|
+
export function insertHiddenButton(type, targetElement, insertPosition) {
|
|
86
|
+
return insertElement(targetElement, insertPosition, createHiddenButton(type));
|
|
87
|
+
}
|
|
88
|
+
export function getAllRadiosInGroup(radio) {
|
|
89
|
+
let parent = radio.form || document;
|
|
90
|
+
return Array.from(parent.querySelectorAll(`input[type="radio"][name="${radio.name}"]`));
|
|
91
|
+
}
|
|
92
|
+
export function getOtherRadiosInGroup(radio) {
|
|
93
|
+
return getAllRadiosInGroup(radio).filter((r) => r !== radio);
|
|
94
|
+
}
|
|
95
|
+
export function isElementInViewport(el) {
|
|
96
|
+
const rect = el.getBoundingClientRect();
|
|
97
|
+
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
98
|
+
const windowWidth = window.innerWidth || document.documentElement.clientWidth;
|
|
99
|
+
const vertInView = rect.top <= windowHeight && rect.top + rect.height >= 0;
|
|
100
|
+
const horInView = rect.left <= windowWidth && rect.left + rect.width >= 0;
|
|
101
|
+
return vertInView && horInView;
|
|
102
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import camelCase from "lodash-es/camelCase";
|
|
2
|
+
import { BaseController } from "./base_controller";
|
|
3
|
+
import '../polyfills/string.replaceAll';
|
|
4
|
+
export class EphemeralController extends BaseController {
|
|
5
|
+
_cleanupSelf() {
|
|
6
|
+
this.cleanup(this.el);
|
|
7
|
+
}
|
|
8
|
+
cleanup(element) {
|
|
9
|
+
var _a, _b, _c;
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
element.dataset.controller = ((_a = element.dataset.controller) === null || _a === void 0 ? void 0 : _a.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, "g"), "")) || "";
|
|
12
|
+
if (element.dataset.controller == "") {
|
|
13
|
+
// If there are no controllers left, remove the attribute
|
|
14
|
+
delete element.dataset.controller;
|
|
15
|
+
}
|
|
16
|
+
let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\..+?(\\s|$)`, "g");
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
element.dataset.target = ((_b = element.dataset.target) === null || _b === void 0 ? void 0 : _b.replaceAll(substringIdentifierValueRegex, "")) || "";
|
|
19
|
+
delete element.dataset[camelCase(`${this.identifier}-target`)];
|
|
20
|
+
if (element.dataset.target == "") {
|
|
21
|
+
// If there are no targets left, remove the attribute
|
|
22
|
+
delete element.dataset.target;
|
|
23
|
+
}
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
element.dataset.action = ((_c = element.dataset.target) === null || _c === void 0 ? void 0 : _c.replaceAll(substringIdentifierValueRegex, "")) || "";
|
|
26
|
+
delete element.dataset[camelCase(`${this.identifier}-action`)];
|
|
27
|
+
if (element.dataset.action == "") {
|
|
28
|
+
// If there are no actions left, remove the attribute
|
|
29
|
+
delete element.dataset.action;
|
|
30
|
+
}
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
let values = this.constructor.values;
|
|
33
|
+
if (values) {
|
|
34
|
+
Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);
|
|
35
|
+
}
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
let classes = this.constructor.classes;
|
|
38
|
+
if (classes) {
|
|
39
|
+
Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|