stimulus-library 0.7.5 → 0.9.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/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} +3 -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/persisted_dismissable_controller.js +19 -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 +17 -24
- 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,34 @@
|
|
|
1
|
+
import debounce from "lodash-es/debounce";
|
|
2
|
+
import { wrapArray } from "../utilities/arrays";
|
|
3
|
+
import { useMixin } from "./create_mixin";
|
|
4
|
+
export function useEventListener(controller, element, eventNameOrNames, handler, opts) {
|
|
5
|
+
if (opts === null || opts === void 0 ? void 0 : opts.debounce) {
|
|
6
|
+
handler = debounce(handler.bind(controller), opts.debounce);
|
|
7
|
+
delete opts.debounce;
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
handler = handler.bind(controller);
|
|
11
|
+
}
|
|
12
|
+
let eventNames = wrapArray(eventNameOrNames);
|
|
13
|
+
let setup = () => eventNames.forEach(eventName => element.addEventListener(eventName, handler, opts));
|
|
14
|
+
let teardown = () => eventNames.forEach(eventName => element.removeEventListener(eventName, handler));
|
|
15
|
+
useMixin(controller, setup, teardown);
|
|
16
|
+
return { setup, teardown };
|
|
17
|
+
}
|
|
18
|
+
export function useEventListeners(controller, element, eventNameOrNames, handler, opts) {
|
|
19
|
+
return useEventListener(controller, element, eventNameOrNames, handler, opts);
|
|
20
|
+
}
|
|
21
|
+
export function useCollectionEventListener(controller, elements, eventNameOrNames, handler, opts) {
|
|
22
|
+
let handlers = [];
|
|
23
|
+
elements.forEach(el => {
|
|
24
|
+
let { setup, teardown } = useEventListener(controller, el, eventNameOrNames, handler, opts);
|
|
25
|
+
handlers.push({ setup, teardown });
|
|
26
|
+
});
|
|
27
|
+
return [
|
|
28
|
+
() => handlers.forEach(h => h.setup()),
|
|
29
|
+
() => handlers.forEach(h => h.teardown()),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
export function useCollectionEventListeners(controller, elements, eventNameOrNames, handler, opts) {
|
|
33
|
+
return useCollectionEventListener(controller, elements, eventNameOrNames, handler, opts);
|
|
34
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { useMixin } from "./create_mixin";
|
|
11
|
+
export function useFullscreen(controller, el) {
|
|
12
|
+
let element = el || document.documentElement;
|
|
13
|
+
let fullscreenOpen = document.fullscreenElement !== null;
|
|
14
|
+
const updateFullscreenState = () => fullscreenOpen = document.fullscreenElement !== null;
|
|
15
|
+
const isFullscreen = () => fullscreenOpen;
|
|
16
|
+
const toggle = () => __awaiter(this, void 0, void 0, function* () { return fullscreenOpen ? yield exit() : yield enter(); });
|
|
17
|
+
let setup = () => document.addEventListener('fullscreenchange', updateFullscreenState);
|
|
18
|
+
let teardown = () => document.removeEventListener('fullscreenchange', updateFullscreenState);
|
|
19
|
+
const exit = () => __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
if (document.exitFullscreen) {
|
|
21
|
+
fullscreenOpen = false;
|
|
22
|
+
yield document.exitFullscreen();
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const enter = () => __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
if (fullscreenOpen) {
|
|
27
|
+
yield exit();
|
|
28
|
+
}
|
|
29
|
+
if (element.requestFullscreen) {
|
|
30
|
+
yield element.requestFullscreen();
|
|
31
|
+
fullscreenOpen = true;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
useMixin(controller, setup, teardown);
|
|
35
|
+
return {
|
|
36
|
+
isFullscreen,
|
|
37
|
+
enter,
|
|
38
|
+
exit,
|
|
39
|
+
toggle,
|
|
40
|
+
teardown,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -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
|
+
}
|