stimulus-library 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/dist/controllers/ajax/async_block_controller.d.ts +17 -18
  3. package/dist/controllers/ajax/async_block_controller.d.ts.map +1 -1
  4. package/dist/controllers/ajax/index.d.ts +5 -0
  5. package/dist/controllers/ajax/index.d.ts.map +1 -0
  6. package/dist/controllers/ajax/lazy_block_controller.d.ts +9 -9
  7. package/dist/controllers/ajax/lazy_block_controller.d.ts.map +1 -1
  8. package/dist/controllers/ajax/load_block_controller.d.ts +23 -19
  9. package/dist/controllers/ajax/load_block_controller.d.ts.map +1 -1
  10. package/dist/controllers/ajax/poll_block_controller.d.ts +15 -13
  11. package/dist/controllers/ajax/poll_block_controller.d.ts.map +1 -1
  12. package/dist/controllers/anchor_spy_controller.d.ts +20 -13
  13. package/dist/controllers/anchor_spy_controller.d.ts.map +1 -1
  14. package/dist/controllers/back_link_controller.d.ts +16 -16
  15. package/dist/controllers/clipboard_controller.d.ts +18 -18
  16. package/dist/controllers/confirm_controller.d.ts +12 -12
  17. package/dist/controllers/confirm_navigation_controller.d.ts +14 -15
  18. package/dist/controllers/confirm_navigation_controller.d.ts.map +1 -1
  19. package/dist/controllers/debug_controller.d.ts +6 -6
  20. package/dist/controllers/disable_with_controller.d.ts +19 -23
  21. package/dist/controllers/disable_with_controller.d.ts.map +1 -1
  22. package/dist/controllers/dismissable_controller.d.ts +6 -6
  23. package/dist/controllers/element_save_controller.d.ts +30 -25
  24. package/dist/controllers/element_save_controller.d.ts.map +1 -1
  25. package/dist/controllers/empty_dom_controller.d.ts +21 -29
  26. package/dist/controllers/empty_dom_controller.d.ts.map +1 -1
  27. package/dist/controllers/forms/auto_submit_form_controller.d.ts +22 -21
  28. package/dist/controllers/forms/auto_submit_form_controller.d.ts.map +1 -1
  29. package/dist/controllers/forms/autosize_controller.d.ts +8 -9
  30. package/dist/controllers/forms/autosize_controller.d.ts.map +1 -1
  31. package/dist/controllers/forms/char_count_controller.d.ts +20 -24
  32. package/dist/controllers/forms/char_count_controller.d.ts.map +1 -1
  33. package/dist/controllers/forms/checkbox_disable_inputs_controller.d.ts +16 -16
  34. package/dist/controllers/forms/checkbox_enable_inputs_controller.d.ts +16 -16
  35. package/dist/controllers/forms/checkbox_select_all_controller.d.ts +13 -12
  36. package/dist/controllers/forms/checkbox_select_all_controller.d.ts.map +1 -1
  37. package/dist/controllers/forms/checkbox_xor_controller.d.ts +9 -0
  38. package/dist/controllers/forms/checkbox_xor_controller.d.ts.map +1 -0
  39. package/dist/controllers/forms/detect_dirty_controller.d.ts +14 -14
  40. package/dist/controllers/forms/detect_dirty_controller.d.ts.map +1 -1
  41. package/dist/controllers/forms/detect_dirty_form_controller.d.ts +17 -17
  42. package/dist/controllers/forms/detect_dirty_form_controller.d.ts.map +1 -1
  43. package/dist/controllers/forms/enable_inputs_controller.d.ts +13 -13
  44. package/dist/controllers/forms/focus_steal_controller.d.ts +11 -11
  45. package/dist/controllers/forms/form_rc_controller.d.ts +17 -17
  46. package/dist/controllers/forms/form_save_controller.d.ts +31 -31
  47. package/dist/controllers/forms/index.d.ts +23 -0
  48. package/dist/controllers/forms/index.d.ts.map +1 -0
  49. package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts +16 -15
  50. package/dist/controllers/forms/limited_selection_checkboxes_controller.d.ts.map +1 -1
  51. package/dist/controllers/forms/navigate_form_errors_controller.d.ts +40 -34
  52. package/dist/controllers/forms/navigate_form_errors_controller.d.ts.map +1 -1
  53. package/dist/controllers/forms/nested_form_controller.d.ts +21 -21
  54. package/dist/controllers/forms/password_confirm_controller.d.ts +11 -15
  55. package/dist/controllers/forms/password_confirm_controller.d.ts.map +1 -1
  56. package/dist/controllers/forms/password_peek_controller.d.ts +8 -8
  57. package/dist/controllers/forms/remote_form_controller.d.ts +13 -13
  58. package/dist/controllers/forms/sync_inputs_controller.d.ts +19 -21
  59. package/dist/controllers/forms/sync_inputs_controller.d.ts.map +1 -1
  60. package/dist/controllers/forms/value_warn_controller.d.ts +30 -37
  61. package/dist/controllers/forms/value_warn_controller.d.ts.map +1 -1
  62. package/dist/controllers/forms/word_count_controller.d.ts +20 -24
  63. package/dist/controllers/forms/word_count_controller.d.ts.map +1 -1
  64. package/dist/controllers/index.d.ts +30 -0
  65. package/dist/controllers/index.d.ts.map +1 -0
  66. package/dist/controllers/media/fallback_image_controller.d.ts +19 -27
  67. package/dist/controllers/media/fallback_image_controller.d.ts.map +1 -1
  68. package/dist/controllers/media/index.d.ts +4 -0
  69. package/dist/controllers/media/index.d.ts.map +1 -0
  70. package/dist/controllers/media/lightbox_image_controller.d.ts +30 -29
  71. package/dist/controllers/media/lightbox_image_controller.d.ts.map +1 -1
  72. package/dist/controllers/media/media_player_controller.d.ts +9 -12
  73. package/dist/controllers/media/media_player_controller.d.ts.map +1 -1
  74. package/dist/controllers/prefetch_controller.d.ts +16 -16
  75. package/dist/controllers/prefetch_controller.d.ts.map +1 -1
  76. package/dist/controllers/print_button_controller.d.ts +7 -11
  77. package/dist/controllers/print_button_controller.d.ts.map +1 -1
  78. package/dist/controllers/responsive_iframe_controller.d.ts +16 -21
  79. package/dist/controllers/responsive_iframe_controller.d.ts.map +1 -1
  80. package/dist/controllers/scroll/index.d.ts +6 -0
  81. package/dist/controllers/scroll/index.d.ts.map +1 -0
  82. package/dist/controllers/scroll/scroll_container_controller.d.ts +21 -21
  83. package/dist/controllers/scroll/scroll_into_focus_controller.d.ts +15 -15
  84. package/dist/controllers/scroll/scroll_to_bottom_controller.d.ts +11 -11
  85. package/dist/controllers/scroll/scroll_to_controller.d.ts +17 -17
  86. package/dist/controllers/scroll/scroll_to_top_controller.d.ts +11 -11
  87. package/dist/controllers/self_destruct_controller.d.ts +8 -8
  88. package/dist/controllers/signal/events.d.ts +4 -0
  89. package/dist/controllers/signal/events.d.ts.map +1 -0
  90. package/dist/controllers/signal/expressions.d.ts +2 -0
  91. package/dist/controllers/signal/expressions.d.ts.map +1 -0
  92. package/dist/controllers/signal/index.d.ts +4 -0
  93. package/dist/controllers/signal/index.d.ts.map +1 -0
  94. package/dist/controllers/signal/signal_action_controller.d.ts +15 -0
  95. package/dist/controllers/signal/signal_action_controller.d.ts.map +1 -0
  96. package/dist/controllers/signal/signal_input_controller.d.ts +20 -0
  97. package/dist/controllers/signal/signal_input_controller.d.ts.map +1 -0
  98. package/dist/controllers/signal/signal_visibility_controller.d.ts +18 -0
  99. package/dist/controllers/signal/signal_visibility_controller.d.ts.map +1 -0
  100. package/dist/controllers/sticky_controller.d.ts +15 -18
  101. package/dist/controllers/sticky_controller.d.ts.map +1 -1
  102. package/dist/controllers/tables/index.d.ts +3 -0
  103. package/dist/controllers/tables/index.d.ts.map +1 -0
  104. package/dist/controllers/tables/table_sort_controller.d.ts +19 -18
  105. package/dist/controllers/tables/table_sort_controller.d.ts.map +1 -1
  106. package/dist/controllers/tables/table_truncate_controller.d.ts +25 -26
  107. package/dist/controllers/tables/table_truncate_controller.d.ts.map +1 -1
  108. package/dist/controllers/teleport_controller.d.ts +15 -15
  109. package/dist/controllers/temporary_state_controller.d.ts +26 -27
  110. package/dist/controllers/temporary_state_controller.d.ts.map +1 -1
  111. package/dist/controllers/toggle_class_controller.d.ts +35 -35
  112. package/dist/controllers/toggle_class_controller.d.ts.map +1 -1
  113. package/dist/controllers/trix_modifier_controller.d.ts +88 -0
  114. package/dist/controllers/trix_modifier_controller.d.ts.map +1 -0
  115. package/dist/controllers/turbo_frame_rc_controller.d.ts +20 -20
  116. package/dist/controllers/turbo_frame_refresh_controller.d.ts +13 -13
  117. package/dist/controllers/utility/alert_controller.d.ts +9 -0
  118. package/dist/controllers/utility/alert_controller.d.ts.map +1 -0
  119. package/dist/controllers/utility/fullscreen_controller.d.ts +8 -0
  120. package/dist/controllers/utility/fullscreen_controller.d.ts.map +1 -0
  121. package/dist/controllers/utility/index.d.ts +9 -0
  122. package/dist/controllers/utility/index.d.ts.map +1 -0
  123. package/dist/controllers/utility/intersection_controller.d.ts +13 -13
  124. package/dist/controllers/utility/intersection_controller.d.ts.map +1 -1
  125. package/dist/controllers/utility/interval_controller.d.ts +10 -10
  126. package/dist/controllers/utility/presence_controller.d.ts +13 -11
  127. package/dist/controllers/utility/presence_controller.d.ts.map +1 -1
  128. package/dist/controllers/utility/print_controller.d.ts +4 -4
  129. package/dist/controllers/utility/timeout_controller.d.ts +9 -9
  130. package/dist/controllers/utility/user_focus_controller.d.ts +8 -8
  131. package/dist/controllers/visual/clock_controller.d.ts +15 -15
  132. package/dist/controllers/visual/countdown_controller.d.ts +45 -53
  133. package/dist/controllers/visual/countdown_controller.d.ts.map +1 -1
  134. package/dist/controllers/visual/duration_controller.d.ts +25 -26
  135. package/dist/controllers/visual/duration_controller.d.ts.map +1 -1
  136. package/dist/controllers/visual/index.d.ts +7 -0
  137. package/dist/controllers/visual/index.d.ts.map +1 -0
  138. package/dist/controllers/visual/tabs_controller.d.ts +29 -35
  139. package/dist/controllers/visual/tabs_controller.d.ts.map +1 -1
  140. package/dist/controllers/visual/time_distance_controller.d.ts +15 -16
  141. package/dist/controllers/visual/time_distance_controller.d.ts.map +1 -1
  142. package/dist/controllers/visual/tree_view_controller.d.ts +25 -29
  143. package/dist/controllers/visual/tree_view_controller.d.ts.map +1 -1
  144. package/dist/index.d.ts +3 -79
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/mixins/create_mixin.d.ts +3 -0
  147. package/dist/mixins/create_mixin.d.ts.map +1 -0
  148. package/dist/mixins/index.d.ts +9 -0
  149. package/dist/mixins/index.d.ts.map +1 -0
  150. package/dist/mixins/install_class_methods.d.ts +6 -0
  151. package/dist/mixins/install_class_methods.d.ts.map +1 -0
  152. package/dist/mixins/use_click_outside.d.ts +5 -0
  153. package/dist/mixins/use_click_outside.d.ts.map +1 -0
  154. package/dist/mixins/use_event_bus.d.ts +8 -0
  155. package/dist/mixins/use_event_bus.d.ts.map +1 -0
  156. package/dist/mixins/use_event_listener.d.ts +19 -7
  157. package/dist/mixins/use_event_listener.d.ts.map +1 -1
  158. package/dist/mixins/use_fullscreen.d.ts +9 -0
  159. package/dist/mixins/use_fullscreen.d.ts.map +1 -0
  160. package/dist/mixins/use_geolocation.d.ts +19 -0
  161. package/dist/mixins/use_geolocation.d.ts.map +1 -0
  162. package/dist/mixins/use_hover.d.ts +5 -0
  163. package/dist/mixins/use_hover.d.ts.map +1 -0
  164. package/dist/mixins/use_injected_html.d.ts +10 -10
  165. package/dist/mixins/use_injected_html.d.ts.map +1 -1
  166. package/dist/mixins/use_intersection.d.ts +14 -0
  167. package/dist/mixins/use_intersection.d.ts.map +1 -0
  168. package/dist/mixins/use_interval.d.ts +2 -2
  169. package/dist/mixins/use_interval.d.ts.map +1 -1
  170. package/dist/mixins/use_localstorage.d.ts +21 -0
  171. package/dist/mixins/use_localstorage.d.ts.map +1 -0
  172. package/dist/mixins/use_mutation_observer.d.ts +3 -0
  173. package/dist/mixins/use_mutation_observer.d.ts.map +1 -0
  174. package/dist/mixins/use_temporary_content.d.ts +6 -0
  175. package/dist/mixins/use_temporary_content.d.ts.map +1 -0
  176. package/dist/mixins/use_timeout.d.ts +2 -2
  177. package/dist/mixins/use_timeout.d.ts.map +1 -1
  178. package/dist/mixins/use_trix_modifiers.d.ts +11 -0
  179. package/dist/mixins/use_trix_modifiers.d.ts.map +1 -0
  180. package/dist/stimulus-library.cjs.js +1 -1
  181. package/dist/stimulus-library.cjs.js.map +1 -1
  182. package/dist/stimulus-library.es.js +4659 -1
  183. package/dist/stimulus-library.es.js.map +1 -1
  184. package/dist/stimulus-library.umd.js +1 -1
  185. package/dist/stimulus-library.umd.js.map +1 -1
  186. package/dist/utilities/arrays.d.ts +2 -0
  187. package/dist/utilities/arrays.d.ts.map +1 -0
  188. package/dist/utilities/base_controller.d.ts +10 -13
  189. package/dist/utilities/base_controller.d.ts.map +1 -1
  190. package/dist/utilities/elements.d.ts +48 -17
  191. package/dist/utilities/elements.d.ts.map +1 -1
  192. package/dist/utilities/ephemeral_controller.d.ts +5 -5
  193. package/dist/utilities/event_bus.d.ts +3 -3
  194. package/dist/utilities/events.d.ts +3 -0
  195. package/dist/utilities/events.d.ts.map +1 -0
  196. package/dist/utilities/fetchRetry.d.ts +2 -0
  197. package/dist/utilities/fetchRetry.d.ts.map +1 -0
  198. package/dist/utilities/index.d.ts +8 -0
  199. package/dist/utilities/index.d.ts.map +1 -0
  200. package/dist/utilities/logging.d.ts +6 -0
  201. package/dist/utilities/logging.d.ts.map +1 -0
  202. package/dist/utilities/reactive.d.ts +2 -0
  203. package/dist/utilities/reactive.d.ts.map +1 -0
  204. package/dist/utilities/request_submit.d.ts +2 -2
  205. package/dist/utilities/scroll.d.ts +10 -10
  206. package/dist/utilities/stimulus.d.ts +3 -0
  207. package/dist/utilities/stimulus.d.ts.map +1 -0
  208. package/dist/utilities/strings.d.ts +2 -0
  209. package/dist/utilities/strings.d.ts.map +1 -0
  210. package/dist/utilities/turbo.d.ts +1 -1
  211. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"stimulus-library.cjs.js","sources":["../node_modules/@stimulus/core/dist/event_listener.js","../node_modules/@stimulus/core/dist/dispatcher.js","../node_modules/@stimulus/core/dist/action_descriptor.js","../node_modules/@stimulus/core/dist/action.js","../node_modules/@stimulus/core/dist/binding.js","../node_modules/@stimulus/mutation-observers/dist/element_observer.js","../node_modules/@stimulus/mutation-observers/dist/attribute_observer.js","../node_modules/@stimulus/mutation-observers/dist/string_map_observer.js","../node_modules/@stimulus/multimap/dist/set_operations.js","../node_modules/@stimulus/multimap/dist/multimap.js","../node_modules/@stimulus/multimap/dist/indexed_multimap.js","../node_modules/@stimulus/mutation-observers/dist/token_list_observer.js","../node_modules/@stimulus/mutation-observers/dist/value_list_observer.js","../node_modules/@stimulus/core/dist/binding_observer.js","../node_modules/@stimulus/core/dist/value_observer.js","../node_modules/@stimulus/core/dist/context.js","../node_modules/@stimulus/core/dist/inheritable_statics.js","../node_modules/@stimulus/core/dist/blessing.js","../node_modules/@stimulus/core/dist/module.js","../node_modules/@stimulus/core/dist/definition.js","../node_modules/@stimulus/core/dist/class_map.js","../node_modules/@stimulus/core/dist/string_helpers.js","../node_modules/@stimulus/core/dist/data_map.js","../node_modules/@stimulus/core/dist/guide.js","../node_modules/@stimulus/core/dist/selectors.js","../node_modules/@stimulus/core/dist/target_set.js","../node_modules/@stimulus/core/dist/scope.js","../node_modules/@stimulus/core/dist/scope_observer.js","../node_modules/@stimulus/core/dist/router.js","../node_modules/@stimulus/core/dist/schema.js","../node_modules/@stimulus/core/dist/application.js","../node_modules/@stimulus/core/dist/class_properties.js","../node_modules/@stimulus/core/dist/target_properties.js","../node_modules/@stimulus/core/dist/value_properties.js","../node_modules/@stimulus/core/dist/controller.js","../src/utilities/base_controller.ts","../node_modules/camelcase/index.js","../src/utilities/ephemeral_controller.ts","../src/utilities/scroll.ts","../src/utilities/turbo.ts","../src/utilities/event_bus.ts","../node_modules/mitt/dist/mitt.mjs","../src/utilities/elements.ts","../src/utilities/request_submit.ts","../src/mixins/use_event_listener.ts","../src/mixins/use_interval.ts","../src/mixins/use_timeout.ts","../src/mixins/use_injected_html.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/ajax/load_block_controller.ts","../src/controllers/ajax/async_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../node_modules/stimulus-use/dist/support/index.js","../node_modules/stimulus-use/dist/use-intersection/use-intersection.js","../node_modules/stimulus-use/dist/use-click-outside/use-click-outside.js","../node_modules/stimulus-use/dist/stimulus-use.js","../node_modules/stimulus-use/dist/use-hover/use-hover.js","../node_modules/stimulus-use/dist/use-mutation/use-mutation.js","../node_modules/stimulus-use/dist/use-window-resize/use-window-resize.js","../node_modules/stimulus-use/dist/use-debounce/use-debounce.js","../src/controllers/back_link_controller.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_disable_inputs_controller.ts","../src/controllers/forms/checkbox_enable_inputs_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/clipboard_controller.ts","../src/controllers/visual/clock_controller.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/visual/countdown_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/visual/duration_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/media/fallback_image_controller.ts","../src/controllers/forms/focus_steal_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/utility/interval_controller.ts","../node_modules/dialog-polyfill/dist/dialog-polyfill.esm.js","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/forms/navigate_form_errors_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/ajax/poll_block_controller.ts","../src/controllers/prefetch_controller.ts","../src/controllers/utility/presence_controller.ts","../src/controllers/utility/print_controller.ts","../src/controllers/print_button_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/controllers/scroll/scroll_container_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/forms/sync_inputs_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/visual/tabs_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/temporary_state_controller.ts","../src/controllers/visual/time_distance_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/toggle_class_controller.ts","../src/controllers/visual/tree_view_controller.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts","../src/controllers/forms/value_warn_controller.ts","../src/controllers/forms/word_count_controller.ts","../src/controllers/forms/autosize_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/ajax/lazy_block_controller.ts","../src/controllers/utility/user_focus_controller.ts"],"sourcesContent":["var EventListener = /** @class */ (function () {\n function EventListener(eventTarget, eventName, eventOptions) {\n this.eventTarget = eventTarget;\n this.eventName = eventName;\n this.eventOptions = eventOptions;\n this.unorderedBindings = new Set();\n }\n EventListener.prototype.connect = function () {\n this.eventTarget.addEventListener(this.eventName, this, this.eventOptions);\n };\n EventListener.prototype.disconnect = function () {\n this.eventTarget.removeEventListener(this.eventName, this, this.eventOptions);\n };\n // Binding observer delegate\n /** @hidden */\n EventListener.prototype.bindingConnected = function (binding) {\n this.unorderedBindings.add(binding);\n };\n /** @hidden */\n EventListener.prototype.bindingDisconnected = function (binding) {\n this.unorderedBindings.delete(binding);\n };\n EventListener.prototype.handleEvent = function (event) {\n var extendedEvent = extendEvent(event);\n for (var _i = 0, _a = this.bindings; _i < _a.length; _i++) {\n var binding = _a[_i];\n if (extendedEvent.immediatePropagationStopped) {\n break;\n }\n else {\n binding.handleEvent(extendedEvent);\n }\n }\n };\n Object.defineProperty(EventListener.prototype, \"bindings\", {\n get: function () {\n return Array.from(this.unorderedBindings).sort(function (left, right) {\n var leftIndex = left.index, rightIndex = right.index;\n return leftIndex < rightIndex ? -1 : leftIndex > rightIndex ? 1 : 0;\n });\n },\n enumerable: false,\n configurable: true\n });\n return EventListener;\n}());\nexport { EventListener };\nfunction extendEvent(event) {\n if (\"immediatePropagationStopped\" in event) {\n return event;\n }\n else {\n var stopImmediatePropagation_1 = event.stopImmediatePropagation;\n return Object.assign(event, {\n immediatePropagationStopped: false,\n stopImmediatePropagation: function () {\n this.immediatePropagationStopped = true;\n stopImmediatePropagation_1.call(this);\n }\n });\n }\n}\n//# sourceMappingURL=event_listener.js.map","import { EventListener } from \"./event_listener\";\nvar Dispatcher = /** @class */ (function () {\n function Dispatcher(application) {\n this.application = application;\n this.eventListenerMaps = new Map;\n this.started = false;\n }\n Dispatcher.prototype.start = function () {\n if (!this.started) {\n this.started = true;\n this.eventListeners.forEach(function (eventListener) { return eventListener.connect(); });\n }\n };\n Dispatcher.prototype.stop = function () {\n if (this.started) {\n this.started = false;\n this.eventListeners.forEach(function (eventListener) { return eventListener.disconnect(); });\n }\n };\n Object.defineProperty(Dispatcher.prototype, \"eventListeners\", {\n get: function () {\n return Array.from(this.eventListenerMaps.values())\n .reduce(function (listeners, map) { return listeners.concat(Array.from(map.values())); }, []);\n },\n enumerable: false,\n configurable: true\n });\n // Binding observer delegate\n /** @hidden */\n Dispatcher.prototype.bindingConnected = function (binding) {\n this.fetchEventListenerForBinding(binding).bindingConnected(binding);\n };\n /** @hidden */\n Dispatcher.prototype.bindingDisconnected = function (binding) {\n this.fetchEventListenerForBinding(binding).bindingDisconnected(binding);\n };\n // Error handling\n Dispatcher.prototype.handleError = function (error, message, detail) {\n if (detail === void 0) { detail = {}; }\n this.application.handleError(error, \"Error \" + message, detail);\n };\n Dispatcher.prototype.fetchEventListenerForBinding = function (binding) {\n var eventTarget = binding.eventTarget, eventName = binding.eventName, eventOptions = binding.eventOptions;\n return this.fetchEventListener(eventTarget, eventName, eventOptions);\n };\n Dispatcher.prototype.fetchEventListener = function (eventTarget, eventName, eventOptions) {\n var eventListenerMap = this.fetchEventListenerMapForEventTarget(eventTarget);\n var cacheKey = this.cacheKey(eventName, eventOptions);\n var eventListener = eventListenerMap.get(cacheKey);\n if (!eventListener) {\n eventListener = this.createEventListener(eventTarget, eventName, eventOptions);\n eventListenerMap.set(cacheKey, eventListener);\n }\n return eventListener;\n };\n Dispatcher.prototype.createEventListener = function (eventTarget, eventName, eventOptions) {\n var eventListener = new EventListener(eventTarget, eventName, eventOptions);\n if (this.started) {\n eventListener.connect();\n }\n return eventListener;\n };\n Dispatcher.prototype.fetchEventListenerMapForEventTarget = function (eventTarget) {\n var eventListenerMap = this.eventListenerMaps.get(eventTarget);\n if (!eventListenerMap) {\n eventListenerMap = new Map;\n this.eventListenerMaps.set(eventTarget, eventListenerMap);\n }\n return eventListenerMap;\n };\n Dispatcher.prototype.cacheKey = function (eventName, eventOptions) {\n var parts = [eventName];\n Object.keys(eventOptions).sort().forEach(function (key) {\n parts.push(\"\" + (eventOptions[key] ? \"\" : \"!\") + key);\n });\n return parts.join(\":\");\n };\n return Dispatcher;\n}());\nexport { Dispatcher };\n//# sourceMappingURL=dispatcher.js.map","// capture nos.: 12 23 4 43 1 5 56 7 768 9 98\nvar descriptorPattern = /^((.+?)(@(window|document))?->)?(.+?)(#([^:]+?))(:(.+))?$/;\nexport function parseActionDescriptorString(descriptorString) {\n var source = descriptorString.trim();\n var matches = source.match(descriptorPattern) || [];\n return {\n eventTarget: parseEventTarget(matches[4]),\n eventName: matches[2],\n eventOptions: matches[9] ? parseEventOptions(matches[9]) : {},\n identifier: matches[5],\n methodName: matches[7]\n };\n}\nfunction parseEventTarget(eventTargetName) {\n if (eventTargetName == \"window\") {\n return window;\n }\n else if (eventTargetName == \"document\") {\n return document;\n }\n}\nfunction parseEventOptions(eventOptions) {\n return eventOptions.split(\":\").reduce(function (options, token) {\n var _a;\n return Object.assign(options, (_a = {}, _a[token.replace(/^!/, \"\")] = !/^!/.test(token), _a));\n }, {});\n}\nexport function stringifyEventTarget(eventTarget) {\n if (eventTarget == window) {\n return \"window\";\n }\n else if (eventTarget == document) {\n return \"document\";\n }\n}\n//# sourceMappingURL=action_descriptor.js.map","import { parseActionDescriptorString, stringifyEventTarget } from \"./action_descriptor\";\nvar Action = /** @class */ (function () {\n function Action(element, index, descriptor) {\n this.element = element;\n this.index = index;\n this.eventTarget = descriptor.eventTarget || element;\n this.eventName = descriptor.eventName || getDefaultEventNameForElement(element) || error(\"missing event name\");\n this.eventOptions = descriptor.eventOptions || {};\n this.identifier = descriptor.identifier || error(\"missing identifier\");\n this.methodName = descriptor.methodName || error(\"missing method name\");\n }\n Action.forToken = function (token) {\n return new this(token.element, token.index, parseActionDescriptorString(token.content));\n };\n Action.prototype.toString = function () {\n var eventNameSuffix = this.eventTargetName ? \"@\" + this.eventTargetName : \"\";\n return \"\" + this.eventName + eventNameSuffix + \"->\" + this.identifier + \"#\" + this.methodName;\n };\n Object.defineProperty(Action.prototype, \"eventTargetName\", {\n get: function () {\n return stringifyEventTarget(this.eventTarget);\n },\n enumerable: false,\n configurable: true\n });\n return Action;\n}());\nexport { Action };\nvar defaultEventNames = {\n \"a\": function (e) { return \"click\"; },\n \"button\": function (e) { return \"click\"; },\n \"form\": function (e) { return \"submit\"; },\n \"input\": function (e) { return e.getAttribute(\"type\") == \"submit\" ? \"click\" : \"input\"; },\n \"select\": function (e) { return \"change\"; },\n \"textarea\": function (e) { return \"input\"; }\n};\nexport function getDefaultEventNameForElement(element) {\n var tagName = element.tagName.toLowerCase();\n if (tagName in defaultEventNames) {\n return defaultEventNames[tagName](element);\n }\n}\nfunction error(message) {\n throw new Error(message);\n}\n//# sourceMappingURL=action.js.map","var Binding = /** @class */ (function () {\n function Binding(context, action) {\n this.context = context;\n this.action = action;\n }\n Object.defineProperty(Binding.prototype, \"index\", {\n get: function () {\n return this.action.index;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"eventTarget\", {\n get: function () {\n return this.action.eventTarget;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"eventOptions\", {\n get: function () {\n return this.action.eventOptions;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"identifier\", {\n get: function () {\n return this.context.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Binding.prototype.handleEvent = function (event) {\n if (this.willBeInvokedByEvent(event)) {\n this.invokeWithEvent(event);\n }\n };\n Object.defineProperty(Binding.prototype, \"eventName\", {\n get: function () {\n return this.action.eventName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"method\", {\n get: function () {\n var method = this.controller[this.methodName];\n if (typeof method == \"function\") {\n return method;\n }\n throw new Error(\"Action \\\"\" + this.action + \"\\\" references undefined method \\\"\" + this.methodName + \"\\\"\");\n },\n enumerable: false,\n configurable: true\n });\n Binding.prototype.invokeWithEvent = function (event) {\n try {\n this.method.call(this.controller, event);\n }\n catch (error) {\n var _a = this, identifier = _a.identifier, controller = _a.controller, element = _a.element, index = _a.index;\n var detail = { identifier: identifier, controller: controller, element: element, index: index, event: event };\n this.context.handleError(error, \"invoking action \\\"\" + this.action + \"\\\"\", detail);\n }\n };\n Binding.prototype.willBeInvokedByEvent = function (event) {\n var eventTarget = event.target;\n if (this.element === eventTarget) {\n return true;\n }\n else if (eventTarget instanceof Element && this.element.contains(eventTarget)) {\n return this.scope.containsElement(eventTarget);\n }\n else {\n return this.scope.containsElement(this.action.element);\n }\n };\n Object.defineProperty(Binding.prototype, \"controller\", {\n get: function () {\n return this.context.controller;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"methodName\", {\n get: function () {\n return this.action.methodName;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"element\", {\n get: function () {\n return this.scope.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Binding.prototype, \"scope\", {\n get: function () {\n return this.context.scope;\n },\n enumerable: false,\n configurable: true\n });\n return Binding;\n}());\nexport { Binding };\n//# sourceMappingURL=binding.js.map","var ElementObserver = /** @class */ (function () {\n function ElementObserver(element, delegate) {\n var _this = this;\n this.element = element;\n this.started = false;\n this.delegate = delegate;\n this.elements = new Set;\n this.mutationObserver = new MutationObserver(function (mutations) { return _this.processMutations(mutations); });\n }\n ElementObserver.prototype.start = function () {\n if (!this.started) {\n this.started = true;\n this.mutationObserver.observe(this.element, { attributes: true, childList: true, subtree: true });\n this.refresh();\n }\n };\n ElementObserver.prototype.stop = function () {\n if (this.started) {\n this.mutationObserver.takeRecords();\n this.mutationObserver.disconnect();\n this.started = false;\n }\n };\n ElementObserver.prototype.refresh = function () {\n if (this.started) {\n var matches = new Set(this.matchElementsInTree());\n for (var _i = 0, _a = Array.from(this.elements); _i < _a.length; _i++) {\n var element = _a[_i];\n if (!matches.has(element)) {\n this.removeElement(element);\n }\n }\n for (var _b = 0, _c = Array.from(matches); _b < _c.length; _b++) {\n var element = _c[_b];\n this.addElement(element);\n }\n }\n };\n // Mutation record processing\n ElementObserver.prototype.processMutations = function (mutations) {\n if (this.started) {\n for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {\n var mutation = mutations_1[_i];\n this.processMutation(mutation);\n }\n }\n };\n ElementObserver.prototype.processMutation = function (mutation) {\n if (mutation.type == \"attributes\") {\n this.processAttributeChange(mutation.target, mutation.attributeName);\n }\n else if (mutation.type == \"childList\") {\n this.processRemovedNodes(mutation.removedNodes);\n this.processAddedNodes(mutation.addedNodes);\n }\n };\n ElementObserver.prototype.processAttributeChange = function (node, attributeName) {\n var element = node;\n if (this.elements.has(element)) {\n if (this.delegate.elementAttributeChanged && this.matchElement(element)) {\n this.delegate.elementAttributeChanged(element, attributeName);\n }\n else {\n this.removeElement(element);\n }\n }\n else if (this.matchElement(element)) {\n this.addElement(element);\n }\n };\n ElementObserver.prototype.processRemovedNodes = function (nodes) {\n for (var _i = 0, _a = Array.from(nodes); _i < _a.length; _i++) {\n var node = _a[_i];\n var element = this.elementFromNode(node);\n if (element) {\n this.processTree(element, this.removeElement);\n }\n }\n };\n ElementObserver.prototype.processAddedNodes = function (nodes) {\n for (var _i = 0, _a = Array.from(nodes); _i < _a.length; _i++) {\n var node = _a[_i];\n var element = this.elementFromNode(node);\n if (element && this.elementIsActive(element)) {\n this.processTree(element, this.addElement);\n }\n }\n };\n // Element matching\n ElementObserver.prototype.matchElement = function (element) {\n return this.delegate.matchElement(element);\n };\n ElementObserver.prototype.matchElementsInTree = function (tree) {\n if (tree === void 0) { tree = this.element; }\n return this.delegate.matchElementsInTree(tree);\n };\n ElementObserver.prototype.processTree = function (tree, processor) {\n for (var _i = 0, _a = this.matchElementsInTree(tree); _i < _a.length; _i++) {\n var element = _a[_i];\n processor.call(this, element);\n }\n };\n ElementObserver.prototype.elementFromNode = function (node) {\n if (node.nodeType == Node.ELEMENT_NODE) {\n return node;\n }\n };\n ElementObserver.prototype.elementIsActive = function (element) {\n if (element.isConnected != this.element.isConnected) {\n return false;\n }\n else {\n return this.element.contains(element);\n }\n };\n // Element tracking\n ElementObserver.prototype.addElement = function (element) {\n if (!this.elements.has(element)) {\n if (this.elementIsActive(element)) {\n this.elements.add(element);\n if (this.delegate.elementMatched) {\n this.delegate.elementMatched(element);\n }\n }\n }\n };\n ElementObserver.prototype.removeElement = function (element) {\n if (this.elements.has(element)) {\n this.elements.delete(element);\n if (this.delegate.elementUnmatched) {\n this.delegate.elementUnmatched(element);\n }\n }\n };\n return ElementObserver;\n}());\nexport { ElementObserver };\n//# sourceMappingURL=element_observer.js.map","import { ElementObserver } from \"./element_observer\";\nvar AttributeObserver = /** @class */ (function () {\n function AttributeObserver(element, attributeName, delegate) {\n this.attributeName = attributeName;\n this.delegate = delegate;\n this.elementObserver = new ElementObserver(element, this);\n }\n Object.defineProperty(AttributeObserver.prototype, \"element\", {\n get: function () {\n return this.elementObserver.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(AttributeObserver.prototype, \"selector\", {\n get: function () {\n return \"[\" + this.attributeName + \"]\";\n },\n enumerable: false,\n configurable: true\n });\n AttributeObserver.prototype.start = function () {\n this.elementObserver.start();\n };\n AttributeObserver.prototype.stop = function () {\n this.elementObserver.stop();\n };\n AttributeObserver.prototype.refresh = function () {\n this.elementObserver.refresh();\n };\n Object.defineProperty(AttributeObserver.prototype, \"started\", {\n get: function () {\n return this.elementObserver.started;\n },\n enumerable: false,\n configurable: true\n });\n // Element observer delegate\n AttributeObserver.prototype.matchElement = function (element) {\n return element.hasAttribute(this.attributeName);\n };\n AttributeObserver.prototype.matchElementsInTree = function (tree) {\n var match = this.matchElement(tree) ? [tree] : [];\n var matches = Array.from(tree.querySelectorAll(this.selector));\n return match.concat(matches);\n };\n AttributeObserver.prototype.elementMatched = function (element) {\n if (this.delegate.elementMatchedAttribute) {\n this.delegate.elementMatchedAttribute(element, this.attributeName);\n }\n };\n AttributeObserver.prototype.elementUnmatched = function (element) {\n if (this.delegate.elementUnmatchedAttribute) {\n this.delegate.elementUnmatchedAttribute(element, this.attributeName);\n }\n };\n AttributeObserver.prototype.elementAttributeChanged = function (element, attributeName) {\n if (this.delegate.elementAttributeValueChanged && this.attributeName == attributeName) {\n this.delegate.elementAttributeValueChanged(element, attributeName);\n }\n };\n return AttributeObserver;\n}());\nexport { AttributeObserver };\n//# sourceMappingURL=attribute_observer.js.map","var StringMapObserver = /** @class */ (function () {\n function StringMapObserver(element, delegate) {\n var _this = this;\n this.element = element;\n this.delegate = delegate;\n this.started = false;\n this.stringMap = new Map;\n this.mutationObserver = new MutationObserver(function (mutations) { return _this.processMutations(mutations); });\n }\n StringMapObserver.prototype.start = function () {\n if (!this.started) {\n this.started = true;\n this.mutationObserver.observe(this.element, { attributes: true });\n this.refresh();\n }\n };\n StringMapObserver.prototype.stop = function () {\n if (this.started) {\n this.mutationObserver.takeRecords();\n this.mutationObserver.disconnect();\n this.started = false;\n }\n };\n StringMapObserver.prototype.refresh = function () {\n if (this.started) {\n for (var _i = 0, _a = this.knownAttributeNames; _i < _a.length; _i++) {\n var attributeName = _a[_i];\n this.refreshAttribute(attributeName);\n }\n }\n };\n // Mutation record processing\n StringMapObserver.prototype.processMutations = function (mutations) {\n if (this.started) {\n for (var _i = 0, mutations_1 = mutations; _i < mutations_1.length; _i++) {\n var mutation = mutations_1[_i];\n this.processMutation(mutation);\n }\n }\n };\n StringMapObserver.prototype.processMutation = function (mutation) {\n var attributeName = mutation.attributeName;\n if (attributeName) {\n this.refreshAttribute(attributeName);\n }\n };\n // State tracking\n StringMapObserver.prototype.refreshAttribute = function (attributeName) {\n var key = this.delegate.getStringMapKeyForAttribute(attributeName);\n if (key != null) {\n if (!this.stringMap.has(attributeName)) {\n this.stringMapKeyAdded(key, attributeName);\n }\n var value = this.element.getAttribute(attributeName);\n if (this.stringMap.get(attributeName) != value) {\n this.stringMapValueChanged(value, key);\n }\n if (value == null) {\n this.stringMap.delete(attributeName);\n this.stringMapKeyRemoved(key, attributeName);\n }\n else {\n this.stringMap.set(attributeName, value);\n }\n }\n };\n StringMapObserver.prototype.stringMapKeyAdded = function (key, attributeName) {\n if (this.delegate.stringMapKeyAdded) {\n this.delegate.stringMapKeyAdded(key, attributeName);\n }\n };\n StringMapObserver.prototype.stringMapValueChanged = function (value, key) {\n if (this.delegate.stringMapValueChanged) {\n this.delegate.stringMapValueChanged(value, key);\n }\n };\n StringMapObserver.prototype.stringMapKeyRemoved = function (key, attributeName) {\n if (this.delegate.stringMapKeyRemoved) {\n this.delegate.stringMapKeyRemoved(key, attributeName);\n }\n };\n Object.defineProperty(StringMapObserver.prototype, \"knownAttributeNames\", {\n get: function () {\n return Array.from(new Set(this.currentAttributeNames.concat(this.recordedAttributeNames)));\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StringMapObserver.prototype, \"currentAttributeNames\", {\n get: function () {\n return Array.from(this.element.attributes).map(function (attribute) { return attribute.name; });\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(StringMapObserver.prototype, \"recordedAttributeNames\", {\n get: function () {\n return Array.from(this.stringMap.keys());\n },\n enumerable: false,\n configurable: true\n });\n return StringMapObserver;\n}());\nexport { StringMapObserver };\n//# sourceMappingURL=string_map_observer.js.map","export function add(map, key, value) {\n fetch(map, key).add(value);\n}\nexport function del(map, key, value) {\n fetch(map, key).delete(value);\n prune(map, key);\n}\nexport function fetch(map, key) {\n var values = map.get(key);\n if (!values) {\n values = new Set();\n map.set(key, values);\n }\n return values;\n}\nexport function prune(map, key) {\n var values = map.get(key);\n if (values != null && values.size == 0) {\n map.delete(key);\n }\n}\n//# sourceMappingURL=set_operations.js.map","import { add, del } from \"./set_operations\";\nvar Multimap = /** @class */ (function () {\n function Multimap() {\n this.valuesByKey = new Map();\n }\n Object.defineProperty(Multimap.prototype, \"values\", {\n get: function () {\n var sets = Array.from(this.valuesByKey.values());\n return sets.reduce(function (values, set) { return values.concat(Array.from(set)); }, []);\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Multimap.prototype, \"size\", {\n get: function () {\n var sets = Array.from(this.valuesByKey.values());\n return sets.reduce(function (size, set) { return size + set.size; }, 0);\n },\n enumerable: false,\n configurable: true\n });\n Multimap.prototype.add = function (key, value) {\n add(this.valuesByKey, key, value);\n };\n Multimap.prototype.delete = function (key, value) {\n del(this.valuesByKey, key, value);\n };\n Multimap.prototype.has = function (key, value) {\n var values = this.valuesByKey.get(key);\n return values != null && values.has(value);\n };\n Multimap.prototype.hasKey = function (key) {\n return this.valuesByKey.has(key);\n };\n Multimap.prototype.hasValue = function (value) {\n var sets = Array.from(this.valuesByKey.values());\n return sets.some(function (set) { return set.has(value); });\n };\n Multimap.prototype.getValuesForKey = function (key) {\n var values = this.valuesByKey.get(key);\n return values ? Array.from(values) : [];\n };\n Multimap.prototype.getKeysForValue = function (value) {\n return Array.from(this.valuesByKey)\n .filter(function (_a) {\n var key = _a[0], values = _a[1];\n return values.has(value);\n })\n .map(function (_a) {\n var key = _a[0], values = _a[1];\n return key;\n });\n };\n return Multimap;\n}());\nexport { Multimap };\n//# sourceMappingURL=multimap.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { Multimap } from \"./multimap\";\nimport { add, del } from \"./set_operations\";\nvar IndexedMultimap = /** @class */ (function (_super) {\n __extends(IndexedMultimap, _super);\n function IndexedMultimap() {\n var _this = _super.call(this) || this;\n _this.keysByValue = new Map;\n return _this;\n }\n Object.defineProperty(IndexedMultimap.prototype, \"values\", {\n get: function () {\n return Array.from(this.keysByValue.keys());\n },\n enumerable: false,\n configurable: true\n });\n IndexedMultimap.prototype.add = function (key, value) {\n _super.prototype.add.call(this, key, value);\n add(this.keysByValue, value, key);\n };\n IndexedMultimap.prototype.delete = function (key, value) {\n _super.prototype.delete.call(this, key, value);\n del(this.keysByValue, value, key);\n };\n IndexedMultimap.prototype.hasValue = function (value) {\n return this.keysByValue.has(value);\n };\n IndexedMultimap.prototype.getKeysForValue = function (value) {\n var set = this.keysByValue.get(value);\n return set ? Array.from(set) : [];\n };\n return IndexedMultimap;\n}(Multimap));\nexport { IndexedMultimap };\n//# sourceMappingURL=indexed_multimap.js.map","import { AttributeObserver } from \"./attribute_observer\";\nimport { Multimap } from \"@stimulus/multimap\";\nvar TokenListObserver = /** @class */ (function () {\n function TokenListObserver(element, attributeName, delegate) {\n this.attributeObserver = new AttributeObserver(element, attributeName, this);\n this.delegate = delegate;\n this.tokensByElement = new Multimap;\n }\n Object.defineProperty(TokenListObserver.prototype, \"started\", {\n get: function () {\n return this.attributeObserver.started;\n },\n enumerable: false,\n configurable: true\n });\n TokenListObserver.prototype.start = function () {\n this.attributeObserver.start();\n };\n TokenListObserver.prototype.stop = function () {\n this.attributeObserver.stop();\n };\n TokenListObserver.prototype.refresh = function () {\n this.attributeObserver.refresh();\n };\n Object.defineProperty(TokenListObserver.prototype, \"element\", {\n get: function () {\n return this.attributeObserver.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TokenListObserver.prototype, \"attributeName\", {\n get: function () {\n return this.attributeObserver.attributeName;\n },\n enumerable: false,\n configurable: true\n });\n // Attribute observer delegate\n TokenListObserver.prototype.elementMatchedAttribute = function (element) {\n this.tokensMatched(this.readTokensForElement(element));\n };\n TokenListObserver.prototype.elementAttributeValueChanged = function (element) {\n var _a = this.refreshTokensForElement(element), unmatchedTokens = _a[0], matchedTokens = _a[1];\n this.tokensUnmatched(unmatchedTokens);\n this.tokensMatched(matchedTokens);\n };\n TokenListObserver.prototype.elementUnmatchedAttribute = function (element) {\n this.tokensUnmatched(this.tokensByElement.getValuesForKey(element));\n };\n TokenListObserver.prototype.tokensMatched = function (tokens) {\n var _this = this;\n tokens.forEach(function (token) { return _this.tokenMatched(token); });\n };\n TokenListObserver.prototype.tokensUnmatched = function (tokens) {\n var _this = this;\n tokens.forEach(function (token) { return _this.tokenUnmatched(token); });\n };\n TokenListObserver.prototype.tokenMatched = function (token) {\n this.delegate.tokenMatched(token);\n this.tokensByElement.add(token.element, token);\n };\n TokenListObserver.prototype.tokenUnmatched = function (token) {\n this.delegate.tokenUnmatched(token);\n this.tokensByElement.delete(token.element, token);\n };\n TokenListObserver.prototype.refreshTokensForElement = function (element) {\n var previousTokens = this.tokensByElement.getValuesForKey(element);\n var currentTokens = this.readTokensForElement(element);\n var firstDifferingIndex = zip(previousTokens, currentTokens)\n .findIndex(function (_a) {\n var previousToken = _a[0], currentToken = _a[1];\n return !tokensAreEqual(previousToken, currentToken);\n });\n if (firstDifferingIndex == -1) {\n return [[], []];\n }\n else {\n return [previousTokens.slice(firstDifferingIndex), currentTokens.slice(firstDifferingIndex)];\n }\n };\n TokenListObserver.prototype.readTokensForElement = function (element) {\n var attributeName = this.attributeName;\n var tokenString = element.getAttribute(attributeName) || \"\";\n return parseTokenString(tokenString, element, attributeName);\n };\n return TokenListObserver;\n}());\nexport { TokenListObserver };\nfunction parseTokenString(tokenString, element, attributeName) {\n return tokenString.trim().split(/\\s+/).filter(function (content) { return content.length; })\n .map(function (content, index) { return ({ element: element, attributeName: attributeName, content: content, index: index }); });\n}\nfunction zip(left, right) {\n var length = Math.max(left.length, right.length);\n return Array.from({ length: length }, function (_, index) { return [left[index], right[index]]; });\n}\nfunction tokensAreEqual(left, right) {\n return left && right && left.index == right.index && left.content == right.content;\n}\n//# sourceMappingURL=token_list_observer.js.map","import { TokenListObserver } from \"./token_list_observer\";\nvar ValueListObserver = /** @class */ (function () {\n function ValueListObserver(element, attributeName, delegate) {\n this.tokenListObserver = new TokenListObserver(element, attributeName, this);\n this.delegate = delegate;\n this.parseResultsByToken = new WeakMap;\n this.valuesByTokenByElement = new WeakMap;\n }\n Object.defineProperty(ValueListObserver.prototype, \"started\", {\n get: function () {\n return this.tokenListObserver.started;\n },\n enumerable: false,\n configurable: true\n });\n ValueListObserver.prototype.start = function () {\n this.tokenListObserver.start();\n };\n ValueListObserver.prototype.stop = function () {\n this.tokenListObserver.stop();\n };\n ValueListObserver.prototype.refresh = function () {\n this.tokenListObserver.refresh();\n };\n Object.defineProperty(ValueListObserver.prototype, \"element\", {\n get: function () {\n return this.tokenListObserver.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ValueListObserver.prototype, \"attributeName\", {\n get: function () {\n return this.tokenListObserver.attributeName;\n },\n enumerable: false,\n configurable: true\n });\n ValueListObserver.prototype.tokenMatched = function (token) {\n var element = token.element;\n var value = this.fetchParseResultForToken(token).value;\n if (value) {\n this.fetchValuesByTokenForElement(element).set(token, value);\n this.delegate.elementMatchedValue(element, value);\n }\n };\n ValueListObserver.prototype.tokenUnmatched = function (token) {\n var element = token.element;\n var value = this.fetchParseResultForToken(token).value;\n if (value) {\n this.fetchValuesByTokenForElement(element).delete(token);\n this.delegate.elementUnmatchedValue(element, value);\n }\n };\n ValueListObserver.prototype.fetchParseResultForToken = function (token) {\n var parseResult = this.parseResultsByToken.get(token);\n if (!parseResult) {\n parseResult = this.parseToken(token);\n this.parseResultsByToken.set(token, parseResult);\n }\n return parseResult;\n };\n ValueListObserver.prototype.fetchValuesByTokenForElement = function (element) {\n var valuesByToken = this.valuesByTokenByElement.get(element);\n if (!valuesByToken) {\n valuesByToken = new Map;\n this.valuesByTokenByElement.set(element, valuesByToken);\n }\n return valuesByToken;\n };\n ValueListObserver.prototype.parseToken = function (token) {\n try {\n var value = this.delegate.parseValueForToken(token);\n return { value: value };\n }\n catch (error) {\n return { error: error };\n }\n };\n return ValueListObserver;\n}());\nexport { ValueListObserver };\n//# sourceMappingURL=value_list_observer.js.map","import { Action } from \"./action\";\nimport { Binding } from \"./binding\";\nimport { ValueListObserver } from \"@stimulus/mutation-observers\";\nvar BindingObserver = /** @class */ (function () {\n function BindingObserver(context, delegate) {\n this.context = context;\n this.delegate = delegate;\n this.bindingsByAction = new Map;\n }\n BindingObserver.prototype.start = function () {\n if (!this.valueListObserver) {\n this.valueListObserver = new ValueListObserver(this.element, this.actionAttribute, this);\n this.valueListObserver.start();\n }\n };\n BindingObserver.prototype.stop = function () {\n if (this.valueListObserver) {\n this.valueListObserver.stop();\n delete this.valueListObserver;\n this.disconnectAllActions();\n }\n };\n Object.defineProperty(BindingObserver.prototype, \"element\", {\n get: function () {\n return this.context.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BindingObserver.prototype, \"identifier\", {\n get: function () {\n return this.context.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BindingObserver.prototype, \"actionAttribute\", {\n get: function () {\n return this.schema.actionAttribute;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BindingObserver.prototype, \"schema\", {\n get: function () {\n return this.context.schema;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(BindingObserver.prototype, \"bindings\", {\n get: function () {\n return Array.from(this.bindingsByAction.values());\n },\n enumerable: false,\n configurable: true\n });\n BindingObserver.prototype.connectAction = function (action) {\n var binding = new Binding(this.context, action);\n this.bindingsByAction.set(action, binding);\n this.delegate.bindingConnected(binding);\n };\n BindingObserver.prototype.disconnectAction = function (action) {\n var binding = this.bindingsByAction.get(action);\n if (binding) {\n this.bindingsByAction.delete(action);\n this.delegate.bindingDisconnected(binding);\n }\n };\n BindingObserver.prototype.disconnectAllActions = function () {\n var _this = this;\n this.bindings.forEach(function (binding) { return _this.delegate.bindingDisconnected(binding); });\n this.bindingsByAction.clear();\n };\n // Value observer delegate\n BindingObserver.prototype.parseValueForToken = function (token) {\n var action = Action.forToken(token);\n if (action.identifier == this.identifier) {\n return action;\n }\n };\n BindingObserver.prototype.elementMatchedValue = function (element, action) {\n this.connectAction(action);\n };\n BindingObserver.prototype.elementUnmatchedValue = function (element, action) {\n this.disconnectAction(action);\n };\n return BindingObserver;\n}());\nexport { BindingObserver };\n//# sourceMappingURL=binding_observer.js.map","import { StringMapObserver } from \"@stimulus/mutation-observers\";\nvar ValueObserver = /** @class */ (function () {\n function ValueObserver(context, receiver) {\n this.context = context;\n this.receiver = receiver;\n this.stringMapObserver = new StringMapObserver(this.element, this);\n this.valueDescriptorMap = this.controller.valueDescriptorMap;\n this.invokeChangedCallbacksForDefaultValues();\n }\n ValueObserver.prototype.start = function () {\n this.stringMapObserver.start();\n };\n ValueObserver.prototype.stop = function () {\n this.stringMapObserver.stop();\n };\n Object.defineProperty(ValueObserver.prototype, \"element\", {\n get: function () {\n return this.context.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(ValueObserver.prototype, \"controller\", {\n get: function () {\n return this.context.controller;\n },\n enumerable: false,\n configurable: true\n });\n // String map observer delegate\n ValueObserver.prototype.getStringMapKeyForAttribute = function (attributeName) {\n if (attributeName in this.valueDescriptorMap) {\n return this.valueDescriptorMap[attributeName].name;\n }\n };\n ValueObserver.prototype.stringMapValueChanged = function (attributeValue, name) {\n this.invokeChangedCallbackForValue(name);\n };\n ValueObserver.prototype.invokeChangedCallbacksForDefaultValues = function () {\n for (var _i = 0, _a = this.valueDescriptors; _i < _a.length; _i++) {\n var _b = _a[_i], key = _b.key, name_1 = _b.name, defaultValue = _b.defaultValue;\n if (defaultValue != undefined && !this.controller.data.has(key)) {\n this.invokeChangedCallbackForValue(name_1);\n }\n }\n };\n ValueObserver.prototype.invokeChangedCallbackForValue = function (name) {\n var methodName = name + \"Changed\";\n var method = this.receiver[methodName];\n if (typeof method == \"function\") {\n var value = this.receiver[name];\n method.call(this.receiver, value);\n }\n };\n Object.defineProperty(ValueObserver.prototype, \"valueDescriptors\", {\n get: function () {\n var valueDescriptorMap = this.valueDescriptorMap;\n return Object.keys(valueDescriptorMap).map(function (key) { return valueDescriptorMap[key]; });\n },\n enumerable: false,\n configurable: true\n });\n return ValueObserver;\n}());\nexport { ValueObserver };\n//# sourceMappingURL=value_observer.js.map","import { BindingObserver } from \"./binding_observer\";\nimport { ValueObserver } from \"./value_observer\";\nvar Context = /** @class */ (function () {\n function Context(module, scope) {\n this.module = module;\n this.scope = scope;\n this.controller = new module.controllerConstructor(this);\n this.bindingObserver = new BindingObserver(this, this.dispatcher);\n this.valueObserver = new ValueObserver(this, this.controller);\n try {\n this.controller.initialize();\n }\n catch (error) {\n this.handleError(error, \"initializing controller\");\n }\n }\n Context.prototype.connect = function () {\n this.bindingObserver.start();\n this.valueObserver.start();\n try {\n this.controller.connect();\n }\n catch (error) {\n this.handleError(error, \"connecting controller\");\n }\n };\n Context.prototype.disconnect = function () {\n try {\n this.controller.disconnect();\n }\n catch (error) {\n this.handleError(error, \"disconnecting controller\");\n }\n this.valueObserver.stop();\n this.bindingObserver.stop();\n };\n Object.defineProperty(Context.prototype, \"application\", {\n get: function () {\n return this.module.application;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Context.prototype, \"identifier\", {\n get: function () {\n return this.module.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Context.prototype, \"schema\", {\n get: function () {\n return this.application.schema;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Context.prototype, \"dispatcher\", {\n get: function () {\n return this.application.dispatcher;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Context.prototype, \"element\", {\n get: function () {\n return this.scope.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Context.prototype, \"parentElement\", {\n get: function () {\n return this.element.parentElement;\n },\n enumerable: false,\n configurable: true\n });\n // Error handling\n Context.prototype.handleError = function (error, message, detail) {\n if (detail === void 0) { detail = {}; }\n var _a = this, identifier = _a.identifier, controller = _a.controller, element = _a.element;\n detail = Object.assign({ identifier: identifier, controller: controller, element: element }, detail);\n this.application.handleError(error, \"Error \" + message, detail);\n };\n return Context;\n}());\nexport { Context };\n//# sourceMappingURL=context.js.map","export function readInheritableStaticArrayValues(constructor, propertyName) {\n var ancestors = getAncestorsForConstructor(constructor);\n return Array.from(ancestors.reduce(function (values, constructor) {\n getOwnStaticArrayValues(constructor, propertyName).forEach(function (name) { return values.add(name); });\n return values;\n }, new Set));\n}\nexport function readInheritableStaticObjectPairs(constructor, propertyName) {\n var ancestors = getAncestorsForConstructor(constructor);\n return ancestors.reduce(function (pairs, constructor) {\n pairs.push.apply(pairs, getOwnStaticObjectPairs(constructor, propertyName));\n return pairs;\n }, []);\n}\nfunction getAncestorsForConstructor(constructor) {\n var ancestors = [];\n while (constructor) {\n ancestors.push(constructor);\n constructor = Object.getPrototypeOf(constructor);\n }\n return ancestors.reverse();\n}\nfunction getOwnStaticArrayValues(constructor, propertyName) {\n var definition = constructor[propertyName];\n return Array.isArray(definition) ? definition : [];\n}\nfunction getOwnStaticObjectPairs(constructor, propertyName) {\n var definition = constructor[propertyName];\n return definition ? Object.keys(definition).map(function (key) { return [key, definition[key]]; }) : [];\n}\n//# sourceMappingURL=inheritable_statics.js.map","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nimport { readInheritableStaticArrayValues } from \"./inheritable_statics\";\n/** @hidden */\nexport function bless(constructor) {\n return shadow(constructor, getBlessedProperties(constructor));\n}\nfunction shadow(constructor, properties) {\n var shadowConstructor = extend(constructor);\n var shadowProperties = getShadowProperties(constructor.prototype, properties);\n Object.defineProperties(shadowConstructor.prototype, shadowProperties);\n return shadowConstructor;\n}\nfunction getBlessedProperties(constructor) {\n var blessings = readInheritableStaticArrayValues(constructor, \"blessings\");\n return blessings.reduce(function (blessedProperties, blessing) {\n var properties = blessing(constructor);\n for (var key in properties) {\n var descriptor = blessedProperties[key] || {};\n blessedProperties[key] = Object.assign(descriptor, properties[key]);\n }\n return blessedProperties;\n }, {});\n}\nfunction getShadowProperties(prototype, properties) {\n return getOwnKeys(properties).reduce(function (shadowProperties, key) {\n var _a;\n var descriptor = getShadowedDescriptor(prototype, properties, key);\n if (descriptor) {\n Object.assign(shadowProperties, (_a = {}, _a[key] = descriptor, _a));\n }\n return shadowProperties;\n }, {});\n}\nfunction getShadowedDescriptor(prototype, properties, key) {\n var shadowingDescriptor = Object.getOwnPropertyDescriptor(prototype, key);\n var shadowedByValue = shadowingDescriptor && \"value\" in shadowingDescriptor;\n if (!shadowedByValue) {\n var descriptor = Object.getOwnPropertyDescriptor(properties, key).value;\n if (shadowingDescriptor) {\n descriptor.get = shadowingDescriptor.get || descriptor.get;\n descriptor.set = shadowingDescriptor.set || descriptor.set;\n }\n return descriptor;\n }\n}\nvar getOwnKeys = (function () {\n if (typeof Object.getOwnPropertySymbols == \"function\") {\n return function (object) { return __spreadArrays(Object.getOwnPropertyNames(object), Object.getOwnPropertySymbols(object)); };\n }\n else {\n return Object.getOwnPropertyNames;\n }\n})();\nvar extend = (function () {\n function extendWithReflect(constructor) {\n function extended() {\n var _newTarget = this && this instanceof extended ? this.constructor : void 0;\n return Reflect.construct(constructor, arguments, _newTarget);\n }\n extended.prototype = Object.create(constructor.prototype, {\n constructor: { value: extended }\n });\n Reflect.setPrototypeOf(extended, constructor);\n return extended;\n }\n function testReflectExtension() {\n var a = function () { this.a.call(this); };\n var b = extendWithReflect(a);\n b.prototype.a = function () { };\n return new b;\n }\n try {\n testReflectExtension();\n return extendWithReflect;\n }\n catch (error) {\n return function (constructor) { return /** @class */ (function (_super) {\n __extends(extended, _super);\n function extended() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return extended;\n }(constructor)); };\n }\n})();\n//# sourceMappingURL=blessing.js.map","import { Context } from \"./context\";\nimport { blessDefinition } from \"./definition\";\nvar Module = /** @class */ (function () {\n function Module(application, definition) {\n this.application = application;\n this.definition = blessDefinition(definition);\n this.contextsByScope = new WeakMap;\n this.connectedContexts = new Set;\n }\n Object.defineProperty(Module.prototype, \"identifier\", {\n get: function () {\n return this.definition.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Module.prototype, \"controllerConstructor\", {\n get: function () {\n return this.definition.controllerConstructor;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Module.prototype, \"contexts\", {\n get: function () {\n return Array.from(this.connectedContexts);\n },\n enumerable: false,\n configurable: true\n });\n Module.prototype.connectContextForScope = function (scope) {\n var context = this.fetchContextForScope(scope);\n this.connectedContexts.add(context);\n context.connect();\n };\n Module.prototype.disconnectContextForScope = function (scope) {\n var context = this.contextsByScope.get(scope);\n if (context) {\n this.connectedContexts.delete(context);\n context.disconnect();\n }\n };\n Module.prototype.fetchContextForScope = function (scope) {\n var context = this.contextsByScope.get(scope);\n if (!context) {\n context = new Context(this, scope);\n this.contextsByScope.set(scope, context);\n }\n return context;\n };\n return Module;\n}());\nexport { Module };\n//# sourceMappingURL=module.js.map","import { bless } from \"./blessing\";\n/** @hidden */\nexport function blessDefinition(definition) {\n return {\n identifier: definition.identifier,\n controllerConstructor: bless(definition.controllerConstructor)\n };\n}\n//# sourceMappingURL=definition.js.map","var ClassMap = /** @class */ (function () {\n function ClassMap(scope) {\n this.scope = scope;\n }\n ClassMap.prototype.has = function (name) {\n return this.data.has(this.getDataKey(name));\n };\n ClassMap.prototype.get = function (name) {\n return this.data.get(this.getDataKey(name));\n };\n ClassMap.prototype.getAttributeName = function (name) {\n return this.data.getAttributeNameForKey(this.getDataKey(name));\n };\n ClassMap.prototype.getDataKey = function (name) {\n return name + \"-class\";\n };\n Object.defineProperty(ClassMap.prototype, \"data\", {\n get: function () {\n return this.scope.data;\n },\n enumerable: false,\n configurable: true\n });\n return ClassMap;\n}());\nexport { ClassMap };\n//# sourceMappingURL=class_map.js.map","export function camelize(value) {\n return value.replace(/(?:[_-])([a-z0-9])/g, function (_, char) { return char.toUpperCase(); });\n}\nexport function capitalize(value) {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\nexport function dasherize(value) {\n return value.replace(/([A-Z])/g, function (_, char) { return \"-\" + char.toLowerCase(); });\n}\n//# sourceMappingURL=string_helpers.js.map","import { dasherize } from \"./string_helpers\";\nvar DataMap = /** @class */ (function () {\n function DataMap(scope) {\n this.scope = scope;\n }\n Object.defineProperty(DataMap.prototype, \"element\", {\n get: function () {\n return this.scope.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(DataMap.prototype, \"identifier\", {\n get: function () {\n return this.scope.identifier;\n },\n enumerable: false,\n configurable: true\n });\n DataMap.prototype.get = function (key) {\n var name = this.getAttributeNameForKey(key);\n return this.element.getAttribute(name);\n };\n DataMap.prototype.set = function (key, value) {\n var name = this.getAttributeNameForKey(key);\n this.element.setAttribute(name, value);\n return this.get(key);\n };\n DataMap.prototype.has = function (key) {\n var name = this.getAttributeNameForKey(key);\n return this.element.hasAttribute(name);\n };\n DataMap.prototype.delete = function (key) {\n if (this.has(key)) {\n var name_1 = this.getAttributeNameForKey(key);\n this.element.removeAttribute(name_1);\n return true;\n }\n else {\n return false;\n }\n };\n DataMap.prototype.getAttributeNameForKey = function (key) {\n return \"data-\" + this.identifier + \"-\" + dasherize(key);\n };\n return DataMap;\n}());\nexport { DataMap };\n//# sourceMappingURL=data_map.js.map","var Guide = /** @class */ (function () {\n function Guide(logger) {\n this.warnedKeysByObject = new WeakMap;\n this.logger = logger;\n }\n Guide.prototype.warn = function (object, key, message) {\n var warnedKeys = this.warnedKeysByObject.get(object);\n if (!warnedKeys) {\n warnedKeys = new Set;\n this.warnedKeysByObject.set(object, warnedKeys);\n }\n if (!warnedKeys.has(key)) {\n warnedKeys.add(key);\n this.logger.warn(message, object);\n }\n };\n return Guide;\n}());\nexport { Guide };\n//# sourceMappingURL=guide.js.map","/** @hidden */\nexport function attributeValueContainsToken(attributeName, token) {\n return \"[\" + attributeName + \"~=\\\"\" + token + \"\\\"]\";\n}\n//# sourceMappingURL=selectors.js.map","var __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nimport { attributeValueContainsToken } from \"./selectors\";\nvar TargetSet = /** @class */ (function () {\n function TargetSet(scope) {\n this.scope = scope;\n }\n Object.defineProperty(TargetSet.prototype, \"element\", {\n get: function () {\n return this.scope.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TargetSet.prototype, \"identifier\", {\n get: function () {\n return this.scope.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(TargetSet.prototype, \"schema\", {\n get: function () {\n return this.scope.schema;\n },\n enumerable: false,\n configurable: true\n });\n TargetSet.prototype.has = function (targetName) {\n return this.find(targetName) != null;\n };\n TargetSet.prototype.find = function () {\n var _this = this;\n var targetNames = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n targetNames[_i] = arguments[_i];\n }\n return targetNames.reduce(function (target, targetName) {\n return target\n || _this.findTarget(targetName)\n || _this.findLegacyTarget(targetName);\n }, undefined);\n };\n TargetSet.prototype.findAll = function () {\n var _this = this;\n var targetNames = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n targetNames[_i] = arguments[_i];\n }\n return targetNames.reduce(function (targets, targetName) { return __spreadArrays(targets, _this.findAllTargets(targetName), _this.findAllLegacyTargets(targetName)); }, []);\n };\n TargetSet.prototype.findTarget = function (targetName) {\n var selector = this.getSelectorForTargetName(targetName);\n return this.scope.findElement(selector);\n };\n TargetSet.prototype.findAllTargets = function (targetName) {\n var selector = this.getSelectorForTargetName(targetName);\n return this.scope.findAllElements(selector);\n };\n TargetSet.prototype.getSelectorForTargetName = function (targetName) {\n var attributeName = \"data-\" + this.identifier + \"-target\";\n return attributeValueContainsToken(attributeName, targetName);\n };\n TargetSet.prototype.findLegacyTarget = function (targetName) {\n var selector = this.getLegacySelectorForTargetName(targetName);\n return this.deprecate(this.scope.findElement(selector), targetName);\n };\n TargetSet.prototype.findAllLegacyTargets = function (targetName) {\n var _this = this;\n var selector = this.getLegacySelectorForTargetName(targetName);\n return this.scope.findAllElements(selector).map(function (element) { return _this.deprecate(element, targetName); });\n };\n TargetSet.prototype.getLegacySelectorForTargetName = function (targetName) {\n var targetDescriptor = this.identifier + \".\" + targetName;\n return attributeValueContainsToken(this.schema.targetAttribute, targetDescriptor);\n };\n TargetSet.prototype.deprecate = function (element, targetName) {\n if (element) {\n var identifier = this.identifier;\n var attributeName = this.schema.targetAttribute;\n this.guide.warn(element, \"target:\" + targetName, \"Please replace \" + attributeName + \"=\\\"\" + identifier + \".\" + targetName + \"\\\" with data-\" + identifier + \"-target=\\\"\" + targetName + \"\\\". \" +\n (\"The \" + attributeName + \" attribute is deprecated and will be removed in a future version of Stimulus.\"));\n }\n return element;\n };\n Object.defineProperty(TargetSet.prototype, \"guide\", {\n get: function () {\n return this.scope.guide;\n },\n enumerable: false,\n configurable: true\n });\n return TargetSet;\n}());\nexport { TargetSet };\n//# sourceMappingURL=target_set.js.map","var __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nimport { ClassMap } from \"./class_map\";\nimport { DataMap } from \"./data_map\";\nimport { Guide } from \"./guide\";\nimport { attributeValueContainsToken } from \"./selectors\";\nimport { TargetSet } from \"./target_set\";\nvar Scope = /** @class */ (function () {\n function Scope(schema, element, identifier, logger) {\n var _this = this;\n this.targets = new TargetSet(this);\n this.classes = new ClassMap(this);\n this.data = new DataMap(this);\n this.containsElement = function (element) {\n return element.closest(_this.controllerSelector) === _this.element;\n };\n this.schema = schema;\n this.element = element;\n this.identifier = identifier;\n this.guide = new Guide(logger);\n }\n Scope.prototype.findElement = function (selector) {\n return this.element.matches(selector)\n ? this.element\n : this.queryElements(selector).find(this.containsElement);\n };\n Scope.prototype.findAllElements = function (selector) {\n return __spreadArrays(this.element.matches(selector) ? [this.element] : [], this.queryElements(selector).filter(this.containsElement));\n };\n Scope.prototype.queryElements = function (selector) {\n return Array.from(this.element.querySelectorAll(selector));\n };\n Object.defineProperty(Scope.prototype, \"controllerSelector\", {\n get: function () {\n return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier);\n },\n enumerable: false,\n configurable: true\n });\n return Scope;\n}());\nexport { Scope };\n//# sourceMappingURL=scope.js.map","import { ValueListObserver } from \"@stimulus/mutation-observers\";\nvar ScopeObserver = /** @class */ (function () {\n function ScopeObserver(element, schema, delegate) {\n this.element = element;\n this.schema = schema;\n this.delegate = delegate;\n this.valueListObserver = new ValueListObserver(this.element, this.controllerAttribute, this);\n this.scopesByIdentifierByElement = new WeakMap;\n this.scopeReferenceCounts = new WeakMap;\n }\n ScopeObserver.prototype.start = function () {\n this.valueListObserver.start();\n };\n ScopeObserver.prototype.stop = function () {\n this.valueListObserver.stop();\n };\n Object.defineProperty(ScopeObserver.prototype, \"controllerAttribute\", {\n get: function () {\n return this.schema.controllerAttribute;\n },\n enumerable: false,\n configurable: true\n });\n // Value observer delegate\n /** @hidden */\n ScopeObserver.prototype.parseValueForToken = function (token) {\n var element = token.element, identifier = token.content;\n var scopesByIdentifier = this.fetchScopesByIdentifierForElement(element);\n var scope = scopesByIdentifier.get(identifier);\n if (!scope) {\n scope = this.delegate.createScopeForElementAndIdentifier(element, identifier);\n scopesByIdentifier.set(identifier, scope);\n }\n return scope;\n };\n /** @hidden */\n ScopeObserver.prototype.elementMatchedValue = function (element, value) {\n var referenceCount = (this.scopeReferenceCounts.get(value) || 0) + 1;\n this.scopeReferenceCounts.set(value, referenceCount);\n if (referenceCount == 1) {\n this.delegate.scopeConnected(value);\n }\n };\n /** @hidden */\n ScopeObserver.prototype.elementUnmatchedValue = function (element, value) {\n var referenceCount = this.scopeReferenceCounts.get(value);\n if (referenceCount) {\n this.scopeReferenceCounts.set(value, referenceCount - 1);\n if (referenceCount == 1) {\n this.delegate.scopeDisconnected(value);\n }\n }\n };\n ScopeObserver.prototype.fetchScopesByIdentifierForElement = function (element) {\n var scopesByIdentifier = this.scopesByIdentifierByElement.get(element);\n if (!scopesByIdentifier) {\n scopesByIdentifier = new Map;\n this.scopesByIdentifierByElement.set(element, scopesByIdentifier);\n }\n return scopesByIdentifier;\n };\n return ScopeObserver;\n}());\nexport { ScopeObserver };\n//# sourceMappingURL=scope_observer.js.map","import { Module } from \"./module\";\nimport { Multimap } from \"@stimulus/multimap\";\nimport { Scope } from \"./scope\";\nimport { ScopeObserver } from \"./scope_observer\";\nvar Router = /** @class */ (function () {\n function Router(application) {\n this.application = application;\n this.scopeObserver = new ScopeObserver(this.element, this.schema, this);\n this.scopesByIdentifier = new Multimap;\n this.modulesByIdentifier = new Map;\n }\n Object.defineProperty(Router.prototype, \"element\", {\n get: function () {\n return this.application.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"schema\", {\n get: function () {\n return this.application.schema;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"logger\", {\n get: function () {\n return this.application.logger;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"controllerAttribute\", {\n get: function () {\n return this.schema.controllerAttribute;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"modules\", {\n get: function () {\n return Array.from(this.modulesByIdentifier.values());\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Router.prototype, \"contexts\", {\n get: function () {\n return this.modules.reduce(function (contexts, module) { return contexts.concat(module.contexts); }, []);\n },\n enumerable: false,\n configurable: true\n });\n Router.prototype.start = function () {\n this.scopeObserver.start();\n };\n Router.prototype.stop = function () {\n this.scopeObserver.stop();\n };\n Router.prototype.loadDefinition = function (definition) {\n this.unloadIdentifier(definition.identifier);\n var module = new Module(this.application, definition);\n this.connectModule(module);\n };\n Router.prototype.unloadIdentifier = function (identifier) {\n var module = this.modulesByIdentifier.get(identifier);\n if (module) {\n this.disconnectModule(module);\n }\n };\n Router.prototype.getContextForElementAndIdentifier = function (element, identifier) {\n var module = this.modulesByIdentifier.get(identifier);\n if (module) {\n return module.contexts.find(function (context) { return context.element == element; });\n }\n };\n // Error handler delegate\n /** @hidden */\n Router.prototype.handleError = function (error, message, detail) {\n this.application.handleError(error, message, detail);\n };\n // Scope observer delegate\n /** @hidden */\n Router.prototype.createScopeForElementAndIdentifier = function (element, identifier) {\n return new Scope(this.schema, element, identifier, this.logger);\n };\n /** @hidden */\n Router.prototype.scopeConnected = function (scope) {\n this.scopesByIdentifier.add(scope.identifier, scope);\n var module = this.modulesByIdentifier.get(scope.identifier);\n if (module) {\n module.connectContextForScope(scope);\n }\n };\n /** @hidden */\n Router.prototype.scopeDisconnected = function (scope) {\n this.scopesByIdentifier.delete(scope.identifier, scope);\n var module = this.modulesByIdentifier.get(scope.identifier);\n if (module) {\n module.disconnectContextForScope(scope);\n }\n };\n // Modules\n Router.prototype.connectModule = function (module) {\n this.modulesByIdentifier.set(module.identifier, module);\n var scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n scopes.forEach(function (scope) { return module.connectContextForScope(scope); });\n };\n Router.prototype.disconnectModule = function (module) {\n this.modulesByIdentifier.delete(module.identifier);\n var scopes = this.scopesByIdentifier.getValuesForKey(module.identifier);\n scopes.forEach(function (scope) { return module.disconnectContextForScope(scope); });\n };\n return Router;\n}());\nexport { Router };\n//# sourceMappingURL=router.js.map","export var defaultSchema = {\n controllerAttribute: \"data-controller\",\n actionAttribute: \"data-action\",\n targetAttribute: \"data-target\"\n};\n//# sourceMappingURL=schema.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nimport { Dispatcher } from \"./dispatcher\";\nimport { Router } from \"./router\";\nimport { defaultSchema } from \"./schema\";\nvar Application = /** @class */ (function () {\n function Application(element, schema) {\n if (element === void 0) { element = document.documentElement; }\n if (schema === void 0) { schema = defaultSchema; }\n this.logger = console;\n this.element = element;\n this.schema = schema;\n this.dispatcher = new Dispatcher(this);\n this.router = new Router(this);\n }\n Application.start = function (element, schema) {\n var application = new Application(element, schema);\n application.start();\n return application;\n };\n Application.prototype.start = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, domReady()];\n case 1:\n _a.sent();\n this.dispatcher.start();\n this.router.start();\n return [2 /*return*/];\n }\n });\n });\n };\n Application.prototype.stop = function () {\n this.dispatcher.stop();\n this.router.stop();\n };\n Application.prototype.register = function (identifier, controllerConstructor) {\n this.load({ identifier: identifier, controllerConstructor: controllerConstructor });\n };\n Application.prototype.load = function (head) {\n var _this = this;\n var rest = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n rest[_i - 1] = arguments[_i];\n }\n var definitions = Array.isArray(head) ? head : __spreadArrays([head], rest);\n definitions.forEach(function (definition) { return _this.router.loadDefinition(definition); });\n };\n Application.prototype.unload = function (head) {\n var _this = this;\n var rest = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n rest[_i - 1] = arguments[_i];\n }\n var identifiers = Array.isArray(head) ? head : __spreadArrays([head], rest);\n identifiers.forEach(function (identifier) { return _this.router.unloadIdentifier(identifier); });\n };\n Object.defineProperty(Application.prototype, \"controllers\", {\n // Controllers\n get: function () {\n return this.router.contexts.map(function (context) { return context.controller; });\n },\n enumerable: false,\n configurable: true\n });\n Application.prototype.getControllerForElementAndIdentifier = function (element, identifier) {\n var context = this.router.getContextForElementAndIdentifier(element, identifier);\n return context ? context.controller : null;\n };\n // Error handling\n Application.prototype.handleError = function (error, message, detail) {\n this.logger.error(\"%s\\n\\n%o\\n\\n%o\", message, error, detail);\n };\n return Application;\n}());\nexport { Application };\nfunction domReady() {\n return new Promise(function (resolve) {\n if (document.readyState == \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", resolve);\n }\n else {\n resolve();\n }\n });\n}\n//# sourceMappingURL=application.js.map","import { readInheritableStaticArrayValues } from \"./inheritable_statics\";\nimport { capitalize } from \"./string_helpers\";\n/** @hidden */\nexport function ClassPropertiesBlessing(constructor) {\n var classes = readInheritableStaticArrayValues(constructor, \"classes\");\n return classes.reduce(function (properties, classDefinition) {\n return Object.assign(properties, propertiesForClassDefinition(classDefinition));\n }, {});\n}\nfunction propertiesForClassDefinition(key) {\n var _a;\n var name = key + \"Class\";\n return _a = {},\n _a[name] = {\n get: function () {\n var classes = this.classes;\n if (classes.has(key)) {\n return classes.get(key);\n }\n else {\n var attribute = classes.getAttributeName(key);\n throw new Error(\"Missing attribute \\\"\" + attribute + \"\\\"\");\n }\n }\n },\n _a[\"has\" + capitalize(name)] = {\n get: function () {\n return this.classes.has(key);\n }\n },\n _a;\n}\n//# sourceMappingURL=class_properties.js.map","import { readInheritableStaticArrayValues } from \"./inheritable_statics\";\nimport { capitalize } from \"./string_helpers\";\n/** @hidden */\nexport function TargetPropertiesBlessing(constructor) {\n var targets = readInheritableStaticArrayValues(constructor, \"targets\");\n return targets.reduce(function (properties, targetDefinition) {\n return Object.assign(properties, propertiesForTargetDefinition(targetDefinition));\n }, {});\n}\nfunction propertiesForTargetDefinition(name) {\n var _a;\n return _a = {},\n _a[name + \"Target\"] = {\n get: function () {\n var target = this.targets.find(name);\n if (target) {\n return target;\n }\n else {\n throw new Error(\"Missing target element \\\"\" + this.identifier + \".\" + name + \"\\\"\");\n }\n }\n },\n _a[name + \"Targets\"] = {\n get: function () {\n return this.targets.findAll(name);\n }\n },\n _a[\"has\" + capitalize(name) + \"Target\"] = {\n get: function () {\n return this.targets.has(name);\n }\n },\n _a;\n}\n//# sourceMappingURL=target_properties.js.map","import { readInheritableStaticObjectPairs } from \"./inheritable_statics\";\nimport { camelize, capitalize, dasherize } from \"./string_helpers\";\n/** @hidden */\nexport function ValuePropertiesBlessing(constructor) {\n var valueDefinitionPairs = readInheritableStaticObjectPairs(constructor, \"values\");\n var propertyDescriptorMap = {\n valueDescriptorMap: {\n get: function () {\n var _this = this;\n return valueDefinitionPairs.reduce(function (result, valueDefinitionPair) {\n var _a;\n var valueDescriptor = parseValueDefinitionPair(valueDefinitionPair);\n var attributeName = _this.data.getAttributeNameForKey(valueDescriptor.key);\n return Object.assign(result, (_a = {}, _a[attributeName] = valueDescriptor, _a));\n }, {});\n }\n }\n };\n return valueDefinitionPairs.reduce(function (properties, valueDefinitionPair) {\n return Object.assign(properties, propertiesForValueDefinitionPair(valueDefinitionPair));\n }, propertyDescriptorMap);\n}\n/** @hidden */\nexport function propertiesForValueDefinitionPair(valueDefinitionPair) {\n var _a;\n var definition = parseValueDefinitionPair(valueDefinitionPair);\n var type = definition.type, key = definition.key, name = definition.name;\n var read = readers[type], write = writers[type] || writers.default;\n return _a = {},\n _a[name] = {\n get: function () {\n var value = this.data.get(key);\n if (value !== null) {\n return read(value);\n }\n else {\n return definition.defaultValue;\n }\n },\n set: function (value) {\n if (value === undefined) {\n this.data.delete(key);\n }\n else {\n this.data.set(key, write(value));\n }\n }\n },\n _a[\"has\" + capitalize(name)] = {\n get: function () {\n return this.data.has(key);\n }\n },\n _a;\n}\nfunction parseValueDefinitionPair(_a) {\n var token = _a[0], typeConstant = _a[1];\n var type = parseValueTypeConstant(typeConstant);\n return valueDescriptorForTokenAndType(token, type);\n}\nfunction parseValueTypeConstant(typeConstant) {\n switch (typeConstant) {\n case Array: return \"array\";\n case Boolean: return \"boolean\";\n case Number: return \"number\";\n case Object: return \"object\";\n case String: return \"string\";\n }\n throw new Error(\"Unknown value type constant \\\"\" + typeConstant + \"\\\"\");\n}\nfunction valueDescriptorForTokenAndType(token, type) {\n var key = dasherize(token) + \"-value\";\n return {\n type: type,\n key: key,\n name: camelize(key),\n get defaultValue() { return defaultValuesByType[type]; }\n };\n}\nvar defaultValuesByType = {\n get array() { return []; },\n boolean: false,\n number: 0,\n get object() { return {}; },\n string: \"\"\n};\nvar readers = {\n array: function (value) {\n var array = JSON.parse(value);\n if (!Array.isArray(array)) {\n throw new TypeError(\"Expected array\");\n }\n return array;\n },\n boolean: function (value) {\n return !(value == \"0\" || value == \"false\");\n },\n number: function (value) {\n return parseFloat(value);\n },\n object: function (value) {\n var object = JSON.parse(value);\n if (object === null || typeof object != \"object\" || Array.isArray(object)) {\n throw new TypeError(\"Expected object\");\n }\n return object;\n },\n string: function (value) {\n return value;\n }\n};\nvar writers = {\n default: writeString,\n array: writeJSON,\n object: writeJSON\n};\nfunction writeJSON(value) {\n return JSON.stringify(value);\n}\nfunction writeString(value) {\n return \"\" + value;\n}\n//# sourceMappingURL=value_properties.js.map","import { ClassPropertiesBlessing } from \"./class_properties\";\nimport { TargetPropertiesBlessing } from \"./target_properties\";\nimport { ValuePropertiesBlessing } from \"./value_properties\";\nvar Controller = /** @class */ (function () {\n function Controller(context) {\n this.context = context;\n }\n Object.defineProperty(Controller.prototype, \"application\", {\n get: function () {\n return this.context.application;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"scope\", {\n get: function () {\n return this.context.scope;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"element\", {\n get: function () {\n return this.scope.element;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"identifier\", {\n get: function () {\n return this.scope.identifier;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"targets\", {\n get: function () {\n return this.scope.targets;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"classes\", {\n get: function () {\n return this.scope.classes;\n },\n enumerable: false,\n configurable: true\n });\n Object.defineProperty(Controller.prototype, \"data\", {\n get: function () {\n return this.scope.data;\n },\n enumerable: false,\n configurable: true\n });\n Controller.prototype.initialize = function () {\n // Override in your subclass to set up initial controller state\n };\n Controller.prototype.connect = function () {\n // Override in your subclass to respond when the controller is connected to the DOM\n };\n Controller.prototype.disconnect = function () {\n // Override in your subclass to respond when the controller is disconnected from the DOM\n };\n Controller.blessings = [ClassPropertiesBlessing, TargetPropertiesBlessing, ValuePropertiesBlessing];\n Controller.targets = [];\n Controller.values = {};\n return Controller;\n}());\nexport { Controller };\n//# sourceMappingURL=controller.js.map","import {Context, Controller} from \"stimulus\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n // @ts-ignore\n if (!this.application.debug) {\n return this;\n }\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n self.log(prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n this.log(prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n get isTurboPreview(): boolean {\n return document.documentElement.hasAttribute('data-turbo-preview') || document.documentElement.hasAttribute('data-turbolinks-preview');\n }\n\n get isTurbolinksPreview(): boolean {\n return this.isTurboPreview;\n }\n\n get csrfToken(): string | null {\n return this.metaValue('csrf-token');\n }\n\n metaValue(name: string): string | null {\n const element = document.head.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || null;\n }\n\n dispatch(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n this.logEvent(eventName, event, element);\n element.dispatchEvent(event);\n }\n\n log(functionName: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: this.element,\n controller: this,\n ...args,\n });\n logger.groupEnd();\n }\n\n warn(warning: string, args: {} = {}): void {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c#${warning}`, \"color: F39B1AFF\", \"color: unset\");\n logger.warn({\n element: this.element,\n controller: this,\n ...args,\n });\n logger.groupEnd();\n }\n\n logEvent(eventName: string, event: CustomEvent, element: HTMLElement) {\n // @ts-ignore\n if (!this.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${this.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n }\n\n}\n\nfunction logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n","'use strict';\n\nconst preserveCamelCase = (string, locale) => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && /[\\p{Lu}]/u.test(character)) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[\\p{Ll}]/u.test(character)) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = character.toLocaleLowerCase(locale) === character && character.toLocaleUpperCase(locale) !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = character.toLocaleUpperCase(locale) === character && character.toLocaleLowerCase(locale) !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst preserveConsecutiveUppercase = input => {\n\treturn input.replace(/^[\\p{Lu}](?![\\p{Lu}])/gu, m1 => m1.toLowerCase());\n};\n\nconst postProcess = (input, options) => {\n\treturn input.replace(/[_.\\- ]+([\\p{Alpha}\\p{N}_]|$)/gu, (_, p1) => p1.toLocaleUpperCase(options.locale))\n\t\t.replace(/\\d+([\\p{Alpha}\\p{N}_]|$)/gu, m => m.toLocaleUpperCase(options.locale));\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = {\n\t\tpascalCase: false,\n\t\tpreserveConsecutiveUppercase: false,\n\t\t...options\n\t};\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? input.toLocaleUpperCase(options.locale) : input.toLocaleLowerCase(options.locale);\n\t}\n\n\tconst hasUpperCase = input !== input.toLocaleLowerCase(options.locale);\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input, options.locale);\n\t}\n\n\tinput = input.replace(/^[_.\\- ]+/, '');\n\n\tif (options.preserveConsecutiveUppercase) {\n\t\tinput = preserveConsecutiveUppercase(input);\n\t} else {\n\t\tinput = input.toLocaleLowerCase();\n\t}\n\n\tif (options.pascalCase) {\n\t\tinput = input.charAt(0).toLocaleUpperCase(options.locale) + input.slice(1);\n\t}\n\n\treturn postProcess(input, options);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import camelCase from \"camelcase\";\nimport {BaseController} from \"./base_controller\";\n\nexport class EphemeralController extends BaseController {\n\n _cleanupSelf() {\n this.cleanup(this.el);\n }\n\n cleanup(element: HTMLElement) {\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\s|^)${this.identifier}(\\s|$)`, \"g\"), \"\") || \"\";\n if (element.dataset.controller == \"\") {\n // If there are no controllers left, remove the attribute\n delete element.dataset.controller;\n }\n\n let substringIdentifierValueRegex = new RegExp(`(\\s|^)${this.identifier}\\\\..+?(\\s|$)`, \"g\");\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-target`)];\n if (element.dataset.target == \"\") {\n // If there are no targets left, remove the attribute\n delete element.dataset.target;\n }\n\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-action`)];\n if (element.dataset.action == \"\") {\n // If there are no actions left, remove the attribute\n delete element.dataset.action;\n }\n\n // @ts-ignore\n let values = this.constructor.values;\n if (values) {\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\n }\n\n // @ts-ignore\n let classes = this.constructor.classes;\n if (classes) {\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\nlet smoothPolyfilled: boolean;\n\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollIntoView({behavior, block, inline});\n}\n\nexport async function scrollAbsoluteTop(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({top: 0, left: 0, behavior});\n}\n\nexport async function scrollAbsoluteBottom(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({top: document.body.scrollHeight, left: 0, behavior});\n } else {\n element.scrollTo({top: (element as Element).scrollHeight, left: 0, behavior});\n }\n}\n\nexport async function scrollAbsoluteLeft(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({left: 0, behavior});\n}\n\nexport async function scrollAbsoluteRight(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({left: document.body.scrollWidth, behavior});\n } else {\n element.scrollTo({left: (element as Element).scrollWidth, behavior});\n }\n}\n\nexport async function scrollUp(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: -amount, left: 0, behavior});\n}\n\nexport async function scrollDown(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: amount, left: 0, behavior});\n}\n\nexport async function scrollLeft(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: -amount, behavior});\n}\n\nexport async function scrollRight(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: amount, behavior});\n}\n\nasync function polyfillSmooth() {\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\n if (smoothPolyfilled) {\n return;\n }\n smoothPolyfilled = true;\n polyfill();\n}\n\nexport function getScrollParent(node: HTMLElement | null): Window | HTMLElement | null {\n if (!node) {\n return null;\n }\n\n if (node == document.body) {\n return window;\n }\n\n const overflowY = getComputedStyle(node).overflowY;\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\n\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\n return node;\n }\n\n return getScrollParent(node.parentElement) || document.body;\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\n return element.nodeName == \"TURBO-FRAME\";\n}\n","import mitt from 'mitt';\n\nexport const EventBus = mitt<{ [idx: string]: any }>();\n","export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLTextAreaElement(element: Element): element is HTMLTextAreaElement {\n return element.nodeName == \"TEXTAREA\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n\nexport function isTypeOfFormInputElement(element: Element): element is (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n return isHTMLInputElement(element) || isHTMLSelectElement(element) || isHTMLTextAreaElement(element);\n}\n\nexport function createHiddenButton(type: \"submit\" | \"reset\"): HTMLButtonElement {\n let button = document.createElement('button');\n button.type = type;\n button.style.display = 'none';\n button.dataset.sythentic = 'true';\n return button;\n}\n\nexport function createHiddenInput(name: string, value: string): HTMLInputElement {\n let input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value;\n return input;\n}\n\nexport function insertElement<T extends Element>(targetElement: Element, insertPosition: InsertPosition, element: T): T {\n let createdElement = targetElement.insertAdjacentElement(insertPosition, element);\n if (!createdElement) {\n throw new Error(`Failed to insert element ${element.nodeName} into ${targetElement.nodeName}`);\n }\n return createdElement as T;\n}\n\nexport function insertHiddenInput(name: string, value: string, targetElement: Element, insertPosition: InsertPosition): HTMLInputElement {\n return insertElement(targetElement, insertPosition, createHiddenInput(name, value));\n}\n\nexport function insertHiddenButton(type: \"submit\" | \"reset\", targetElement: Element, insertPosition: InsertPosition): HTMLButtonElement {\n return insertElement(targetElement, insertPosition, createHiddenButton(type));\n}\n","import {insertHiddenButton} from \"./elements\";\n\nexport function requestSubmit(form: HTMLFormElement) {\n if (form.requestSubmit) {\n form.requestSubmit();\n } else {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"submit\"]');\n if (!button) {\n button = insertHiddenButton(\"submit\", form, 'beforeend');\n }\n button.click();\n }\n}\n\nexport function requestReset(form: HTMLFormElement) {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"reset\"]');\n if (!button) {\n button = insertHiddenButton(\"reset\", form, 'beforeend');\n }\n button.click();\n}","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\n\n\nexport function useEventListener(controller: Controller, element: Document | Window | HTMLElement, eventName: string, handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useEventListeners(controller, element, [eventName], handler, opts);\n}\n\nexport function useEventListeners(controller: Controller, element: Document | Window | HTMLElement, eventNames: string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n // keep a copy of the lifecycle functions of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n let options = opts;\n\n if (options?.debounce) {\n handler = debounce(handler.bind(controller), options.debounce);\n delete options.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n\n let setup = () => eventNames.forEach(eventName => element.addEventListener(eventName, handler, options));\n let teardown = () => eventNames.forEach(eventName => element.removeEventListener(eventName, handler));\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return [setup, teardown];\n}\n","import {Controller} from \"stimulus\";\n\n\nexport function useInterval(controller: Controller, handler: (...args: any[]) => void, interval: number) {\n // keep a copy of the lifecycle functions of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n handler = handler.bind(controller);\n let intervalHandle: ReturnType<typeof window.setInterval> | null = null;\n\n let setup = () => intervalHandle = setInterval(handler, interval);\n let teardown = () => {\n if (intervalHandle !== null) {\n clearInterval(intervalHandle);\n }\n };\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return teardown;\n}\n","import {Controller} from \"stimulus\";\n\n\nexport function useTimeout(controller: Controller, handler: (...args: any[]) => void, timeout: number) {\n // keep a copy of the lifecycle functions of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n handler = handler.bind(controller);\n let timeoutHandle: ReturnType<typeof window.setTimeout> | null = null;\n\n let setup = () => timeoutHandle = setTimeout(handler, timeout);\n let teardown = () => {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n }\n };\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return teardown;\n}\n","import {Controller} from \"stimulus\";\n\n\nexport function useInjectedFragment(\n controller: Controller,\n targetElement: HTMLElement,\n insertPosition: InsertPosition,\n fragment: DocumentFragment,\n options: { cleanup?: boolean } = {},\n): [Array<ChildNode>, () => void] {\n // keep a copy of the lifecycle functions of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n let nodes = Array.from(fragment.childNodes);\n\n let setup = () => {\n let parent = targetElement.parentElement;\n if ([\"beforebegin\", \"afterend\"].includes(insertPosition) && parent == null) {\n throw new Error(\"Cannot insert beforebegin into a node with no parent\");\n }\n\n switch (insertPosition) {\n case 'beforeend':\n targetElement.append(fragment);\n break;\n case \"afterbegin\":\n targetElement.prepend(fragment);\n break;\n case \"beforebegin\":\n parent!.insertBefore(fragment, targetElement);\n break;\n case \"afterend\":\n parent!.insertBefore(fragment, targetElement);\n break;\n }\n };\n let teardown: () => void;\n if (options.cleanup) {\n teardown = () => {\n console.log(\"teardown\");\n nodes.forEach(node => node.remove());\n };\n } else {\n teardown = () => console.log(\"void teardown\");\n }\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return [nodes, teardown];\n}\n\nexport function useInjectedHTML(\n controller: Controller,\n targetElement: HTMLElement,\n insertPosition: InsertPosition,\n html: string,\n options: { cleanup?: boolean } = {},\n): [Array<ChildNode>, () => void] {\n const fragment = document.createRange().createContextualFragment(html);\n return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n}\n\nexport function useInjectedElement(\n controller: Controller,\n targetElement: HTMLElement,\n insertPosition: InsertPosition,\n element: HTMLElement,\n options: { cleanup?: boolean } = {},\n): [ChildNode, () => void] {\n const fragment = new DocumentFragment();\n fragment.append(element);\n let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n return [nodes[0], teardown];\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class AnchorSpyController extends BaseController {\n static values = {key: String};\n\n declare readonly keyValue: string;\n\n get _key(): string {\n return this.keyValue.replaceAll('#', '');\n }\n\n get _anchor(): string {\n return window.location.hash.substr(1);\n }\n\n set _anchor(value: string) {\n window.location.hash = value;\n }\n\n connect() {\n requestAnimationFrame(() => {\n this._checkAnchor();\n useEventListener(this, window, 'hashchange', this._checkAnchor);\n });\n }\n\n write(event?: Event) {\n event?.preventDefault();\n this._anchor = this._key;\n }\n\n private _checkAnchor() {\n if (this._key === this._anchor) {\n this.dispatch(this.el, \"anchor-spy:active\");\n } else {\n this.dispatch(this.el, \"anchor-spy:inactive\");\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class LoadBlockController extends BaseController {\n\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n connect() {\n }\n\n async loadContent(event: Event | null = null) {\n event?.preventDefault();\n\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n\n let failure = () => {\n el.replaceWith(this._errorMessage);\n self.dispatch(el, \"ajax:error\");\n };\n\n try {\n let response = await fetch(this.endpointValue);\n if (!response.ok) {\n failure();\n }\n let text = await response.text();\n let newEl = document.createElement(\"div\");\n\n newEl.innerHTML = text;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatch(el, \"ajax:success\");\n } catch (e) {\n failure();\n } finally {\n self.dispatch(el, \"ajax:complete\");\n }\n }\n}\n","import {LoadBlockController} from \"./load_block_controller\";\n\nexport class AsyncBlockController extends LoadBlockController {\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String};\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n async connect() {\n await this.loadContent();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {requestSubmit} from \"../../utilities/request_submit\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n static values = {submitMode: String, eventMode: String, debounceInterval: Number};\n declare readonly submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare eventModeValue: 'change' | 'input' | 'debounced';\n declare readonly hasEventModeValue: boolean;\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n\n get _eventMode(): 'change' | 'input' | 'debounced' {\n if (this.hasEventModeValue) {\n if (!['change', 'input', 'debounced'].includes(this.eventModeValue)) {\n throw new Error(`The modeValue provided '${this.eventModeValue}' is not one of the recognised configuration options`);\n }\n return this.eventModeValue;\n } else {\n return \"change\";\n }\n }\n\n get _debounceTimeout(): number {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : 1000;\n }\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get _cssSelector() {\n let inputTypes = ['input', 'textarea', 'select'];\n let ignore = ':not([data-no-autosubmit])';\n return inputTypes.map(type => type.concat(ignore)).join(',');\n }\n\n get inputElements() {\n return this.element.querySelectorAll(this._cssSelector);\n }\n\n connect() {\n this.inputElements.forEach(el => {\n return useEventListener(\n this,\n el as HTMLElement,\n this._eventMode == 'change' ? 'change' : 'input',\n this.submit,\n {debounce: this._eventMode == 'debounced' ? this._debounceTimeout : undefined},\n );\n });\n }\n\n private submit() {\n let el = this.el as HTMLFormElement;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n}\n","export const method = (controller, methodName) => {\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n }\n else {\n return (...args) => { };\n }\n};\nexport const composeEventName = (name, controller, eventPrefix) => {\n let composedName = name;\n if (eventPrefix === true) {\n composedName = `${controller.identifier}:${name}`;\n }\n else if (typeof eventPrefix === 'string') {\n composedName = `${eventPrefix}:${name}`;\n }\n return composedName;\n};\nexport const extendedEvent = (type, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(type, {\n bubbles,\n cancelable,\n composed,\n detail\n });\n return customEvent;\n};\nexport function isElementInViewport(el) {\n const rect = el.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n const vertInView = rect.top <= windowHeight && rect.top + rect.height >= 0;\n const horInView = rect.left <= windowWidth && rect.left + rect.width >= 0;\n return vertInView && horInView;\n}\nexport function camelize(value) {\n return value.replace(/(?:[_-])([a-z0-9])/g, (_, char) => char.toUpperCase());\n}\n//# sourceMappingURL=index.js.map","import { method, extendedEvent, composeEventName } from '../support/index';\nconst defaultOptions = {\n dispatchEvent: true,\n eventPrefix: true\n};\nexport const useIntersection = (controller, options = {}) => {\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const callback = (entries) => {\n const [entry] = entries;\n if (entry.isIntersecting) {\n dispatchAppear(entry);\n }\n else if (controller.isVisible) {\n dispatchDisappear(entry);\n }\n };\n const dispatchAppear = (entry) => {\n controller.isVisible = true;\n method(controller, 'appear').call(controller, entry);\n // emit a custom \"appear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('appear', controller, eventPrefix);\n const appearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(appearEvent);\n }\n };\n const dispatchDisappear = (entry) => {\n controller.isVisible = false;\n method(controller, 'disappear').call(controller, entry);\n // emit a custom \"disappear\" event\n if (dispatchEvent) {\n const eventName = composeEventName('disappear', controller, eventPrefix);\n const disappearEvent = extendedEvent(eventName, null, { controller, entry });\n targetElement.dispatchEvent(disappearEvent);\n }\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observer = new IntersectionObserver(callback, options);\n const observe = () => {\n observer.observe(targetElement);\n };\n const unobserve = () => {\n observer.unobserve(targetElement);\n };\n Object.assign(controller, {\n isVisible: false,\n disconnect() {\n unobserve();\n controllerDisconnect();\n }\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-intersection.js.map","import { composeEventName, extendedEvent, isElementInViewport } from '../support/index';\nconst defaultOptions = {\n events: ['click', 'touchend'],\n onlyVisible: true,\n dispatchEvent: true,\n eventPrefix: true\n};\nexport const useClickOutside = (controller, options = {}) => {\n const { onlyVisible, dispatchEvent, events, eventPrefix } = Object.assign({}, defaultOptions, options);\n const onEvent = (event) => {\n const targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n if (targetElement.contains(event.target) || (!isElementInViewport(targetElement) && onlyVisible)) {\n return;\n }\n // call the clickOutside method of the Stimulus controller\n if (controller.clickOutside) {\n controller.clickOutside(event);\n }\n // emit a custom event\n if (dispatchEvent) {\n const eventName = composeEventName('click:outside', controller, eventPrefix);\n const clickOutsideEvent = extendedEvent(eventName, event, { controller });\n targetElement.dispatchEvent(clickOutsideEvent);\n }\n };\n const observe = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.addEventListener(event, onEvent, false);\n });\n };\n const unobserve = () => {\n events === null || events === void 0 ? void 0 : events.forEach(event => {\n window.removeEventListener(event, onEvent, false);\n });\n };\n // keep a copy of the current disconnect() function of the controller\n // to support composing several behaviors\n const controllerDisconnect = controller.disconnect.bind(controller);\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n }\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-click-outside.js.map","const defaultOptions = {\n debug: false,\n logger: console,\n dispatchEvent: true,\n eventPrefix: true\n};\nexport class StimulusUse {\n constructor(controller, options = {}) {\n var _a, _b, _c;\n this.log = (functionName, args) => {\n if (!this.debug)\n return;\n this.logger.groupCollapsed(`%c${this.controller.identifier} %c#${functionName}`, 'color: #3B82F6', 'color: unset');\n this.logger.log({\n controllerId: this.controllerId,\n ...args\n });\n this.logger.groupEnd();\n };\n this.dispatch = (eventName, details = {}) => {\n if (this.dispatchEvent) {\n const { event, ...eventDetails } = details;\n const customEvent = this.extendedEvent(eventName, event || null, eventDetails);\n this.targetElement.dispatchEvent(customEvent);\n this.log('dispatchEvent', { eventName: customEvent.type, ...eventDetails });\n }\n };\n this.call = (methodName, args = {}) => {\n const method = this.controller[methodName];\n if (typeof method == 'function') {\n return method.call(this.controller, args);\n }\n };\n this.extendedEvent = (name, event, detail) => {\n const { bubbles, cancelable, composed } = event || { bubbles: true, cancelable: true, composed: true };\n if (event) {\n Object.assign(detail, { originalEvent: event });\n }\n const customEvent = new CustomEvent(this.composeEventName(name), {\n bubbles,\n cancelable,\n composed,\n detail\n });\n return customEvent;\n };\n this.composeEventName = (name) => {\n let composedName = name;\n if (this.eventPrefix === true) {\n composedName = `${this.controller.identifier}:${name}`;\n }\n else if (typeof this.eventPrefix === 'string') {\n composedName = `${this.eventPrefix}:${name}`;\n }\n return composedName;\n };\n this.debug = (_b = (_a = options === null || options === void 0 ? void 0 : options.debug) !== null && _a !== void 0 ? _a : controller.application.stimulusUseDebug) !== null && _b !== void 0 ? _b : defaultOptions.debug;\n this.logger = (_c = options === null || options === void 0 ? void 0 : options.logger) !== null && _c !== void 0 ? _c : defaultOptions.logger;\n this.controller = controller;\n this.controllerId = controller.element.id || controller.element.dataset.id;\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n const { dispatchEvent, eventPrefix } = Object.assign({}, defaultOptions, options);\n Object.assign(this, { dispatchEvent, eventPrefix });\n // make copies of lifecycle functions\n this.controllerInitialize = controller.initialize.bind(controller);\n this.controllerConnect = controller.connect.bind(controller);\n this.controllerDisconnect = controller.disconnect.bind(controller);\n }\n}\n//# sourceMappingURL=stimulus-use.js.map","import { StimulusUse } from '../stimulus-use';\nexport class UseHover extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n this.targetElement.addEventListener('mouseenter', this.onEnter);\n this.targetElement.addEventListener('mouseleave', this.onLeave);\n };\n this.unobserve = () => {\n this.targetElement.removeEventListener('mouseenter', this.onEnter);\n this.targetElement.removeEventListener('mouseleave', this.onLeave);\n };\n this.onEnter = (event) => {\n this.call('mouseEnter', event);\n this.log('mouseEnter', { hover: true });\n this.dispatch('mouseEnter', { hover: false });\n };\n this.onLeave = (event) => {\n this.call('mouseLeave', event);\n this.log('mouseLeave', { hover: false });\n this.dispatch('mouseLeave', { hover: false });\n };\n this.controller = controller;\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useHover = (controller, options = {}) => {\n const observer = new UseHover(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-hover.js.map","import { StimulusUse } from '../stimulus-use';\nexport class UseMutation extends StimulusUse {\n constructor(controller, options = {}) {\n super(controller, options);\n this.observe = () => {\n try {\n this.observer.observe(this.targetElement, this.options);\n }\n catch (error) {\n this.controller.application.handleError(error, 'At a minimum, one of childList, attributes, and/or characterData must be true', {});\n }\n };\n this.unobserve = () => {\n this.observer.disconnect();\n };\n this.mutation = (entries) => {\n this.call('mutate', entries);\n this.log('mutate', { entries });\n this.dispatch('mutate', { entries });\n };\n this.targetElement = (options === null || options === void 0 ? void 0 : options.element) || controller.element;\n this.controller = controller;\n this.options = options;\n this.observer = new MutationObserver(this.mutation);\n this.enhanceController();\n this.observe();\n }\n enhanceController() {\n const controllerDisconnect = this.controller.disconnect.bind(this.controller);\n const disconnect = () => {\n this.unobserve();\n controllerDisconnect();\n };\n Object.assign(this.controller, { disconnect });\n }\n}\nexport const useMutation = (controller, options = {}) => {\n const observer = new UseMutation(controller, options);\n return [observer.observe, observer.unobserve];\n};\n//# sourceMappingURL=use-mutation.js.map","import { method } from '../support/index';\nexport const useWindowResize = (controller) => {\n const callback = (event) => {\n const { innerWidth, innerHeight } = window;\n const payload = {\n height: innerHeight || Infinity,\n width: innerWidth || Infinity,\n event\n };\n method(controller, 'windowResize').call(controller, payload);\n };\n const controllerDisconnect = controller.disconnect.bind(controller);\n const observe = () => {\n window.addEventListener('resize', callback);\n callback();\n };\n const unobserve = () => {\n window.removeEventListener('resize', callback);\n };\n Object.assign(controller, {\n disconnect() {\n unobserve();\n controllerDisconnect();\n }\n });\n observe();\n return [observe, unobserve];\n};\n//# sourceMappingURL=use-window-resize.js.map","import { Controller } from 'stimulus';\nclass DebounceController extends Controller {\n}\nDebounceController.debounces = [];\nconst defaultWait = 200;\nconst debounce = (fn, wait = defaultWait) => {\n let timeoutId = null;\n return function () {\n const args = arguments;\n const context = this;\n const callback = () => fn.apply(context, args);\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(callback, wait);\n };\n};\nexport const useDebounce = (controller, options) => {\n var _a;\n const constructor = controller.constructor;\n (_a = constructor.debounces) === null || _a === void 0 ? void 0 : _a.forEach((func) => {\n if (typeof func === 'string') {\n ;\n controller[func] = debounce(controller[func], options === null || options === void 0 ? void 0 : options.wait);\n }\n if (typeof func === 'object') {\n const { name, wait } = func;\n if (!name)\n return;\n controller[name] = debounce(controller[name], wait || (options === null || options === void 0 ? void 0 : options.wait));\n }\n });\n};\n//# sourceMappingURL=use-debounce.js.map","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class BackLinkController extends BaseController {\n\n static values = {timeout: Number, pages: Number};\n\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n declare readonly pagesValue: number;\n declare readonly hasPagesValue: boolean;\n\n get _pages(): number {\n return this.hasPagesValue ? Math.abs(this.pagesValue) : 1;\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1500;\n }\n\n connect() {\n useEventListener(this, this.el, \"click\", this.goBack);\n }\n\n goBack(event?: Event) {\n event?.preventDefault();\n history.go(-this._pages);\n if ((this.el as HTMLAnchorElement).href) {\n useTimeout(this, this.fallback, this._timeout);\n }\n }\n\n fallback() {\n window.location.href = (this.el as HTMLAnchorElement).href;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class CharCountController extends BaseController {\n\n // Config\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n // Targets\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n // Values\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n // Classes\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n // Getters\n get _errorClasses(): string[] {\n return this.errorClass.split(' ');\n }\n\n get _defaultErrorClasses(): string[] {\n return [];\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.inputTarget, \"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n private _addErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.add(...this._errorClasses);\n } else {\n el.classList.add(...this._defaultErrorClasses);\n }\n }\n\n private _removeErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.remove(...this._errorClasses);\n } else {\n el.classList.remove(...this._defaultErrorClasses);\n }\n }\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(charCount)) {\n this._removeErrorClasses(this.outputTarget);\n } else {\n this._addErrorClasses(this.outputTarget);\n }\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxDisableInputsController extends BaseController {\n\n static targets = [\"disabler\", \"disable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasDisablerTarget: boolean;\n declare readonly disablerTarget: HTMLInputElement;\n declare readonly disableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\n this.disable();\n } else {\n this.enable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.disableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.disableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxEnableInputsController extends BaseController {\n\n static targets = [\"enabler\", \"enable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasEnablerTarget: boolean;\n declare readonly enablerTarget: HTMLInputElement;\n declare readonly enableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.enableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.enableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this.checkboxTargets.filter(checkbox => checkbox.checked);\n }\n\n private get _unchecked() {\n return this.checkboxTargets.filter(checkbox => !checkbox.checked);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n useEventListener(this, this.selectAllTarget, 'change', this._toggle);\n this.checkboxTargets.forEach(checkbox => useEventListener(this, checkbox, 'change', this._refresh));\n this._refresh();\n });\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this.checkboxTargets.forEach((checkbox) => checkbox.checked = target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this.checkboxTargets.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ClipboardController extends BaseController {\n\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\n static values = {removeUnused: Boolean};\n\n declare readonly sourceTarget: HTMLElement;\n declare readonly copyTarget: HTMLElement;\n declare readonly hasCopyTarget: boolean;\n declare readonly fallbackTarget: HTMLElement;\n declare readonly hasFallbackTarget: boolean;\n\n declare readonly hasRemoveUnusedValue: boolean;\n declare readonly removeUnusedValue: boolean;\n\n _supported = false;\n\n connect() {\n this._supported = document.queryCommandSupported(\"copy\");\n\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\n if (this._supported && this.hasFallbackTarget) {\n this.fallbackTarget.remove();\n } else if (this.hasCopyTarget) {\n this.copyTarget.remove();\n }\n }\n }\n\n select(event: MouseEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n }\n\n copy(event: ClipboardEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n if (this._supported) {\n document.execCommand(\"copy\");\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class ClockController extends BaseController {\n\n\n static targets = [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"];\n\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n declare readonly hasMillisecondsTarget: boolean;\n declare readonly millisecondsTarget: HTMLElement;\n\n get _tickInterval() {\n if (this.hasMillisecondsTarget) {\n return 1; // 1 ms\n } else if (this.hasSecondsTarget) {\n return 1000; // 1 seconds\n } else if (this.hasMinutesTarget) {\n return 15000; // 15 seconds\n } else {\n return 300000; // Every 5 minutes\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useInterval(this, this._tick, this._tickInterval);\n });\n }\n\n _tick() {\n let current = new Date();\n\n if (this.hasHoursTarget) {\n this.hoursTarget.innerHTML = current\n .getHours()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMinutesTarget) {\n this.minutesTarget.innerHTML = current\n .getMinutes()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasSecondsTarget) {\n this.secondsTarget.innerHTML = current\n .getSeconds()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMillisecondsTarget) {\n this.millisecondsTarget.innerHTML = current\n .getMilliseconds()\n .toString()\n .padStart(3, \"0\");\n }\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n get _eventType(): \"submit\" | \"click\" {\n if (isHTMLFormElement(this.el)) {\n return \"submit\";\n } else if (isHTMLAnchorElement(this.el)) {\n return \"click\";\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, this._eventType, this.confirm);\n });\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatch(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener, useEventListeners} from \"../mixins/use_event_listener\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {message: String};\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n initialize() {\n this.allowSubmit = this.allowSubmit.bind(this);\n this.confirmNavigation = this.confirmNavigation.bind(this);\n this.confirmTurboNavigation = this.confirmTurboNavigation.bind(this);\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n useEventListener(this, window, \"popstate\", this.confirmNavigation);\n useEventListener(this, window, \"submit\", this.allowSubmit);\n useEventListeners(this, window, [\"turbolinks:before-visit\", \"turbo:before-visit\"], this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.onbeforeunload = null;\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: Event | PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {Duration, intervalToDuration, isPast} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class CountdownController extends BaseController {\n\n static values = {deadline: String, removeUnused: Boolean};\n static targets = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n static classes = [\"countingDown\", \"ended\"];\n\n // Values\n declare readonly deadlineValue: string;\n declare readonly removeUnusedValue: boolean;\n declare readonly hasRemoveUnusedValue: boolean;\n // Targets\n declare readonly hasYearsTarget: boolean;\n declare readonly yearsTarget: HTMLElement;\n declare readonly hasMonthsTarget: boolean;\n declare readonly monthsTarget: HTMLElement;\n declare readonly hasDaysTarget: boolean;\n declare readonly daysTarget: HTMLElement;\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n // Classes\n declare readonly countingDownClass: string;\n declare readonly hasCountingDownClass: boolean;\n declare readonly endedClass: string;\n declare readonly hasEndedClass: boolean;\n // Instance Data\n _interval: null | ReturnType<typeof window.setInterval> = null;\n\n get _removeUnused(): boolean {\n return this.hasRemoveUnusedValue ? this.removeUnusedValue : false;\n }\n\n get _endedClasses(): string[] {\n return this.endedClass.split(' ');\n }\n\n get _defaultEndedClasses(): string[] {\n return [];\n }\n\n get _countingDownClasses(): string[] {\n return this.countingDownClass.split(' ');\n }\n\n get _defaultCountingDownClasses(): string[] {\n return [];\n }\n\n get _deadlineDate() {\n return new Date(this.deadlineValue);\n }\n\n connect() {\n this._interval = setInterval(this._tick.bind(this), 1000);\n this._addCountingDownClasses();\n }\n\n disconnect() {\n this._clearTick();\n this._removeCountingDownClasses();\n this._removeEndedClasses();\n }\n\n deadlineValueChanged() {\n // Countdown had previously ended, restart ticking. Updating mid-tick will just work.\n if (this._interval == null) {\n this._interval = setInterval(this._tick.bind(this), 1000);\n }\n }\n\n _tick() {\n try {\n const now = new Date();\n let distance: Duration = {};\n\n if (isPast(this._deadlineDate)) {\n distance = {years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0};\n // Countdown has ended, stop ticking\n this._clearTick();\n this._removeCountingDownClasses();\n this._addEndedClasses();\n this.dispatch(this.el, \"countdown:ended\");\n } else {\n distance = intervalToDuration({start: this._deadlineDate, end: now});\n }\n\n if (this.hasYearsTarget) {\n this._updateTarget(this.yearsTarget, this._years(distance));\n }\n if (this.hasMonthsTarget) {\n this._updateTarget(this.monthsTarget, this._months(distance));\n }\n if (this.hasDaysTarget) {\n this._updateTarget(this.daysTarget, this._days(distance));\n }\n if (this.hasHoursTarget) {\n this._updateTarget(this.hoursTarget, this._hours(distance));\n }\n if (this.hasMinutesTarget) {\n this._updateTarget(this.minutesTarget, this._minutes(distance));\n }\n if (this.hasSecondsTarget) {\n this._updateTarget(this.secondsTarget, this._seconds(distance));\n }\n } catch (e) {\n console.error(e);\n this._clearTick();\n }\n }\n\n _clearTick() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _updateTarget(target: HTMLElement, value: number) {\n this._removeTargetIfUnused(target, value);\n target.innerHTML = value.toString();\n }\n\n _removeTargetIfUnused(target: HTMLElement, value: number) {\n if (this._removeUnused) {\n if (value === 0 && target.dataset.unused) {\n if (Number.parseInt(target.dataset.unused) > Date.now() + 1500) {\n target.remove();\n }\n } else if (value == 0) {\n target.dataset.unused = Date.now().toString();\n } else {\n target.dataset.unused = undefined;\n }\n }\n }\n\n _years(duration: Duration): number {\n return duration.years || 0;\n }\n\n _months(duration: Duration): number {\n return duration.months || 0;\n }\n\n _days(duration: Duration): number {\n return duration.days || 0;\n }\n\n _hours(duration: Duration): number {\n return duration.hours || 0;\n }\n\n _minutes(duration: Duration): number {\n return duration.minutes || 0;\n }\n\n _seconds(duration: Duration): number {\n return duration.seconds || 0;\n }\n\n private _addEndedClasses(el: HTMLElement = this.el) {\n if (this.hasEndedClass) {\n el.classList.add(...this._endedClasses);\n } else {\n el.classList.add(...this._defaultEndedClasses);\n }\n }\n\n private _removeEndedClasses(el: HTMLElement = this.el) {\n if (this.hasEndedClass) {\n el.classList.remove(...this._endedClasses);\n } else {\n el.classList.remove(...this._defaultEndedClasses);\n }\n }\n\n private _addCountingDownClasses(el: HTMLElement = this.el) {\n if (this.hasCountingDownClass) {\n el.classList.add(...this._countingDownClasses);\n } else {\n el.classList.add(...this._defaultCountingDownClasses);\n }\n }\n\n private _removeCountingDownClasses(el: HTMLElement = this.el) {\n if (this.hasCountingDownClass) {\n el.classList.remove(...this._countingDownClasses);\n } else {\n el.classList.remove(...this._defaultCountingDownClasses);\n }\n }\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListeners} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyFormController extends BaseController {\n\n get _formElements(): Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> {\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\n }\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListeners(this, element, [\"input\", \"change\"], this._checkDirty);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\n }\n\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (value !== null) {\n return value;\n }\n\n if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (this._isElementDirty(element)) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return this._getElementValue(element) !== this._getElementLoadValue(element);\n }\n\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\n }\n\n private _checkDirty(): void {\n this._formElements.forEach(el => this._checkElementDirty(el));\n if (this._formElements.some(el => isFormDirty(el))) {\n this.el.setAttribute(\"data-dirty\", \"true\");\n } else {\n this.el.removeAttribute(\"data-dirty\");\n }\n }\n}\n\nexport function isFormDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLButtonElement, isHTMLInputElement} from \"../utilities/elements\";\nimport {useEventListeners} from \"../mixins/use_event_listener\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n _cacheText?: string;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n initialize() {\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListeners(this, this.el, [\"click\"], this.disable);\n useEventListeners(this, window, [\"turbo:load\", \"turbolinks:load\"], this._enable);\n });\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._cacheText = this._getElText(element);\n this._setElText(element, this._message);\n this._disable();\n useTimeout(this, this.enable, this._timeout);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._setElText(element, this._cacheText!);\n this._enable();\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _getElText(el: HTMLElement): string {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n return el.value;\n } else {\n return el.innerText;\n }\n }\n\n _setElText(el: HTMLElement, str: string) {\n if (isHTMLInputElement(el) && el.type == \"submit\") {\n el.value = str;\n } else if (isHTMLButtonElement(el) || isHTMLAnchorElement(el)) {\n el.innerText = str;\n }\n }\n\n _disable() {\n let el = this.el;\n if ((isHTMLInputElement(el) && el.type == \"submit\") || isHTMLButtonElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable() {\n let el = this.el;\n if (isHTMLInputElement(el) && el.type == \"submit\" || isHTMLButtonElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n\nexport class RemoveController extends DismissableController {\n}","import {Duration, formatDuration, intervalToDuration, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class DurationController extends BaseController {\n static values = {\n timestamp: Number,\n minutes: Boolean,\n seconds: Boolean,\n };\n\n declare readonly minutesValue: boolean;\n declare readonly hasMinutesValue: boolean;\n declare readonly secondsValue: boolean;\n declare readonly hasSecondsValue: boolean;\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n _intervalHandle: number | null = null;\n\n get _format(): string[] {\n return [\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n ...(this._minutes ? [\"minutes\"] : []),\n ...(this._seconds ? [\"seconds\"] : []),\n ];\n }\n\n get _output(): string {\n let {years, months, weeks, days, hours, minutes, seconds} = this._duration;\n\n years ||= 0;\n months ||= 0;\n weeks ||= 0;\n days ||= 0;\n hours ||= 0;\n minutes ||= 0;\n seconds ||= 0;\n\n let largeDenominators = [years, months, weeks, days, hours];\n\n if (!this._minutes && !this._seconds && largeDenominators.every((x) => x === 0)) {\n minutes = minutes + seconds / 60.0;\n return `${(minutes / 60).toFixed(1)} hours`;\n }\n\n return formatDuration(this._duration, {format: this._format, delimiter: \", \"});\n }\n\n get _seconds(): boolean {\n return this.hasSecondsValue ? this.secondsValue : true;\n }\n\n get _minutes(): boolean {\n return this.hasMinutesValue ? this.minutesValue : true;\n }\n\n get _timestamp(): Date {\n if (this.hasTimestampValue) {\n return toDate(this.timestampValue * 1000);\n } else {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n }\n\n get _duration(): Duration {\n return intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _tickInterval() {\n if (this._seconds) {\n return 1000; // 1 seconds\n } else if (this._minutes) {\n return 15000; // 15 seconds\n } else {\n return 120000; // 2 minutes\n }\n }\n\n declare _clearInterval: () => void;\n\n connect() {\n this._clearInterval = useInterval(this, this._update, this._tickInterval);\n this._update();\n }\n\n\n _update() {\n try {\n this.el.innerHTML = this._output;\n } catch {\n if (this._intervalHandle) {\n window.clearInterval(this._intervalHandle);\n }\n }\n }\n}\n","import {get as _get, set as _set} from \"lodash-es\";\nimport {BaseController} from '../utilities/base_controller';\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n localStorage.removeItem(this._uniqueIdentifier);\n this.dispatch(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n localStorage.setItem(this._uniqueIdentifier, JSON.stringify(data));\n this.dispatch(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (localStorage.getItem(this._uniqueIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._uniqueIdentifier)!); // get and parse the saved data from localStorage\n Object.keys(savedData).forEach((attr: string) => {\n _set(element as HTMLElement, attr, savedData[attr]);\n });\n this.dispatch(element, `element-save:restore:success`);\n } else {\n this.dispatch(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport class EmptyDomController extends BaseController {\n\n static targets = [\"container\"];\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare readonly hasContainerTarget: boolean;\n declare readonly containerTarget: HTMLElement;\n\n declare readonly emptyClass: string;\n declare readonly hasEmptyClass: boolean;\n declare readonly notEmptyClass: string;\n declare readonly hasNotEmptyClass: boolean;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _container() {\n return this.hasContainerTarget ? this.containerTarget : this.el;\n }\n\n get _notEmptyClasses(): string[] {\n return this.notEmptyClass.split(' ');\n }\n\n get _defaultNotEmptyClasses(): string[] {\n return [];\n }\n\n get _emptyClasses(): string[] {\n return this.emptyClass.split(' ');\n }\n\n get _defaultEmptyClasses(): string[] {\n return [];\n }\n\n get _children(): Element[] {\n let element = this._container;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n useMutation(this, {element: this._container, childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this._container;\n let children = this._children;\n if (children.length === 0) {\n this._removeNotEmptyClasses();\n this._addEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:empty\");\n } else {\n this._addNotEmptyClasses();\n this._removeEmptyClasses();\n this.dispatch(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n private _addNotEmptyClasses(el: HTMLElement = this.el) {\n if (this.hasNotEmptyClass) {\n el.classList.add(...this._notEmptyClasses);\n } else {\n el.classList.add(...this._defaultNotEmptyClasses);\n }\n }\n\n private _removeNotEmptyClasses(el: HTMLElement = this.el) {\n if (this.hasNotEmptyClass) {\n el.classList.remove(...this._notEmptyClasses);\n } else {\n el.classList.remove(...this._defaultNotEmptyClasses);\n }\n }\n\n private _addEmptyClasses(el: HTMLElement = this.el) {\n if (this.hasEmptyClass) {\n el.classList.add(...this._emptyClasses);\n } else {\n el.classList.add(...this._defaultEmptyClasses);\n }\n }\n\n private _removeEmptyClasses(el: HTMLElement = this.el) {\n if (this.hasEmptyClass) {\n el.classList.remove(...this._emptyClasses);\n } else {\n el.classList.remove(...this._defaultEmptyClasses);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class EnableInputsController extends BaseController {\n\n static targets = [\"input\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly inputTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.inputTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.inputTargets.forEach((el, _) => el.disabled = false);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FallbackImageController extends BaseController {\n\n static values = {placeholder: String};\n static classes = [\"success\", \"fail\"];\n\n declare readonly placeholderValue: string;\n declare readonly hasPlaceholderValue: boolean;\n declare readonly successClass: string;\n declare readonly hasSuccessClass: boolean;\n declare readonly failClass: string;\n declare readonly hasFailClass: boolean;\n\n get _successClasses(): string[] {\n return this.successClass.split(' ');\n }\n\n get _defaultSuccessClasses(): string[] {\n return [];\n }\n\n get _failClasses(): string[] {\n return this.failClass.split(' ');\n }\n\n get _defaultFailClasses(): string[] {\n return [];\n }\n\n initialize() {\n this._hasLoadedSuccessfully = this._hasLoadedSuccessfully.bind(this);\n this._success = this._success.bind(this);\n this._fail = this._fail.bind(this);\n }\n\n connect() {\n let element = this.el as HTMLImageElement;\n\n element.onerror = this._fail;\n if (element.complete && !this._hasLoadedSuccessfully()) {\n this._fail();\n } else {\n this._success();\n }\n }\n\n disconnect() {\n this._removeSuccessClasses();\n this._removeFailClasses();\n }\n\n private _success() {\n this._addSuccessClasses();\n }\n\n private _fail() {\n let element = this.el as HTMLImageElement;\n this._addFailClasses();\n\n if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {\n this.dispatch(element, \"fallback-image:placeholder\");\n element.src = this.placeholderValue;\n element.onerror = this._fail;\n } else {\n this.dispatch(element, \"fallback-image:fail\");\n element.style.display = \"none\";\n }\n }\n\n private _hasLoadedSuccessfully(): boolean {\n let element = this.el as HTMLImageElement;\n return element.naturalHeight > 0 && element.naturalWidth > 0;\n }\n\n private _addFailClasses(el: HTMLElement = this.el) {\n if (this.hasFailClass) {\n el.classList.add(...this._failClasses);\n } else {\n el.classList.add(...this._defaultFailClasses);\n }\n }\n\n private _removeFailClasses(el: HTMLElement = this.el) {\n if (this.hasFailClass) {\n el.classList.remove(...this._failClasses);\n } else {\n el.classList.remove(...this._defaultFailClasses);\n }\n }\n\n private _addSuccessClasses(el: HTMLElement = this.el) {\n if (this.hasSuccessClass) {\n el.classList.add(...this._successClasses);\n } else {\n el.classList.add(...this._defaultSuccessClasses);\n }\n }\n\n private _removeSuccessClasses(el: HTMLElement = this.el) {\n if (this.hasSuccessClass) {\n el.classList.remove(...this._successClasses);\n } else {\n el.classList.remove(...this._defaultSuccessClasses);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FocusStealController extends BaseController {\n\n\n static values = {\n mode: String,\n };\n\n declare modeValue: 'immediate' | 'wait';\n declare hasModeValue: boolean;\n\n get _mode() {\n const MODES = ['immediate', 'wait'];\n if (this.hasModeValue) {\n if (!MODES.includes(this.modeValue)) {\n throw new Error(`The given modeValue '${this.modeValue}' is not one of the supported modes: \"${MODES.join('\", \"')}\"`);\n } else {\n return this.modeValue;\n }\n } else {\n return MODES[0];\n }\n }\n\n connect() {\n if (this._mode == 'immediate') {\n this.steal();\n }\n }\n\n steal() {\n (this.el as HTMLInputElement).focus();\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {requestReset, requestSubmit} from \"../../utilities/request_submit\";\n\nexport class FormRcController extends BaseController {\n\n static targets = [\"form\"];\n static values = {\n formSelector: String,\n submitMode: String,\n };\n\n declare submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare readonly formTarget: HTMLFormElement;\n declare readonly formSelectorValue: string;\n declare readonly hasFormSelectorValue: boolean;\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get form(): HTMLFormElement {\n let form: HTMLFormElement | null;\n if (this.hasFormSelectorValue) {\n form = document.querySelector(this.formSelectorValue);\n if (!form) {\n throw new Error(`Could not find a form on the page that matches selector '${this.formSelectorValue}'`);\n }\n } else {\n form = this.formTarget;\n }\n return form;\n }\n\n submit(event?: Event) {\n event?.preventDefault();\n let el = this.el as HTMLFormElement;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n\n reset(event?: Event) {\n event?.preventDefault();\n requestReset(this.form);\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\ninterface FormSavePayload {\n [idx: string]: {\n [idx: string]: string | boolean\n };\n}\n\nexport class FormSaveController extends BaseController {\n\n static values = {\n id: String,\n restoreOnLoad: Boolean,\n clearOnSubmit: Boolean,\n };\n\n declare readonly idValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare readonly clearOnSubmitValue: boolean;\n declare readonly hasClearOnSubmitValue: boolean;\n\n get _formID() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = (this.el as HTMLFormElement).id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\n }\n }\n\n get _formIdentifier() {\n const url = location.href;\n return `${url} ${this._formID}`;\n }\n\n get _formElements() {\n return (this.el as HTMLFormElement).elements;\n }\n\n get _formData(): FormSavePayload {\n let data: FormSavePayload = {[this._formIdentifier]: {}};\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name.length > 0) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n data[this._formIdentifier][el.name] = el.checked;\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.checked) {\n data[this._formIdentifier][el.name] = el.value;\n }\n } else {\n data[this._formIdentifier][el.name] = el.value;\n }\n }\n }\n return data;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _clearOnSubmit() {\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (!isHTMLFormElement(element)) {\n throw new Error('Expected controller to be mounted on a form element.');\n }\n\n if (this._restoreOnLoad) {\n this.restore();\n }\n if (this._clearOnSubmit) {\n useEventListener(this, this.el, 'submit', this._clear);\n }\n });\n }\n\n _clear() {\n localStorage.removeItem(this._formIdentifier);\n this.dispatch(this.el, `form-save:cleared`);\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n save(event: Event) {\n event.preventDefault();\n let data = this._formData;\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\n this.dispatch(this.el, `form-save:save:success`);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n if (localStorage.getItem(this._formIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name in savedData) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n el.checked = savedData[el.name];\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.value == savedData[el.name]) {\n el.checked = true;\n }\n } else {\n el.value = savedData[el.name];\n }\n }\n }\n this.dispatch(this.el, `form-save:restore:success`);\n } else {\n this.dispatch(this.el, `form-save:restore:empty`);\n }\n }\n\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, {\n threshold: this._threshold,\n element: this.el,\n });\n }\n\n appear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:appear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n disappear(entry: IntersectionObserverEntry) {\n this.dispatch(\n this.el,\n \"intersection:disappear\",\n {\n detail: {\n element: this.el,\n },\n },\n );\n };\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class IntervalController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n declare readonly hasSecondsValue: boolean;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error('Expected `secondsValue` to be present');\n }\n requestAnimationFrame(() => {\n useInterval(this, this._interval, this.secondsValue * 1000);\n });\n }\n\n _interval() {\n this.dispatch(this.el, \"interval:action\");\n }\n\n}\n","// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n supportCustomEvent = function CustomEvent(event, x) {\n x = x || {};\n var ev = document.createEvent('CustomEvent');\n ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n return ev;\n };\n supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * Dispatches the passed event to both an \"on<type>\" handler as well as via the\n * normal dispatch operation. Does not bubble.\n *\n * @param {!EventTarget} target\n * @param {!Event} event\n * @return {boolean}\n */\nfunction safeDispatchEvent(target, event) {\n var check = 'on' + event.type.toLowerCase();\n if (typeof target[check] === 'function') {\n target[check](event);\n }\n return target.dispatchEvent(event);\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n while (el && el !== document.body) {\n var s = window.getComputedStyle(el);\n var invalid = function(k, ok) {\n return !(s[k] === undefined || s[k] === ok);\n };\n\n if (s.opacity < 1 ||\n invalid('zIndex', 'auto') ||\n invalid('transform', 'none') ||\n invalid('mixBlendMode', 'normal') ||\n invalid('filter', 'none') ||\n invalid('perspective', 'none') ||\n s['isolation'] === 'isolate' ||\n s.position === 'fixed' ||\n s.webkitOverflowScrolling === 'touch') {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n while (el) {\n if (el.localName === 'dialog') {\n return /** @type {HTMLDialogElement} */ (el);\n }\n if (el.parentElement) {\n el = el.parentElement;\n } else if (el.parentNode) {\n el = el.parentNode.host;\n } else {\n el = null;\n }\n }\n return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n // Find the actual focused element when the active element is inside a shadow root\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement;\n }\n\n if (el && el.blur && el !== document.body) {\n el.blur();\n }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n for (var i = 0; i < nodeList.length; ++i) {\n if (nodeList[i] === node) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n if (!el || !el.hasAttribute('method')) {\n return false;\n }\n return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!DocumentFragment|!Element} hostElement\n * @return {?Element}\n */\nfunction findFocusableElementWithin(hostElement) {\n // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n // alternative involves stepping through and trying to focus everything.\n var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n var query = opts.map(function(el) {\n return el + ':not([disabled])';\n });\n // TODO(samthor): tabindex values that are not numeric are not focusable.\n query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])'); // tabindex != \"\", not disabled\n var target = hostElement.querySelector(query.join(', '));\n\n if (!target && 'attachShadow' in Element.prototype) {\n // If we haven't found a focusable target, see if the host element contains an element\n // which has a shadowRoot.\n // Recursively search for the first focusable item in shadow roots.\n var elems = hostElement.querySelectorAll('*');\n for (var i = 0; i < elems.length; i++) {\n if (elems[i].tagName && elems[i].shadowRoot) {\n target = findFocusableElementWithin(elems[i].shadowRoot);\n if (target) {\n break;\n }\n }\n }\n }\n return target;\n}\n\n/**\n * Determines if an element is attached to the DOM.\n * @param {Element} element to check\n * @return {boolean} whether the element is in DOM\n */\nfunction isConnected(element) {\n return element.isConnected || document.body.contains(element);\n}\n\n/**\n * @param {!Event} event\n * @return {?Element}\n */\nfunction findFormSubmitter(event) {\n if (event.submitter) {\n return event.submitter;\n }\n\n var form = event.target;\n if (!(form instanceof HTMLFormElement)) {\n return null;\n }\n\n var submitter = dialogPolyfill.formSubmitter;\n if (!submitter) {\n var target = event.target;\n var root = ('getRootNode' in target && target.getRootNode() || document);\n submitter = root.activeElement;\n }\n\n if (!submitter || submitter.form !== form) {\n return null;\n }\n return submitter;\n}\n\n/**\n * @param {!Event} event\n */\nfunction maybeHandleSubmit(event) {\n if (event.defaultPrevented) {\n return;\n }\n var form = /** @type {!HTMLFormElement} */ (event.target);\n\n // We'd have a value if we clicked on an imagemap.\n var value = dialogPolyfill.imagemapUseValue;\n var submitter = findFormSubmitter(event);\n if (value === null && submitter) {\n value = submitter.value;\n }\n\n // There should always be a dialog as this handler is added specifically on them, but check just\n // in case.\n var dialog = findNearestDialog(form);\n if (!dialog) {\n return;\n }\n\n // Prefer formmethod on the button.\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod !== 'dialog') {\n return;\n }\n event.preventDefault();\n\n if (value != null) {\n // nb. we explicitly check against null/undefined\n dialog.close(value);\n } else {\n dialog.close();\n }\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n this.dialog_ = dialog;\n this.replacedStyleTop_ = false;\n this.openAsModal_ = false;\n\n // Set a11y role. Browsers that support dialog implicitly know this already.\n if (!dialog.hasAttribute('role')) {\n dialog.setAttribute('role', 'dialog');\n }\n\n dialog.show = this.show.bind(this);\n dialog.showModal = this.showModal.bind(this);\n dialog.close = this.close.bind(this);\n\n dialog.addEventListener('submit', maybeHandleSubmit, false);\n\n if (!('returnValue' in dialog)) {\n dialog.returnValue = '';\n }\n\n if ('MutationObserver' in window) {\n var mo = new MutationObserver(this.maybeHideModal.bind(this));\n mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n } else {\n // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n // seem to fire even if the element was removed as part of a parent removal. Use the removed\n // events to force downgrade (useful if removed/immediately added).\n var removed = false;\n var cb = function() {\n removed ? this.downgradeModal() : this.maybeHideModal();\n removed = false;\n }.bind(this);\n var timeout;\n var delayModel = function(ev) {\n if (ev.target !== dialog) { return; } // not for a child element\n var cand = 'DOMNodeRemoved';\n removed |= (ev.type.substr(0, cand.length) === cand);\n window.clearTimeout(timeout);\n timeout = window.setTimeout(cb, 0);\n };\n ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n dialog.addEventListener(name, delayModel);\n });\n }\n // Note that the DOM is observed inside DialogManager while any dialog\n // is being displayed as a modal, to catch modal removal from the DOM.\n\n Object.defineProperty(dialog, 'open', {\n set: this.setOpen.bind(this),\n get: dialog.hasAttribute.bind(dialog, 'open')\n });\n\n this.backdrop_ = document.createElement('div');\n this.backdrop_.className = 'backdrop';\n this.backdrop_.addEventListener('mouseup' , this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('mousedown', this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('click' , this.backdropMouseEvent_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = /** @type {HTMLDialogElement.prototype} */ ({\n\n get dialog() {\n return this.dialog_;\n },\n\n /**\n * Maybe remove this dialog from the modal top layer. This is called when\n * a modal dialog may no longer be tenable, e.g., when the dialog is no\n * longer open or is no longer part of the DOM.\n */\n maybeHideModal: function() {\n if (this.dialog_.hasAttribute('open') && isConnected(this.dialog_)) { return; }\n this.downgradeModal();\n },\n\n /**\n * Remove this dialog from the modal top layer, leaving it as a non-modal.\n */\n downgradeModal: function() {\n if (!this.openAsModal_) { return; }\n this.openAsModal_ = false;\n this.dialog_.style.zIndex = '';\n\n // This won't match the native <dialog> exactly because if the user set top on a centered\n // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n // possible to polyfill this perfectly.\n if (this.replacedStyleTop_) {\n this.dialog_.style.top = '';\n this.replacedStyleTop_ = false;\n }\n\n // Clear the backdrop and remove from the manager.\n this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n dialogPolyfill.dm.removeDialog(this);\n },\n\n /**\n * @param {boolean} value whether to open or close this dialog\n */\n setOpen: function(value) {\n if (value) {\n this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n } else {\n this.dialog_.removeAttribute('open');\n this.maybeHideModal(); // nb. redundant with MutationObserver\n }\n },\n\n /**\n * Handles mouse events ('mouseup', 'mousedown', 'click') on the fake .backdrop element, redirecting them as if\n * they were on the dialog itself.\n *\n * @param {!Event} e to redirect\n */\n backdropMouseEvent_: function(e) {\n if (!this.dialog_.hasAttribute('tabindex')) {\n // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n // would not be needed - clicks would move the implicit cursor there.\n var fake = document.createElement('div');\n this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n fake.tabIndex = -1;\n fake.focus();\n this.dialog_.removeChild(fake);\n } else {\n this.dialog_.focus();\n }\n\n var redirectedEvent = document.createEvent('MouseEvents');\n redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n this.dialog_.dispatchEvent(redirectedEvent);\n e.stopPropagation();\n },\n\n /**\n * Focuses on the first focusable element within the dialog. This will always blur the current\n * focus, even if nothing within the dialog is found.\n */\n focus_: function() {\n // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n if (!target && this.dialog_.tabIndex >= 0) {\n target = this.dialog_;\n }\n if (!target) {\n target = findFocusableElementWithin(this.dialog_);\n }\n safeBlur(document.activeElement);\n target && target.focus();\n },\n\n /**\n * Sets the zIndex for the backdrop and dialog.\n *\n * @param {number} dialogZ\n * @param {number} backdropZ\n */\n updateZIndex: function(dialogZ, backdropZ) {\n if (dialogZ < backdropZ) {\n throw new Error('dialogZ should never be < backdropZ');\n }\n this.dialog_.style.zIndex = dialogZ;\n this.backdrop_.style.zIndex = backdropZ;\n },\n\n /**\n * Shows the dialog. If the dialog is already open, this does nothing.\n */\n show: function() {\n if (!this.dialog_.open) {\n this.setOpen(true);\n this.focus_();\n }\n },\n\n /**\n * Show this dialog modally.\n */\n showModal: function() {\n if (this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n }\n if (!isConnected(this.dialog_)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n }\n if (!dialogPolyfill.dm.pushDialog(this)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n }\n\n if (createsStackingContext(this.dialog_.parentElement)) {\n console.warn('A dialog is being shown inside a stacking context. ' +\n 'This may cause it to be unusable. For more information, see this link: ' +\n 'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n }\n\n this.setOpen(true);\n this.openAsModal_ = true;\n\n // Optionally center vertically, relative to the current viewport.\n if (dialogPolyfill.needsCentering(this.dialog_)) {\n dialogPolyfill.reposition(this.dialog_);\n this.replacedStyleTop_ = true;\n } else {\n this.replacedStyleTop_ = false;\n }\n\n // Insert backdrop.\n this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n // Focus on whatever inside the dialog.\n this.focus_();\n },\n\n /**\n * Closes this HTMLDialogElement. This is optional vs clearing the open\n * attribute, however this fires a 'close' event.\n *\n * @param {string=} opt_returnValue to use as the returnValue\n */\n close: function(opt_returnValue) {\n if (!this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n }\n this.setOpen(false);\n\n // Leave returnValue untouched in case it was set directly on the element\n if (opt_returnValue !== undefined) {\n this.dialog_.returnValue = opt_returnValue;\n }\n\n // Triggering \"close\" event for any attached listeners on the <dialog>.\n var closeEvent = new supportCustomEvent('close', {\n bubbles: false,\n cancelable: false\n });\n safeDispatchEvent(this.dialog_, closeEvent);\n }\n\n});\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n for (var i = 0; i < document.styleSheets.length; ++i) {\n var styleSheet = document.styleSheets[i];\n var cssRules = null;\n // Some browsers throw on cssRules.\n try {\n cssRules = styleSheet.cssRules;\n } catch (e) {}\n if (!cssRules) { continue; }\n for (var j = 0; j < cssRules.length; ++j) {\n var rule = cssRules[j];\n var selectedNodes = null;\n // Ignore errors on invalid selector texts.\n try {\n selectedNodes = document.querySelectorAll(rule.selectorText);\n } catch(e) {}\n if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n continue;\n }\n var cssTop = rule.style.getPropertyValue('top');\n var cssBottom = rule.style.getPropertyValue('bottom');\n if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n return true;\n }\n }\n }\n return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n var computedStyle = window.getComputedStyle(dialog);\n if (computedStyle.position !== 'absolute') {\n return false;\n }\n\n // We must determine whether the top/bottom specified value is non-auto. In\n // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n // Firefox returns the used value. So we do this crazy thing instead: check\n // the inline style and then go through CSS rules.\n if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n return false;\n }\n return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n if (window.HTMLDialogElement || element.showModal) {\n console.warn('This browser already supports <dialog>, the polyfill ' +\n 'may not work correctly', element);\n }\n if (element.localName !== 'dialog') {\n throw new Error('Failed to register dialog: The element is not a dialog.');\n }\n new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n if (!element.showModal) {\n dialogPolyfill.forceRegisterDialog(element);\n }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n /** @type {!Array<!dialogPolyfillInfo>} */\n this.pendingDialogStack = [];\n\n var checkDOM = this.checkDOM_.bind(this);\n\n // The overlay is used to simulate how a modal dialog blocks the document.\n // The blocking dialog is positioned on top of the overlay, and the rest of\n // the dialogs on the pending dialog stack are positioned below it. In the\n // actual implementation, the modal dialog stacking is controlled by the\n // top layer, where z-index has no effect.\n this.overlay = document.createElement('div');\n this.overlay.className = '_dialog_overlay';\n this.overlay.addEventListener('click', function(e) {\n this.forwardTab_ = undefined;\n e.stopPropagation();\n checkDOM([]); // sanity-check DOM\n }.bind(this));\n\n this.handleKey_ = this.handleKey_.bind(this);\n this.handleFocus_ = this.handleFocus_.bind(this);\n\n this.zIndexLow_ = 100000;\n this.zIndexHigh_ = 100000 + 150;\n\n this.forwardTab_ = undefined;\n\n if ('MutationObserver' in window) {\n this.mo_ = new MutationObserver(function(records) {\n var removed = [];\n records.forEach(function(rec) {\n for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n if (!(c instanceof Element)) {\n continue;\n } else if (c.localName === 'dialog') {\n removed.push(c);\n }\n removed = removed.concat(c.querySelectorAll('dialog'));\n }\n });\n removed.length && checkDOM(removed);\n });\n }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n document.documentElement.addEventListener('focus', this.handleFocus_, true);\n document.addEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n document.removeEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n var zIndex = this.zIndexHigh_;\n\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n dpi.updateZIndex(--zIndex, --zIndex);\n if (i === 0) {\n this.overlay.style.zIndex = --zIndex;\n }\n }\n\n // Make the overlay a sibling of the dialog itself.\n var last = this.pendingDialogStack[0];\n if (last) {\n var p = last.dialog.parentNode || document.body;\n p.appendChild(this.overlay);\n } else if (this.overlay.parentNode) {\n this.overlay.parentNode.removeChild(this.overlay);\n }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n while (candidate = findNearestDialog(candidate)) {\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n if (dpi.dialog === candidate) {\n return i === 0; // only valid if top-most\n }\n }\n candidate = candidate.parentElement;\n }\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n var target = event.composedPath ? event.composedPath()[0] : event.target;\n\n if (this.containedByTopDialog_(target)) { return; }\n\n if (document.activeElement === document.documentElement) { return; }\n\n event.preventDefault();\n event.stopPropagation();\n safeBlur(/** @type {Element} */ (target));\n\n if (this.forwardTab_ === undefined) { return; } // move focus only from a tab key\n\n var dpi = this.pendingDialogStack[0];\n var dialog = dpi.dialog;\n var position = dialog.compareDocumentPosition(target);\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n if (this.forwardTab_) {\n // forward\n dpi.focus_();\n } else if (target !== document.documentElement) {\n // backwards if we're not already focused on <html>\n document.documentElement.focus();\n }\n }\n\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n this.forwardTab_ = undefined;\n if (event.keyCode === 27) {\n event.preventDefault();\n event.stopPropagation();\n var cancelEvent = new supportCustomEvent('cancel', {\n bubbles: false,\n cancelable: true\n });\n var dpi = this.pendingDialogStack[0];\n if (dpi && safeDispatchEvent(dpi.dialog, cancelEvent)) {\n dpi.dialog.close();\n }\n } else if (event.keyCode === 9) {\n this.forwardTab_ = !event.shiftKey;\n }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n // This operates on a clone because it may cause it to change. Each change also calls\n // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n // at a time?!\n var clone = this.pendingDialogStack.slice();\n clone.forEach(function(dpi) {\n if (removed.indexOf(dpi.dialog) !== -1) {\n dpi.downgradeModal();\n } else {\n dpi.maybeHideModal();\n }\n });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n if (this.pendingDialogStack.length >= allowed) {\n return false;\n }\n if (this.pendingDialogStack.unshift(dpi) === 1) {\n this.blockDocument();\n }\n this.updateStacking();\n return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n var index = this.pendingDialogStack.indexOf(dpi);\n if (index === -1) { return; }\n\n this.pendingDialogStack.splice(index, 1);\n if (this.pendingDialogStack.length === 0) {\n this.unblockDocument();\n }\n this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.imagemapUseValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n /**\n * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n * one that returns the correct value.\n */\n var testForm = document.createElement('form');\n testForm.setAttribute('method', 'dialog');\n if (testForm.method !== 'dialog') {\n var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n if (methodDescriptor) {\n // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n // and don't bother to update the element.\n var realGet = methodDescriptor.get;\n methodDescriptor.get = function() {\n if (isFormMethodDialog(this)) {\n return 'dialog';\n }\n return realGet.call(this);\n };\n var realSet = methodDescriptor.set;\n /** @this {HTMLElement} */\n methodDescriptor.set = function(v) {\n if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n return this.setAttribute('method', v);\n }\n return realSet.call(this, v);\n };\n Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n }\n }\n\n /**\n * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n * document.activeElement.\n */\n document.addEventListener('click', function(ev) {\n dialogPolyfill.formSubmitter = null;\n dialogPolyfill.imagemapUseValue = null;\n if (ev.defaultPrevented) { return; } // e.g. a submit which prevents default submission\n\n var target = /** @type {Element} */ (ev.target);\n if ('composedPath' in ev) {\n var path = ev.composedPath();\n target = path.shift() || target;\n }\n if (!target || !isFormMethodDialog(target.form)) { return; }\n\n var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n if (!valid) {\n if (!(target.localName === 'input' && target.type === 'image')) { return; }\n // this is a <input type=\"image\">, which can submit forms\n dialogPolyfill.imagemapUseValue = ev.offsetX + ',' + ev.offsetY;\n }\n\n var dialog = findNearestDialog(target);\n if (!dialog) { return; }\n\n dialogPolyfill.formSubmitter = target;\n\n }, false);\n\n /**\n * Global 'submit' handler. This handles submits of `method=\"dialog\"` which are invalid, i.e.,\n * outside a dialog. They get prevented.\n */\n document.addEventListener('submit', function(ev) {\n var form = ev.target;\n var dialog = findNearestDialog(form);\n if (dialog) {\n return; // ignore, handle there\n }\n\n var submitter = findFormSubmitter(ev);\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod === 'dialog') {\n ev.preventDefault();\n }\n });\n\n /**\n * Replace the native HTMLFormElement.submit() method, as it won't fire the\n * submit event and give us a chance to respond.\n */\n var nativeFormSubmit = HTMLFormElement.prototype.submit;\n var replacementFormSubmit = function () {\n if (!isFormMethodDialog(this)) {\n return nativeFormSubmit.call(this);\n }\n var dialog = findNearestDialog(this);\n dialog && dialog.close();\n };\n HTMLFormElement.prototype.submit = replacementFormSubmit;\n}\n\nexport default dialogPolyfill;\n","import dialogPolyfill from \"dialog-polyfill\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LightboxImageController extends BaseController {\n\n static values = {\n src: String,\n srcSet: String,\n sizes: String,\n };\n static classes = [\"modal\", \"image\"];\n\n declare readonly hasModalClass: boolean;\n declare readonly modalClass: string;\n declare readonly hasImageClass: boolean;\n declare readonly imageClass: string;\n declare readonly hasSrcValue: boolean;\n declare readonly srcValue: string;\n declare readonly hasSrcSetValue: boolean;\n declare readonly srcSetValue: string;\n declare readonly hasSizesValue: boolean;\n declare readonly sizesValue: string;\n _dialog: HTMLDialogElement | null = null;\n\n get _src(): string {\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\n }\n\n get _srcSet(): string {\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\n }\n\n get _sizes(): string {\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\n }\n\n get _modalClassName() {\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\n }\n\n get _imageClassName() {\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\n }\n\n initialize() {\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n }\n\n connect() {\n }\n\n open() {\n let element = this.el as HTMLImageElement;\n if (this._dialog) {\n return;\n }\n this._dialog = document.createElement(\"dialog\");\n\n let image = document.createElement(\"img\") as HTMLImageElement;\n image.className = this._imageClassName;\n image.src = this._src;\n image.srcset = this._srcSet;\n image.sizes = this._sizes;\n this._dialog.appendChild(image);\n\n element.insertAdjacentElement(\"afterend\", this._dialog);\n dialogPolyfill.registerDialog(this._dialog);\n this._dialog.className = this._modalClassName;\n // @ts-ignore Experimental API\n this._dialog.showModal();\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\n useEventListener(this, this._dialog, \"click\", this.close);\n useEventListener(this, this._dialog, \"cancel\", this.close);\n useEventListener(this, this._dialog, \"close\", this.close);\n }\n\n close() {\n if (this._dialog) {\n // @ts-ignore Experimental API\n this._dialog.close();\n this._dialog.remove();\n this._dialog = null;\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n\n connect() {\n this.inputTargets.forEach((el) => useEventListener(this, el, \"change\", this.handleInputs));\n }\n\n handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatch(target, \"change\");\n this.dispatch(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatch(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class MediaPlayerController extends BaseController {\n\n static targets = [\"media\"];\n\n declare readonly mediaTarget: HTMLMediaElement;\n\n initialize() {\n }\n\n connect() {\n }\n\n disconnect() {\n }\n\n async play(event?: Event) {\n event?.preventDefault();\n await this.mediaTarget.play();\n }\n\n pause(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.pause();\n }\n\n restart(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime = 0;\n }\n\n seek(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime += 5;\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {clamp} from \"lodash-es\";\n\nexport class NavigateFormErrorsController extends BaseController {\n static values = {\n selector: String,\n index: Number,\n };\n\n static targets = [\"next\", \"current\", \"previous\"];\n\n declare readonly hasNextTarget: boolean;\n declare readonly nextTarget: HTMLElement;\n declare readonly hasPreviousTarget: boolean;\n declare readonly previousTarget: HTMLElement;\n declare readonly hasCurrentTarget: boolean;\n declare readonly currentTarget: HTMLElement;\n\n declare selectorValue: string;\n declare readonly hasSelectorValue: boolean;\n declare indexValue: number;\n declare readonly hasIndexValue: boolean;\n\n _errors: HTMLElement[] = [];\n _firstClick = false;\n\n get _errorCount(): number {\n return this._errors.length;\n }\n\n get _previousIndex(): number {\n let index = this._index - 1;\n if (index < 0) {\n return 0;\n }\n return index;\n }\n\n get _nextIndex(): number {\n let index = this._index + 1;\n if (index > this._errors.length - 1) {\n return this._errors.length - 1;\n }\n return index;\n }\n\n get _index(): number {\n return clamp(this.hasIndexValue ? this.indexValue : 0, 0, this._errors.length);\n }\n\n get _selector(): string {\n if (this.hasSelectorValue) {\n return this.selectorValue;\n } else {\n throw new Error(\"Expected `selectorValue` to be present\");\n }\n }\n\n get _currentError(): HTMLElement {\n return this._errors[this._index];\n }\n\n connect() {\n requestAnimationFrame(() => {\n this._firstClick = true;\n this._toggleButtons();\n this._toggleVisibility();\n },\n );\n }\n\n async current(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n }\n\n async next(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._nextIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n }\n\n async previous(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._previousIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n }\n\n indexValueChanged() {\n this._toggleButtons();\n }\n\n selectorValueChanged() {\n this._errors = Array.from(document.querySelectorAll(this._selector));\n this.indexValue = 0;\n this._toggleButtons();\n this._toggleVisibility();\n }\n\n private _toggleVisibility() {\n if (this._errorCount === 0) {\n this.el.style.display = \"none\";\n } else {\n this.el.style.display = \"\";\n }\n }\n\n private _toggleButtons() {\n if (this.hasNextTarget) {\n // If there is no \"Current Error\" button, then enable the next error button when there is only 1 error.\n if (!this.hasCurrentTarget && this._firstClick && this.indexValue == this._errorCount - 1) {\n this.nextTarget.removeAttribute(\"disabled\");\n return;\n } else if (this.indexValue >= this._errorCount - 1) {\n this.nextTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.nextTarget.removeAttribute(\"disabled\");\n }\n }\n if (this.hasPreviousTarget) {\n if (this.indexValue <= 0) {\n this.previousTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.previousTarget.removeAttribute(\"disabled\");\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n get _errorClasses(): string[] {\n return this.errorClass.split(' ');\n }\n\n get _defaultErrorClasses(): string[] {\n return [];\n }\n\n connect() {\n this.passwordTargets.forEach((el) => useEventListener(this, el, \"change\", this._checkPasswordsMatch));\n }\n\n private _addErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.add(...this._errorClasses);\n } else {\n el.classList.add(...this._defaultErrorClasses);\n }\n }\n\n private _removeErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.remove(...this._errorClasses);\n } else {\n el.classList.remove(...this._defaultErrorClasses);\n }\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private _checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatch(element, \"password-confirm:match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => this._removeErrorClasses(el));\n }\n } else {\n this.dispatch(element, \"password-confirm:no-match\");\n if (this.hasErrorClass) {\n this.passwordTargets.forEach(el => this._addErrorClasses(el));\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {LoadBlockController} from \"./load_block_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class PollBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {endpoint: String, errorMessage: String, selector: String, seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n this._timeout();\n useInterval(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n async _timeout() {\n await this.loadContent();\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class PrefetchController extends BaseController {\n\n static values = {mode: String};\n\n declare readonly modeValue: \"intersect\" | \"mouseover\";\n declare readonly hasModeValue: boolean;\n\n get _mode(): string {\n return this.hasModeValue ? this.modeValue : \"mouseover\";\n }\n\n get _supportsPrefetch(): boolean {\n const link: HTMLLinkElement = document.createElement('link');\n return link.relList?.supports && link.relList?.supports('prefetch');\n }\n\n get _href(): string {\n return (this.el as HTMLAnchorElement).href;\n }\n\n get _existingPrefetch(): boolean {\n return (document.head.querySelectorAll(`link[rel=\"prefetch\"][href=\"${this._href}\"]`) || []).length > 0;\n }\n\n get _connectionSuitable(): boolean {\n // @ts-ignore\n const connection = navigator.connection;\n\n // no way to know what network state is. Allow prefetching\n if (!connection) {\n return true;\n }\n\n // Don't prefetch if network conditions are poor or user has enabled data-saving mode\n if (connection) {\n // @ts-ignore Experimental API\n if (connection.saveData) {\n this.warn('Data Saving is enabled');\n return false;\n }\n\n // @ts-ignore Experimental API\n if (/2g/.test(connection.effectiveType)) {\n this.warn(\"Network is too slow\");\n return false;\n }\n }\n return true;\n }\n\n connect(): void {\n if (!this._supportsPrefetch) {\n return;\n }\n\n switch (this._mode) {\n case \"intersect\":\n this._setupObserver();\n break;\n case \"mouseover\":\n useEventListener(this, this.el, \"mouseover\", this.prefetch, {once: true});\n break;\n default:\n throw new Error(`'${this._mode}' is not a supported prefetch mode`);\n }\n }\n\n _setupObserver(): void {\n const observer: IntersectionObserver = new IntersectionObserver(\n ([entry]: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n if (entry.isIntersecting) {\n this.prefetch();\n observer.unobserve(entry.target);\n }\n },\n );\n observer.observe(this.element);\n }\n\n prefetch() {\n if (this._existingPrefetch || !this._connectionSuitable) {\n return;\n }\n const link: HTMLLinkElement = document.createElement('link');\n Object.assign(link, {rel: 'prefetch', href: this._href, as: 'document'});\n document.head.appendChild(link);\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PresenceController extends BaseController {\n\n static values = {name: String};\n\n declare nameValue: string;\n declare readonly hasNameValue: boolean;\n\n get name(): string {\n return this.hasNameValue ? `${this.nameValue}:` : ``;\n }\n\n connect() {\n this.dispatch(this.el, `${this.nameValue}presence:added`);\n }\n\n disconnect() {\n this.dispatch(this.el, `${this.nameValue}presence:removed`);\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class PrintController extends BaseController {\n\n print(event?: Event) {\n event?.preventDefault();\n window.print();\n }\n\n}\n","import {PrintController} from \"./utility/print_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class PrintButtonController extends PrintController {\n\n static classes = [\n 'unsupported',\n ];\n declare readonly unsupportedClass: string;\n declare readonly hasUnsupportedClass: boolean;\n\n get _unsupportedClasses(): string[] {\n return this.unsupportedClass.split(' ');\n }\n\n get _defaultUnsupportedClasses(): string[] {\n return [\"unsupported\"];\n }\n\n connect() {\n if (!(\"print\" in window)) {\n this._addUnsupportedClasses(this.el);\n }\n useEventListener(this, this.el, 'click', this.print);\n }\n\n private _addUnsupportedClasses(el: HTMLElement = this.el) {\n if (this.hasUnsupportedClass) {\n el.classList.add(...this._unsupportedClasses);\n } else {\n el.classList.add(...this._defaultUnsupportedClasses);\n }\n }\n\n private _removeUnsupportedClasses(el: HTMLElement = this.el) {\n if (this.hasUnsupportedClass) {\n el.classList.remove(...this._unsupportedClasses);\n } else {\n el.classList.remove(...this._defaultUnsupportedClasses);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class RemoteFormController extends BaseController {\n static targets = [];\n\n static values = {selector: String};\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n get _selector(): string {\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\n }\n\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\n const [data, status, xhr] = event.detail;\n if (data instanceof Node) {\n let newElement: HTMLElement | null = data.querySelector(this._selector);\n\n if (newElement == null) {\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\n }\n\n let parentNode = this.el.parentNode;\n if (parentNode == null) {\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\n }\n parentNode.replaceChild(newElement, this.el);\n this.dispatch(newElement, 'remote-form:replace');\n } else {\n console.log('Unknown', data);\n }\n }\n}\n","import {useDebounce, useWindowResize} from \"stimulus-use\";\nimport {WindowResizePayload} from \"stimulus-use/dist/use-window-resize/use-window-resize\";\nimport {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n connect() {\n useEventListener(this, window, \"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent<ResponsiveIframeMessage>) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n static debounces = [\"postUpdate\"];\n\n declare observe: () => void;\n declare unobserve: () => void;\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useWindowResize(this);\n useDebounce(this, {});\n this.postUpdate();\n } else {\n // Not an iframe\n }\n }\n\n windowResize(payload: WindowResizePayload) {\n this.postUpdate();\n };\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollUp} from \"../../utilities/scroll\";\n\nexport class ScrollContainerController extends BaseController {\n\n static values = {\n behaviour: String,\n increment: Number,\n };\n\n declare readonly behaviourValue: ScrollBehavior;\n declare readonly hasBehaviourValue: boolean;\n\n declare readonly incrementValue: number;\n declare readonly hasIncrementValue: boolean;\n\n get _increment(): number {\n return this.hasIncrementValue ? this.incrementValue : 50;\n }\n\n get _behaviour(): ScrollBehavior {\n if (this.hasBehaviourValue) {\n if ([\"auto\", \"smooth\"].includes(this.behaviourValue)) {\n return this.behaviourValue;\n } else {\n throw new Error(`'${this.behaviourValue}' is not a recognised scroll behaviour`);\n }\n } else {\n return \"auto\";\n }\n }\n\n async scrollTop(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteTop(this.el, {behavior: this._behaviour});\n }\n\n async scrollBottom(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteBottom(this.el, {behavior: this._behaviour});\n }\n\n async scrollLeft(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async scrollRight(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async up(event?: Event) {\n event?.preventDefault();\n await scrollUp(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async down(event?: Event) {\n event?.preventDefault();\n await scrollDown(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async left(event?: Event) {\n event?.preventDefault();\n await scrollLeft(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async right(event?: Event) {\n event?.preventDefault();\n await scrollRight(this.el, this._increment, {behavior: this._behaviour});\n }\n}\n\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollIntoFocusController extends EphemeralController {\n\n static values = {\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n connect() {\n requestAnimationFrame(() => {\n // Attempt smooth scrolling, with polyfill\n scrollToElement(\n this.el,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\n this._cleanupSelf();\n });\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteBottom} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteBottom(this._scrollTarget);\n }\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteTop} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteTop(this._scrollTarget);\n }\n }\n\n}\n\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class SelfDestructController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n // Only start countdown on first paint\n useTimeout(this, () => this.el.remove(), this.secondsValue * 1000);\n });\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useInjectedElement} from \"../mixins/use_injected_html\";\n\nexport class StickyController extends BaseController {\n\n static classes = [\"stuck\"];\n static values = {mode: String};\n\n declare readonly stuckClass: string;\n declare readonly hasStuckClass: boolean;\n\n declare readonly hasModeValue: \"top\" | \"bottom\";\n declare readonly modeValue: \"top\" | \"bottom\";\n\n _magicElement: HTMLDivElement | null = null;\n\n get _stuckClasses(): string[] {\n return this.stuckClass.split(' ');\n }\n\n get _defaultStuckClasses(): string[] {\n return [\"stuck\"];\n }\n\n get _mode(): 'beforebegin' | 'afterend' {\n if (this.hasModeValue) {\n if (!['top', 'bottom'].includes(this.modeValue)) {\n throw new Error(`The modeValue provided '${this.modeValue}' is not one of the recognised configuration options`);\n }\n if (this.modeValue === 'top') {\n return 'beforebegin';\n }\n }\n return \"afterend\";\n }\n\n connect() {\n this._magicElement = document.createElement(\"div\");\n useInjectedElement(this, this.el, this._mode, this._magicElement);\n\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (entry.target !== this._magicElement) {\n return;\n }\n if (entry.intersectionRatio === 0) {\n this._addStuckClasses();\n } else if (entry.intersectionRatio === 1) {\n this._removeStuckClasses();\n }\n });\n\n }, {\n threshold: [0, 1],\n });\n observer.observe(this._magicElement!);\n }\n\n private _addStuckClasses(el: HTMLElement = this.el) {\n if (this.hasStuckClass) {\n el.classList.add(...this._stuckClasses);\n } else {\n el.classList.add(...this._defaultStuckClasses);\n }\n }\n\n private _removeStuckClasses(el: HTMLElement = this.el) {\n if (this.hasStuckClass) {\n el.classList.remove(...this._stuckClasses);\n } else {\n el.classList.remove(...this._defaultStuckClasses);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isHTMLInputElement, isHTMLSelectElement, isHTMLTextAreaElement, isTypeOfFormInputElement} from \"../../utilities/elements\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport interface SyncValuePayload {\n value: string | boolean;\n dispatcher: HTMLElement;\n}\n\nexport class SyncInputsController extends BaseController {\n static values = {\n key: String,\n };\n\n declare readonly keyValue: string;\n declare readonly hasKeyValue: boolean;\n\n get _eventName(): string {\n return `sync:${this._key}`;\n }\n\n get _key(): string {\n if (this.hasKeyValue) {\n return this.keyValue;\n }\n throw new Error(\"Expected `keyValue` to be present\");\n }\n\n get _value(): string | boolean {\n let el = this.el as | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n return el.checked;\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n return el.checked ? el.value : \"\";\n } else {\n return el.value;\n }\n }\n\n set _value(val: string | boolean) {\n let el = this.el;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n el.checked = val.toString() === \"true\";\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n el.checked = el.value === val;\n } else if (isHTMLInputElement(el) || isHTMLTextAreaElement(el) || isHTMLSelectElement(el)) {\n el.value = val.toString();\n } else {\n el.innerHTML = val.toString();\n }\n }\n\n initialize() {\n this._read = this._read.bind(this);\n this._emit = this._emit.bind(this);\n }\n\n connect() {\n EventBus.on(this._eventName, this._read);\n\n requestAnimationFrame(() => {\n if (isTypeOfFormInputElement(this.el)) {\n this._emit();\n useEventListener(this, this.el, \"input\", this._emit);\n }\n });\n }\n\n disconnect() {\n EventBus.off(this._eventName, this._read);\n }\n\n _emit() {\n EventBus.emit(this._eventName, {value: this._value, dispatcher: this.el} as SyncValuePayload);\n }\n\n _read(payload?: SyncValuePayload) {\n if (payload === undefined) {\n throw new Error(\"No payload received\");\n }\n let {dispatcher, value} = payload;\n if (dispatcher !== this.el) {\n this._value = value;\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TableSortController extends BaseController {\n\n static values = {startSort: Number};\n\n declare readonly startSortValue: number;\n declare readonly hasStartSortValue: boolean;\n _lastIndex: number | null = null;\n _reverse: boolean = false;\n\n get _tableHead(): HTMLTableSectionElement {\n let head = (this.el as HTMLTableElement).tHead;\n if (head == null) {\n throw new Error('Expected table to have a <thead> element.');\n }\n return head;\n }\n\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\n let rows = this._tableHead.rows;\n if (rows.length == 0) {\n throw new Error('Expected table to have a <thead> element with at least one row.');\n }\n return Array.from(rows[0].cells);\n }\n\n get _tableBody() {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n connect() {\n requestAnimationFrame(() => {\n this._tableHeaders.forEach(cell => useEventListener(this, cell,\"click\", this.sort));\n if (this.hasStartSortValue) {\n this._sortByColumn(this.startSortValue);\n }\n });\n }\n\n sort(event: Event) {\n event.preventDefault();\n let headerCell = event.target! as HTMLTableHeaderCellElement;\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\n this._sortByColumn(headerCellIndex);\n }\n\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement) {\n return this._tableHeaders.indexOf(cell);\n }\n\n private _sortByColumn(index: number) {\n this._reverse = index === this._lastIndex && !this._reverse;\n let frag = document.createDocumentFragment();\n let rows = this._tableRows;\n\n let newRows = rows.sort((row, otherRow) => {\n let cells = Array.from(row.cells);\n let otherCells = Array.from(otherRow.cells);\n\n // TODO: Handle colspans?\n let x = cells[index]?.innerText || \"\";\n let y = otherCells[index]?.innerText || \"\";\n\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\n\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\n return sortVal;\n }\n return -1;\n }\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\n return sortVal;\n }\n return 1;\n }\n\n if (this._reverse) {\n return sortVal > 0 ? -1 : 1;\n }\n return sortVal;\n });\n\n newRows.forEach(row => frag.appendChild(row));\n\n this._tableBody.innerHTML = \"\";\n this._tableBody.appendChild(frag);\n this._lastIndex = index;\n }\n\n}","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TableTruncateController extends BaseController {\n\n static targets = [\"showMore\"];\n static values = {\n limit: Number,\n truncated: Boolean,\n };\n\n declare readonly showMoreTarget: HTMLElement;\n declare limitValue: number;\n declare readonly hasLimitValue: boolean;\n declare truncatedValue: boolean;\n declare readonly hasTruncatedValue: boolean;\n\n get _truncated(): boolean {\n return this.hasTruncatedValue ? this.truncatedValue : false;\n }\n\n set _truncated(value) {\n this.truncatedValue = value;\n }\n\n get _tableBody(): HTMLTableSectionElement {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n get _limit(): number {\n return this.hasLimitValue ? this.limitValue : 20;\n }\n\n initialize() {\n this.truncate = this.truncate.bind(this);\n this.expand = this.expand.bind(this);\n }\n\n connect() {\n useMutation(this, {childList: true, element: this._tableBody});\n\n requestAnimationFrame(() => {\n this.truncate();\n useEventListener(this, this.showMoreTarget, \"click\", this.expand);\n });\n }\n\n truncate(event?: Event) {\n event?.preventDefault();\n this._truncated = true;\n if (this._tableRows.length >= this._limit) {\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n } else {\n this._hideElement(this.showMoreTarget);\n }\n }\n\n expand(event?: Event) {\n this._truncated = false;\n event?.preventDefault();\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._hideElement(this.showMoreTarget);\n }\n\n mutate(entries: MutationRecord[]) {\n if (this._truncated) {\n this._reTruncate();\n }\n }\n\n private _showElement(el: HTMLElement): void {\n el.style.display = \"\";\n }\n\n private _hideElement(el: HTMLElement): void {\n el.style.display = \"none\";\n }\n\n private _reTruncate() {\n this._tableRows.slice(0, this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {clamp} from \"lodash-es\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TabsController extends BaseController {\n\n static values = {currentTab: Number, equalize: Boolean};\n static targets = [\"link\", \"content\"];\n static classes = [\"active\", \"hide\"];\n\n declare currentTabValue: number;\n declare hasCurrentTabValue: boolean;\n\n declare equalizeValue: boolean;\n declare hasEqualizeValue: boolean;\n declare readonly linkTargets: HTMLElement[];\n declare readonly contentTargets: HTMLElement[];\n declare readonly activeClass: string;\n declare readonly hasActiveClass: boolean;\n declare readonly hideClass: string;\n declare readonly hasHideClass: boolean;\n\n get _hideClasses(): string[] {\n return this.hideClass.split(' ');\n }\n\n get _defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n get _activeClasses(): string[] {\n return this.activeClass.split(' ');\n }\n\n get _defaultActiveClasses(): string[] {\n return [\"is-active\"];\n }\n\n get _currentTab(): number {\n return this.hasCurrentTabValue ? this.currentTabValue : 0;\n }\n\n get _equalize(): boolean {\n return this.hasEqualizeValue ? this.equalizeValue : false;\n }\n\n connect() {\n this.linkTargets.forEach((link) => useEventListener(this, link,\"click\", this.switchTabs));\n\n if (this._equalize) {\n this._setMinHeight();\n }\n\n this.currentTabValue = this._currentTab;\n }\n\n switchTabs(event: Event) {\n event.preventDefault();\n this.currentTabValue = this.linkTargets.indexOf(event.currentTarget as HTMLElement);\n }\n\n currentTabValueChanged() {\n let index = this._currentTab;\n index = this._clampIndex(index);\n this._selectTab(index);\n }\n\n _selectTab(index: number) {\n index = this._clampIndex(index);\n let links = this.linkTargets;\n let panels = this.contentTargets;\n let activePanel = panels[index];\n let activeLink = links[index];\n let otherPanels = [...panels.slice(0, index), ...panels.slice(index + 1)];\n let otherLinks = [...links.slice(0, index), ...links.slice(index + 1)];\n\n this._addActiveClasses(activeLink);\n activeLink.setAttribute('aria-selected', \"true\");\n\n this._addActiveClasses(activePanel);\n this._removeHideClasses(activePanel);\n\n otherLinks.forEach((link) => {\n link.removeAttribute('aria-selected');\n\n this._removeActiveClasses(link);\n });\n otherPanels.forEach((panel) => {\n this._removeActiveClasses(panel);\n this._addHideClasses(panel);\n });\n }\n\n _clampIndex(index: number): number {\n return clamp(index, 0, this.contentTargets.length - 1);\n }\n\n _setMinHeight() {\n let minHeight = 0;\n\n // determine the minimum height\n this.contentTargets.forEach((content) => {\n let hidden = content.hasAttribute(\"tab-hidden\");\n if (hidden) {\n this._removeHideClasses(content);\n }\n\n let height = content.offsetHeight;\n if (height > minHeight) {\n minHeight = height;\n }\n\n if (hidden) {\n this._addHideClasses(content);\n }\n });\n\n // apply to all tabs\n this.contentTargets.forEach((content) => content.style.minHeight = minHeight + \"px\");\n }\n\n private _addHideClasses(el: HTMLElement = this.el) {\n el.setAttribute(\"tab-hidden\", \"true\");\n if (this.hasHideClass) {\n el.classList.add(...this._hideClasses);\n } else {\n el.classList.add(...this._defaultHideClasses);\n }\n }\n\n private _removeHideClasses(el: HTMLElement = this.el) {\n el.removeAttribute(\"tab-hidden\");\n if (this.hasHideClass) {\n el.classList.remove(...this._hideClasses);\n } else {\n el.classList.remove(...this._defaultHideClasses);\n }\n }\n\n private _addActiveClasses(el: HTMLElement = this.el) {\n if (this.hasActiveClass) {\n el.classList.add(...this._activeClasses);\n } else {\n el.classList.add(...this._defaultActiveClasses);\n }\n }\n\n private _removeActiveClasses(el: HTMLElement = this.el) {\n if (this.hasActiveClass) {\n el.classList.remove(...this._activeClasses);\n } else {\n el.classList.remove(...this._defaultActiveClasses);\n }\n }\n}\n","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatch(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {camelCase, get as _get, set as _set} from \"lodash-es\";\nimport {EphemeralController} from \"../utilities/ephemeral_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class TemporaryStateController extends EphemeralController {\n\n static values = {\n attribute: String,\n seconds: Number,\n value: String,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n declare readonly attributeValue: string;\n declare readonly hasAttributeValue: boolean;\n declare readonly valueValue: string;\n declare readonly hasValueValue: boolean;\n _previousState: { [index: string]: any } = {};\n\n get _value(): string {\n if (this.hasValueValue) {\n return this.valueValue;\n }\n throw new Error(\"Expected `valueValue` to be present\");\n }\n\n get _attribute(): string {\n if (this.hasAttributeValue) {\n return this.attributeValue;\n }\n throw new Error(\"Expected `attributeValue` to be present\");\n }\n\n get _seconds(): number {\n if (this.hasSecondsValue) {\n return this.secondsValue * 1000;\n }\n throw new Error(\"Expected `secondsValue` to be present\");\n }\n\n initialize() {\n this.setState = this.setState.bind(this);\n this.removeState = this.removeState.bind(this);\n }\n\n connect() {\n this.setState();\n useTimeout(this, this.removeState, this._seconds);\n }\n\n disconnect() {\n this.removeState();\n }\n\n setState() {\n this._previousState[this._attribute] = _get(this.el, this._attribute);\n _set(this.el, this._attribute, this.valueValue);\n }\n\n removeState() {\n _set(this.el, this._attribute, this._previousState[this._attribute]);\n }\n\n}\n\nexport function applyTemporaryState(element: HTMLElement, propertyString: string, value: any, seconds: number, controllerIdentifier = \"temporary-state\") {\n if (!element.dataset.controller || !element.dataset.controller?.includes(controllerIdentifier)) {\n element.dataset.controller = (element.dataset.controller || '' + ` ${controllerIdentifier} `).trim().replaceAll(' ', ' ');\n }\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-attribute-value`)] = propertyString;\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-seconds-value`)] = seconds.toString();\n}\n\nexport function applyTemporaryClass(element: HTMLElement, value: any, seconds: number) {\n applyTemporaryState(element, 'className', value, seconds);\n}\n","import {Duration, formatDistanceToNow, intervalToDuration, isPast, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeDistanceController extends BaseController {\n static values = {\n timestamp: Number,\n };\n\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n\n declare _timestamp: Date;\n\n get _duration(): Duration {\n return isPast(this._timestamp) ? intervalToDuration({start: this._timestamp, end: new Date()}) : intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _nextUpdate(): number | null {\n let duration = this._duration;\n\n if (duration.years && duration.years > 0) {\n return null;\n } else if (duration.months && duration.months > 0) {\n return null;\n } else if (duration.days && duration.days > 0) {\n return null;\n } else if (duration.hours && duration.hours > 0) {\n return 1800000; // Update every 30 mins\n } else {\n return 30000; // Update every 30 seconds\n }\n }\n\n timestampValueChanged() {\n this._timestamp = toDate(this.timestampValue * 1000);\n }\n\n initialize() {\n this._update = this._update.bind(this);\n }\n\n connect() {\n if (!this.hasTimestampValue) {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n this._update();\n }\n\n _update() {\n this.el.innerHTML = formatDistanceToNow(this._timestamp, {\n addSuffix: true,\n includeSeconds: true,\n });\n\n if (this._nextUpdate) {\n useTimeout(this, this._update, this._nextUpdate);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeoutController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n useTimeout(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n _timeout() {\n this.dispatch(this.el, \"timeout\");\n }\n\n}","import {useClickOutside, useHover} from \"stimulus-use\";\nimport {BaseController} from \"../utilities/base_controller\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","import {useMutation} from \"stimulus-use\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class TreeViewController extends BaseController {\n\n static classes = [\n \"active\",\n \"collapsed\",\n ];\n\n declare readonly activeClass: string;\n declare readonly hasActiveClass: boolean;\n declare readonly collapsedClass: string;\n declare readonly hasCollapsedClass: boolean;\n\n get _collapsedClasses(): string[] {\n return this.hasCollapsedClass ? this.collapsedClass.split(' ') : this._defaultCollapsedClasses;\n }\n\n get _defaultCollapsedClasses(): string[] {\n return ['collapsed'];\n }\n\n get _activeClasses(): string[] {\n return this.hasActiveClass ? this.activeClass.split(' ') : this._defaultActiveClasses;\n }\n\n get _defaultActiveClasses(): string[] {\n return ['active'];\n }\n\n initialize() {\n this._nodeClicked = this._nodeClicked.bind(this);\n }\n\n connect() {\n this._setup();\n useMutation(this, {subtree: true, childList: true});\n }\n\n disconnect() {\n this._teardown();\n }\n\n _setup() {\n this._setupNode(this.el);\n }\n\n _setupNode(el: HTMLElement) {\n const process = (e: HTMLElement) => {\n let parent = e.parentElement;\n if (parent) {\n if (!this._nodeActive(parent)) {\n this._hideNode(parent);\n }\n parent.removeEventListener(\"click\", this._nodeClicked);\n parent.addEventListener(\"click\", this._nodeClicked);\n }\n };\n if (el.tagName === 'UL' || el.tagName === 'OL') {\n process(el);\n }\n el.querySelectorAll(\"ul, ol\").forEach(e => process(e as HTMLElement));\n }\n\n _teardown() {\n this.el.querySelectorAll(\"ul, ol, li\").forEach((el) => this._teardownNode(el as HTMLElement));\n }\n\n _teardownNode(el: HTMLElement) {\n [el, ...Array.from(el.querySelectorAll('ul, ol, li')) as HTMLElement[]].forEach((x) => {\n x.removeEventListener(\"click\", this._nodeClicked);\n this._removeActiveClasses(x);\n this._removeCollapsedClasses(x);\n });\n }\n\n _nodeClicked(event: MouseEvent) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n let el = event.target as HTMLElement | null;\n\n if (!el || !this._hasNested(el)) {\n return;\n }\n\n if (this._nodeActive(el)) {\n this._hideNode(el);\n } else {\n this._showNode(el);\n }\n }\n\n _nodeActive(el: HTMLElement): boolean {\n return this._activeClasses.every(klass => el.classList.contains(klass));\n }\n\n _showNode(el: HTMLElement) {\n this._removeCollapsedClasses(el);\n this._addActiveClasses(el);\n }\n\n _hideNode(el: HTMLElement) {\n this._removeActiveClasses(el);\n this._addCollapsedClasses(el);\n }\n\n _hasNested(el: HTMLElement): boolean {\n return el.querySelectorAll(\"ul, ol\").length > 0;\n }\n\n mutate(entries: MutationRecord[]) {\n for (const mutation of entries) {\n if (mutation.type === \"childList\") {\n (Array.from(mutation.addedNodes || []) as HTMLElement[]).forEach(el => this._setupNode(el));\n (Array.from(mutation.removedNodes || []) as HTMLElement[]).forEach(el => this._teardownNode(el));\n }\n }\n }\n\n private _addCollapsedClasses(el: HTMLElement = this.el) {\n if (this.hasCollapsedClass) {\n el.classList.add(...this._collapsedClasses);\n } else {\n el.classList.add(...this._defaultCollapsedClasses);\n }\n }\n\n private _removeCollapsedClasses(el: HTMLElement = this.el) {\n if (this.hasCollapsedClass) {\n el.classList.remove(...this._collapsedClasses);\n } else {\n el.classList.remove(...this._defaultCollapsedClasses);\n }\n }\n\n private _addActiveClasses(el: HTMLElement = this.el) {\n if (this.hasActiveClass) {\n el.classList.add(...this._activeClasses);\n } else {\n el.classList.add(...this._defaultActiveClasses);\n }\n }\n\n private _removeActiveClasses(el: HTMLElement = this.el) {\n if (this.hasActiveClass) {\n el.classList.remove(...this._activeClasses);\n } else {\n el.classList.remove(...this._defaultActiveClasses);\n }\n }\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided <turbo-frame> element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a <turbo-frame> element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => useTimeout(this, this.refresh, this.intervalValue));\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class ValueWarnController extends BaseController {\n static classes = [\"inputWarning\", \"warningHide\"];\n static targets = [\"input\", \"warning\"];\n static values = {max: Number, min: Number, minMessage: String, maxMessage: String};/* Classes*/\n declare readonly inputWarningClass: string;\n declare readonly hasInputWarningClass: boolean;\n declare readonly warningHideClass: string;\n declare readonly hasWarningHideClass: boolean;/* Targets*/\n declare readonly inputTarget: HTMLInputElement;\n declare readonly warningTarget: HTMLElement;/* Values*/\n declare readonly maxValue: number;\n declare readonly hasMaxValue: boolean;\n declare readonly minValue: number;\n declare readonly hasMinValue: boolean;\n declare readonly minMessageValue: string;\n declare readonly hasMinMessageValue: boolean;\n declare readonly maxMessageValue: string;\n declare readonly hasMaxMessageValue: boolean;\n\n get _maxMessage(): string {\n return this.hasMaxMessageValue ? this.maxMessageValue : `Value must be less than ${this.maxValue}`;\n }\n\n get _minMessage(): string {\n return this.hasMinMessageValue ? this.minMessageValue : `Value must be greater than ${this.minValue}`;\n }\n\n get _warningHideClasses(): string[] {\n return this.warningHideClass.split(\" \");\n }\n\n get _defaultWarningHideClasses(): string[] {\n return [\"hide\"];\n }\n\n get _inputWarningClasses(): string[] {\n return this.inputWarningClass.split(\" \");\n }\n\n get _defaultInputWarningClasses(): string[] {\n return [\"\"];\n }\n\n connect() {\n this._addWarningHideClasses(this.warningTarget);\n useEventListener(this, this.inputTarget,\"input\", this._check);\n this._check();\n }\n\n private _check() {\n if (this.hasMinValue && Number.parseFloat(this.inputTarget.value) < this.minValue) {\n this._removeWarningHideClasses(this.warningTarget);\n this._addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._minMessage;\n } else if (this.hasMaxValue && Number.parseFloat(this.inputTarget.value) > this.maxValue) {\n this._removeWarningHideClasses(this.warningTarget);\n this._addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._maxMessage;\n } else {\n this._addWarningHideClasses(this.warningTarget);\n this._removeInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = \"\";\n }\n }\n\n private _addWarningHideClasses(el: HTMLElement = this.el) {\n if (this.hasWarningHideClass) {\n el.classList.add(...this._warningHideClasses);\n } else {\n el.classList.add(...this._defaultWarningHideClasses);\n }\n }\n\n private _removeWarningHideClasses(el: HTMLElement = this.el) {\n if (this.hasWarningHideClass) {\n el.classList.remove(...this._warningHideClasses);\n } else {\n el.classList.remove(...this._defaultWarningHideClasses);\n }\n }\n\n private _addInputWarningClasses(el: HTMLElement = this.el) {\n if (this.hasInputWarningClass) {\n el.classList.add(...this._inputWarningClasses);\n } else {\n el.classList.add(...this._defaultInputWarningClasses);\n }\n }\n\n private _removeInputWarningClasses(el: HTMLElement = this.el) {\n if (this.hasInputWarningClass) {\n el.classList.remove(...this._inputWarningClasses);\n } else {\n el.classList.remove(...this._defaultInputWarningClasses);\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n\n declare readonly errorClass: string;\n declare readonly hasErrorClass: boolean;\n\n get _errorClasses(): string[] {\n return this.errorClass.split(' ');\n }\n\n get _defaultErrorClasses(): string[] {\n return [];\n }\n\n connect() {\n this._updateWordCount();\n useEventListener(this, this.inputTarget, \"input\", this._updateWordCount);\n }\n\n _updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this.hasErrorClass) {\n if (this._isValidCount(wordCount)) {\n this._removeErrorClasses(this.outputTarget);\n } else {\n this._addErrorClasses(this.outputTarget);\n }\n }\n }\n\n private _addErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.add(...this._errorClasses);\n } else {\n el.classList.add(...this._defaultErrorClasses);\n }\n }\n\n private _removeErrorClasses(el: HTMLElement = this.el) {\n if (this.hasErrorClass) {\n el.classList.remove(...this._errorClasses);\n } else {\n el.classList.remove(...this._defaultErrorClasses);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {useIntersection, useWindowResize} from \"stimulus-use\";\nimport {isHTMLTextAreaElement} from \"../../utilities/elements\";\nimport {useEventListeners} from \"../../mixins/use_event_listener\";\n\nexport class AutosizeController extends BaseController {\n\n declare unobserveIntersection: () => void;\n declare isVisible: boolean;\n\n connect() {\n useWindowResize(this);\n let [, unobserveIntersection] = useIntersection(this);\n this.unobserveIntersection = unobserveIntersection;\n if (!isHTMLTextAreaElement(this.el)) {\n throw new Error(`Expected controller to be attached to a textarea, but was a '${this.el.tagName}'`);\n }\n\n requestAnimationFrame(() => {\n this.el.style.resize = \"none\";\n this.el.style.boxSizing = \"border-box\";\n\n this._handler();\n useEventListeners(this, window, ['resize'], this._handler,);\n useEventListeners(this, this.el, ['input', 'focus'], this._handler,);\n });\n }\n\n appear(_entry: IntersectionObserverEntry) {\n this.autosize(this.el as HTMLTextAreaElement);\n this.unobserveIntersection();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n }\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isElementCheckable, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListeners} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyController extends BaseController {\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n\n useEventListeners(this, element, [\"input\", \"change\"], this._checkDirty);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._restoreElementFromLoadValue();\n }\n\n private _getElementValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (value !== null) {\n return value;\n }\n\n if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(): boolean {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkDirty() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (this._isElementDirty()) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(): boolean {\n return this._getElementValue() !== this._getElementLoadValue();\n }\n\n private _restoreElementFromLoadValue() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n}\n\nexport function isDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {useIntersection} from \"stimulus-use\";\nimport {LoadBlockController} from \"./load_block_controller\";\n\nexport class LazyBlockController extends LoadBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n async connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n [this.observe, this.unobserve] = useIntersection(this, {element, threshold: 0.3});\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n await this.loadContent();\n }\n }\n\n async appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n await this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener, useEventListeners} from \"../../mixins/use_event_listener\";\n\nexport class UserFocusController extends BaseController {\n\n connect() {\n useEventListeners(this, window, [\"focus\", \"blur\"], this._handleVisibility);\n useEventListener(this, document, \"visibilitychange\", this._handleVisibility);\n requestAnimationFrame(() => {\n this._handleVisibility();\n });\n }\n\n appear() {\n this.dispatch(this.el, \"user-focus:active\");\n }\n\n away() {\n this.dispatch(this.el, \"user-focus:away\");\n }\n\n private _handleVisibility() {\n this._documentIsActive() ? this.appear() : this.away();\n }\n\n private _documentIsActive() {\n return document.visibilityState == \"visible\" && document.hasFocus();\n }\n\n}\n"],"names":["EventListener","eventTarget","eventName","eventOptions","unorderedBindings","Set","prototype","connect","addEventListener","this","disconnect","removeEventListener","bindingConnected","binding","add","bindingDisconnected","delete","handleEvent","event","extendedEvent2","stopImmediatePropagation_1","stopImmediatePropagation","Object","assign","immediatePropagationStopped","call","extendEvent","_i","_a","bindings","length","defineProperty","EventListener2","get","Array","from","sort","left","right","leftIndex","index","rightIndex","enumerable","configurable","Dispatcher","application","eventListenerMaps","Map","started","start","eventListeners","forEach","eventListener","stop","Dispatcher2","values","reduce","listeners","map","concat","fetchEventListenerForBinding","handleError","error2","message","detail","fetchEventListener","eventListenerMap","fetchEventListenerMapForEventTarget","cacheKey","createEventListener","set","parts","keys","key","push","join","descriptorPattern","eventTargetName","window","document","Action","element","descriptor","tagName","toLowerCase","defaultEventNames","getDefaultEventNameForElement","error","identifier","methodName","forToken","token","descriptorString","content","parseEventTarget","matches","trim","match","split","options","replace","test","toString","eventNameSuffix","Action2","a","e","button","form","input","getAttribute","select","textarea","Error","Binding","context","action","Binding2","willBeInvokedByEvent","invokeWithEvent","method2","controller","method","target","Element","contains","scope","containsElement","ElementObserver","delegate","_this","elements","mutationObserver","MutationObserver","mutations","processMutations","observe","attributes","childList","subtree","refresh","takeRecords","matchElementsInTree","has","removeElement","_b","_c","addElement","mutations_1","mutation","processMutation","type","processAttributeChange","attributeName","processRemovedNodes","removedNodes","processAddedNodes","addedNodes","node","elementAttributeChanged","matchElement","nodes","elementFromNode","processTree","elementIsActive","tree","processor","nodeType","Node","ELEMENT_NODE","isConnected","elementMatched","elementUnmatched","ElementObserver2","AttributeObserver","elementObserver","AttributeObserver2","hasAttribute","querySelectorAll","selector","elementMatchedAttribute","elementUnmatchedAttribute","elementAttributeValueChanged","StringMapObserver","stringMap","knownAttributeNames","refreshAttribute","getStringMapKeyForAttribute","stringMapKeyAdded","value","stringMapValueChanged","stringMapKeyRemoved","StringMapObserver2","currentAttributeNames","recordedAttributeNames","attribute","name","size","extendStatics","Multimap","valuesByKey","Multimap2","hasKey","hasValue","some","getValuesForKey","getKeysForValue","filter","__extends","d","b","setPrototypeOf","__proto__","d2","b2","p","hasOwnProperty","constructor","create","__","_super","keysByValue","IndexedMultimap","TokenListObserver","attributeObserver","tokensByElement","TokenListObserver2","tokensMatched","readTokensForElement","refreshTokensForElement","unmatchedTokens","matchedTokens","tokensUnmatched","tokens","tokenMatched","tokenUnmatched","previousTokens","currentTokens","firstDifferingIndex","Math","max","_","findIndex","tokensAreEqual","slice","tokenString","parseTokenString","ValueListObserver","tokenListObserver","parseResultsByToken","WeakMap","valuesByTokenByElement","ValueListObserver2","fetchParseResultForToken","fetchValuesByTokenForElement","elementMatchedValue","elementUnmatchedValue","parseResult","parseToken","valuesByToken","parseValueForToken","BindingObserver","bindingsByAction","valueListObserver","actionAttribute","disconnectAllActions","BindingObserver2","schema","connectAction","disconnectAction","clear","ValueObserver","receiver","stringMapObserver","valueDescriptorMap","invokeChangedCallbacksForDefaultValues","ValueObserver2","attributeValue","invokeChangedCallbackForValue","valueDescriptors","name_1","defaultValue","data","Context","module","controllerConstructor","bindingObserver","dispatcher","valueObserver","initialize","Context2","parentElement","propertyName","ancestors","getAncestorsForConstructor","constructor2","definition","isArray","pairs","apply","getOwnStaticObjectPairs","getPrototypeOf","reverse","properties","shadowConstructor","extend","shadowProperties","getOwnKeys","shadowingDescriptor","getOwnPropertyDescriptor","getShadowedDescriptor","getShadowProperties","defineProperties","shadow","readInheritableStaticArrayValues","blessedProperties","blessing","getBlessedProperties","getOwnPropertySymbols","object","s","i","il","arguments","r","k","j","jl","__spreadArrays","getOwnPropertyNames","_newTarget","extended","Reflect","construct","extendWithReflect","Module","bless","blessDefinition","contextsByScope","connectedContexts","Module2","connectContextForScope","fetchContextForScope","disconnectContextForScope","ClassMap","getDataKey","getAttributeName","getAttributeNameForKey","ClassMap2","char","toUpperCase","charAt","DataMap","DataMap2","setAttribute","removeAttribute","dasherize","Guide","logger","warnedKeysByObject","warn","warnedKeys","Guide2","TargetSet","TargetSet2","targetName","find","targetNames","findTarget","findLegacyTarget","findAll","targets","findAllTargets","findAllLegacyTargets","getSelectorForTargetName","findElement","findAllElements","attributeValueContainsToken","getLegacySelectorForTargetName","deprecate","targetDescriptor","targetAttribute","guide","Scope","classes","element2","closest","controllerSelector","queryElements","Scope2","controllerAttribute","ScopeObserver","scopesByIdentifierByElement","scopeReferenceCounts","ScopeObserver2","scopesByIdentifier","fetchScopesByIdentifierForElement","createScopeForElementAndIdentifier","referenceCount","scopeConnected","scopeDisconnected","Router","scopeObserver","modulesByIdentifier","Router2","modules","contexts","loadDefinition","unloadIdentifier","connectModule","disconnectModule","getContextForElementAndIdentifier","defaultSchema","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","next","result","done","then","fulfilled","rejected","__generator","body","f","y","t","g","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","TypeError","pop","step","classDefinition","capitalize","targetDefinition","valueDefinitionPairs","readInheritableStaticObjectPairs","propertyDescriptorMap","valueDefinitionPair","valueDescriptor","parseValueDefinitionPair","read","readers","write","writers","default","propertiesForValueDefinitionPair","camelize","defaultValuesByType","valueDescriptorForTokenAndType","typeConstant","Boolean","Number","String","parseValueTypeConstant","documentElement","console","router","Application","readyState","register","load","head","rest","definitions","unload","identifiers","getControllerForElementAndIdentifier","boolean","number","string","array","JSON","parse","parseFloat","writeJSON","stringify","Controller","Controller2","blessings","ClassPropertiesBlessing","TargetPropertiesBlessing","ValuePropertiesBlessing","debug","Proxy","obj","prop","returnVal","self","logProperty","argArray","log","args","isTurboPreview","metaValue","querySelector","dispatch","mergedOptions","bubbles","cancelable","CustomEvent","logEvent","dispatchEvent","functionName","groupCollapsed","__spreadValues","groupEnd","warning","camelCase","pascalCase","preserveConsecutiveUppercase","x","toLocaleUpperCase","locale","toLocaleLowerCase","isLastCharLower","isLastCharUpper","isLastLastCharUpper","character","preserveCamelCase","m1","p1","m","postProcess","camelcaseModule","BaseController","_cleanupSelf","cleanup","el","dataset","replaceAll","RegExp","substringIdentifierValueRegex","val","smoothSupported","style","smoothPolyfilled","behavior","block","inline","polyfillSmooth","scrollIntoView","scrollTo","top","scrollHeight","amount","scrollBy","async","polyfill","overflowY","getComputedStyle","clientHeight","getScrollParent","nodeName","EventBus","all","on","off","splice","indexOf","emit","n2","isHTMLInputElement","createElement","display","sythentic","targetElement","insertPosition","createdElement","insertAdjacentElement","insertElement","createHiddenButton","requestSubmit","insertHiddenButton","click","handler","opts","useEventListeners","eventNames","controllerDisconnect","bind","debounce","setup","teardown","interval","intervalHandle","setInterval","timeout","timeoutHandle","setTimeout","fragment","childNodes","remove","parent","includes","append","prepend","insertBefore","DocumentFragment","useInjectedFragment","keyValue","location","hash","substr","_checkAnchor","preventDefault","_anchor","_key","__publicField","hasErrorMessageValue","errorMessageValue","hasReplaceTarget","replaceTarget","failure","replaceWith","_errorMessage","response","fetch","endpointValue","ok","text","newEl","innerHTML","hasSelectorValue","selectedContent","selectorValue","children","endpoint","errorMessage","LoadBlockController","loadContent","hasEventModeValue","eventModeValue","hasDebounceIntervalValue","debounceIntervalValue","hasSubmitModeValue","submitModeValue","_cssSelector","inputElements","useEventListener","_eventMode","submit","_debounceTimeout","_mode","submitMode","eventMode","debounceInterval","composeEventName","eventPrefix","composedName","extendedEvent","composed","originalEvent","defaultOptions","useIntersection","dispatchAppear","entry","isVisible","appearEvent","dispatchDisappear","disappearEvent","observer","IntersectionObserver","entries","isIntersecting","unobserve","events","onlyVisible","useClickOutside","onEvent","rect","getBoundingClientRect","windowHeight","innerHeight","windowWidth","innerWidth","clientWidth","vertInView","height","horInView","width","isElementInViewport","clickOutside","clickOutsideEvent","controllerId","details","_a2","eventDetails","customEvent","stimulusUseDebug","id","controllerInitialize","controllerConnect","StimulusUse","onEnter","onLeave","hover","enhanceController","useMutation","UseMutation","useWindowResize","callback","payload","Infinity","debounces","fn","wait","timeoutId","hasPagesValue","abs","pagesValue","hasTimeoutValue","timeoutValue","goBack","go","_pages","href","fallback","_timeout","pages","errorClass","inputTarget","_updateCharCount","_addErrorClasses","hasErrorClass","classList","_errorClasses","_defaultErrorClasses","_removeErrorClasses","charCount","outputTarget","innerText","_isValidCount","count","min","hasMinValue","minValue","hasMaxValue","maxValue","toggle","hasDisablerTarget","disablerTarget","checked","disable","enable","shouldClear","hasClearValue","clearValue","disableTargets","disabled","hasEnablerTarget","enablerTarget","enableTargets","checkboxTargets","checkbox","hasSelectAllTarget","selectAllTarget","_toggle","_refresh","checkboxesCount","checkboxesCheckedCount","_checked","indeterminate","_supported","queryCommandSupported","hasRemoveUnusedValue","removeUnusedValue","hasFallbackTarget","fallbackTarget","hasCopyTarget","copyTarget","sourceTarget","copy","execCommand","removeUnused","hasMillisecondsTarget","hasSecondsTarget","hasMinutesTarget","_tick","_tickInterval","current","Date","hasHoursTarget","hoursTarget","getHours","padStart","minutesTarget","getMinutes","secondsTarget","getSeconds","millisecondsTarget","getMilliseconds","hasMessageValue","messageValue","isHTMLFormElement","isHTMLAnchorElement","_eventType","confirm","_message","allowSubmit","confirmNavigation","confirmTurboNavigation","onbeforeunload","_event","endedClass","countingDownClass","deadlineValue","_interval","_addCountingDownClasses","_clearTick","_removeCountingDownClasses","_removeEndedClasses","deadlineValueChanged","now","distance","isPast","_deadlineDate","years","months","days","hours","minutes","seconds","_addEndedClasses","intervalToDuration","end","hasYearsTarget","_updateTarget","yearsTarget","_years","hasMonthsTarget","monthsTarget","_months","hasDaysTarget","daysTarget","_days","_hours","_minutes","_seconds","_removeTargetIfUnused","_removeUnused","unused","parseInt","duration","hasEndedClass","_endedClasses","_defaultEndedClasses","hasCountingDownClass","_countingDownClasses","_defaultCountingDownClasses","deadline","testTargets","_enable","_isDisabled","_cacheText","_getElText","_setElText","_disable","isHTMLButtonElement","str","dismiss","weeks","_duration","largeDenominators","every","formatDuration","format","_format","delimiter","toFixed","hasSecondsValue","secondsValue","hasMinutesValue","minutesValue","hasTimestampValue","toDate","timestampValue","_timestamp","_clearInterval","useInterval","_update","_output","_intervalHandle","clearInterval","timestamp","hasIdValue","idValue","elementID","_id","hasRestoreOnLoadValue","restoreOnLoadValue","hasElementTarget","elementTarget","_restoreOnLoad","restore","removeItem","_uniqueIdentifier","_element","save","attributesValue","attr","_get","setItem","localStorage","getItem","savedData","restoreOnLoad","hasContainerTarget","containerTarget","notEmptyClass","emptyClass","_container","hasScopeSelectorValue","scopeSelectorValue","checkEmpty","mutate","_children","_removeNotEmptyClasses","_addEmptyClasses","_addNotEmptyClasses","_removeEmptyClasses","hasNotEmptyClass","_notEmptyClasses","_defaultNotEmptyClasses","hasEmptyClass","_emptyClasses","_defaultEmptyClasses","scopeSelector","inputTargets","successClass","failClass","_hasLoadedSuccessfully","_success","_fail","onerror","complete","_removeSuccessClasses","_removeFailClasses","_addSuccessClasses","_addFailClasses","hasPlaceholderValue","src","placeholderValue","naturalHeight","naturalWidth","hasFailClass","_failClasses","_defaultFailClasses","hasSuccessClass","_successClasses","_defaultSuccessClasses","placeholder","MODES","hasModeValue","modeValue","steal","focus","mode","hasFormSelectorValue","formSelectorValue","formTarget","reset","formSelector","_formID","_formIdentifier","_formElements","hasClearOnSubmitValue","clearOnSubmitValue","_clearOnSubmit","_clear","_formData","clearOnSubmit","hasThresholdValue","thresholdValue","threshold","_threshold","appear","disappear","supportCustomEvent","check","localName","parentNode","host","shadowRoot","activeElement","blur","nodeList","hostElement","query","elems","findFocusableElementWithin","submitter","HTMLFormElement","dialogPolyfill","formSubmitter","getRootNode","defaultPrevented","imagemapUseValue","findFormSubmitter","dialog","findNearestDialog","close","dialog_","replacedStyleTop_","openAsModal_","show","showModal","maybeHandleSubmit","returnValue","maybeHideModal","attributeFilter","removed","cb","downgradeModal","delayModel","ev","cand","clearTimeout","setOpen","backdrop_","className","backdropMouseEvent_","createEvent","initCustomEvent","Event","dialogPolyfillInfo","zIndex","removeChild","dm","removeDialog","fake","firstChild","tabIndex","redirectedEvent","initMouseEvent","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","relatedTarget","stopPropagation","focus_","updateZIndex","dialogZ","backdropZ","open","pushDialog","invalid","opacity","position","webkitOverflowScrolling","createsStackingContext","needsCentering","reposition","nextSibling","opt_returnValue","closeEvent","scrollTop","topValue","offsetHeight","isInlinePositionSetByStylesheet","styleSheets","styleSheet","cssRules","rule","selectedNodes","selectorText","inNodeList","cssTop","getPropertyValue","cssBottom","bottom","forceRegisterDialog","HTMLDialogElement","registerDialog","DialogManager","pendingDialogStack","checkDOM","checkDOM_","overlay","forwardTab_","handleKey_","handleFocus_","zIndexLow_","zIndexHigh_","mo_","records","rec","c","blockDocument","unblockDocument","updateStacking","dpi","last","appendChild","containedByTopDialog_","candidate","composedPath","compareDocumentPosition","DOCUMENT_POSITION_PRECEDING","keyCode","cancelEvent","safeDispatchEvent","allowed","unshift","testForm","methodDescriptor","realGet","isFormMethodDialog","realSet","shift","offsetX","offsetY","nativeFormSubmit","hasSrcValue","srcValue","hasSrcSetValue","srcSetValue","srcset","hasSizesValue","sizesValue","sizes","hasModalClass","modalClass","hasImageClass","imageClass","_dialog","image","_imageClassName","_src","_srcSet","_sizes","_modalClassName","catch","srcSet","handleInputs","tickedInputs","previousValue","hasErrorTarget","errorTarget","mediaTarget","play","pause","restart","currentTime","seek","_errors","_index","clamp","hasIndexValue","indexValue","_firstClick","_toggleButtons","_toggleVisibility","scrollToElement","_currentError","_nextIndex","_previousIndex","indexValueChanged","selectorValueChanged","_selector","_errorCount","hasNextTarget","hasCurrentTarget","nextTarget","hasPreviousTarget","previousTarget","hasWrapperSelectorValue","wrapperClassValue","hasInsertModeValue","insertModeValue","_checkStructure","templateTarget","_generateID","targetTarget","insertAdjacentHTML","_insertMode","wrapper","_wrapperClass","newRecord","destroyInput","getTime","random","insertMode","wrapperClass","passwordTargets","_checkPasswordsMatch","_allPasswordsMatch","peak","passwordTarget","hide","link","relList","supports","_href","connection","navigator","saveData","effectiveType","_supportsPrefetch","_setupObserver","prefetch","once","observer2","_existingPrefetch","_connectionSuitable","rel","as","hasNameValue","nameValue","print","PrintController","unsupportedClass","_addUnsupportedClasses","hasUnsupportedClass","_unsupportedClasses","_defaultUnsupportedClasses","_removeUnsupportedClasses","status","xhr","newElement","replaceChild","func","postUpdate","windowResize","getHeight","postMessage","html","hasIncrementValue","incrementValue","hasBehaviourValue","behaviourValue","scrollAbsoluteTop","_behaviour","scrollAbsoluteBottom","scrollAbsoluteLeft","scrollUp","_increment","scrollDown","scrollLeft","scrollRight","behaviour","increment","EphemeralController","hasBehaviorValue","behaviorValue","hasBlockValue","blockValue","hasInlineValue","inlineValue","_scrollTarget","scroll","stuckClass","_magicElement","intersectionRatio","_addStuckClasses","_removeStuckClasses","hasStuckClass","_stuckClasses","_defaultStuckClasses","hasKeyValue","isHTMLTextAreaElement","isHTMLSelectElement","_read","_emit","_eventName","_value","tHead","rows","_tableHead","cells","tBodies","_tableBody","_tableHeaders","cell","hasStartSortValue","_sortByColumn","startSortValue","headerCell","headerCellIndex","_indexOfHeaderCell","_reverse","_lastIndex","frag","createDocumentFragment","_tableRows","row","otherRow","otherCells","sortVal","localeCompare","sensitivity","numeric","caseFirst","sortTop","sortBottom","startSort","hasTruncatedValue","truncatedValue","hasLimitValue","limitValue","truncate","expand","showMoreTarget","_truncated","_limit","_hideElement","_showElement","_reTruncate","limit","truncated","hideClass","activeClass","hasCurrentTabValue","currentTabValue","hasEqualizeValue","equalizeValue","linkTargets","switchTabs","_equalize","_setMinHeight","_currentTab","currentTarget","currentTabValueChanged","_clampIndex","_selectTab","links","panels","contentTargets","activePanel","activeLink","otherPanels","otherLinks","_addActiveClasses","_removeHideClasses","_removeActiveClasses","panel","_addHideClasses","minHeight","hidden","hasHideClass","_hideClasses","_defaultHideClasses","hasActiveClass","_activeClasses","_defaultActiveClasses","currentTab","equalize","hasInsertValue","hasImmediateValue","immediateValue","execute","destination","targetValue","cloneNode","insertValue","outerHTML","insert","immediate","hasValueValue","valueValue","hasAttributeValue","setState","removeState","_previousState","_attribute","propertyString","controllerIdentifier","timestampValueChanged","formatDistanceToNow","addSuffix","includeSeconds","_nextUpdate","hasClassValue","hasMouseEnterValue","hasMouseLeaveValue","UseHover","hasClickAwayValue","clickAwayValue","hasInitialValue","initialValue","toggleTargets","_elementOn","_elementOff","_elementWasToggled","_elementToggleStatus","_elementToggle","mouseEnter","mouseEnterValue","mouseLeave","mouseLeaveValue","toggled","classValue","klass","class","clickAway","initial","hasCollapsedClass","collapsedClass","_defaultCollapsedClasses","_nodeClicked","_setup","_teardown","_setupNode","process","_nodeActive","_hideNode","_teardownNode","_removeCollapsedClasses","_hasNested","_showNode","_addCollapsedClasses","_collapsedClasses","frameSrc","_getFrame","_getSrc","_setSrc","setSrc","frame","hasLoadingMessageValue","loadingMessageValue","getElementById","frameIdValue","isTurboFrame","frameId","loadingMessage","hasPollValue","pollValue","_poll","useTimeout","intervalValue","poll","hasMaxMessageValue","maxMessageValue","hasMinMessageValue","minMessageValue","warningHideClass","inputWarningClass","_addWarningHideClasses","warningTarget","_check","_removeWarningHideClasses","_addInputWarningClasses","_minMessage","_maxMessage","_removeInputWarningClasses","hasWarningHideClass","_warningHideClasses","_defaultWarningHideClasses","hasInputWarningClass","_inputWarningClasses","_defaultInputWarningClasses","minMessage","maxMessage","_updateWordCount","wordCount","unobserveIntersection","resize","boxSizing","_handler","_entry","autosize","offset","_cacheLoadValues","_checkDirty","_restoreElementFromLoadValue","_getElementValue","isElementCheckable","_getElementLoadValue","_cacheAttrName","defaultChecked","option","defaultSelected","_elementHasCachedLoadValue","_isElementDirty","cacheValue","_checkElementDirty","_cacheElementLoadValue","isFormDirty","DismissableController","messageReceived","_handleVisibility","away","_documentIsActive","visibilityState","hasFocus","createHiddenInput","scrollWidth","createRange","createContextualFragment"],"mappings":"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"}
1
+ {"version":3,"file":"stimulus-library.cjs.js","sources":["../src/utilities/logging.ts","../src/utilities/base_controller.ts","../src/utilities/ephemeral_controller.ts","../src/utilities/scroll.ts","../src/utilities/turbo.ts","../node_modules/mitt/dist/mitt.mjs","../src/utilities/event_bus.ts","../src/utilities/elements.ts","../src/utilities/request_submit.ts","../src/utilities/arrays.ts","../src/mixins/create_mixin.ts","../src/mixins/use_event_listener.ts","../src/mixins/use_fullscreen.ts","../src/utilities/reactive.ts","../src/mixins/use_geolocation.ts","../src/mixins/use_injected_html.ts","../src/mixins/use_interval.ts","../src/mixins/use_localstorage.ts","../src/mixins/use_timeout.ts","../src/mixins/use_temporary_content.ts","../src/utilities/fetchRetry.ts","../src/controllers/ajax/load_block_controller.ts","../src/controllers/ajax/async_block_controller.ts","../src/mixins/use_intersection.ts","../src/controllers/ajax/lazy_block_controller.ts","../src/controllers/ajax/poll_block_controller.ts","../src/controllers/forms/auto_submit_form_controller.ts","../src/controllers/forms/autosize_controller.ts","../src/utilities/stimulus.ts","../src/utilities/strings.ts","../src/mixins/install_class_methods.ts","../src/controllers/forms/char_count_controller.ts","../src/controllers/forms/checkbox_disable_inputs_controller.ts","../src/controllers/forms/checkbox_enable_inputs_controller.ts","../src/controllers/forms/checkbox_select_all_controller.ts","../src/controllers/forms/checkbox_xor_controller.ts","../src/controllers/forms/detect_dirty_controller.ts","../src/controllers/forms/detect_dirty_form_controller.ts","../src/controllers/forms/enable_inputs_controller.ts","../src/controllers/forms/focus_steal_controller.ts","../src/controllers/forms/form_rc_controller.ts","../src/controllers/forms/form_save_controller.ts","../src/controllers/forms/limited_selection_checkboxes_controller.ts","../src/controllers/forms/navigate_form_errors_controller.ts","../src/controllers/forms/nested_form_controller.ts","../src/controllers/forms/password_confirm_controller.ts","../src/controllers/forms/password_peek_controller.ts","../src/controllers/forms/remote_form_controller.ts","../src/mixins/use_event_bus.ts","../src/controllers/forms/sync_inputs_controller.ts","../src/controllers/forms/value_warn_controller.ts","../src/controllers/forms/word_count_controller.ts","../src/controllers/media/fallback_image_controller.ts","../node_modules/dialog-polyfill/dist/dialog-polyfill.esm.js","../src/controllers/media/lightbox_image_controller.ts","../src/controllers/media/media_player_controller.ts","../src/controllers/scroll/scroll_container_controller.ts","../src/controllers/scroll/scroll_into_focus_controller.ts","../src/controllers/scroll/scroll_to_bottom_controller.ts","../src/controllers/scroll/scroll_to_controller.ts","../src/controllers/scroll/scroll_to_top_controller.ts","../src/controllers/signal/expressions.ts","../src/controllers/signal/events.ts","../src/controllers/signal/signal_action_controller.ts","../src/controllers/signal/signal_input_controller.ts","../src/controllers/signal/signal_visibility_controller.ts","../src/controllers/tables/table_sort_controller.ts","../src/mixins/use_mutation_observer.ts","../src/controllers/tables/table_truncate_controller.ts","../src/controllers/utility/alert_controller.ts","../src/controllers/utility/fullscreen_controller.ts","../src/utilities/events.ts","../src/controllers/utility/intersection_controller.ts","../src/controllers/utility/interval_controller.ts","../src/controllers/utility/presence_controller.ts","../src/controllers/utility/print_controller.ts","../src/controllers/utility/timeout_controller.ts","../src/controllers/utility/user_focus_controller.ts","../src/controllers/visual/clock_controller.ts","../src/controllers/visual/countdown_controller.ts","../src/controllers/visual/duration_controller.ts","../src/controllers/visual/tabs_controller.ts","../src/controllers/visual/time_distance_controller.ts","../src/controllers/visual/tree_view_controller.ts","../src/controllers/anchor_spy_controller.ts","../src/controllers/back_link_controller.ts","../src/controllers/clipboard_controller.ts","../src/controllers/confirm_controller.ts","../src/controllers/confirm_navigation_controller.ts","../src/controllers/debug_controller.ts","../src/controllers/disable_with_controller.ts","../src/controllers/dismissable_controller.ts","../src/controllers/element_save_controller.ts","../src/controllers/empty_dom_controller.ts","../src/controllers/prefetch_controller.ts","../src/controllers/print_button_controller.ts","../src/controllers/responsive_iframe_controller.ts","../src/controllers/self_destruct_controller.ts","../src/controllers/sticky_controller.ts","../src/controllers/teleport_controller.ts","../src/controllers/temporary_state_controller.ts","../src/mixins/use_click_outside.ts","../src/mixins/use_hover.ts","../src/controllers/toggle_class_controller.ts","../src/mixins/use_trix_modifiers.ts","../src/controllers/trix_modifier_controller.ts","../src/controllers/turbo_frame_rc_controller.ts","../src/controllers/turbo_frame_refresh_controller.ts"],"sourcesContent":["import {Controller} from \"stimulus\";\n\nexport function logProperty(prop: string): boolean {\n switch (prop) {\n case \"application\":\n case \"el\":\n case \"element\":\n case \"constructor\":\n case \"initialize\":\n case \"log\":\n case \"logEvent\":\n case \"dispatch\":\n case \"data\":\n case \"valueDescriptorMap\":\n case \"mutate\":\n case \"identifier\":\n return false;\n }\n\n if (/^_.*?$/.test(prop)) {\n return false;\n }\n if (/^.*?Target(s)?$/.test(prop)) {\n return false;\n }\n if (/^.*?Value$/.test(prop)) {\n return false;\n }\n if (/^.*?ValueChanged$/.test(prop)) {\n return false;\n }\n if (/^.*?Class$/.test(prop)) {\n return false;\n }\n if (/^.*?Classes$/.test(prop)) {\n return false;\n }\n if (/^.*?ClassesPresent$/.test(prop)) {\n return false;\n }\n\n return true;\n}\n\n\nexport function log(controller: Controller, functionName: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${controller.identifier} %c#${functionName}`, \"color: #3B82F6\", \"color: unset\");\n logger.log({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function warn(controller: Controller, warning: string, args: {} = {}): void {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${controller.identifier} %c#${warning}`, \"color: F39B1AFF\", \"color: unset\");\n logger.warn({\n element: controller.element,\n controller: controller,\n ...args,\n });\n logger.groupEnd();\n}\n\nexport function logEvent(controller: Controller, eventName: string, event: CustomEvent, element: HTMLElement) {\n if (!controller.application.debug) {\n return;\n }\n let logger = console;\n logger.groupCollapsed(`%c${controller.identifier} %c${eventName}%c`, \"color: #3B82F6\", \"color: #0be000\", \"color: unset\");\n logger.log({element});\n logger.groupEnd();\n}","import {Context, Controller} from \"stimulus\";\nimport {log, logProperty} from \"./logging\";\n\nexport class BaseController extends Controller {\n\n constructor(context: Context) {\n super(context);\n // @ts-ignore\n if (!this.application.debug) {\n return this;\n }\n return new Proxy(this, {\n get: (obj, prop) => {\n let returnVal = Reflect.get(obj, prop);\n let self = this;\n if (logProperty(prop.toString())) {\n if (typeof returnVal == \"function\") {\n return new Proxy(returnVal, {\n apply(target: any, thisArg: any, argArray?: any): any {\n log(self, prop.toString(), {\n args: argArray,\n });\n return Reflect.apply(target, thisArg, argArray);\n },\n });\n } else {\n log(this, prop.toString());\n }\n }\n return returnVal;\n },\n });\n }\n\n get el(): HTMLElement {\n return this.element as HTMLElement;\n }\n\n get isTurboPreview(): boolean {\n return document.documentElement.hasAttribute('data-turbo-preview') || document.documentElement.hasAttribute('data-turbolinks-preview');\n }\n\n get isTurbolinksPreview(): boolean {\n return this.isTurboPreview;\n }\n\n get csrfToken(): string | null {\n return this.metaValue('csrf-token');\n }\n\n metaValue(name: string): string | null {\n const element = document.head.querySelector(`meta[name=\"${name}\"]`);\n return element?.getAttribute('content') || null;\n }\n\n dispatchEvent(element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n this.dispatchEvent(element, eventName, options);\n }\n\n}\n","import {camelCase} from \"lodash-es\";\nimport {BaseController} from \"./base_controller\";\n\nexport class EphemeralController extends BaseController {\n\n _cleanupSelf() {\n this.cleanup(this.el);\n }\n\n cleanup(element: HTMLElement) {\n element.dataset.controller = element.dataset.controller?.replaceAll(new RegExp(`(\\\\s|^)${this.identifier}(\\\\s|$)`, \"g\"), \"\") || \"\";\n if (element.dataset.controller == \"\") {\n // If there are no controllers left, remove the attribute\n delete element.dataset.controller;\n }\n\n let substringIdentifierValueRegex = new RegExp(`(\\\\s|^)${this.identifier}\\\\..+?(\\\\s|$)`, \"g\");\n element.dataset.target = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-target`)];\n if (element.dataset.target == \"\") {\n // If there are no targets left, remove the attribute\n delete element.dataset.target;\n }\n\n element.dataset.action = element.dataset.target?.replaceAll(substringIdentifierValueRegex, \"\") || \"\";\n delete element.dataset[camelCase(`${this.identifier}-action`)];\n if (element.dataset.action == \"\") {\n // If there are no actions left, remove the attribute\n delete element.dataset.action;\n }\n\n // @ts-ignore\n let values = this.constructor.values;\n if (values) {\n Object.keys(values).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-value`)]);\n }\n\n // @ts-ignore\n let classes = this.constructor.classes;\n if (classes) {\n Object.keys(classes).forEach(val => delete element.dataset[camelCase(`${this.identifier}-${val}-class`)]);\n }\n }\n\n}\n","const smoothSupported = \"scrollBehavior\" in document.documentElement.style;\nlet smoothPolyfilled: boolean;\n\nexport async function scrollToElement(element: Element, {behavior = \"smooth\", block = \"start\", inline = \"nearest\"}: ScrollIntoViewOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollIntoView({behavior, block, inline});\n}\n\nexport async function scrollAbsoluteTop(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({top: 0, left: 0, behavior});\n}\n\nexport async function scrollAbsoluteBottom(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({top: document.body.scrollHeight, left: 0, behavior});\n } else {\n element.scrollTo({top: (element as Element).scrollHeight, left: 0, behavior});\n }\n}\n\nexport async function scrollAbsoluteLeft(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollTo({left: 0, behavior});\n}\n\nexport async function scrollAbsoluteRight(element: Window | Element, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n if (element == window) {\n element.scrollTo({left: document.body.scrollWidth, behavior});\n } else {\n element.scrollTo({left: (element as Element).scrollWidth, behavior});\n }\n}\n\nexport async function scrollUp(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: -amount, left: 0, behavior});\n}\n\nexport async function scrollDown(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: amount, left: 0, behavior});\n}\n\nexport async function scrollLeft(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: -amount, behavior});\n}\n\nexport async function scrollRight(element: Window | Element, amount: number, {behavior = \"smooth\"}: ScrollOptions = {}) {\n if (behavior == \"smooth\" && !smoothSupported) {\n await polyfillSmooth();\n }\n element.scrollBy({top: 0, left: amount, behavior});\n}\n\nasync function polyfillSmooth() {\n const {polyfill} = await import(/* webpackChunkName: \"smoothscroll-polyfill\" */ \"smoothscroll-polyfill\");\n if (smoothPolyfilled) {\n return;\n }\n smoothPolyfilled = true;\n polyfill();\n}\n\nexport function getScrollParent(node: HTMLElement | null): Window | HTMLElement | null {\n if (!node) {\n return null;\n }\n\n if (node == document.body) {\n return window;\n }\n\n const overflowY = getComputedStyle(node).overflowY;\n const isScrollable = overflowY !== \"visible\" && overflowY !== \"hidden\";\n\n if (isScrollable && node.scrollHeight >= node.clientHeight) {\n return node;\n }\n\n return getScrollParent(node.parentElement) || document.body;\n}\n","export function isTurboFrame(element: HTMLElement): element is TurboFrame {\n return element.nodeName == \"TURBO-FRAME\";\n}\n","export default function(n){return{all:n=n||new Map,on:function(t,e){var i=n.get(t);i?i.push(e):n.set(t,[e])},off:function(t,e){var i=n.get(t);i&&(e?i.splice(i.indexOf(e)>>>0,1):n.set(t,[]))},emit:function(t,e){var i=n.get(t);i&&i.slice().map(function(n){n(e)}),(i=n.get(\"*\"))&&i.slice().map(function(n){n(t,e)})}}}\n//# sourceMappingURL=mitt.mjs.map\n","import mitt from 'mitt';\n\nexport const EventBus = mitt<{ [idx: string]: any }>();\n","export function isHTMLLinkElement(element: Element): element is HTMLLinkElement {\n return element.nodeName == \"LINK\";\n}\n\nexport function isHTMLAnchorElement(element: Element): element is HTMLAnchorElement {\n return element.nodeName == \"A\";\n}\n\nexport function isHTMLFormElement(element: Element): element is HTMLFormElement {\n return element.nodeName == \"FORM\";\n}\n\nexport function isHTMLInputElement(element: Element): element is HTMLInputElement {\n return element.nodeName == \"INPUT\";\n}\n\nexport function isHTMLLabelElement(element: Element): element is HTMLLabelElement {\n return element.nodeName == \"LABEL\";\n}\n\nexport function isHTMLTextAreaElement(element: Element): element is HTMLTextAreaElement {\n return element.nodeName == \"TEXTAREA\";\n}\n\nexport function isHTMLButtonElement(element: Element): element is HTMLButtonElement {\n return element.nodeName == \"BUTTON\";\n}\n\nexport function isHTMLSelectElement(element: Element): element is HTMLSelectElement {\n return element.nodeName == \"SELECT\";\n}\n\nexport function isHTMLImageElement(element: Element): element is HTMLImageElement {\n return element.nodeName == \"IMG\";\n}\n\nexport function isHTMLButtonInputElement(element: Element): element is HTMLInputElement & { type: \"button\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"button\";\n}\n\nexport function isHTMLSubmitInputElement(element: Element): element is HTMLInputElement & { type: \"submit\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"submit\";\n}\n\nexport function isHTMLResetInputElement(element: Element): element is HTMLInputElement & { type: \"reset\" } {\n return element.nodeName == \"INPUT\" && (element as HTMLInputElement).type == \"reset\";\n}\n\nexport function isHTMLButtonButtonElement(element: Element): element is HTMLButtonElement & { type: \"button\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"button\";\n}\n\nexport function isHTMLSubmitButtonElement(element: Element): element is HTMLButtonElement & { type: \"submit\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"submit\";\n}\n\nexport function isHTMLResetButtonElement(element: Element): element is HTMLButtonElement & { type: \"reset\" } {\n return element.nodeName == \"BUTTON\" && (element as HTMLButtonElement).type == \"reset\";\n}\n\nexport function isTypeOfResetButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"reset\" } {\n return isHTMLResetButtonElement(element) || isHTMLResetInputElement(element);\n}\n\nexport function isTypeOfSubmitButtonElement(element: Element): element is (HTMLButtonElement | HTMLInputElement) & { type: \"submit\" } {\n return isHTMLSubmitButtonElement(element) || isHTMLSubmitInputElement(element);\n}\n\nexport function isTypeOfButtonableElement(element: Element): element is HTMLButtonElement | (HTMLInputElement & { type: \"submit\" | \"reset\" }) {\n return isTypeOfResetButtonElement(element) || isTypeOfSubmitButtonElement(element) || isHTMLButtonButtonElement(element);\n}\n\nexport function isElementCheckable(element: Element): element is HTMLInputElement & { checked: boolean } {\n return isHTMLInputElement(element) && (element.type === \"radio\" || element.type === \"checkbox\");\n}\n\nexport function isTypeOfFormInputElement(element: Element): element is (HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n return isHTMLInputElement(element) || isHTMLSelectElement(element) || isHTMLTextAreaElement(element);\n}\n\nexport function createHiddenButton(type: \"submit\" | \"reset\"): HTMLButtonElement {\n let button = document.createElement('button');\n button.type = type;\n button.style.display = 'none';\n button.dataset.sythentic = 'true';\n return button;\n}\n\nexport function createHiddenInput(name: string, value: string): HTMLInputElement {\n let input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = value;\n return input;\n}\n\nexport function insertElement<T extends Element>(targetElement: Element, insertPosition: InsertPosition, element: T): T {\n let createdElement = targetElement.insertAdjacentElement(insertPosition, element);\n if (!createdElement) {\n throw new Error(`Failed to insert element ${element.nodeName} into ${targetElement.nodeName}`);\n }\n return createdElement as T;\n}\n\nexport function insertHiddenInput(name: string, value: string, targetElement: Element, insertPosition: InsertPosition): HTMLInputElement {\n return insertElement(targetElement, insertPosition, createHiddenInput(name, value));\n}\n\nexport function insertHiddenButton(type: \"submit\" | \"reset\", targetElement: Element, insertPosition: InsertPosition): HTMLButtonElement {\n return insertElement(targetElement, insertPosition, createHiddenButton(type));\n}\n\nexport function getAllRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n let parent = radio.form || document;\n return Array.from(parent.querySelectorAll(`input[type=\"radio\"][name=\"${radio.name}\"]`));\n}\n\nexport function getOtherRadiosInGroup(radio: HTMLInputElement): HTMLInputElement[] {\n return getAllRadiosInGroup(radio).filter((r) => r !== radio);\n}\n\nexport function isElementInViewport(el: Element) {\n const rect = el.getBoundingClientRect();\n\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n const vertInView = rect.top <= windowHeight && rect.top + rect.height >= 0;\n const horInView = rect.left <= windowWidth && rect.left + rect.width >= 0;\n\n return vertInView && horInView;\n}\n","import {insertHiddenButton} from \"./elements\";\n\nexport function requestSubmit(form: HTMLFormElement) {\n if (form.requestSubmit) {\n form.requestSubmit();\n } else {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"submit\"]');\n if (!button) {\n button = insertHiddenButton(\"submit\", form, 'beforeend');\n }\n button.click();\n }\n}\n\nexport function requestReset(form: HTMLFormElement) {\n let button: HTMLButtonElement | null = form.querySelector('button[type=\"reset\"]');\n if (!button) {\n button = insertHiddenButton(\"reset\", form, 'beforeend');\n }\n button.click();\n}","export function wrapArray<T>(x: T | Array<T>): Array<T> {\n return Array.isArray(x) ? x : [x];\n}","import {Controller} from \"stimulus\";\n\nexport function useMixin(controller: Controller, setup: () => void, teardown: () => void) {\n const controllerDisconnect = controller.disconnect.bind(controller);\n\n setup();\n\n Object.assign(controller, {\n disconnect() {\n teardown();\n controllerDisconnect();\n },\n });\n\n return controllerDisconnect;\n}","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventListener(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n if (opts?.debounce) {\n handler = debounce(handler.bind(controller), opts.debounce);\n delete opts.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => element.addEventListener(eventName, handler, opts));\n let teardown = () => eventNames.forEach(eventName => element.removeEventListener(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n\nexport function useEventListeners(controller: Controller, element: Document | Window | HTMLElement, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useEventListener(controller, element, eventNameOrNames, handler, opts);\n}\n\nexport function useCollectionEventListener(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n let handlers: Array<{ setup: () => void, teardown: () => void, }> = [];\n elements.forEach(el => {\n let {setup, teardown} = useEventListener(controller, el, eventNameOrNames, handler, opts);\n handlers.push({setup, teardown});\n });\n return [\n () => handlers.forEach(h => h.setup()),\n () => handlers.forEach(h => h.teardown()),\n ];\n}\n\nexport function useCollectionEventListeners(controller: Controller, elements: Array<Document | Window | HTMLElement>, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: AddEventListenerOptions & { debounce?: number }) {\n return useCollectionEventListener(controller, elements, eventNameOrNames, handler, opts);\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useFullscreen(controller: Controller, el?: Element) {\n let element = el || document.documentElement;\n let fullscreenOpen = document.fullscreenElement !== null;\n\n const updateFullscreenState = () => fullscreenOpen = document.fullscreenElement !== null;\n const isFullscreen = (): boolean => fullscreenOpen;\n const toggle = async () => fullscreenOpen ? await exit() : await enter();\n let setup = () => document.addEventListener('fullscreenchange', updateFullscreenState);\n let teardown = () => document.removeEventListener('fullscreenchange', updateFullscreenState);\n\n const exit = async () => {\n if (document.exitFullscreen) {\n fullscreenOpen = false;\n await document.exitFullscreen();\n }\n };\n\n const enter = async () => {\n if (fullscreenOpen) {\n await exit();\n }\n if (element.requestFullscreen) {\n await element.requestFullscreen();\n fullscreenOpen = true;\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n isFullscreen,\n enter,\n exit,\n toggle,\n teardown,\n };\n}","export function reactive<T extends Object>(object: T): T {\n\n if (object === null || typeof object !== 'object') {\n return object;\n }\n\n for (const property in object) {\n if (Object.getOwnPropertyDescriptor(object, property) == undefined) {\n continue;\n }\n\n // @ts-ignore\n object[property] = reactive(object[property]);\n }\n\n return new Proxy(object, {\n get(target, property) {\n // @ts-ignore\n return target[property];\n },\n set(target, property, value) {\n // @ts-ignore\n target[property] = reactive(value);\n\n return true;\n },\n });\n}","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\nimport {useMixin} from \"./create_mixin\";\n\nexport interface GeolocationOptions extends Partial<PositionOptions> {\n}\n\nexport interface GeolocationData {\n locatedAt: number | null,\n error: GeolocationPositionError | null,\n coords: {\n accuracy: number,\n latitude: number,\n longitude: number,\n altitude: number | null,\n altitudeAccuracy: number | null,\n heading: number | null,\n speed: number | null,\n },\n teardown: () => void,\n}\n\nexport function useGeolocation(controller: Controller, options: GeolocationOptions = {}, update?: (...args: any[]) => void, error?: (...args: any[]) => void) {\n // Ensure passed functions are bound to the correct controller scope\n if (update) {\n update = update.bind(controller);\n }\n if (error) {\n error = error.bind(controller);\n }\n\n // Default options to pass to the navigator.geolocation.watchPosition() method\n const {\n enableHighAccuracy = true,\n maximumAge = 30000,\n timeout = 27000,\n } = options;\n\n const isSupported = navigator && 'geolocation' in navigator;\n\n // Create a reactive object to store the geolocation data\n const values = reactive({\n locatedAt: null,\n error: null,\n coords: {\n accuracy: 0,\n latitude: Infinity,\n longitude: Infinity,\n altitude: null,\n altitudeAccuracy: null,\n heading: null,\n speed: null,\n },\n teardown: () => {\n if (watcher) {\n navigator.geolocation.clearWatch(watcher);\n watcher = null;\n }\n },\n } as GeolocationData);\n\n let setup = () => {\n if (isSupported) {\n watcher = navigator.geolocation.watchPosition(\n (position: GeolocationPosition) => {\n // Update reactive values\n values.locatedAt = position.timestamp;\n values.coords = position.coords;\n values.error = null;\n // Fire user callback if provided\n if (update) {\n update(position);\n }\n },\n (err: GeolocationPositionError) => {\n // Update reactive values\n values.error = err;\n // Fire user callback if provided\n if (error) {\n error(err);\n }\n },\n {\n enableHighAccuracy,\n maximumAge,\n timeout,\n },\n );\n }\n };\n\n let watcher: number | null = null;\n\n useMixin(controller, setup, values.teardown);\n\n return values;\n}\n\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInjectedFragment(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, fragment: DocumentFragment, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n let nodes = Array.from(fragment.childNodes);\n\n let setup = () => {\n let parent = targetElement.parentElement;\n if ([\"beforebegin\", \"afterend\"].includes(insertPosition) && parent == null) {\n throw new Error(\"Cannot insert beforebegin into a node with no parent\");\n }\n\n switch (insertPosition) {\n case 'beforeend':\n targetElement.append(fragment);\n break;\n case \"afterbegin\":\n targetElement.prepend(fragment);\n break;\n case \"beforebegin\":\n parent!.insertBefore(fragment, targetElement);\n break;\n case \"afterend\":\n parent!.insertBefore(fragment, targetElement);\n break;\n }\n };\n let teardown = options.cleanup ? () => nodes.forEach(node => node.remove()) : () => void 0;\n\n useMixin(controller, setup, teardown);\n return [nodes, teardown];\n}\n\nexport function useInjectedHTML(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, html: string, options: { cleanup?: boolean } = {}): [ChildNode[], () => void] {\n const fragment = document.createRange().createContextualFragment(html);\n return useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n}\n\nexport function useInjectedElement(controller: Controller, targetElement: HTMLElement, insertPosition: InsertPosition, element: HTMLElement, options: { cleanup?: boolean } = {}): [ChildNode, () => void] {\n const fragment = new DocumentFragment();\n fragment.append(element);\n let [nodes, teardown] = useInjectedFragment(controller, targetElement, insertPosition, fragment, options);\n return [nodes[0], teardown];\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useInterval(controller: Controller, handler: (...args: any[]) => void, interval: number) {\n handler = handler.bind(controller);\n let intervalHandle: ReturnType<typeof window.setInterval> | null = null;\n\n let setup = () => intervalHandle = setInterval(handler, interval);\n let teardown = () => {\n if (intervalHandle !== null) {\n clearInterval(intervalHandle);\n }\n };\n\n useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {reactive} from \"../utilities/reactive\";\n\n\nexport type Serializer<T> = {\n deserialize(raw: string): T\n serialize(value: T): string\n isEmpty(value: T): boolean\n}\n\nexport interface LocalStorageProxy<T> {\n get value(): T;\n\n set value(value: T);\n\n read(): T;\n\n write(value: T): void;\n\n clear(): void;\n\n isEmpty(): boolean;\n}\n\nexport const StorageSerializers: Record<'boolean' | 'object' | 'number' | 'any' | 'string' | 'map' | 'set', Serializer<any>> & { [idx: string]: Serializer<any> } = {\n boolean: {\n deserialize: (v: any) => v === 'true',\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n object: {\n deserialize: (v: any) => JSON.parse(v),\n serialize: (v: any) => JSON.stringify(v),\n isEmpty: (v: any) => {\n const values = Object.values(JSON.parse(v));\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n number: {\n deserialize: (v: any) => Number.parseFloat(v),\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n any: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n string: {\n deserialize: (v: any) => v,\n serialize: (v: any) => String(v),\n isEmpty: (v: any) => v === '' || v === null,\n },\n map: {\n deserialize: (v: any) => new Map(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Map<any, any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Map<any, any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n set: {\n deserialize: (v: any) => new Set(JSON.parse(v)),\n serialize: (v: any) => JSON.stringify(Array.from((v as Set<any>).entries())),\n isEmpty: (v: any) => {\n const values = Array.from((v as Set<any>).values());\n return values.length === 0 || values.every(v => v === '' || v === null);\n },\n },\n};\n\nexport function useLocalStorage<T>(controller: Controller, key: string, defaultValue: T, opts: { writeDefaults: boolean } = {writeDefaults: true}): LocalStorageProxy<T> {\n let type: string;\n let {writeDefaults} = opts;\n\n if (defaultValue == null) {\n type = 'any';\n } else if (defaultValue instanceof Set) {\n type = 'set';\n } else if (defaultValue instanceof Map) {\n type = 'map';\n } else if (typeof defaultValue === 'boolean') {\n type = 'boolean';\n } else if (typeof defaultValue === 'string') {\n type = 'string';\n } else if (typeof defaultValue === 'object') {\n type = 'object';\n } else if (Array.isArray(defaultValue)) {\n type = 'object';\n } else if (!Number.isNaN(defaultValue)) {\n type = 'number';\n } else {\n type = 'any';\n }\n\n let data = reactive({\n value: defaultValue,\n });\n\n let storage = localStorage;\n const serializer = StorageSerializers[type];\n\n const read = () => {\n const rawValue = storage.getItem(key);\n if (rawValue == null) {\n data.value = defaultValue;\n if (writeDefaults && defaultValue !== null) {\n storage.setItem(key, serializer.serialize(defaultValue));\n }\n } else {\n data.value = serializer.deserialize(rawValue);\n }\n\n return data.value;\n };\n\n const write = (value: T) => {\n storage.setItem(key, serializer.serialize(value));\n data.value = value;\n };\n\n const clear = () => {\n storage.removeItem(key);\n data.value = defaultValue;\n return data.value;\n };\n\n const isEmpty = (): boolean => {\n let rawValue = storage.getItem(key);\n return serializer.isEmpty(rawValue);\n };\n\n read();\n\n return {\n get value() {\n return read();\n },\n set value(value) {\n write(value);\n },\n read,\n clear,\n write,\n isEmpty,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\n\nexport function useTimeout(controller: Controller, handler: (...args: any[]) => void, timeout: number) {\n let controllerDisconnect: () => void;\n let timeoutHandle: ReturnType<typeof window.setTimeout> | null = null;\n handler = handler.bind(controller);\n\n let newHandler = () => {\n handler();\n timeoutHandle = null;\n Object.assign(controller, {disconnect: controllerDisconnect});\n };\n\n let setup = () => timeoutHandle = setTimeout(newHandler, timeout);\n let teardown = () => {\n if (timeoutHandle !== null) {\n clearTimeout(timeoutHandle);\n timeoutHandle = null;\n }\n };\n\n controllerDisconnect = useMixin(controller, setup, teardown);\n return teardown;\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\nimport {useTimeout} from \"./use_timeout\";\nimport {isHTMLInputElement} from \"../utilities/elements\";\n\nexport function useTemporaryContent(controller: Controller, target: HTMLElement, content: string, timeout?: number, teardownCallback?: () => void) {\n\n const setContent = (element: HTMLElement | HTMLInputElement, text: string) => {\n if (isHTMLInputElement(element)) {\n element.value = text;\n } else {\n element.textContent = text;\n }\n };\n\n const getContent = (element: HTMLElement): string => {\n return isHTMLInputElement(element) ? element.value : element.innerHTML;\n };\n\n let cleanupTimeout: () => void = () => void 0;\n let originalText: string = getContent(target);\n\n const teardown = () => {\n setContent(target, originalText);\n cleanupTimeout();\n if (teardownCallback) {\n teardownCallback.call(controller);\n }\n };\n\n const setup = () => {\n setContent(target, content);\n if (timeout !== undefined) {\n cleanupTimeout = useTimeout(controller, teardown, timeout);\n }\n };\n\n useMixin(controller, setup, teardown);\n\n return {\n teardown,\n update(newContent: string) {\n setContent(target, newContent);\n },\n };\n}\n","export async function fetchRetry(n: number, input: RequestInfo, init?: RequestInit): Promise<Response> {\n try {\n return await fetch(input, init);\n } catch (err) {\n if (n === 1) {\n throw err;\n }\n return await fetchRetry(n - 1, input, init);\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {fetchRetry} from \"../../utilities/fetchRetry\";\n\nexport class LoadBlockController extends BaseController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare maxRetriesValue: number;\n declare readonly hasMaxRetriesValue: boolean;\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n get _maxRetries(): number {\n return this.hasMaxRetriesValue ? this.maxRetriesValue : 1;\n }\n\n connect() {\n }\n\n async loadContent(event: Event | null = null) {\n event?.preventDefault();\n\n let self = this;\n let el = this.hasReplaceTarget ? this.replaceTarget : this.el;\n\n let failure = () => {\n el.replaceWith(this._errorMessage);\n self.dispatchEvent(el, \"ajax:error\");\n };\n\n try {\n let response = await fetchRetry(this._maxRetries, this.endpointValue);\n if (!response.ok) {\n failure();\n }\n let text = await response.text();\n let newEl = document.createElement(\"div\");\n\n newEl.innerHTML = text;\n if (this.hasSelectorValue) {\n let selectedContent = newEl.querySelectorAll(this.selectorValue);\n el.replaceWith(...selectedContent);\n } else {\n el.replaceWith(...newEl.children);\n }\n // Trigger event to show block has loaded\n self.dispatchEvent(el, \"ajax:success\");\n } catch (e) {\n failure();\n } finally {\n self.dispatchEvent(el, \"ajax:complete\");\n }\n }\n}\n","import {LoadBlockController} from \"./load_block_controller\";\n\nexport class AsyncBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n };\n\n declare readonly replaceTarget: HTMLElement;\n declare readonly hasReplaceTarget: boolean;\n declare readonly endpointValue: string;\n\n declare readonly hasErrorMessageValue: boolean;\n declare readonly errorMessageValue: string;\n\n get _errorMessage(): string {\n return this.hasErrorMessageValue ? this.errorMessageValue : \"This content failed to load\";\n }\n\n // This is a simple controller to load a block of content when the page loads.\n // It should be used to give a quick initial response before calling out to an\n // an AJAX endpoint to do some expensive work.\n async connect() {\n await this.loadContent();\n }\n\n}\n","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useIntersectionObserver(controller: Controller, handler: IntersectionObserverCallback, options?: IntersectionObserverInit) {\n handler = handler.bind(controller);\n\n let observer: IntersectionObserver | null = new IntersectionObserver(handler, options);\n let teardown = () => {\n observer?.disconnect();\n observer = null;\n };\n let observe = (element: HTMLElement) => observer?.observe(element);\n let unobserve = (element: HTMLElement) => observer?.unobserve(element);\n\n return {\n observer,\n teardown,\n observe,\n unobserve,\n };\n}\n\nexport function useIntersection(\n controller: Controller,\n element: HTMLElement,\n appear?: null | ((entry: IntersectionObserverEntry) => void),\n disappear?: null | ((entry: IntersectionObserverEntry) => void),\n options?: IntersectionObserverInit,\n) {\n if (appear) {\n appear = appear.bind(controller);\n }\n if (disappear) {\n disappear = disappear.bind(controller);\n }\n let opts = options ?? {};\n let processEntries = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n appear && appear(entry);\n } else {\n disappear && disappear(entry);\n }\n });\n };\n let {observer, observe, unobserve, teardown} = useIntersectionObserver(controller, processEntries, opts);\n let setup = () => observe(element);\n useMixin(controller, setup, teardown);\n\n return {\n observer,\n observe: () => observe(element),\n unobserve: () => unobserve(element),\n teardown,\n };\n}","import {LoadBlockController} from \"./load_block_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class LazyBlockController extends LoadBlockController {\n\n declare observe: () => void;\n declare unobserve: () => void;\n declare isVisible: boolean;\n declare disappear: () => void;\n\n async connect() {\n let element = this.el;\n\n if (\"IntersectionObserver\" in window) {\n let {observe, unobserve} = useIntersection(this, element, this.appear, null, {threshold: 0.3});\n this.observe = observe;\n this.unobserve = unobserve;\n } else {\n // Client doesn't support intersection observer, fallback to pre-loading\n await this.loadContent();\n }\n }\n\n async appear(entry: IntersectionObserverEntry) {\n if (entry.target === this.el && entry.isIntersecting) {\n await this.loadContent();\n if (this.unobserve) {\n this.unobserve();\n }\n }\n }\n\n}\n","import {LoadBlockController} from \"./load_block_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class PollBlockController extends LoadBlockController {\n\n static targets = [\"replace\"];\n static values = {\n endpoint: String,\n errorMessage: String,\n selector: String,\n maxRetries: Number,\n seconds: Number,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error(\"Required value `seconds` is missing\");\n }\n\n requestAnimationFrame(() => {\n this._timeout();\n useInterval(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n async _timeout() {\n await this.loadContent();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {requestSubmit} from \"../../utilities/request_submit\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class AutoSubmitFormController extends BaseController {\n\n static values = {submitMode: String, eventMode: String, debounceInterval: Number};\n declare readonly submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare eventModeValue: 'change' | 'input' | 'debounced';\n declare readonly hasEventModeValue: boolean;\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n\n get _eventModes(): Array<'change' | 'input'> {\n if (this.hasEventModeValue) {\n let modes = this.eventModeValue.split(' ').map(mode => mode.trim());\n\n if (modes.length === 1 && modes[0] === 'debounced') {\n return ['change', 'input'];\n }\n\n if (!modes.every(mode => ['change', 'input'].includes(mode))) {\n throw new Error(`The modeValue provided '${this.eventModeValue}' is not one of the recognised configuration options`);\n }\n\n return modes as Array<'change' | 'input'>;\n } else {\n return [\"change\"];\n }\n }\n\n get _debounceTimeout(): number {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : -1;\n }\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get _cssSelector() {\n let inputTypes = ['input', 'textarea', 'select'];\n let ignore = ':not([data-no-autosubmit])';\n return inputTypes.map(type => type.concat(ignore)).join(',');\n }\n\n get inputElements() {\n let subElements = Array.from(this.element.querySelectorAll(this._cssSelector));\n subElements = subElements.filter(el => !this._ancestorIsTrix(el));\n return subElements;\n }\n\n connect() {\n this.inputElements.forEach(el => {\n return useEventListener(\n this,\n el as HTMLElement,\n this._eventModes,\n this.submit,\n {debounce: this._debounceTimeout && this._debounceTimeout > 0 ? this._debounceTimeout : undefined},\n );\n });\n }\n\n _ancestorIsTrix(element: Element) {\n return element.closest('trix-toolbar') !== null && element.closest('trix-editor') !== null;\n }\n\n private submit() {\n let el = this.el as HTMLFormElement;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLTextAreaElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\n\nexport class AutosizeController extends BaseController {\n\n declare _unobserveIntersection: () => void;\n\n connect() {\n let {teardown} = useIntersection(this, this.el, this.appear);\n this._unobserveIntersection = teardown;\n if (!isHTMLTextAreaElement(this.el)) {\n throw new Error(`Expected controller to be attached to a textarea, but was a '${this.el.tagName}'`);\n }\n\n requestAnimationFrame(() => {\n this.el.style.resize = \"none\";\n this.el.style.boxSizing = \"border-box\";\n\n this._handler();\n useEventListener(this, window, ['resize'], this._handler);\n useEventListener(this, this.el, ['input', 'change', 'focus'], this._handler, {debounce: 100});\n });\n }\n\n appear(_entry: IntersectionObserverEntry) {\n this.autosize(this.el as HTMLTextAreaElement);\n this._unobserveIntersection();\n }\n\n private _handler() {\n this.autosize(this.el as HTMLTextAreaElement);\n }\n\n private autosize(element: HTMLTextAreaElement) {\n let offset = element.offsetHeight - element.clientHeight;\n element.style.height = \"auto\";\n element.style.height = element.scrollHeight + offset + \"px\";\n }\n\n}\n","import {Controller} from \"stimulus\";\n\nexport function controllerMethod<C extends Controller>(controller: C, methodName: string): (...args: any[]) => any {\n // @ts-ignore\n const method = controller[methodName];\n if (typeof method == 'function') {\n return method;\n } else if (method != undefined) {\n return () => method;\n } else {\n return () => void 0;\n }\n}","import {camelCase, upperFirst} from \"lodash-es\";\n\nexport function pascalCase(str: string): string {\n return upperFirst(\n camelCase(str),\n );\n}","import {Controller} from \"stimulus\";\nimport {controllerMethod} from \"../utilities/stimulus\";\nimport {pascalCase} from \"../utilities/strings\";\n\nexport class InstallClassMethodComposableController extends Controller {\n [index: string]: any\n}\n\nfunction addMethodsForClassDefinition(controller: InstallClassMethodComposableController, name: string) {\n let defaultElement = controller.element as HTMLElement;\n let hasClass = (): boolean => controller[`has${pascalCase(name)}Class`] == true;\n let classes = (): string[] => controller[`${name}Classes`];\n let defaultClasses = (): string[] => controllerMethod(controller, `default${pascalCase(name)}Classes`).call(controller) || [];\n let classOrDefault = (): string[] => hasClass() ? classes() : defaultClasses();\n\n if (controller[`${name}Classes`] == undefined) {\n Object.defineProperty(controller, `${name}Classes`, {\n get: () => hasClass() ? controller[`${name}Class`].split(' ') : defaultClasses(),\n });\n }\n let methods = {\n [`add${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.add(...classOrDefault()),\n [`remove${pascalCase(name)}Classes`]: (element = defaultElement) => element.classList.remove(...classOrDefault()),\n [`${name}ClassesPresent`]: (element = defaultElement) => classOrDefault().every((klass: string) => element.classList.contains(klass)),\n };\n Object.assign(controller, methods);\n}\n\nexport function installClassMethods(controller: InstallClassMethodComposableController) {\n // @ts-ignore\n let classes = controller.constructor.classes || [];\n classes.forEach((classDefinition: string) => addMethodsForClassDefinition(controller, classDefinition));\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class CharCountController extends BaseController {\n\n // Config\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n // Targets\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n // Values\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n // Classes\n declare removeErrorClasses: (el?: HTMLElement) => void;\n declare addErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n useEventListener(this, this.inputTarget, \"input\", this._updateCharCount);\n this._updateCharCount();\n });\n }\n\n\n private _updateCharCount() {\n let charCount = this.inputTarget.value.length;\n this.outputTarget.innerText = charCount.toString();\n if (this._isValidCount(charCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxDisableInputsController extends BaseController {\n\n static targets = [\"disabler\", \"disable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasDisablerTarget: boolean;\n declare readonly disablerTarget: HTMLInputElement;\n declare readonly disableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasDisablerTarget && this.disablerTarget.checked) {\n this.disable();\n } else {\n this.enable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.disableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.disableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class CheckboxEnableInputsController extends BaseController {\n\n static targets = [\"enabler\", \"enable\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly hasEnablerTarget: boolean;\n declare readonly enablerTarget: HTMLInputElement;\n declare readonly enableTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n this.toggle();\n }\n\n toggle() {\n if (this.hasEnablerTarget && this.enablerTarget.checked) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.enableTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.enableTargets.forEach((el, _) => {\n el.disabled = false;\n });\n }\n}\n","import {BaseController} from '../../utilities/base_controller';\nimport {useCollectionEventListener, useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class CheckboxSelectAllController extends BaseController {\n static targets = ['selectAll', 'checkbox'];\n\n declare readonly hasSelectAllTarget: boolean;\n declare readonly selectAllTarget: HTMLInputElement;\n declare readonly checkboxTargets: HTMLInputElement[];\n\n private get _checked() {\n return this._enabled.filter(checkbox => checkbox.checked);\n }\n\n private get _enabled() {\n return this.checkboxTargets.filter(checkbox => !checkbox.disabled && !checkbox.readOnly);\n }\n\n private get _unchecked() {\n return this._enabled.filter(checkbox => !checkbox.checked);\n }\n\n connect() {\n requestAnimationFrame(() => {\n if (!this.hasSelectAllTarget) {\n return;\n }\n\n useEventListener(this, this.selectAllTarget, 'change', this._toggle);\n useCollectionEventListener(this, this.checkboxTargets, 'change', this._refresh);\n this._refresh();\n });\n }\n\n private _toggle(event: Event) {\n event.preventDefault();\n let target = event.target as HTMLInputElement;\n this._enabled.forEach((checkbox) => checkbox.checked = (checkbox.disabled || checkbox.readOnly) ? checkbox.checked : target.checked);\n }\n\n private _refresh() {\n const checkboxesCount = this._enabled.length;\n const checkboxesCheckedCount = this._checked.length;\n\n this.selectAllTarget.checked = checkboxesCheckedCount > 0;\n this.selectAllTarget.indeterminate = checkboxesCheckedCount > 0 && checkboxesCheckedCount < checkboxesCount;\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins\";\n\nexport class CheckboxXORController extends BaseController {\n\n static targets = [\"checkbox\"];\n declare readonly checkboxTargets: HTMLInputElement[];\n\n connect() {\n useCollectionEventListener(this, this.checkboxTargets, \"change\", this._update);\n }\n\n _otherCheckboxes(el: HTMLInputElement): HTMLInputElement[] {\n return Array.from(this.checkboxTargets).filter(field => field !== el);\n }\n\n _update(event: Event) {\n const target = event.target as HTMLInputElement | null;\n if (!target) {\n throw new Error(\"No target found on event\");\n }\n\n let others = this._otherCheckboxes(target);\n if (target.checked) {\n others.forEach(checkbox => {\n checkbox.checked = false;\n this.dispatchEvent(this.el, 'change');\n });\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyController extends BaseController {\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._restoreElementFromLoadValue();\n }\n\n private _getElementValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(): boolean | string {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(): boolean {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkDirty() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty()) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(): boolean {\n return this._getElementValue() !== this._getElementLoadValue();\n }\n\n private _restoreElementFromLoadValue() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n if (!this._elementHasCachedLoadValue() && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n}\n\nexport function isDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getOtherRadiosInGroup, isElementCheckable, isHTMLInputElement, isHTMLSelectElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class DetectDirtyFormController extends BaseController {\n\n get _formElements(): Array<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> {\n return Array.from(this.el.querySelectorAll('input, select, textarea'));\n }\n\n get _cacheAttrName(): string {\n return 'detect-dirty-load-value';\n }\n\n connect() {\n let element = this.el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n\n this._cacheLoadValues();\n this._checkDirty();\n useEventListener(this, element, [\"input\", \"change\"], this._checkDirty, {debounce: 10});\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n this._formElements.forEach(element => this._restoreElementFromLoadValue(element));\n }\n\n private _getElementValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n return isElementCheckable(element) ? element.checked : element.value;\n }\n\n private _getElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean | string {\n let value = element.getAttribute(this._cacheAttrName);\n if (isElementCheckable(element)) {\n return value == null ? element.defaultChecked : value == \"true\";\n } else if (isHTMLSelectElement(element)) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return option.value;\n }\n });\n } else if (value !== null) {\n return value;\n }\n\n return value!;\n }\n\n private _elementHasCachedLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return element.hasAttribute(this._cacheAttrName);\n }\n\n private _checkElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (isHTMLInputElement(element) && element.type == \"radio\") {\n getOtherRadiosInGroup(element).forEach((radio) => radio.removeAttribute('data-dirty'));\n }\n if (this._isElementDirty(element)) {\n element.setAttribute('data-dirty', \"true\");\n } else {\n element.removeAttribute('data-dirty');\n }\n }\n\n private _isElementDirty(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement): boolean {\n return this._getElementValue(element) !== this._getElementLoadValue(element);\n }\n\n private _cacheElementLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n if (!this._elementHasCachedLoadValue(element) && isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n } else {\n element.setAttribute(this._cacheAttrName, element.value.toString());\n }\n }\n\n private _restoreElementFromLoadValue(element: HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement) {\n let cacheValue = element.getAttribute(this._cacheAttrName);\n\n if (isElementCheckable(element)) {\n element.setAttribute(this._cacheAttrName, element.checked.toString());\n element.checked = cacheValue == null ? element.defaultChecked : cacheValue == \"true\";\n } else if (isHTMLSelectElement(element)) {\n if (cacheValue == null) {\n let options = Array.from(element.options);\n options.forEach((option) => {\n if (option.defaultSelected) {\n element.value = option.value;\n return;\n }\n });\n } else {\n element.value = cacheValue;\n }\n\n } else {\n element.value = cacheValue == null ? element.defaultValue : cacheValue;\n }\n }\n\n private _cacheLoadValues(): void {\n this._formElements.forEach(el => this._cacheElementLoadValue(el));\n }\n\n private _checkDirty(): void {\n this._formElements.forEach(el => this._checkElementDirty(el));\n if (this._formElements.some(el => isFormDirty(el))) {\n this.el.setAttribute(\"data-dirty\", \"true\");\n } else {\n this.el.removeAttribute(\"data-dirty\");\n }\n }\n}\n\nexport function isFormDirty(element: HTMLElement) {\n return element.hasAttribute(\"data-dirty\");\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class EnableInputsController extends BaseController {\n\n static targets = [\"input\"];\n\n static values = {\n clear: Boolean,\n };\n\n declare readonly inputTargets: Array<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>;\n declare readonly clearValue: boolean;\n declare readonly hasClearValue: boolean;\n\n connect() {\n }\n\n disable() {\n let shouldClear = this.hasClearValue && this.clearValue;\n this.inputTargets.forEach((el, _) => {\n if (shouldClear) {\n el.value = \"\";\n }\n el.disabled = true;\n });\n }\n\n enable() {\n this.inputTargets.forEach((el, _) => el.disabled = false);\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FocusStealController extends BaseController {\n\n\n static values = {\n mode: String,\n };\n\n declare modeValue: 'immediate' | 'wait';\n declare hasModeValue: boolean;\n\n get _mode() {\n const MODES = ['immediate', 'wait'];\n if (this.hasModeValue) {\n if (!MODES.includes(this.modeValue)) {\n throw new Error(`The given modeValue '${this.modeValue}' is not one of the supported modes: \"${MODES.join('\", \"')}\"`);\n } else {\n return this.modeValue;\n }\n } else {\n return MODES[0];\n }\n }\n\n connect() {\n if (this._mode == 'immediate') {\n this.steal();\n }\n }\n\n steal() {\n (this.el as HTMLInputElement).focus();\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {requestReset, requestSubmit} from \"../../utilities/request_submit\";\n\nexport class FormRcController extends BaseController {\n\n static targets = [\"form\"];\n static values = {\n formSelector: String,\n submitMode: String,\n };\n\n declare submitModeValue: \"direct\" | \"request\";\n declare readonly hasSubmitModeValue: boolean;\n declare readonly formTarget: HTMLFormElement;\n declare readonly formSelectorValue: string;\n declare readonly hasFormSelectorValue: boolean;\n\n get _mode(): \"direct\" | \"request\" {\n if (this.hasSubmitModeValue) {\n if (![\"direct\", \"request\"].includes(this.submitModeValue)) {\n throw new Error(`The modeValue provided '${this.submitModeValue}' is not one of the recognised configuration options`);\n }\n return this.submitModeValue;\n } else {\n return \"request\";\n }\n }\n\n get form(): HTMLFormElement {\n let form: HTMLFormElement | null;\n if (this.hasFormSelectorValue) {\n form = document.querySelector(this.formSelectorValue);\n if (!form) {\n throw new Error(`Could not find a form on the page that matches selector '${this.formSelectorValue}'`);\n }\n } else {\n form = this.formTarget;\n }\n return form;\n }\n\n submit(event?: Event) {\n event?.preventDefault();\n let el = this.formTarget;\n if (this._mode == 'request') {\n requestSubmit(el);\n } else {\n el.submit();\n }\n }\n\n reset(event?: Event) {\n event?.preventDefault();\n requestReset(this.form);\n }\n\n}","import {BaseController} from '../../utilities/base_controller';\nimport {isHTMLFormElement, isHTMLInputElement} from \"../../utilities/elements\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\ninterface FormSavePayload {\n [idx: string]: {\n [idx: string]: string | boolean\n };\n}\n\nexport class FormSaveController extends BaseController {\n\n static values = {\n id: String,\n restoreOnLoad: Boolean,\n clearOnSubmit: Boolean,\n };\n\n declare readonly idValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare readonly clearOnSubmitValue: boolean;\n declare readonly hasClearOnSubmitValue: boolean;\n\n get _formID() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = (this.el as HTMLFormElement).id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this form. Please either specify data-${this.identifier}-id-value or give this form an 'id' attribute. `);\n }\n }\n\n get _formIdentifier() {\n const url = location.href;\n return `${url} ${this._formID}`;\n }\n\n get _formElements() {\n return (this.el as HTMLFormElement).elements;\n }\n\n get _formData(): FormSavePayload {\n let data: FormSavePayload = {[this._formIdentifier]: {}};\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name.length > 0) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n data[this._formIdentifier][el.name] = el.checked;\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.checked) {\n data[this._formIdentifier][el.name] = el.value;\n }\n } else {\n data[this._formIdentifier][el.name] = el.value;\n }\n }\n }\n return data;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _clearOnSubmit() {\n return this.hasClearOnSubmitValue ? this.clearOnSubmitValue : true;\n }\n\n connect() {\n requestAnimationFrame(() => {\n let element = this.el;\n if (!isHTMLFormElement(element)) {\n throw new Error('Expected controller to be mounted on a form element.');\n }\n\n if (this._restoreOnLoad) {\n this.restore();\n }\n if (this._clearOnSubmit) {\n useEventListener(this, this.el, 'submit', this._clear);\n }\n });\n }\n\n _clear() {\n localStorage.removeItem(this._formIdentifier);\n this.dispatchEvent(this.el, `form-save:cleared`);\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n save(event: Event) {\n event.preventDefault();\n let data = this._formData;\n localStorage.setItem(this._formIdentifier, JSON.stringify(data[this._formIdentifier]));\n this.dispatchEvent(this.el, `form-save:save:success`);\n }\n\n restore(event?: Event) {\n event?.preventDefault();\n if (localStorage.getItem(this._formIdentifier)) {\n const savedData = JSON.parse(localStorage.getItem(this._formIdentifier)!); // get and parse the saved data from localStorage\n for (const element of this._formElements) {\n let el = element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (el.name in savedData) {\n if (isHTMLInputElement(el) && el.type == \"checkbox\") {\n el.checked = savedData[el.name];\n } else if (isHTMLInputElement(el) && el.type == \"radio\") {\n if (el.value == savedData[el.name]) {\n el.checked = true;\n }\n } else {\n el.value = savedData[el.name];\n }\n }\n }\n this.dispatchEvent(this.el, `form-save:restore:success`);\n } else {\n this.dispatchEvent(this.el, `form-save:restore:empty`);\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LimitedSelectionCheckboxesController extends BaseController {\n\n static targets = [\"input\", \"error\"];\n static values = {max: Number, message: String};\n\n declare readonly hasErrorTarget: boolean;\n declare readonly errorTarget: HTMLElement;\n declare readonly inputTargets: HTMLInputElement[];\n declare readonly maxValue: number;\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n connect() {\n useCollectionEventListener(this, this.inputTargets, \"change\", this._handleInputs);\n }\n\n _handleInputs(event: Event) {\n let tickedInputs = this.inputTargets.reduce((previousValue, el) => el.checked ? previousValue + 1 : previousValue, 0);\n let target = event.target as HTMLInputElement;\n if (tickedInputs > this.maxValue) {\n event.preventDefault();\n target.checked = false;\n this.dispatchEvent(target, \"change\");\n this.dispatchEvent(target, \"limited-selection:too-many\");\n if (this.hasErrorTarget && this.hasMessageValue) {\n this.errorTarget.innerHTML = this.messageValue;\n }\n } else {\n this.dispatchEvent(target, \"limited-selection:selection\");\n if (this.hasErrorTarget) {\n this.errorTarget.innerHTML = \"\";\n }\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {clamp} from \"lodash-es\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class NavigateFormErrorsController extends BaseController {\n static values = {\n selector: String,\n index: Number,\n };\n\n static classes = [\"current\"];\n static targets = [\"next\", \"current\", \"previous\"];\n\n declare readonly hasNextTarget: boolean;\n declare readonly nextTarget: HTMLElement;\n declare readonly hasPreviousTarget: boolean;\n declare readonly previousTarget: HTMLElement;\n declare readonly hasCurrentTarget: boolean;\n declare readonly currentTarget: HTMLElement;\n declare selectorValue: string;\n declare readonly hasSelectorValue: boolean;\n declare indexValue: number;\n declare readonly hasIndexValue: boolean;\n _errors: HTMLElement[] = [];\n _firstClick = false;\n\n declare addCurrentClasses: (el?: HTMLElement) => void;\n declare removeCurrentClasses: (el?: HTMLElement) => void;\n\n get defaultCurrentClasses(): string[] {\n return [\"currentError\"];\n }\n\n get _errorCount(): number {\n return this._errors.length;\n }\n\n get _previousIndex(): number {\n let index = this._index - 1;\n if (index < 0) {\n return 0;\n }\n return index;\n }\n\n get _nextIndex(): number {\n let index = this._index + 1;\n if (index > this._errors.length - 1) {\n return this._errors.length - 1;\n }\n return index;\n }\n\n get _index(): number {\n return clamp(this.hasIndexValue ? this.indexValue : 0, 0, this._errors.length);\n }\n\n get _selector(): string {\n if (this.hasSelectorValue) {\n return this.selectorValue;\n } else {\n throw new Error(\"Expected `selectorValue` to be present\");\n }\n }\n\n get _currentError(): HTMLElement {\n return this._errors[this._index];\n }\n\n get _otherErrors(): HTMLElement[] {\n return this._errors.filter((error, index) => index !== this._index);\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._firstClick = true;\n this._toggleButtons();\n this._toggleVisibility();\n },\n );\n }\n\n async current(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async next(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._nextIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n async previous(event?: Event) {\n event?.preventDefault();\n if (this._firstClick) {\n this._firstClick = false;\n this._toggleButtons();\n } else {\n this.indexValue = this._previousIndex;\n }\n await scrollToElement(this._currentError, {behavior: \"smooth\", block: \"center\", inline: \"center\"});\n this._updateClasses();\n }\n\n indexValueChanged() {\n this._toggleButtons();\n }\n\n selectorValueChanged() {\n this._errors = Array.from(document.querySelectorAll(this._selector));\n this.indexValue = 0;\n this._toggleButtons();\n this._toggleVisibility();\n }\n\n private _updateClasses() {\n this.addCurrentClasses(this._currentError);\n this._otherErrors.forEach((error) => this.removeCurrentClasses(error));\n }\n\n private _toggleVisibility() {\n if (this._errorCount === 0) {\n this.el.style.display = \"none\";\n } else {\n this.el.style.display = \"\";\n }\n }\n\n private _toggleButtons() {\n if (this.hasNextTarget) {\n // If there is no \"Current Error\" button, then enable the next error button when there is only 1 error.\n if (!this.hasCurrentTarget && this._firstClick && this.indexValue == this._errorCount - 1) {\n this.nextTarget.removeAttribute(\"disabled\");\n return;\n } else if (this.indexValue >= this._errorCount - 1) {\n this.nextTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.nextTarget.removeAttribute(\"disabled\");\n }\n }\n if (this.hasPreviousTarget) {\n if (this.indexValue <= 0) {\n this.previousTarget.setAttribute(\"disabled\", \"true\");\n } else {\n this.previousTarget.removeAttribute(\"disabled\");\n }\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class NestedFormController extends BaseController {\n static targets = ['target', 'template'];\n static values = {\n insertMode: String,\n wrapperClass: String,\n };\n\n declare readonly targetTarget: HTMLElement;\n declare readonly templateTarget: HTMLTemplateElement | HTMLScriptElement;\n\n declare readonly wrapperClassValue: string;\n declare readonly hasWrapperSelectorValue: boolean;\n declare readonly insertModeValue: InsertPosition;\n declare readonly hasInsertModeValue: boolean;\n\n get _wrapperClass() {\n return this.hasWrapperSelectorValue ? this.wrapperClassValue : 'nested-fields';\n }\n\n get _insertMode(): InsertPosition {\n return this.hasInsertModeValue ? this.insertModeValue : 'beforeend';\n }\n\n connect() {\n this._checkStructure();\n }\n\n add(event?: Event) {\n event?.preventDefault();\n\n const content = this.templateTarget.innerHTML.replace(/NEW_RECORD/g, this._generateID());\n this.targetTarget.insertAdjacentHTML(this._insertMode, content);\n }\n\n remove(event: Event) {\n event.preventDefault();\n const wrapper: HTMLElement | null = (event.target as HTMLElement).closest(`.${this._wrapperClass}`);\n if (wrapper == null) {\n throw new Error(`#remove was clicked from outside of a child record. Could not find an ancestor with class .${this._wrapperClass}`);\n }\n\n if (wrapper.dataset.newRecord === 'true') {\n wrapper.remove();\n } else {\n wrapper.style.display = 'none';\n let destroyInput = wrapper.querySelector(\"input[name*='_destroy']\") as HTMLInputElement | null;\n if (destroyInput == null) {\n throw new Error(`Could not find a hidden input with name '_destroy'. NestedForm cannot remove an already persisted record without it.`);\n }\n\n destroyInput.value = \"1\";\n }\n }\n\n private _generateID(): string {\n return new Date().getTime().toString() + Math.random().toString().slice(2);\n }\n\n private _checkStructure() {\n let template = this.templateTarget.innerHTML;\n\n if (template.indexOf('NEW_RECORD')) {\n throw new Error(\"Could not find 'NEW_RECORD' in the provided template. Please make sure you've passed `child_index: 'NEW_RECORD'` to `fields_for`\");\n }\n }\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class PasswordConfirmController extends BaseController {\n\n static targets = [\"password\"];\n static classes = [\"error\"];\n\n declare readonly passwordTargets: HTMLInputElement[];\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n useCollectionEventListener(this, this.passwordTargets, \"change\", this._checkPasswordsMatch);\n }\n\n private _allPasswordsMatch(): boolean {\n let values = new Set(this.passwordTargets.map(el => el.value)); // Create a unique set of the password values\n return values.has(\"\") || values.size == 1; // If any of the passwords are still blank, or there is only one distinct password value (i.e. they all are the same)\n }\n\n private _checkPasswordsMatch() {\n let element = this.el;\n if (this._allPasswordsMatch()) {\n this.dispatchEvent(element, \"password-confirm:match\");\n this.passwordTargets.forEach(el => this.removeErrorClasses(el));\n } else {\n this.dispatchEvent(element, \"password-confirm:no-match\");\n this.passwordTargets.forEach(el => this.addErrorClasses(el));\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PasswordPeekController extends BaseController {\n\n static targets = [\"password\"];\n\n declare readonly passwordTarget: HTMLInputElement;\n\n peak(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"text\";\n }\n\n hide(event?: Event) {\n event?.preventDefault();\n this.passwordTarget.type = \"password\";\n }\n\n toggle(event?: Event) {\n event?.preventDefault();\n if (this.passwordTarget.type === \"password\") {\n this.peak();\n } else {\n this.hide();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class RemoteFormController extends BaseController {\n static targets = [];\n\n static values = {selector: String};\n\n declare readonly hasSelectorValue: boolean;\n declare readonly selectorValue: string;\n\n get _selector(): string {\n return this.hasSelectorValue ? this.selectorValue : `[data-controller~=\"${this.identifier}\"]`;\n }\n\n replace(event: { detail: [Element, any, XMLHttpRequest] }) {\n const [data, status, xhr] = event.detail;\n if (data instanceof Node) {\n let newElement: HTMLElement | null = data.querySelector(this._selector);\n\n if (newElement == null) {\n throw new Error(`expected new form DOM with [data-controller=\"${this.identifier}\"] to be present in returned payload`);\n }\n\n let parentNode = this.el.parentNode;\n if (parentNode == null) {\n throw new Error('expected form to have a DOM parent, could not execute replaceChild');\n }\n parentNode.replaceChild(newElement, this.el);\n this.dispatchEvent(newElement, 'remote-form:replace');\n } else {\n console.log('Unknown', data);\n }\n }\n}\n","import {Controller} from \"stimulus\";\nimport {debounce} from \"lodash-es\";\nimport {EventBus} from \"../utilities/event_bus\";\nimport {wrapArray} from \"../utilities/arrays\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useEventBus(controller: Controller, eventNameOrNames: string | string[], handler: (...args: any[]) => void, opts?: { debounce?: number }) {\n let options = opts;\n\n if (options?.debounce) {\n handler = debounce(handler.bind(controller), options.debounce);\n delete options.debounce;\n } else {\n handler = handler.bind(controller);\n }\n\n let eventNames = wrapArray(eventNameOrNames);\n let setup = () => eventNames.forEach(eventName => EventBus.on(eventName, handler));\n let teardown = () => eventNames.forEach(eventName => EventBus.off(eventName, handler));\n\n useMixin(controller, setup, teardown);\n return {setup, teardown};\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {isHTMLInputElement, isHTMLSelectElement, isHTMLTextAreaElement, isTypeOfFormInputElement} from \"../../utilities/elements\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SyncValuePayload {\n value: string | boolean;\n dispatcher: HTMLElement;\n}\n\nexport class SyncInputsController extends BaseController {\n static values = {\n key: String,\n };\n\n declare readonly keyValue: string;\n declare readonly hasKeyValue: boolean;\n\n get _eventName(): string {\n return `sync:${this._key}`;\n }\n\n get _key(): string {\n if (this.hasKeyValue) {\n return this.keyValue;\n }\n throw new Error(\"Expected `keyValue` to be present\");\n }\n\n get _value(): string | boolean {\n let el = this.el as | HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n return el.checked;\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n return el.checked ? el.value : \"\";\n } else {\n return el.value;\n }\n }\n\n set _value(val: string | boolean) {\n let el = this.el;\n if (isHTMLInputElement(el) && el.type === \"checkbox\") {\n el.checked = val.toString() === \"true\";\n } else if (isHTMLInputElement(el) && el.type === \"radio\") {\n el.checked = el.value === val;\n } else if (isHTMLInputElement(el) || isHTMLTextAreaElement(el) || isHTMLSelectElement(el)) {\n el.value = val.toString();\n } else {\n el.innerHTML = val.toString();\n }\n }\n\n connect() {\n useEventBus(this, this._eventName, this._read);\n\n requestAnimationFrame(() => {\n if (isTypeOfFormInputElement(this.el)) {\n this._emit();\n useEventListener(this, this.el, \"input\", this._emit);\n }\n });\n }\n\n _emit() {\n EventBus.emit(this._eventName, {value: this._value, dispatcher: this.el} as SyncValuePayload);\n }\n\n _read(payload?: SyncValuePayload) {\n if (payload === undefined) {\n throw new Error(\"No payload received\");\n }\n let {dispatcher, value} = payload;\n if (dispatcher !== this.el) {\n this._value = value;\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class ValueWarnController extends BaseController {\n\n static classes = [\"inputWarning\", \"warningHide\"];\n static targets = [\"input\", \"warning\"];\n static values = {\n max: Number,\n min: Number,\n minMessage: String,\n maxMessage: String,\n };\n\n declare readonly inputTarget: HTMLInputElement;\n declare readonly warningTarget: HTMLElement;\n declare readonly maxValue: number;\n declare readonly hasMaxValue: boolean;\n declare readonly minValue: number;\n declare readonly hasMinValue: boolean;\n declare readonly minMessageValue: string;\n declare readonly hasMinMessageValue: boolean;\n declare readonly maxMessageValue: string;\n declare readonly hasMaxMessageValue: boolean;\n declare addInputWarningClasses: (el?: HTMLElement) => void;\n declare removeInputWarningClasses: (el?: HTMLElement) => void;\n declare addWarningHideClasses: (el?: HTMLElement) => void;\n declare removeWarningHideClasses: (el?: HTMLElement) => void;\n\n get _maxMessage(): string {\n return this.hasMaxMessageValue ? this.maxMessageValue : `Value must be less than ${this.maxValue}`;\n }\n\n get _minMessage(): string {\n return this.hasMinMessageValue ? this.minMessageValue : `Value must be greater than ${this.minValue}`;\n }\n\n get defaultWarningHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n this.addWarningHideClasses(this.warningTarget);\n useEventListener(this, this.inputTarget, \"input\", this._check);\n this._check();\n }\n\n private _check() {\n if (this.hasMinValue && Number.parseFloat(this.inputTarget.value) < this.minValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._minMessage;\n } else if (this.hasMaxValue && Number.parseFloat(this.inputTarget.value) > this.maxValue) {\n this.removeWarningHideClasses(this.warningTarget);\n this.addInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = this._maxMessage;\n } else {\n this.addWarningHideClasses(this.warningTarget);\n this.removeInputWarningClasses(this.inputTarget);\n this.warningTarget.innerText = \"\";\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class WordCountController extends BaseController {\n\n static targets = [\"input\", \"output\"];\n static values = {min: Number, max: Number};\n static classes = [\"error\"];\n\n declare readonly inputTarget: HTMLInputElement | HTMLTextAreaElement;\n declare readonly outputTarget: HTMLElement;\n declare minValue: number;\n declare hasMinValue: boolean;\n declare maxValue: number;\n declare hasMaxValue: boolean;\n\n declare addErrorClasses: (el?: HTMLElement) => void;\n declare removeErrorClasses: (el?: HTMLElement) => void;\n\n connect() {\n installClassMethods(this);\n this._updateWordCount();\n useEventListener(this, this.inputTarget, \"input\", this._updateWordCount);\n }\n\n _updateWordCount() {\n let wordCount = 0;\n let textAreaValue = this.inputTarget.value;\n let matches = textAreaValue.match(/\\S+/g);\n wordCount = (matches && matches.length) || 0;\n this.outputTarget.innerText = wordCount.toString();\n if (this._isValidCount(wordCount)) {\n this.removeErrorClasses(this.outputTarget);\n } else {\n this.addErrorClasses(this.outputTarget);\n }\n }\n\n private _isValidCount(count: number) {\n let min = 0;\n let max = 99999;\n\n if (this.hasMinValue) {\n min = this.minValue;\n }\n\n if (this.hasMaxValue) {\n max = this.maxValue;\n }\n\n return count >= min && count <= max;\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class FallbackImageController extends BaseController {\n\n static values = {placeholder: String};\n static classes = [\"success\", \"fail\"];\n\n declare readonly placeholderValue: string;\n declare readonly hasPlaceholderValue: boolean;\n declare addSuccessClasses: (el?: HTMLElement) => void;\n declare removeSuccessClasses: (el?: HTMLElement) => void;\n declare addFailClasses: (el?: HTMLElement) => void;\n declare removeFailClasses: (el?: HTMLElement) => void;\n\n\n initialize() {\n this._hasLoadedSuccessfully = this._hasLoadedSuccessfully.bind(this);\n this._success = this._success.bind(this);\n this._fail = this._fail.bind(this);\n }\n\n connect() {\n let element = this.el as HTMLImageElement;\n\n element.onerror = this._fail;\n if (element.complete && !this._hasLoadedSuccessfully()) {\n this._fail();\n } else {\n this._success();\n }\n }\n\n disconnect() {\n this.removeSuccessClasses();\n this.removeFailClasses();\n }\n\n private _success() {\n this.addSuccessClasses();\n }\n\n private _fail() {\n let element = this.el as HTMLImageElement;\n this.addFailClasses();\n\n if (this.hasPlaceholderValue && element.src !== this.placeholderValue) {\n this.dispatchEvent(element, \"fallback-image:placeholder\");\n element.src = this.placeholderValue;\n element.onerror = this._fail;\n } else {\n this.dispatchEvent(element, \"fallback-image:fail\");\n element.style.display = \"none\";\n }\n }\n\n private _hasLoadedSuccessfully(): boolean {\n let element = this.el as HTMLImageElement;\n return element.naturalHeight > 0 && element.naturalWidth > 0;\n }\n\n}\n","// nb. This is for IE10 and lower _only_.\nvar supportCustomEvent = window.CustomEvent;\nif (!supportCustomEvent || typeof supportCustomEvent === 'object') {\n supportCustomEvent = function CustomEvent(event, x) {\n x = x || {};\n var ev = document.createEvent('CustomEvent');\n ev.initCustomEvent(event, !!x.bubbles, !!x.cancelable, x.detail || null);\n return ev;\n };\n supportCustomEvent.prototype = window.Event.prototype;\n}\n\n/**\n * Dispatches the passed event to both an \"on<type>\" handler as well as via the\n * normal dispatch operation. Does not bubble.\n *\n * @param {!EventTarget} target\n * @param {!Event} event\n * @return {boolean}\n */\nfunction safeDispatchEvent(target, event) {\n var check = 'on' + event.type.toLowerCase();\n if (typeof target[check] === 'function') {\n target[check](event);\n }\n return target.dispatchEvent(event);\n}\n\n/**\n * @param {Element} el to check for stacking context\n * @return {boolean} whether this el or its parents creates a stacking context\n */\nfunction createsStackingContext(el) {\n while (el && el !== document.body) {\n var s = window.getComputedStyle(el);\n var invalid = function(k, ok) {\n return !(s[k] === undefined || s[k] === ok);\n };\n\n if (s.opacity < 1 ||\n invalid('zIndex', 'auto') ||\n invalid('transform', 'none') ||\n invalid('mixBlendMode', 'normal') ||\n invalid('filter', 'none') ||\n invalid('perspective', 'none') ||\n s['isolation'] === 'isolate' ||\n s.position === 'fixed' ||\n s.webkitOverflowScrolling === 'touch') {\n return true;\n }\n el = el.parentElement;\n }\n return false;\n}\n\n/**\n * Finds the nearest <dialog> from the passed element.\n *\n * @param {Element} el to search from\n * @return {HTMLDialogElement} dialog found\n */\nfunction findNearestDialog(el) {\n while (el) {\n if (el.localName === 'dialog') {\n return /** @type {HTMLDialogElement} */ (el);\n }\n if (el.parentElement) {\n el = el.parentElement;\n } else if (el.parentNode) {\n el = el.parentNode.host;\n } else {\n el = null;\n }\n }\n return null;\n}\n\n/**\n * Blur the specified element, as long as it's not the HTML body element.\n * This works around an IE9/10 bug - blurring the body causes Windows to\n * blur the whole application.\n *\n * @param {Element} el to blur\n */\nfunction safeBlur(el) {\n // Find the actual focused element when the active element is inside a shadow root\n while (el && el.shadowRoot && el.shadowRoot.activeElement) {\n el = el.shadowRoot.activeElement;\n }\n\n if (el && el.blur && el !== document.body) {\n el.blur();\n }\n}\n\n/**\n * @param {!NodeList} nodeList to search\n * @param {Node} node to find\n * @return {boolean} whether node is inside nodeList\n */\nfunction inNodeList(nodeList, node) {\n for (var i = 0; i < nodeList.length; ++i) {\n if (nodeList[i] === node) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @param {HTMLFormElement} el to check\n * @return {boolean} whether this form has method=\"dialog\"\n */\nfunction isFormMethodDialog(el) {\n if (!el || !el.hasAttribute('method')) {\n return false;\n }\n return el.getAttribute('method').toLowerCase() === 'dialog';\n}\n\n/**\n * @param {!DocumentFragment|!Element} hostElement\n * @return {?Element}\n */\nfunction findFocusableElementWithin(hostElement) {\n // Note that this is 'any focusable area'. This list is probably not exhaustive, but the\n // alternative involves stepping through and trying to focus everything.\n var opts = ['button', 'input', 'keygen', 'select', 'textarea'];\n var query = opts.map(function(el) {\n return el + ':not([disabled])';\n });\n // TODO(samthor): tabindex values that are not numeric are not focusable.\n query.push('[tabindex]:not([disabled]):not([tabindex=\"\"])'); // tabindex != \"\", not disabled\n var target = hostElement.querySelector(query.join(', '));\n\n if (!target && 'attachShadow' in Element.prototype) {\n // If we haven't found a focusable target, see if the host element contains an element\n // which has a shadowRoot.\n // Recursively search for the first focusable item in shadow roots.\n var elems = hostElement.querySelectorAll('*');\n for (var i = 0; i < elems.length; i++) {\n if (elems[i].tagName && elems[i].shadowRoot) {\n target = findFocusableElementWithin(elems[i].shadowRoot);\n if (target) {\n break;\n }\n }\n }\n }\n return target;\n}\n\n/**\n * Determines if an element is attached to the DOM.\n * @param {Element} element to check\n * @return {boolean} whether the element is in DOM\n */\nfunction isConnected(element) {\n return element.isConnected || document.body.contains(element);\n}\n\n/**\n * @param {!Event} event\n * @return {?Element}\n */\nfunction findFormSubmitter(event) {\n if (event.submitter) {\n return event.submitter;\n }\n\n var form = event.target;\n if (!(form instanceof HTMLFormElement)) {\n return null;\n }\n\n var submitter = dialogPolyfill.formSubmitter;\n if (!submitter) {\n var target = event.target;\n var root = ('getRootNode' in target && target.getRootNode() || document);\n submitter = root.activeElement;\n }\n\n if (!submitter || submitter.form !== form) {\n return null;\n }\n return submitter;\n}\n\n/**\n * @param {!Event} event\n */\nfunction maybeHandleSubmit(event) {\n if (event.defaultPrevented) {\n return;\n }\n var form = /** @type {!HTMLFormElement} */ (event.target);\n\n // We'd have a value if we clicked on an imagemap.\n var value = dialogPolyfill.imagemapUseValue;\n var submitter = findFormSubmitter(event);\n if (value === null && submitter) {\n value = submitter.value;\n }\n\n // There should always be a dialog as this handler is added specifically on them, but check just\n // in case.\n var dialog = findNearestDialog(form);\n if (!dialog) {\n return;\n }\n\n // Prefer formmethod on the button.\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod !== 'dialog') {\n return;\n }\n event.preventDefault();\n\n if (value != null) {\n // nb. we explicitly check against null/undefined\n dialog.close(value);\n } else {\n dialog.close();\n }\n}\n\n/**\n * @param {!HTMLDialogElement} dialog to upgrade\n * @constructor\n */\nfunction dialogPolyfillInfo(dialog) {\n this.dialog_ = dialog;\n this.replacedStyleTop_ = false;\n this.openAsModal_ = false;\n\n // Set a11y role. Browsers that support dialog implicitly know this already.\n if (!dialog.hasAttribute('role')) {\n dialog.setAttribute('role', 'dialog');\n }\n\n dialog.show = this.show.bind(this);\n dialog.showModal = this.showModal.bind(this);\n dialog.close = this.close.bind(this);\n\n dialog.addEventListener('submit', maybeHandleSubmit, false);\n\n if (!('returnValue' in dialog)) {\n dialog.returnValue = '';\n }\n\n if ('MutationObserver' in window) {\n var mo = new MutationObserver(this.maybeHideModal.bind(this));\n mo.observe(dialog, {attributes: true, attributeFilter: ['open']});\n } else {\n // IE10 and below support. Note that DOMNodeRemoved etc fire _before_ removal. They also\n // seem to fire even if the element was removed as part of a parent removal. Use the removed\n // events to force downgrade (useful if removed/immediately added).\n var removed = false;\n var cb = function() {\n removed ? this.downgradeModal() : this.maybeHideModal();\n removed = false;\n }.bind(this);\n var timeout;\n var delayModel = function(ev) {\n if (ev.target !== dialog) { return; } // not for a child element\n var cand = 'DOMNodeRemoved';\n removed |= (ev.type.substr(0, cand.length) === cand);\n window.clearTimeout(timeout);\n timeout = window.setTimeout(cb, 0);\n };\n ['DOMAttrModified', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument'].forEach(function(name) {\n dialog.addEventListener(name, delayModel);\n });\n }\n // Note that the DOM is observed inside DialogManager while any dialog\n // is being displayed as a modal, to catch modal removal from the DOM.\n\n Object.defineProperty(dialog, 'open', {\n set: this.setOpen.bind(this),\n get: dialog.hasAttribute.bind(dialog, 'open')\n });\n\n this.backdrop_ = document.createElement('div');\n this.backdrop_.className = 'backdrop';\n this.backdrop_.addEventListener('mouseup' , this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('mousedown', this.backdropMouseEvent_.bind(this));\n this.backdrop_.addEventListener('click' , this.backdropMouseEvent_.bind(this));\n}\n\ndialogPolyfillInfo.prototype = /** @type {HTMLDialogElement.prototype} */ ({\n\n get dialog() {\n return this.dialog_;\n },\n\n /**\n * Maybe remove this dialog from the modal top layer. This is called when\n * a modal dialog may no longer be tenable, e.g., when the dialog is no\n * longer open or is no longer part of the DOM.\n */\n maybeHideModal: function() {\n if (this.dialog_.hasAttribute('open') && isConnected(this.dialog_)) { return; }\n this.downgradeModal();\n },\n\n /**\n * Remove this dialog from the modal top layer, leaving it as a non-modal.\n */\n downgradeModal: function() {\n if (!this.openAsModal_) { return; }\n this.openAsModal_ = false;\n this.dialog_.style.zIndex = '';\n\n // This won't match the native <dialog> exactly because if the user set top on a centered\n // polyfill dialog, that top gets thrown away when the dialog is closed. Not sure it's\n // possible to polyfill this perfectly.\n if (this.replacedStyleTop_) {\n this.dialog_.style.top = '';\n this.replacedStyleTop_ = false;\n }\n\n // Clear the backdrop and remove from the manager.\n this.backdrop_.parentNode && this.backdrop_.parentNode.removeChild(this.backdrop_);\n dialogPolyfill.dm.removeDialog(this);\n },\n\n /**\n * @param {boolean} value whether to open or close this dialog\n */\n setOpen: function(value) {\n if (value) {\n this.dialog_.hasAttribute('open') || this.dialog_.setAttribute('open', '');\n } else {\n this.dialog_.removeAttribute('open');\n this.maybeHideModal(); // nb. redundant with MutationObserver\n }\n },\n\n /**\n * Handles mouse events ('mouseup', 'mousedown', 'click') on the fake .backdrop element, redirecting them as if\n * they were on the dialog itself.\n *\n * @param {!Event} e to redirect\n */\n backdropMouseEvent_: function(e) {\n if (!this.dialog_.hasAttribute('tabindex')) {\n // Clicking on the backdrop should move the implicit cursor, even if dialog cannot be\n // focused. Create a fake thing to focus on. If the backdrop was _before_ the dialog, this\n // would not be needed - clicks would move the implicit cursor there.\n var fake = document.createElement('div');\n this.dialog_.insertBefore(fake, this.dialog_.firstChild);\n fake.tabIndex = -1;\n fake.focus();\n this.dialog_.removeChild(fake);\n } else {\n this.dialog_.focus();\n }\n\n var redirectedEvent = document.createEvent('MouseEvents');\n redirectedEvent.initMouseEvent(e.type, e.bubbles, e.cancelable, window,\n e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey,\n e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget);\n this.dialog_.dispatchEvent(redirectedEvent);\n e.stopPropagation();\n },\n\n /**\n * Focuses on the first focusable element within the dialog. This will always blur the current\n * focus, even if nothing within the dialog is found.\n */\n focus_: function() {\n // Find element with `autofocus` attribute, or fall back to the first form/tabindex control.\n var target = this.dialog_.querySelector('[autofocus]:not([disabled])');\n if (!target && this.dialog_.tabIndex >= 0) {\n target = this.dialog_;\n }\n if (!target) {\n target = findFocusableElementWithin(this.dialog_);\n }\n safeBlur(document.activeElement);\n target && target.focus();\n },\n\n /**\n * Sets the zIndex for the backdrop and dialog.\n *\n * @param {number} dialogZ\n * @param {number} backdropZ\n */\n updateZIndex: function(dialogZ, backdropZ) {\n if (dialogZ < backdropZ) {\n throw new Error('dialogZ should never be < backdropZ');\n }\n this.dialog_.style.zIndex = dialogZ;\n this.backdrop_.style.zIndex = backdropZ;\n },\n\n /**\n * Shows the dialog. If the dialog is already open, this does nothing.\n */\n show: function() {\n if (!this.dialog_.open) {\n this.setOpen(true);\n this.focus_();\n }\n },\n\n /**\n * Show this dialog modally.\n */\n showModal: function() {\n if (this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is already open, and therefore cannot be opened modally.');\n }\n if (!isConnected(this.dialog_)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: The element is not in a Document.');\n }\n if (!dialogPolyfill.dm.pushDialog(this)) {\n throw new Error('Failed to execute \\'showModal\\' on dialog: There are too many open modal dialogs.');\n }\n\n if (createsStackingContext(this.dialog_.parentElement)) {\n console.warn('A dialog is being shown inside a stacking context. ' +\n 'This may cause it to be unusable. For more information, see this link: ' +\n 'https://github.com/GoogleChrome/dialog-polyfill/#stacking-context');\n }\n\n this.setOpen(true);\n this.openAsModal_ = true;\n\n // Optionally center vertically, relative to the current viewport.\n if (dialogPolyfill.needsCentering(this.dialog_)) {\n dialogPolyfill.reposition(this.dialog_);\n this.replacedStyleTop_ = true;\n } else {\n this.replacedStyleTop_ = false;\n }\n\n // Insert backdrop.\n this.dialog_.parentNode.insertBefore(this.backdrop_, this.dialog_.nextSibling);\n\n // Focus on whatever inside the dialog.\n this.focus_();\n },\n\n /**\n * Closes this HTMLDialogElement. This is optional vs clearing the open\n * attribute, however this fires a 'close' event.\n *\n * @param {string=} opt_returnValue to use as the returnValue\n */\n close: function(opt_returnValue) {\n if (!this.dialog_.hasAttribute('open')) {\n throw new Error('Failed to execute \\'close\\' on dialog: The element does not have an \\'open\\' attribute, and therefore cannot be closed.');\n }\n this.setOpen(false);\n\n // Leave returnValue untouched in case it was set directly on the element\n if (opt_returnValue !== undefined) {\n this.dialog_.returnValue = opt_returnValue;\n }\n\n // Triggering \"close\" event for any attached listeners on the <dialog>.\n var closeEvent = new supportCustomEvent('close', {\n bubbles: false,\n cancelable: false\n });\n safeDispatchEvent(this.dialog_, closeEvent);\n }\n\n});\n\nvar dialogPolyfill = {};\n\ndialogPolyfill.reposition = function(element) {\n var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;\n var topValue = scrollTop + (window.innerHeight - element.offsetHeight) / 2;\n element.style.top = Math.max(scrollTop, topValue) + 'px';\n};\n\ndialogPolyfill.isInlinePositionSetByStylesheet = function(element) {\n for (var i = 0; i < document.styleSheets.length; ++i) {\n var styleSheet = document.styleSheets[i];\n var cssRules = null;\n // Some browsers throw on cssRules.\n try {\n cssRules = styleSheet.cssRules;\n } catch (e) {}\n if (!cssRules) { continue; }\n for (var j = 0; j < cssRules.length; ++j) {\n var rule = cssRules[j];\n var selectedNodes = null;\n // Ignore errors on invalid selector texts.\n try {\n selectedNodes = document.querySelectorAll(rule.selectorText);\n } catch(e) {}\n if (!selectedNodes || !inNodeList(selectedNodes, element)) {\n continue;\n }\n var cssTop = rule.style.getPropertyValue('top');\n var cssBottom = rule.style.getPropertyValue('bottom');\n if ((cssTop && cssTop !== 'auto') || (cssBottom && cssBottom !== 'auto')) {\n return true;\n }\n }\n }\n return false;\n};\n\ndialogPolyfill.needsCentering = function(dialog) {\n var computedStyle = window.getComputedStyle(dialog);\n if (computedStyle.position !== 'absolute') {\n return false;\n }\n\n // We must determine whether the top/bottom specified value is non-auto. In\n // WebKit/Blink, checking computedStyle.top == 'auto' is sufficient, but\n // Firefox returns the used value. So we do this crazy thing instead: check\n // the inline style and then go through CSS rules.\n if ((dialog.style.top !== 'auto' && dialog.style.top !== '') ||\n (dialog.style.bottom !== 'auto' && dialog.style.bottom !== '')) {\n return false;\n }\n return !dialogPolyfill.isInlinePositionSetByStylesheet(dialog);\n};\n\n/**\n * @param {!Element} element to force upgrade\n */\ndialogPolyfill.forceRegisterDialog = function(element) {\n if (window.HTMLDialogElement || element.showModal) {\n console.warn('This browser already supports <dialog>, the polyfill ' +\n 'may not work correctly', element);\n }\n if (element.localName !== 'dialog') {\n throw new Error('Failed to register dialog: The element is not a dialog.');\n }\n new dialogPolyfillInfo(/** @type {!HTMLDialogElement} */ (element));\n};\n\n/**\n * @param {!Element} element to upgrade, if necessary\n */\ndialogPolyfill.registerDialog = function(element) {\n if (!element.showModal) {\n dialogPolyfill.forceRegisterDialog(element);\n }\n};\n\n/**\n * @constructor\n */\ndialogPolyfill.DialogManager = function() {\n /** @type {!Array<!dialogPolyfillInfo>} */\n this.pendingDialogStack = [];\n\n var checkDOM = this.checkDOM_.bind(this);\n\n // The overlay is used to simulate how a modal dialog blocks the document.\n // The blocking dialog is positioned on top of the overlay, and the rest of\n // the dialogs on the pending dialog stack are positioned below it. In the\n // actual implementation, the modal dialog stacking is controlled by the\n // top layer, where z-index has no effect.\n this.overlay = document.createElement('div');\n this.overlay.className = '_dialog_overlay';\n this.overlay.addEventListener('click', function(e) {\n this.forwardTab_ = undefined;\n e.stopPropagation();\n checkDOM([]); // sanity-check DOM\n }.bind(this));\n\n this.handleKey_ = this.handleKey_.bind(this);\n this.handleFocus_ = this.handleFocus_.bind(this);\n\n this.zIndexLow_ = 100000;\n this.zIndexHigh_ = 100000 + 150;\n\n this.forwardTab_ = undefined;\n\n if ('MutationObserver' in window) {\n this.mo_ = new MutationObserver(function(records) {\n var removed = [];\n records.forEach(function(rec) {\n for (var i = 0, c; c = rec.removedNodes[i]; ++i) {\n if (!(c instanceof Element)) {\n continue;\n } else if (c.localName === 'dialog') {\n removed.push(c);\n }\n removed = removed.concat(c.querySelectorAll('dialog'));\n }\n });\n removed.length && checkDOM(removed);\n });\n }\n};\n\n/**\n * Called on the first modal dialog being shown. Adds the overlay and related\n * handlers.\n */\ndialogPolyfill.DialogManager.prototype.blockDocument = function() {\n document.documentElement.addEventListener('focus', this.handleFocus_, true);\n document.addEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.observe(document, {childList: true, subtree: true});\n};\n\n/**\n * Called on the first modal dialog being removed, i.e., when no more modal\n * dialogs are visible.\n */\ndialogPolyfill.DialogManager.prototype.unblockDocument = function() {\n document.documentElement.removeEventListener('focus', this.handleFocus_, true);\n document.removeEventListener('keydown', this.handleKey_);\n this.mo_ && this.mo_.disconnect();\n};\n\n/**\n * Updates the stacking of all known dialogs.\n */\ndialogPolyfill.DialogManager.prototype.updateStacking = function() {\n var zIndex = this.zIndexHigh_;\n\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n dpi.updateZIndex(--zIndex, --zIndex);\n if (i === 0) {\n this.overlay.style.zIndex = --zIndex;\n }\n }\n\n // Make the overlay a sibling of the dialog itself.\n var last = this.pendingDialogStack[0];\n if (last) {\n var p = last.dialog.parentNode || document.body;\n p.appendChild(this.overlay);\n } else if (this.overlay.parentNode) {\n this.overlay.parentNode.removeChild(this.overlay);\n }\n};\n\n/**\n * @param {Element} candidate to check if contained or is the top-most modal dialog\n * @return {boolean} whether candidate is contained in top dialog\n */\ndialogPolyfill.DialogManager.prototype.containedByTopDialog_ = function(candidate) {\n while (candidate = findNearestDialog(candidate)) {\n for (var i = 0, dpi; dpi = this.pendingDialogStack[i]; ++i) {\n if (dpi.dialog === candidate) {\n return i === 0; // only valid if top-most\n }\n }\n candidate = candidate.parentElement;\n }\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleFocus_ = function(event) {\n var target = event.composedPath ? event.composedPath()[0] : event.target;\n\n if (this.containedByTopDialog_(target)) { return; }\n\n if (document.activeElement === document.documentElement) { return; }\n\n event.preventDefault();\n event.stopPropagation();\n safeBlur(/** @type {Element} */ (target));\n\n if (this.forwardTab_ === undefined) { return; } // move focus only from a tab key\n\n var dpi = this.pendingDialogStack[0];\n var dialog = dpi.dialog;\n var position = dialog.compareDocumentPosition(target);\n if (position & Node.DOCUMENT_POSITION_PRECEDING) {\n if (this.forwardTab_) {\n // forward\n dpi.focus_();\n } else if (target !== document.documentElement) {\n // backwards if we're not already focused on <html>\n document.documentElement.focus();\n }\n }\n\n return false;\n};\n\ndialogPolyfill.DialogManager.prototype.handleKey_ = function(event) {\n this.forwardTab_ = undefined;\n if (event.keyCode === 27) {\n event.preventDefault();\n event.stopPropagation();\n var cancelEvent = new supportCustomEvent('cancel', {\n bubbles: false,\n cancelable: true\n });\n var dpi = this.pendingDialogStack[0];\n if (dpi && safeDispatchEvent(dpi.dialog, cancelEvent)) {\n dpi.dialog.close();\n }\n } else if (event.keyCode === 9) {\n this.forwardTab_ = !event.shiftKey;\n }\n};\n\n/**\n * Finds and downgrades any known modal dialogs that are no longer displayed. Dialogs that are\n * removed and immediately readded don't stay modal, they become normal.\n *\n * @param {!Array<!HTMLDialogElement>} removed that have definitely been removed\n */\ndialogPolyfill.DialogManager.prototype.checkDOM_ = function(removed) {\n // This operates on a clone because it may cause it to change. Each change also calls\n // updateStacking, which only actually needs to happen once. But who removes many modal dialogs\n // at a time?!\n var clone = this.pendingDialogStack.slice();\n clone.forEach(function(dpi) {\n if (removed.indexOf(dpi.dialog) !== -1) {\n dpi.downgradeModal();\n } else {\n dpi.maybeHideModal();\n }\n });\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n * @return {boolean} whether the dialog was allowed\n */\ndialogPolyfill.DialogManager.prototype.pushDialog = function(dpi) {\n var allowed = (this.zIndexHigh_ - this.zIndexLow_) / 2 - 1;\n if (this.pendingDialogStack.length >= allowed) {\n return false;\n }\n if (this.pendingDialogStack.unshift(dpi) === 1) {\n this.blockDocument();\n }\n this.updateStacking();\n return true;\n};\n\n/**\n * @param {!dialogPolyfillInfo} dpi\n */\ndialogPolyfill.DialogManager.prototype.removeDialog = function(dpi) {\n var index = this.pendingDialogStack.indexOf(dpi);\n if (index === -1) { return; }\n\n this.pendingDialogStack.splice(index, 1);\n if (this.pendingDialogStack.length === 0) {\n this.unblockDocument();\n }\n this.updateStacking();\n};\n\ndialogPolyfill.dm = new dialogPolyfill.DialogManager();\ndialogPolyfill.formSubmitter = null;\ndialogPolyfill.imagemapUseValue = null;\n\n/**\n * Installs global handlers, such as click listers and native method overrides. These are needed\n * even if a no dialog is registered, as they deal with <form method=\"dialog\">.\n */\nif (window.HTMLDialogElement === undefined) {\n\n /**\n * If HTMLFormElement translates method=\"DIALOG\" into 'get', then replace the descriptor with\n * one that returns the correct value.\n */\n var testForm = document.createElement('form');\n testForm.setAttribute('method', 'dialog');\n if (testForm.method !== 'dialog') {\n var methodDescriptor = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, 'method');\n if (methodDescriptor) {\n // nb. Some older iOS and older PhantomJS fail to return the descriptor. Don't do anything\n // and don't bother to update the element.\n var realGet = methodDescriptor.get;\n methodDescriptor.get = function() {\n if (isFormMethodDialog(this)) {\n return 'dialog';\n }\n return realGet.call(this);\n };\n var realSet = methodDescriptor.set;\n /** @this {HTMLElement} */\n methodDescriptor.set = function(v) {\n if (typeof v === 'string' && v.toLowerCase() === 'dialog') {\n return this.setAttribute('method', v);\n }\n return realSet.call(this, v);\n };\n Object.defineProperty(HTMLFormElement.prototype, 'method', methodDescriptor);\n }\n }\n\n /**\n * Global 'click' handler, to capture the <input type=\"submit\"> or <button> element which has\n * submitted a <form method=\"dialog\">. Needed as Safari and others don't report this inside\n * document.activeElement.\n */\n document.addEventListener('click', function(ev) {\n dialogPolyfill.formSubmitter = null;\n dialogPolyfill.imagemapUseValue = null;\n if (ev.defaultPrevented) { return; } // e.g. a submit which prevents default submission\n\n var target = /** @type {Element} */ (ev.target);\n if ('composedPath' in ev) {\n var path = ev.composedPath();\n target = path.shift() || target;\n }\n if (!target || !isFormMethodDialog(target.form)) { return; }\n\n var valid = (target.type === 'submit' && ['button', 'input'].indexOf(target.localName) > -1);\n if (!valid) {\n if (!(target.localName === 'input' && target.type === 'image')) { return; }\n // this is a <input type=\"image\">, which can submit forms\n dialogPolyfill.imagemapUseValue = ev.offsetX + ',' + ev.offsetY;\n }\n\n var dialog = findNearestDialog(target);\n if (!dialog) { return; }\n\n dialogPolyfill.formSubmitter = target;\n\n }, false);\n\n /**\n * Global 'submit' handler. This handles submits of `method=\"dialog\"` which are invalid, i.e.,\n * outside a dialog. They get prevented.\n */\n document.addEventListener('submit', function(ev) {\n var form = ev.target;\n var dialog = findNearestDialog(form);\n if (dialog) {\n return; // ignore, handle there\n }\n\n var submitter = findFormSubmitter(ev);\n var formmethod = submitter && submitter.getAttribute('formmethod') || form.getAttribute('method');\n if (formmethod === 'dialog') {\n ev.preventDefault();\n }\n });\n\n /**\n * Replace the native HTMLFormElement.submit() method, as it won't fire the\n * submit event and give us a chance to respond.\n */\n var nativeFormSubmit = HTMLFormElement.prototype.submit;\n var replacementFormSubmit = function () {\n if (!isFormMethodDialog(this)) {\n return nativeFormSubmit.call(this);\n }\n var dialog = findNearestDialog(this);\n dialog && dialog.close();\n };\n HTMLFormElement.prototype.submit = replacementFormSubmit;\n}\n\nexport default dialogPolyfill;\n","import dialogPolyfill from \"dialog-polyfill\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class LightboxImageController extends BaseController {\n\n static values = {\n src: String,\n srcSet: String,\n sizes: String,\n };\n static classes = [\"modal\", \"image\"];\n\n declare readonly hasModalClass: boolean;\n declare readonly modalClass: string;\n declare readonly hasImageClass: boolean;\n declare readonly imageClass: string;\n declare readonly hasSrcValue: boolean;\n declare readonly srcValue: string;\n declare readonly hasSrcSetValue: boolean;\n declare readonly srcSetValue: string;\n declare readonly hasSizesValue: boolean;\n declare readonly sizesValue: string;\n _dialog: HTMLDialogElement | null = null;\n\n get _src(): string {\n return this.hasSrcValue ? this.srcValue : (this.el as HTMLImageElement).src;\n }\n\n get _srcSet(): string {\n return this.hasSrcSetValue ? this.srcSetValue : (this.el as HTMLImageElement).srcset;\n }\n\n get _sizes(): string {\n return this.hasSizesValue ? this.sizesValue : (this.el as HTMLImageElement).sizes;\n }\n\n get _modalClassName() {\n return this.hasModalClass ? this.modalClass : \"image-lightbox-dialog\";\n }\n\n get _imageClassName() {\n return this.hasImageClass ? this.imageClass : \"image-lightbox-image\";\n }\n\n initialize() {\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n }\n\n connect() {\n }\n\n disconnect() {\n this.close();\n }\n\n open() {\n let element = this.el as HTMLImageElement;\n if (this._dialog) {\n return;\n }\n this._dialog = document.createElement(\"dialog\");\n\n let image = document.createElement(\"img\") as HTMLImageElement;\n image.className = this._imageClassName;\n image.src = this._src;\n image.srcset = this._srcSet;\n image.sizes = this._sizes;\n this._dialog.appendChild(image);\n\n element.insertAdjacentElement(\"afterend\", this._dialog);\n dialogPolyfill.registerDialog(this._dialog);\n this._dialog.className = this._modalClassName;\n // @ts-ignore Experimental API\n this._dialog.showModal();\n scrollToElement(this._dialog, {behavior: \"smooth\", block: \"end\"}).catch(() => this._dialog!.scrollIntoView(false));\n useEventListener(this, this._dialog, \"click\", this.close);\n useEventListener(this, this._dialog, \"cancel\", this.close);\n useEventListener(this, this._dialog, \"close\", this.close);\n }\n\n close() {\n if (this._dialog) {\n // @ts-ignore Experimental API\n this._dialog.close();\n this._dialog.remove();\n this._dialog = null;\n scrollToElement(this.el, {behavior: \"smooth\", block: \"end\"}).catch(() => this.el.scrollIntoView(false));\n }\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class MediaPlayerController extends BaseController {\n\n static targets = [\"media\"];\n\n declare readonly mediaTarget: HTMLMediaElement;\n\n async play(event?: Event) {\n event?.preventDefault();\n await this.mediaTarget.play();\n }\n\n pause(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.pause();\n }\n\n restart(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime = 0;\n }\n\n seek(event?: Event) {\n event?.preventDefault();\n this.mediaTarget.currentTime += 5;\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollAbsoluteBottom, scrollAbsoluteLeft, scrollAbsoluteTop, scrollDown, scrollLeft, scrollRight, scrollUp} from \"../../utilities/scroll\";\n\nexport class ScrollContainerController extends BaseController {\n\n static values = {\n behaviour: String,\n increment: Number,\n };\n\n declare readonly behaviourValue: ScrollBehavior;\n declare readonly hasBehaviourValue: boolean;\n\n declare readonly incrementValue: number;\n declare readonly hasIncrementValue: boolean;\n\n get _increment(): number {\n return this.hasIncrementValue ? this.incrementValue : 50;\n }\n\n get _behaviour(): ScrollBehavior {\n if (this.hasBehaviourValue) {\n if ([\"auto\", \"smooth\"].includes(this.behaviourValue)) {\n return this.behaviourValue;\n } else {\n throw new Error(`'${this.behaviourValue}' is not a recognised scroll behaviour`);\n }\n } else {\n return \"auto\";\n }\n }\n\n async scrollTop(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteTop(this.el, {behavior: this._behaviour});\n }\n\n async scrollBottom(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteBottom(this.el, {behavior: this._behaviour});\n }\n\n async scrollLeft(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async scrollRight(event?: Event) {\n event?.preventDefault();\n await scrollAbsoluteLeft(this.el, {behavior: this._behaviour});\n }\n\n async up(event?: Event) {\n event?.preventDefault();\n await scrollUp(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async down(event?: Event) {\n event?.preventDefault();\n await scrollDown(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async left(event?: Event) {\n event?.preventDefault();\n await scrollLeft(this.el, this._increment, {behavior: this._behaviour});\n }\n\n async right(event?: Event) {\n event?.preventDefault();\n await scrollRight(this.el, this._increment, {behavior: this._behaviour});\n }\n}\n\n","import {EphemeralController} from \"../../utilities/ephemeral_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollIntoFocusController extends EphemeralController {\n\n static values = {\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n connect() {\n requestAnimationFrame(() => {\n // Attempt smooth scrolling, with polyfill\n scrollToElement(\n this.el,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => this.el.scrollIntoView()); // Fallback to snap-scrolling\n this._cleanupSelf();\n });\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteBottom} from \"../../utilities/scroll\";\n\nexport class ScrollToBottomController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteBottom(this._scrollTarget);\n }\n }\n\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {scrollToElement} from \"../../utilities/scroll\";\n\nexport class ScrollToController extends BaseController {\n\n static values = {\n selector: String,\n behavior: String,\n block: String,\n inline: String,\n };\n\n declare selectorValue: string;\n declare behaviorValue: ScrollBehavior;\n declare hasBehaviorValue: boolean;\n declare blockValue: ScrollLogicalPosition;\n declare hasBlockValue: boolean;\n declare inlineValue: ScrollLogicalPosition;\n declare hasInlineValue: boolean;\n\n scroll() {\n let target = document.querySelector(this.selectorValue);\n if (!target) {\n console.warn(`Could not find target for '${this.selectorValue}'`);\n return;\n }\n\n scrollToElement(\n target!,\n {\n behavior: this.hasBehaviorValue ? this.behaviorValue : \"smooth\",\n block: this.hasBlockValue ? this.blockValue : \"center\",\n inline: this.hasInlineValue ? this.inlineValue : \"center\",\n },\n ).catch(() => target!.scrollIntoView()); // Fallback to snap-scrolling\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {getScrollParent, scrollAbsoluteTop} from \"../../utilities/scroll\";\n\nexport class ScrollToTopController extends BaseController {\n\n static values = {\n mode: String,\n };\n\n declare modeValue: \"nearest\" | \"document\";\n declare hasModeValue: boolean;\n\n get _mode(): \"nearest\" | \"document\" {\n return this.hasModeValue ? this.modeValue : \"document\";\n }\n\n get _scrollTarget(): HTMLElement | Window | null {\n let target: null | HTMLElement | Window;\n if (this._mode == \"document\") {\n target = window;\n } else {\n target = getScrollParent(this.el);\n }\n return target;\n }\n\n async scroll(event?: Event) {\n event?.preventDefault();\n if (this._scrollTarget) {\n await scrollAbsoluteTop(this._scrollTarget);\n }\n }\n\n}\n\n","export function extractPredicates(expressionString: string): Array<(val: string | number) => boolean> {\n expressionString = expressionString.trim();\n\n let andExpression = expressionString.includes(\"&&\");\n let orExpression = expressionString.includes(\"||\");\n let groupings = expressionString.includes(\"(\") || expressionString.includes(\")\");\n\n if (andExpression && orExpression) {\n throw new Error(\"Cannot have both && and || in the same expression.\");\n }\n\n if (groupings) {\n throw new Error(\"Cannot have logical groupings `(>3 && <= 9) || (>1 && <2)` in the expression. Only supports simple expressions like `>1 && <3`\");\n }\n\n let expressions = expressionString.split(andExpression ? \"&&\" : \"||\");\n if (andExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else if (orExpression) {\n return expressions.map(ex => _predicateForExpression(ex));\n } else {\n return [_predicateForExpression(expressionString)];\n }\n}\n\n\nfunction _predicateForExpression(expression: string): (val: string | number) => boolean {\n let operators = [\">=\", \"<=\", \"==\", \"!=\", \">\", \"<\"];\n let operator = operators.find(part => expression.includes(part));\n if (!operator) {\n throw new Error(`Could not find operator in expression: ${expression}`);\n }\n let expressionValue: string | number = expression.split(operator)[1].trim();\n let isNumber = /^-?[0-9]\\d*(\\.\\d+)?$/.test(expressionValue);\n expressionValue = isNumber ? parseFloat(expressionValue) : expressionValue;\n\n if (expressionValue == \"\") {\n throw new Error(`Could not find a value in expression: ${expression}`);\n }\n\n let notEmpty = (signalValue: string | number) => signalValue !== \"\";\n\n switch (operator) {\n case \">\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue > expressionValue;\n case \"<\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue < expressionValue;\n case \">=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue >= expressionValue;\n case \"<=\":\n return (signalValue: string | number) => isNumber && notEmpty(signalValue) && signalValue <= expressionValue;\n case \"==\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue == expressionValue;\n case \"!=\":\n return (signalValue: string | number) => notEmpty(signalValue) && signalValue != expressionValue;\n default:\n throw new Error(`Unknown operator ${operator}`);\n }\n}\n","export function signalEventName(name: string, type: string): string {\n return `signal:${type}:${name}`;\n}\n\nexport function signalConnectEvent(name: string): string {\n return signalEventName(name, 'connect');\n}\n\nexport function signalValueEvent(name: string): string {\n return signalEventName(name, 'value');\n}\n\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {EventBus} from \"../../utilities\";\nimport {signalConnectEvent, signalEventName, signalValueEvent} from \"./events\";\n\nexport class SignalActionController extends BaseController {\n\n static values = {\n name: String,\n when: String,\n };\n\n declare whenValue: string;\n declare readonly hasWhenValue: boolean;\n\n declare nameValue: string;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.whenValue);\n }\n\n connect() {\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (!this.hasWhenValue) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'));\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'match'), {detail: {element: this.el, value}});\n } else {\n this.dispatchEvent(this.el, signalEventName(this.nameValue, 'no-match'), {detail: {element: this.el, value}});\n }\n }\n\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {EventBus} from \"../../utilities/event_bus\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {getAllRadiosInGroup, isHTMLInputElement} from \"../../utilities\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\n\nexport interface SignalPayload {\n element: HTMLElement;\n value: string;\n}\n\nexport class SignalInputController extends BaseController {\n\n static values = {\n name: String,\n debounceInterval: Number,\n };\n\n declare debounceIntervalValue: number;\n declare readonly hasDebounceIntervalValue: boolean;\n declare nameValue: string;\n declare hasNameValue: boolean;\n\n get _debounceTimeout(): number | null {\n return this.hasDebounceIntervalValue ? this.debounceIntervalValue : null;\n }\n\n get _name(): string {\n return this.hasNameValue ? this.nameValue : (this.element as HTMLInputElement).name;\n }\n\n connect() {\n useEventBus(this, signalConnectEvent(this._name), () => this.emitValue());\n useEventListener(this, this.el, \"input\", this.emitValue, {debounce: this._debounceTimeout || undefined});\n useEventListener(this, this.el, \"change\", this.emitValue);\n requestAnimationFrame(() => this.emitValue());\n }\n\n emitValue() {\n let value = (this.el as HTMLInputElement).value;\n\n if (isHTMLInputElement(this.el) && this.el.type === \"checkbox\") {\n value = this.el.checked ? \"true\" : \"false\";\n } else if (isHTMLInputElement(this.el) && this.el.type === \"radio\") {\n let selectedValue = getAllRadiosInGroup(this.el).find(el => el.checked)?.value;\n value = selectedValue ? selectedValue : \"\";\n }\n\n EventBus.emit(signalValueEvent(this._name), {element: this.el, value} as SignalPayload);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventBus} from \"../../mixins/use_event_bus\";\nimport {SignalPayload} from \"./signal_input_controller\";\nimport {extractPredicates} from \"./expressions\";\nimport {signalConnectEvent, signalValueEvent} from \"./events\";\nimport {EventBus} from \"../../utilities\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class SignalVisibilityController extends BaseController {\n\n static values = {\n name: String,\n show: String,\n };\n\n static classes = ['hide'];\n\n declare nameValue: string;\n declare showValue: string;\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n\n get _predicates(): Array<(val: string | number) => boolean> {\n return extractPredicates(this.showValue);\n }\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n connect() {\n installClassMethods(this);\n EventBus.emit(signalConnectEvent(this.nameValue));\n useEventBus(this, signalValueEvent(this.nameValue), this._onSignal);\n }\n\n _onSignal(payload: SignalPayload) {\n let value = payload.value;\n if (this.showValue == \"default\") {\n if (value == \"\") {\n this.removeHideClasses(this.el);\n } else {\n this.addHideClasses(this.el);\n }\n return;\n }\n if (this._predicates.every(predicate => predicate(value))) {\n this.removeHideClasses(this.el);\n } else {\n this.addHideClasses(this.el);\n }\n }\n\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TableSortController extends BaseController {\n\n static values = {startSort: Number};\n\n declare readonly startSortValue: number;\n declare readonly hasStartSortValue: boolean;\n _lastIndex: number | null = null;\n _reverse: boolean = false;\n\n get _tableHead(): HTMLTableSectionElement {\n let head = (this.el as HTMLTableElement).tHead;\n if (head == null) {\n throw new Error('Expected table to have a <thead> element.');\n }\n return head;\n }\n\n get _tableHeaders(): HTMLTableHeaderCellElement[] {\n let rows = this._tableHead.rows;\n if (rows.length == 0) {\n throw new Error('Expected table to have a <thead> element with at least one row.');\n }\n return Array.from(rows[0].cells);\n }\n\n get _tableBody() {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n connect() {\n requestAnimationFrame(() => {\n useCollectionEventListener(this, this._tableHeaders, \"click\", this.sort);\n if (this.hasStartSortValue) {\n this._sortByColumn(this.startSortValue);\n }\n });\n }\n\n sort(event: Event) {\n event.preventDefault();\n let headerCell = event.target! as HTMLTableHeaderCellElement;\n let headerCellIndex = this._indexOfHeaderCell(headerCell);\n if (headerCell.dataset.sortable == \"false\") {\n return;\n }\n if (headerCell.dataset.sort == \"asc\") {\n this._reverse = true;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"desc\";\n this._sortByColumn(headerCellIndex);\n } else {\n this._reverse = false;\n this._otherHeaderCells(headerCell).forEach(cell => delete cell.dataset.sort);\n headerCell.dataset.sort = \"asc\";\n this._sortByColumn(headerCellIndex);\n }\n }\n\n private _indexOfHeaderCell(cell: HTMLTableHeaderCellElement): number {\n return this._tableHeaders.indexOf(cell);\n }\n\n private _otherHeaderCells(cell: HTMLTableHeaderCellElement): HTMLTableHeaderCellElement[] {\n return Array.from(this._tableHeaders).filter(otherCell => otherCell != cell);\n }\n\n private _sortByColumn(index: number) {\n let frag = document.createDocumentFragment();\n let rows = this._tableRows;\n\n let newRows = rows.sort((row, otherRow) => {\n let cells = Array.from(row.cells);\n let otherCells = Array.from(otherRow.cells);\n\n // TODO: Handle colspans?\n let x = cells[index]?.innerText || \"\";\n let y = otherCells[index]?.innerText || \"\";\n\n let sortVal = x.localeCompare(y, \"en\", {sensitivity: \"base\", numeric: true, caseFirst: \"upper\"});\n\n if (row.dataset.sortTop || otherRow.dataset.sortBottom) {\n if (row.dataset.sortTop && otherRow.dataset.sortTop) {\n return sortVal;\n }\n return -1;\n }\n if (row.dataset.sortBottom || otherRow.dataset.sortTop) {\n if (row.dataset.sortBottom && otherRow.dataset.sortBottom) {\n return sortVal;\n }\n return 1;\n }\n\n if (this._reverse) {\n return sortVal > 0 ? -1 : 1;\n }\n return sortVal;\n });\n\n newRows.forEach(row => frag.appendChild(row));\n\n this._tableBody.innerHTML = \"\";\n this._tableBody.appendChild(frag);\n this._lastIndex = index;\n }\n\n}","import {Controller} from \"stimulus\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useMutationObserver(controller: Controller, element: HTMLElement, handler: (entries: MutationRecord[]) => void, options: MutationObserverInit) {\n handler = handler.bind(controller);\n let observer: MutationObserver = new MutationObserver(handler);\n\n let setup = () => observer.observe(element, options);\n let teardown = () => observer.disconnect();\n\n useMixin(controller, setup, teardown);\n return teardown;\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\nimport {useMutationObserver} from \"../../mixins/use_mutation_observer\";\n\nexport class TableTruncateController extends BaseController {\n\n static targets = [\"showMore\"];\n static values = {\n limit: Number,\n truncated: Boolean,\n };\n\n declare readonly showMoreTarget: HTMLElement;\n declare limitValue: number;\n declare readonly hasLimitValue: boolean;\n declare truncatedValue: boolean;\n declare readonly hasTruncatedValue: boolean;\n\n get _truncated(): boolean {\n return this.hasTruncatedValue ? this.truncatedValue : false;\n }\n\n set _truncated(value) {\n this.truncatedValue = value;\n }\n\n get _tableBody(): HTMLTableSectionElement {\n return (this.el as HTMLTableElement).tBodies[0];\n }\n\n get _tableRows(): HTMLTableRowElement[] {\n return Array.from(this._tableBody.rows);\n }\n\n get _limit(): number {\n return this.hasLimitValue ? this.limitValue : 20;\n }\n\n connect() {\n useMutationObserver(this, this._tableBody, this.mutate, {childList: true});\n\n requestAnimationFrame(() => {\n this.truncate();\n useEventListener(this, this.showMoreTarget, \"click\", this.expand);\n });\n }\n\n truncate(event?: Event) {\n event?.preventDefault();\n this._truncated = true;\n if (this._tableRows.length >= this._limit) {\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n } else {\n this._hideElement(this.showMoreTarget);\n }\n }\n\n expand(event?: Event) {\n this._truncated = false;\n event?.preventDefault();\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._hideElement(this.showMoreTarget);\n }\n\n mutate(entries: MutationRecord[]) {\n if (this._truncated) {\n this._reTruncate();\n }\n }\n\n private _showElement(el: HTMLElement): void {\n el.style.display = \"\";\n }\n\n private _hideElement(el: HTMLElement): void {\n el.style.display = \"none\";\n }\n\n private _reTruncate() {\n this._tableRows.slice(0, this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._showElement(el);\n }\n });\n this._tableRows.slice(this._limit).forEach((el) => {\n if (el !== this.showMoreTarget) {\n this._hideElement(el);\n }\n });\n this._showElement(this.showMoreTarget);\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class AlertController extends BaseController {\n\n static values = {message: String};\n\n declare messageValue: string;\n\n alert() {\n alert(this.messageValue);\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useFullscreen} from \"../../mixins\";\n\nexport class FullscreenController extends BaseController {\n\n declare enter: () => void;\n declare exit: () => void;\n declare toggle: () => void;\n\n connect() {\n let {enter, exit, toggle} = useFullscreen(this);\n this.enter = enter;\n this.exit = exit;\n this.toggle = toggle;\n }\n\n}\n","import {Controller} from \"stimulus\";\nimport {logEvent} from \"./logging\";\n\nexport function dispatchEvent(controller: Controller, element: HTMLElement, eventName: string, options: CustomEventInit = {}) {\n let mergedOptions = Object.assign({}, {bubbles: true, cancelable: true, detail: {target: element}}, options);\n if (!!mergedOptions.detail.target) {\n mergedOptions.detail.target = element;\n }\n let event = new CustomEvent(eventName, mergedOptions);\n logEvent(controller, eventName, event, element);\n element.dispatchEvent(event);\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useIntersection} from \"../../mixins/use_intersection\";\nimport {dispatchEvent} from \"../../utilities/events\";\n\nexport class IntersectionController extends BaseController {\n\n static values = {threshold: String};\n\n declare readonly isVisible: boolean;\n declare readonly thresholdValue: string;\n declare readonly hasThresholdValue: boolean;\n\n get _threshold(): number[] {\n if (this.hasThresholdValue) {\n return this.thresholdValue.split(',').map(val => Number.parseFloat(val.trim())).filter(val => val >= 0 && val <= 1);\n } else {\n return [0, 1];\n }\n }\n\n connect() {\n useIntersection(this, this.el, this.appear, this.disappear, {threshold: this._threshold});\n }\n\n appear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:appear\");\n };\n\n disappear(entry: IntersectionObserverEntry) {\n dispatchEvent(this, this.el, \"intersection:disappear\");\n };\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class IntervalController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n declare readonly hasSecondsValue: boolean;\n\n connect() {\n if (!this.hasSecondsValue) {\n throw new Error('Expected `secondsValue` to be present');\n }\n requestAnimationFrame(() => {\n useInterval(this, this._interval, this.secondsValue * 1000);\n });\n }\n\n _interval() {\n this.dispatchEvent(this.el, \"interval:action\");\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\n\nexport class PresenceController extends BaseController {\n\n static values = {name: String};\n\n declare nameValue: string;\n declare readonly hasNameValue: boolean;\n\n get name(): string {\n return this.hasNameValue ? this.nameValue : ``;\n }\n\n get _addedEventName(): string {\n return [this.name, 'presence', 'added'].filter(el => !!el).join(':');\n }\n\n get _removedEventName(): string {\n return [this.name, 'presence', 'removed'].filter(el => !!el).join(':');\n }\n\n connect() {\n this.dispatchEvent(this.el, this._addedEventName);\n }\n\n disconnect() {\n this.dispatchEvent(this.el, this._removedEventName);\n }\n\n}\n","import {BaseController} from '../../utilities/base_controller';\n\nexport class PrintController extends BaseController {\n\n print(event?: Event) {\n event?.preventDefault();\n window.print();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeoutController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n useTimeout(this, this._timeout, this.secondsValue * 1000);\n });\n }\n\n _timeout() {\n this.dispatchEvent(this.el, \"timeout\");\n }\n\n}","import {BaseController} from \"../../utilities/base_controller\";\nimport {useEventListener} from \"../../mixins/use_event_listener\";\n\nexport class UserFocusController extends BaseController {\n\n connect() {\n useEventListener(this, window, [\"focus\", \"blur\"], this._handleVisibility);\n useEventListener(this, document, \"visibilitychange\", this._handleVisibility);\n requestAnimationFrame(() => {\n this._handleVisibility();\n });\n }\n\n appear() {\n this.dispatchEvent(this.el, \"user-focus:active\");\n }\n\n away() {\n this.dispatchEvent(this.el, \"user-focus:away\");\n }\n\n private _handleVisibility() {\n this._documentIsActive() ? this.appear() : this.away();\n }\n\n private _documentIsActive() {\n return document.visibilityState == \"visible\" && document.hasFocus();\n }\n\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class ClockController extends BaseController {\n\n\n static targets = [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"];\n\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n declare readonly hasMillisecondsTarget: boolean;\n declare readonly millisecondsTarget: HTMLElement;\n\n get _tickInterval() {\n if (this.hasMillisecondsTarget) {\n return 1; // 1 ms\n } else if (this.hasSecondsTarget) {\n return 1000; // 1 seconds\n } else if (this.hasMinutesTarget) {\n return 15000; // 15 seconds\n } else {\n return 300000; // Every 5 minutes\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useInterval(this, this._tick, this._tickInterval);\n });\n }\n\n _tick() {\n let current = new Date();\n\n if (this.hasHoursTarget) {\n this.hoursTarget.innerHTML = current\n .getHours()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMinutesTarget) {\n this.minutesTarget.innerHTML = current\n .getMinutes()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasSecondsTarget) {\n this.secondsTarget.innerHTML = current\n .getSeconds()\n .toString()\n .padStart(2, \"0\");\n }\n if (this.hasMillisecondsTarget) {\n this.millisecondsTarget.innerHTML = current\n .getMilliseconds()\n .toString()\n .padStart(3, \"0\");\n }\n }\n}\n","import {Duration, intervalToDuration, isPast} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\n\nexport class CountdownController extends BaseController {\n\n static values = {deadline: String, removeUnused: Boolean};\n static targets = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n static classes = [\"countingDown\", \"ended\"];\n\n // Values\n declare readonly deadlineValue: string;\n declare readonly removeUnusedValue: boolean;\n declare readonly hasRemoveUnusedValue: boolean;\n // Targets\n declare readonly hasYearsTarget: boolean;\n declare readonly yearsTarget: HTMLElement;\n declare readonly hasMonthsTarget: boolean;\n declare readonly monthsTarget: HTMLElement;\n declare readonly hasDaysTarget: boolean;\n declare readonly daysTarget: HTMLElement;\n declare readonly hasHoursTarget: boolean;\n declare readonly hoursTarget: HTMLElement;\n declare readonly hasMinutesTarget: boolean;\n declare readonly minutesTarget: HTMLElement;\n declare readonly hasSecondsTarget: boolean;\n declare readonly secondsTarget: HTMLElement;\n // Classes\n declare addEndedClasses: (el?: HTMLElement) => void;\n declare removeEndedClasses: (el?: HTMLElement) => void;\n declare addCountingDownClasses: (el?: HTMLElement) => void;\n declare removeCountingDownClasses: (el?: HTMLElement) => void;\n\n // Instance Data\n _interval: null | ReturnType<typeof window.setInterval> = null;\n\n get _removeUnused(): boolean {\n return this.hasRemoveUnusedValue ? this.removeUnusedValue : false;\n }\n\n\n get _deadlineDate() {\n return new Date(this.deadlineValue);\n }\n\n connect() {\n this._interval = setInterval(this._tick.bind(this), 1000);\n this.addCountingDownClasses();\n }\n\n disconnect() {\n this._clearTick();\n this.removeCountingDownClasses();\n this.removeEndedClasses();\n }\n\n deadlineValueChanged() {\n // Countdown had previously ended, restart ticking. Updating mid-tick will just work.\n if (this._interval == null) {\n this._interval = setInterval(this._tick.bind(this), 1000);\n }\n }\n\n _tick() {\n try {\n const now = new Date();\n let distance: Duration = {};\n\n if (isPast(this._deadlineDate)) {\n distance = {years: 0, months: 0, days: 0, hours: 0, minutes: 0, seconds: 0};\n // Countdown has ended, stop ticking\n this._clearTick();\n this.removeCountingDownClasses();\n this.addEndedClasses();\n this.dispatchEvent(this.el, \"countdown:ended\");\n } else {\n distance = intervalToDuration({start: this._deadlineDate, end: now});\n }\n\n if (this.hasYearsTarget) {\n this._updateTarget(this.yearsTarget, this._years(distance));\n }\n if (this.hasMonthsTarget) {\n this._updateTarget(this.monthsTarget, this._months(distance));\n }\n if (this.hasDaysTarget) {\n this._updateTarget(this.daysTarget, this._days(distance));\n }\n if (this.hasHoursTarget) {\n this._updateTarget(this.hoursTarget, this._hours(distance));\n }\n if (this.hasMinutesTarget) {\n this._updateTarget(this.minutesTarget, this._minutes(distance));\n }\n if (this.hasSecondsTarget) {\n this._updateTarget(this.secondsTarget, this._seconds(distance));\n }\n } catch (e) {\n console.error(e);\n this._clearTick();\n }\n }\n\n _clearTick() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n\n _updateTarget(target: HTMLElement, value: number) {\n this._removeTargetIfUnused(target, value);\n target.innerHTML = value.toString();\n }\n\n _removeTargetIfUnused(target: HTMLElement, value: number) {\n if (this._removeUnused) {\n if (value === 0 && target.dataset.unused) {\n if (Number.parseInt(target.dataset.unused) > Date.now() + 1500) {\n target.remove();\n }\n } else if (value == 0) {\n target.dataset.unused = Date.now().toString();\n } else {\n target.dataset.unused = undefined;\n }\n }\n }\n\n _years(duration: Duration): number {\n return duration.years || 0;\n }\n\n _months(duration: Duration): number {\n return duration.months || 0;\n }\n\n _days(duration: Duration): number {\n return duration.days || 0;\n }\n\n _hours(duration: Duration): number {\n return duration.hours || 0;\n }\n\n _minutes(duration: Duration): number {\n return duration.minutes || 0;\n }\n\n _seconds(duration: Duration): number {\n return duration.seconds || 0;\n }\n\n}\n","import {Duration, formatDuration, intervalToDuration, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useInterval} from \"../../mixins/use_interval\";\n\nexport class DurationController extends BaseController {\n static values = {\n timestamp: Number,\n minutes: Boolean,\n seconds: Boolean,\n };\n\n declare readonly minutesValue: boolean;\n declare readonly hasMinutesValue: boolean;\n declare readonly secondsValue: boolean;\n declare readonly hasSecondsValue: boolean;\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n declare _clearInterval: () => void;\n\n get _format(): string[] {\n return [\n \"years\",\n \"months\",\n \"weeks\",\n \"days\",\n \"hours\",\n ...(this._minutes ? [\"minutes\"] : []),\n ...(this._seconds ? [\"seconds\"] : []),\n ];\n }\n\n get _output(): string {\n let {years, months, weeks, days, hours, minutes, seconds} = this._duration;\n\n years ||= 0;\n months ||= 0;\n weeks ||= 0;\n days ||= 0;\n hours ||= 0;\n minutes ||= 0;\n seconds ||= 0;\n\n let largeDenominators = [years, months, weeks, days, hours];\n\n if (!this._minutes && !this._seconds && largeDenominators.every((x) => x === 0)) {\n minutes = minutes + seconds / 60.0;\n return `${(minutes / 60).toFixed(1)} hours`;\n }\n\n return formatDuration(this._duration, {format: this._format, delimiter: \", \"});\n }\n\n get _seconds(): boolean {\n return this.hasSecondsValue ? this.secondsValue : true;\n }\n\n get _minutes(): boolean {\n return this.hasMinutesValue ? this.minutesValue : true;\n }\n\n get _timestamp(): Date {\n if (this.hasTimestampValue) {\n return toDate(this.timestampValue * 1000);\n } else {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n }\n\n get _duration(): Duration {\n return intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _tickInterval() {\n if (this._seconds) {\n return 1000; // 1 seconds\n } else if (this._minutes) {\n return 15000; // 15 seconds\n } else {\n return 120000; // 2 minutes\n }\n }\n\n connect() {\n this._clearInterval = useInterval(this, this._update, this._tickInterval);\n this._update();\n }\n\n\n _update() {\n try {\n this.el.innerHTML = this._output;\n } catch {\n this._clearInterval();\n }\n }\n}\n","import {BaseController} from \"../../utilities/base_controller\";\nimport {clamp} from \"lodash-es\";\nimport {useCollectionEventListener} from \"../../mixins/use_event_listener\";\n\nexport class TabsController extends BaseController {\n\n static values = {currentTab: Number, equalize: Boolean};\n static targets = [\"link\", \"content\"];\n static classes = [\"active\", \"hide\"];\n\n declare currentTabValue: number;\n declare hasCurrentTabValue: boolean;\n\n declare equalizeValue: boolean;\n declare hasEqualizeValue: boolean;\n declare readonly linkTargets: HTMLElement[];\n declare readonly contentTargets: HTMLElement[];\n declare addHideClasses: (el?: HTMLElement) => void;\n declare removeHideClasses: (el?: HTMLElement) => void;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultHideClasses(): string[] {\n return [\"hide\"];\n }\n\n get defaultActiveClasses(): string[] {\n return [\"is-active\"];\n }\n\n get _currentTab(): number {\n return this.hasCurrentTabValue ? this.currentTabValue : 0;\n }\n\n get _equalize(): boolean {\n return this.hasEqualizeValue ? this.equalizeValue : false;\n }\n\n connect() {\n useCollectionEventListener(this, this.linkTargets, \"click\", this.switchTabs);\n\n if (this._equalize) {\n this._setMinHeight();\n }\n\n this.currentTabValue = this._currentTab;\n }\n\n switchTabs(event: Event) {\n event.preventDefault();\n this.currentTabValue = this.linkTargets.indexOf(event.currentTarget as HTMLElement);\n }\n\n currentTabValueChanged() {\n let index = this._currentTab;\n index = this._clampIndex(index);\n this._selectTab(index);\n }\n\n _selectTab(index: number) {\n index = this._clampIndex(index);\n let links = this.linkTargets;\n let panels = this.contentTargets;\n let activePanel = panels[index];\n let activeLink = links[index];\n let otherPanels = [...panels.slice(0, index), ...panels.slice(index + 1)];\n let otherLinks = [...links.slice(0, index), ...links.slice(index + 1)];\n\n this.addActiveClasses(activeLink);\n activeLink.setAttribute('aria-selected', \"true\");\n\n this.addActiveClasses(activePanel);\n this.removeHideClasses(activePanel);\n\n otherLinks.forEach((link) => {\n link.removeAttribute('aria-selected');\n this.removeActiveClasses(link);\n });\n otherPanels.forEach((panel) => {\n this.removeActiveClasses(panel);\n this.addHideClasses(panel);\n });\n }\n\n _clampIndex(index: number): number {\n return clamp(index, 0, this.contentTargets.length - 1);\n }\n\n _setMinHeight() {\n let minHeight = 0;\n\n // determine the minimum height\n this.contentTargets.forEach((content) => {\n let hidden = content.hasAttribute(\"tab-hidden\");\n if (hidden) {\n this.removeHideClasses(content);\n }\n\n let height = content.offsetHeight;\n if (height > minHeight) {\n minHeight = height;\n }\n\n if (hidden) {\n this.addHideClasses(content);\n }\n });\n\n // apply to all tabs\n this.contentTargets.forEach((content) => content.style.minHeight = minHeight + \"px\");\n }\n\n}\n","import {Duration, formatDistanceToNow, intervalToDuration, isPast, toDate} from \"date-fns\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {useTimeout} from \"../../mixins/use_timeout\";\n\nexport class TimeDistanceController extends BaseController {\n static values = {\n timestamp: Number,\n };\n\n declare timestampValue: number;\n declare readonly hasTimestampValue: boolean;\n\n declare _timestamp: Date;\n\n get _duration(): Duration {\n return isPast(this._timestamp) ? intervalToDuration({start: this._timestamp, end: new Date()}) : intervalToDuration({start: new Date(), end: this._timestamp});\n }\n\n get _nextUpdate(): number | null {\n let duration = this._duration;\n\n if (duration.years && duration.years > 0) {\n return null;\n } else if (duration.months && duration.months > 0) {\n return null;\n } else if (duration.days && duration.days > 0) {\n return null;\n } else if (duration.hours && duration.hours > 0) {\n return 1800000; // Update every 30 mins\n } else {\n return 30000; // Update every 30 seconds\n }\n }\n\n timestampValueChanged() {\n this._timestamp = toDate(this.timestampValue * 1000);\n }\n\n connect() {\n if (!this.hasTimestampValue) {\n throw new Error(\"Expected `timestampValue` to be present\");\n }\n this._update();\n }\n\n _update() {\n this.el.innerHTML = formatDistanceToNow(this._timestamp, {\n addSuffix: true,\n includeSeconds: true,\n });\n\n if (this._nextUpdate) {\n useTimeout(this, this._update, this._nextUpdate);\n }\n }\n}\n","import {useMutationObserver} from \"../../mixins/use_mutation_observer\";\nimport {BaseController} from \"../../utilities/base_controller\";\nimport {installClassMethods} from \"../../mixins/install_class_methods\";\n\nexport class TreeViewController extends BaseController {\n\n static classes = [\n \"active\",\n \"collapsed\",\n ];\n\n declare activeClasses: string[];\n declare activeClassesPresent: (el?: HTMLElement) => boolean;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n declare addCollapsedClasses: (el?: HTMLElement) => void;\n declare removeCollapsedClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultCollapsedClasses(): string[] {\n return [\"collapsed\"];\n }\n\n initialize() {\n this._nodeClicked = this._nodeClicked.bind(this);\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this.el, this.mutate, {subtree: true, childList: true});\n this._setup();\n }\n\n disconnect() {\n this._teardown();\n }\n\n _setup() {\n this._setupNode(this.el);\n }\n\n _setupNode(el: HTMLElement) {\n const process = (e: HTMLElement) => {\n let parent = e.parentElement;\n if (parent) {\n if (!this._nodeActive(parent)) {\n this._hideNode(parent);\n }\n parent.removeEventListener(\"click\", this._nodeClicked);\n parent.addEventListener(\"click\", this._nodeClicked);\n }\n };\n if (el.tagName === 'UL' || el.tagName === 'OL') {\n process(el);\n }\n el.querySelectorAll(\"ul, ol\").forEach(e => process(e as HTMLElement));\n }\n\n _teardown() {\n this.el.querySelectorAll(\"ul, ol, li\").forEach((el) => this._teardownNode(el as HTMLElement));\n }\n\n _teardownNode(el: HTMLElement) {\n [el, ...Array.from(el.querySelectorAll('ul, ol, li')) as HTMLElement[]].forEach((x) => {\n x.removeEventListener(\"click\", this._nodeClicked);\n this.removeActiveClasses(x);\n this.removeCollapsedClasses(x);\n });\n }\n\n _nodeClicked(event: MouseEvent) {\n if (event) {\n event.stopImmediatePropagation();\n }\n\n let el = event.target as HTMLElement | null;\n\n if (!el || !this._hasNested(el)) {\n return;\n }\n\n if (this._nodeActive(el)) {\n this._hideNode(el);\n } else {\n this._showNode(el);\n }\n }\n\n _nodeActive(el: HTMLElement): boolean {\n return this.activeClassesPresent(el);\n }\n\n _showNode(el: HTMLElement) {\n this.removeCollapsedClasses(el);\n this.addActiveClasses(el);\n }\n\n _hideNode(el: HTMLElement) {\n this.removeActiveClasses(el);\n this.addCollapsedClasses(el);\n }\n\n _hasNested(el: HTMLElement): boolean {\n return el.querySelectorAll(\"ul, ol\").length > 0;\n }\n\n mutate(entries: MutationRecord[]) {\n for (const mutation of entries) {\n if (mutation.type === \"childList\") {\n (Array.from(mutation.addedNodes || []) as HTMLElement[]).forEach(el => this._setupNode(el));\n (Array.from(mutation.removedNodes || []) as HTMLElement[]).forEach(el => this._teardownNode(el));\n }\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class AnchorSpyController extends BaseController {\n static values = {key: String};\n static classes = [\"active\", \"inactive\"];\n\n declare readonly keyValue: string;\n declare addActiveClasses: (el?: HTMLElement) => void;\n declare removeInactiveClasses: (el?: HTMLElement) => void;\n declare addInactiveClasses: (el?: HTMLElement) => void;\n declare removeActiveClasses: (el?: HTMLElement) => void;\n\n get defaultActiveClasses(): string[] {\n return [\"active\"];\n }\n\n get defaultInactiveClasses(): string[] {\n return [\"inactive\"];\n }\n\n get _key(): string {\n return this.keyValue.replaceAll('#', '');\n }\n\n get _anchor(): string {\n return window.location.hash.substr(1);\n }\n\n set _anchor(value: string) {\n window.location.hash = value;\n }\n\n connect() {\n installClassMethods(this);\n requestAnimationFrame(() => {\n this._checkAnchor();\n useEventListener(this, window, 'hashchange', this._checkAnchor);\n });\n }\n\n write(event?: Event) {\n event?.preventDefault();\n this._anchor = this._key;\n }\n\n private _checkAnchor() {\n if (this._key === this._anchor) {\n this.dispatchEvent(this.el, \"anchor-spy:active\");\n this.addActiveClasses(this.el);\n this.removeInactiveClasses(this.el);\n } else {\n this.dispatchEvent(this.el, \"anchor-spy:inactive\");\n this.addInactiveClasses(this.el);\n this.removeActiveClasses(this.el);\n }\n }\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class BackLinkController extends BaseController {\n\n static values = {timeout: Number, pages: Number};\n\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n declare readonly pagesValue: number;\n declare readonly hasPagesValue: boolean;\n\n get _pages(): number {\n return this.hasPagesValue ? Math.abs(this.pagesValue) : 1;\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1500;\n }\n\n connect() {\n useEventListener(this, this.el, \"click\", this.goBack);\n }\n\n goBack(event?: Event) {\n event?.preventDefault();\n history.go(-this._pages);\n if ((this.el as HTMLAnchorElement).href) {\n useTimeout(this, this.fallback, this._timeout);\n }\n }\n\n fallback() {\n window.location.href = (this.el as HTMLAnchorElement).href;\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class ClipboardController extends BaseController {\n\n static targets = [\"source\", \"button\", \"copy\", \"fallback\"];\n static values = {removeUnused: Boolean};\n\n declare readonly sourceTarget: HTMLElement;\n declare readonly copyTarget: HTMLElement;\n declare readonly hasCopyTarget: boolean;\n declare readonly fallbackTarget: HTMLElement;\n declare readonly hasFallbackTarget: boolean;\n\n declare readonly hasRemoveUnusedValue: boolean;\n declare readonly removeUnusedValue: boolean;\n\n _supported = false;\n\n connect() {\n this._supported = document.queryCommandSupported(\"copy\");\n\n if (this.hasRemoveUnusedValue && this.removeUnusedValue) {\n if (this._supported && this.hasFallbackTarget) {\n this.fallbackTarget.remove();\n } else if (this.hasCopyTarget) {\n this.copyTarget.remove();\n }\n }\n }\n\n select(event: MouseEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n }\n\n copy(event: ClipboardEvent) {\n if (event) {\n event.preventDefault();\n }\n (this.sourceTarget as HTMLInputElement | HTMLTextAreaElement).select();\n if (this._supported) {\n document.execCommand(\"copy\");\n }\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isHTMLAnchorElement, isHTMLFormElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmController extends BaseController {\n\n static values = {\n message: String,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Are you sure?';\n }\n\n get _eventType(): \"submit\" | \"click\" {\n if (isHTMLFormElement(this.el)) {\n return \"submit\";\n } else if (isHTMLAnchorElement(this.el)) {\n return \"click\";\n } else {\n throw new Error(\"Can't handle confirmation on attached element\");\n }\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, this._eventType, this.confirm);\n });\n }\n\n confirm(event: Event) {\n if (!(window.confirm(this._message))) {\n event.preventDefault();\n this.dispatchEvent(this.el, \"confirm:cancelled\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\nexport class ConfirmNavigationController extends BaseController {\n\n static values = {message: String};\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : \"Do you want to leave this page? Changes you made may not be saved\";\n }\n\n connect() {\n window.onbeforeunload = () => this._message;\n useEventListener(this, window, \"popstate\", this.confirmNavigation);\n useEventListener(this, window, \"submit\", this.allowSubmit);\n useEventListener(this, window, [\"turbolinks:before-visit\", \"turbo:before-visit\"], this.confirmTurboNavigation);\n }\n\n disconnect() {\n window.onbeforeunload = null;\n }\n\n allowSubmit(_event: Event) {\n window.removeEventListener(\"popstate\", this.confirmNavigation);\n window.onbeforeunload = null;\n }\n\n confirmNavigation(_event: Event | PopStateEvent) {\n return false;\n }\n\n confirmTurboNavigation(event: Event) {\n if (!confirm(this._message)) {\n event.preventDefault();\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DebugController extends BaseController {\n\n static targets = [\"test\"];\n declare testTargets: HTMLElement[];\n\n connect() {\n console.log(\"Debug Controller\", this, this.testTargets);\n }\n}\n","import {BaseController} from '../utilities/base_controller';\nimport {isTypeOfButtonableElement} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useTemporaryContent} from \"../mixins/use_temporary_content\";\n\nexport class DisableWithController extends BaseController {\n\n static values = {\n message: String,\n timeout: Number,\n };\n\n declare readonly messageValue: string;\n declare readonly hasMessageValue: boolean;\n declare readonly timeoutValue: number;\n declare readonly hasTimeoutValue: boolean;\n\n get _message(): string {\n return this.hasMessageValue ? this.messageValue : 'Submitting...';\n }\n\n get _timeout(): number {\n return this.hasTimeoutValue ? this.timeoutValue : 1000;\n }\n\n connect() {\n requestAnimationFrame(() => {\n useEventListener(this, this.el, [\"click\"], this.disable);\n useEventListener(this, window, [\"turbo:load\", \"turbolinks:load\"], this._enable);\n });\n }\n\n disable(event?: Event) {\n let element = this.el;\n\n if (this._isDisabled(element)) {\n event?.preventDefault();\n event?.stopImmediatePropagation();\n } else {\n this._disable();\n useTemporaryContent(this, element, this._message, this._timeout, this._enable);\n }\n }\n\n enable(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n if (this._isDisabled(element)) {\n this._enable();\n }\n }\n\n _isDisabled(el: HTMLElement): boolean {\n if (isTypeOfButtonableElement(el)) {\n return el.disabled;\n } else {\n return el.dataset.disabled == \"true\";\n }\n }\n\n _disable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = true;\n } else {\n el.dataset.disabled = \"true\";\n }\n }\n\n _enable() {\n let el = this.el;\n if (isTypeOfButtonableElement(el)) {\n el.disabled = false;\n } else {\n el.dataset.disabled = undefined;\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\n\nexport class DismissableController extends BaseController {\n\n dismiss() {\n this.el.remove();\n }\n\n}\n\nexport class RemoveController extends DismissableController {\n}","import {debounce, get as _get, set as _set} from \"lodash-es\";\nimport {BaseController} from '../utilities/base_controller';\nimport {LocalStorageProxy, useLocalStorage} from \"../mixins\";\n\nexport class ElementSaveController extends BaseController {\n\n static targets = [\n \"element\",\n ];\n static values = {\n id: String,\n attributes: String,\n restoreOnLoad: Boolean,\n };\n declare readonly hasElementTarget: boolean;\n declare readonly elementTarget: HTMLElement;\n declare readonly elementTargets: HTMLElement[];\n declare readonly idValue: string;\n declare readonly attributesValue: string;\n declare readonly hasIdValue: boolean;\n declare readonly restoreOnLoadValue: boolean;\n declare readonly hasRestoreOnLoadValue: boolean;\n declare _store: LocalStorageProxy<{ [idx: string]: string; }>;\n\n get _id() {\n if (this.hasIdValue) {\n return this.idValue;\n }\n let elementID = this.el.id;\n\n if (elementID !== \"\") {\n return elementID;\n } else {\n throw new Error(`No ID value to uniquely identify this element. Please either specify data-${this.identifier}-id-value or give this element an 'id' attribute. `);\n }\n }\n\n get _uniqueIdentifier() {\n const url = location.href;\n return `${url} ${this._id}`;\n }\n\n get _restoreOnLoad() {\n return this.hasRestoreOnLoadValue ? this.restoreOnLoadValue : true;\n }\n\n get _element(): HTMLElement {\n return this.hasElementTarget ? this.elementTarget : this.el;\n }\n\n initialize() {\n this.save = debounce(this.save.bind(this), 300);\n }\n\n connect() {\n this._store = useLocalStorage(this, this._uniqueIdentifier, {});\n requestAnimationFrame(() => {\n if (this._restoreOnLoad) {\n this.restore();\n }\n });\n }\n\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n this._store.clear();\n this.dispatchEvent(this._element, `element-save:cleared`);\n }\n\n save(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n let attributes = this.attributesValue.split(\" \");\n let data: { [idx: string]: any } = {};\n attributes.forEach((attr: string) => data[attr] = _get(element, attr));\n this._store.value = data;\n this.dispatchEvent(element, `element-save:save:success`);\n }\n\n restore(event?: Event) {\n if (event) {\n event.preventDefault();\n }\n let element = this._element;\n if (!this._store.isEmpty()) {\n const savedData = this._store.value; // get and parse the saved data from localStorage\n Object.keys(savedData).forEach(\n (attr: string) => _set(element as HTMLElement, attr, savedData[attr]),\n );\n this.dispatchEvent(element, `element-save:restore:success`);\n } else {\n this.dispatchEvent(element, `element-save:restore:empty`);\n }\n }\n\n}\n","import {useMutationObserver} from \"../mixins/use_mutation_observer\";\nimport {BaseController} from \"../utilities/base_controller\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class EmptyDomController extends BaseController {\n\n static targets = [\"container\"];\n static classes = [\"empty\", \"notEmpty\"];\n static values = {scopeSelector: String};\n\n declare readonly hasContainerTarget: boolean;\n declare readonly containerTarget: HTMLElement;\n\n declare addEmptyClasses: (el?: HTMLElement) => void;\n declare removeEmptyClasses: (el?: HTMLElement) => void;\n declare addNotEmptyClasses: (el?: HTMLElement) => void;\n declare removeNotEmptyClasses: (el?: HTMLElement) => void;\n\n declare hasScopeSelectorValue: boolean;\n declare scopeSelectorValue: string;\n\n get _container() {\n return this.hasContainerTarget ? this.containerTarget : this.el;\n }\n\n get _children(): Element[] {\n let element = this._container;\n if (this.hasScopeSelectorValue) {\n return Array.from(element.querySelectorAll(this.scopeSelectorValue));\n } else {\n return Array.from(element.children);\n }\n }\n\n connect() {\n installClassMethods(this);\n useMutationObserver(this, this._container, this.mutate, {childList: true});\n this.checkEmpty();\n }\n\n mutate(entries: MutationRecord[]) {\n this.checkEmpty();\n }\n\n checkEmpty() {\n let element = this._container;\n let children = this._children;\n if (children.length === 0) {\n this.removeNotEmptyClasses();\n this.addEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:empty\");\n } else {\n this.addNotEmptyClasses();\n this.removeEmptyClasses();\n this.dispatchEvent(element as HTMLElement, \"dom:not-empty\", {detail: {count: children.length}});\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {warn} from \"../utilities/logging\";\n\nexport class PrefetchController extends BaseController {\n\n static values = {mode: String};\n\n declare readonly modeValue: \"intersect\" | \"mouseover\";\n declare readonly hasModeValue: boolean;\n\n get _mode(): string {\n return this.hasModeValue ? this.modeValue : \"mouseover\";\n }\n\n get _supportsPrefetch(): boolean {\n const link: HTMLLinkElement = document.createElement('link');\n return link.relList?.supports && link.relList?.supports('prefetch');\n }\n\n get _href(): string {\n return (this.el as HTMLAnchorElement).href;\n }\n\n get _existingPrefetch(): boolean {\n return (document.head.querySelectorAll(`link[rel=\"prefetch\"][href=\"${this._href}\"]`) || []).length > 0;\n }\n\n get _connectionSuitable(): boolean {\n // @ts-ignore\n const connection = navigator.connection;\n\n // no way to know what network state is. Allow prefetching\n if (!connection) {\n return true;\n }\n\n // Don't prefetch if network conditions are poor or user has enabled data-saving mode\n if (connection) {\n // @ts-ignore Experimental API\n if (connection.saveData) {\n warn(this, 'Data Saving is enabled');\n return false;\n }\n\n // @ts-ignore Experimental API\n if (/2g/.test(connection.effectiveType)) {\n warn(this, \"Network is too slow\");\n return false;\n }\n }\n return true;\n }\n\n connect(): void {\n if (!this._supportsPrefetch) {\n return;\n }\n\n switch (this._mode) {\n case \"intersect\":\n this._setupObserver();\n break;\n case \"mouseover\":\n useEventListener(this, this.el, \"mouseover\", this.prefetch, {once: true});\n break;\n default:\n throw new Error(`'${this._mode}' is not a supported prefetch mode`);\n }\n }\n\n _setupObserver(): void {\n const observer: IntersectionObserver = new IntersectionObserver(\n ([entry]: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n if (entry.isIntersecting) {\n this.prefetch();\n observer.unobserve(entry.target);\n }\n },\n );\n observer.observe(this.element);\n }\n\n prefetch() {\n if (this._existingPrefetch || !this._connectionSuitable) {\n return;\n }\n const link: HTMLLinkElement = document.createElement('link');\n Object.assign(link, {rel: 'prefetch', href: this._href, as: 'document'});\n document.head.appendChild(link);\n }\n\n}\n","import {PrintController} from \"./utility/print_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {installClassMethods} from \"../mixins/install_class_methods\";\n\nexport class PrintButtonController extends PrintController {\n\n static classes = [\n 'unsupported',\n ];\n declare addUnsupportedClasses: (el?: HTMLElement) => void;\n\n get defaultUnsupportedClasses(): string[] {\n return [\"unsupported\"];\n }\n\n connect() {\n installClassMethods(this);\n if (!(\"print\" in window)) {\n this.addUnsupportedClasses();\n }\n useEventListener(this, this.el, 'click', this.print);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\n\ninterface ResponsiveIframeMessage {\n name: string,\n height: number,\n}\n\nexport class ResponsiveIframeWrapperController extends BaseController {\n\n connect() {\n useEventListener(this, window, \"message\", this.messageReceived);\n }\n\n messageReceived(message: MessageEvent<ResponsiveIframeMessage>) {\n let data = message.data;\n if (data.hasOwnProperty(\"name\") && data.name === \"iframe-body\" && data.hasOwnProperty(\"height\")) {\n this.resize(data.height);\n }\n }\n\n resize(height: number) {\n (this.el as HTMLIFrameElement).style.height = `${height}px`;\n }\n\n}\n\nexport class ResponsiveIframeBodyController extends BaseController {\n\n connect() {\n // If this Window is inside a frame\n if (window.self !== window.top) {\n useEventListener(this, window, \"resize\", this.postUpdate, {debounce: 200});\n this.postUpdate();\n }\n }\n\n postUpdate() {\n let payload: ResponsiveIframeMessage = {name: \"iframe-body\", height: this.getHeight()};\n window.parent.postMessage(\n payload,\n \"*\",\n );\n }\n\n getHeight(): number {\n const body = document.body;\n const html = document.documentElement;\n\n // Get the largest height out of body and html's various height measurements\n return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class SelfDestructController extends BaseController {\n\n static values = {seconds: Number};\n\n declare readonly secondsValue: number;\n\n connect() {\n requestAnimationFrame(() => {\n // Only start countdown on first paint\n useTimeout(this, () => this.el.remove(), this.secondsValue * 1000);\n });\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {useInjectedElement} from \"../mixins/use_injected_html\";\n\nexport class StickyController extends BaseController {\n\n static classes = [\"stuck\"];\n static values = {mode: String};\n\n declare addStuckClasses: (el?: HTMLElement) => void;\n declare removeStuckClasses: (el?: HTMLElement) => void;\n\n declare readonly hasModeValue: \"top\" | \"bottom\";\n declare readonly modeValue: \"top\" | \"bottom\";\n\n _magicElement: HTMLDivElement | null = null;\n\n get defaultStuckClasses(): string[] {\n return [\"stuck\"];\n }\n\n get _mode(): 'beforebegin' | 'afterend' {\n if (this.hasModeValue) {\n if (!['top', 'bottom'].includes(this.modeValue)) {\n throw new Error(`The modeValue provided '${this.modeValue}' is not one of the recognised configuration options`);\n }\n if (this.modeValue === 'top') {\n return 'beforebegin';\n }\n }\n return \"afterend\";\n }\n\n connect() {\n this._magicElement = document.createElement(\"div\");\n useInjectedElement(this, this.el, this._mode, this._magicElement);\n\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if (entry.target !== this._magicElement) {\n return;\n }\n if (entry.intersectionRatio === 0) {\n this.addStuckClasses();\n } else if (entry.intersectionRatio === 1) {\n this.removeStuckClasses();\n }\n });\n\n }, {\n threshold: [0, 1],\n });\n observer.observe(this._magicElement!);\n }\n\n}\n","import {EphemeralController} from \"../utilities/ephemeral_controller\";\n\nexport class TeleportController extends EphemeralController {\n\n static values = {target: String, insert: String, immediate: Boolean};\n\n declare readonly immediateValue: boolean;\n declare readonly hasImmediateValue: boolean;\n declare readonly targetValue: string;\n declare readonly hasInsertValue: boolean;\n declare readonly insertValue: InsertPosition | \"replaceOuter\" | \"replaceInner\" | \"prepend\" | \"append\";\n\n connect() {\n if (!this.hasInsertValue) {\n throw new Error(\"`insert` value was not specified\");\n }\n\n requestAnimationFrame(() => {\n if (this.hasImmediateValue && this.immediateValue) {\n this.execute();\n }\n });\n }\n\n execute(event?: Event) {\n event?.preventDefault();\n let element = this.el;\n let destination = document.querySelector(this.targetValue);\n\n if (destination == null) {\n this.dispatchEvent(element, \"teleport:error\");\n return;\n }\n\n let copy = element.cloneNode(true) as HTMLElement;\n this.cleanup(copy);\n\n switch (this.insertValue) {\n case \"beforebegin\":\n case \"beforeend\":\n case \"afterend\":\n case \"afterbegin\":\n destination.insertAdjacentHTML(this.insertValue, copy.outerHTML);\n break;\n case \"replaceOuter\":\n destination.outerHTML = copy.outerHTML;\n break;\n case \"replaceInner\":\n destination.innerHTML = copy.outerHTML;\n break;\n case \"prepend\":\n destination.insertAdjacentHTML(\"afterbegin\", copy.outerHTML);\n break;\n case \"append\":\n destination.insertAdjacentHTML(\"beforeend\", copy.outerHTML);\n break;\n default:\n throw new Error(\"`insert` value was not specified\");\n\n }\n element.remove();\n }\n\n}\n","import {camelCase, get as _get, set as _set} from \"lodash-es\";\nimport {EphemeralController} from \"../utilities/ephemeral_controller\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\nexport class TemporaryStateController extends EphemeralController {\n\n static values = {\n attribute: String,\n seconds: Number,\n value: String,\n };\n\n declare readonly hasSecondsValue: boolean;\n declare readonly secondsValue: number;\n declare readonly attributeValue: string;\n declare readonly hasAttributeValue: boolean;\n declare readonly valueValue: string;\n declare readonly hasValueValue: boolean;\n _previousState: { [index: string]: any } = {};\n\n get _value(): string {\n if (this.hasValueValue) {\n return this.valueValue;\n }\n throw new Error(\"Expected `valueValue` to be present\");\n }\n\n get _attribute(): string {\n if (this.hasAttributeValue) {\n return this.attributeValue;\n }\n throw new Error(\"Expected `attributeValue` to be present\");\n }\n\n get _seconds(): number {\n if (this.hasSecondsValue) {\n return this.secondsValue * 1000;\n }\n throw new Error(\"Expected `secondsValue` to be present\");\n }\n\n connect() {\n this.setState();\n useTimeout(this, this.removeState, this._seconds);\n }\n\n disconnect() {\n this.removeState();\n }\n\n setState() {\n this._previousState[this._attribute] = _get(this.el, this._attribute);\n _set(this.el, this._attribute, this.valueValue);\n }\n\n removeState() {\n _set(this.el, this._attribute, this._previousState[this._attribute]);\n }\n\n}\n\nexport function applyTemporaryState(element: HTMLElement, propertyString: string, value: any, seconds: number, controllerIdentifier = \"temporary-state\") {\n if (!element.dataset.controller || !element.dataset.controller?.includes(controllerIdentifier)) {\n element.dataset.controller = (element.dataset.controller || '' + ` ${controllerIdentifier} `).trim().replaceAll(' ', ' ');\n }\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-attribute-value`)] = propertyString;\n // @ts-ignore\n element[camelCase(`${controllerIdentifier}-seconds-value`)] = seconds.toString();\n}\n\nexport function applyTemporaryClass(element: HTMLElement, value: any, seconds: number) {\n applyTemporaryState(element, 'className', value, seconds);\n}\n","import {Controller} from \"stimulus\";\nimport {isElementInViewport} from \"../utilities/elements\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useClickOutside(controller: Controller, element: HTMLElement, callback: (event: Event) => void) {\n callback = callback.bind(controller);\n\n const handler = (event: Event) => {\n if (element.contains(event.target as Node) || (!isElementInViewport(element))) {\n return;\n }\n callback(event);\n };\n\n let {teardown} = useEventListener(controller, window, [\"click\", \"touchend\"], handler);\n useMixin(controller, () => void 0, teardown);\n\n return {\n teardown,\n };\n\n}","import {Controller} from \"stimulus\";\nimport {useEventListener} from \"../mixins/use_event_listener\";\nimport {useMixin} from \"./create_mixin\";\n\nexport function useHover(controller: Controller, element: HTMLElement, enter?: ((event: Event) => void) | null, leave?: ((event: Event) => void) | null) {\n let teardownEnter: null | (() => void) = null;\n let teardownLeave: null | (() => void) = null;\n\n if (enter) {\n enter = enter.bind(controller);\n let {teardown: _teardownEnter} = useEventListener(controller, element, \"mouseenter\", enter);\n teardownEnter = _teardownEnter;\n }\n if (leave) {\n leave = leave.bind(controller);\n let {teardown: _teardownLeave} = useEventListener(controller, element, \"mouseleave\", leave);\n teardownLeave = _teardownLeave;\n }\n\n let setup = () => void 0;\n let teardown = () => {\n if (teardownEnter) {\n teardownEnter();\n }\n if (teardownLeave) {\n teardownLeave();\n }\n };\n\n useMixin(controller, setup, teardown);\n return {\n teardown,\n };\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {useClickOutside} from \"../mixins/use_click_outside\";\nimport {useHover} from \"../mixins/use_hover\";\n\nexport type ToggleClassMode = \"on\" | \"off\" | \"toggle\"\n\nexport class ToggleClassController extends BaseController {\n\n static targets = [\"toggle\"];\n static values = {\n class: String,\n mouseEnter: String,\n mouseLeave: String,\n clickAway: Boolean,\n initial: String,\n };\n\n declare readonly toggleTargets: HTMLElement[];\n\n declare readonly classValue: string;\n declare readonly hasClassValue: boolean;\n\n declare readonly mouseEnterValue: ToggleClassMode;\n declare readonly hasMouseEnterValue: boolean;\n\n declare readonly mouseLeaveValue: ToggleClassMode;\n declare readonly hasMouseLeaveValue: boolean;\n\n declare readonly clickAwayValue: boolean;\n declare readonly hasClickAwayValue: boolean;\n\n declare readonly initialValue: \"on\" | \"off\";\n declare readonly hasInitialValue: boolean;\n\n connect() {\n if (!this.hasClassValue) {\n throw new Error(\"data-toggle-class-class-value must not be empty\");\n }\n\n if (this.hasMouseEnterValue || this.hasMouseLeaveValue) {\n useHover(this, this.el, this.mouseEnter, this.mouseLeave);\n }\n\n if (this.hasClickAwayValue && this.clickAwayValue) {\n useClickOutside(this, this.el, this.clickOutside);\n }\n\n requestAnimationFrame(() => {\n if (this.hasInitialValue) {\n if (this.initialValue === \"on\") {\n this.toggleTargets.forEach((target) => this._elementOn(target));\n } else {\n this.toggleTargets.forEach((target) => this._elementOff(target));\n }\n }\n });\n }\n\n clickOutside() {\n this.toggleTargets.forEach((target) => {\n if (this._elementWasToggled(target)) {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n }\n });\n }\n\n mouseEnter() {\n if (this.hasMouseEnterValue) {\n switch (this.mouseEnterValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n mouseLeave() {\n if (this.hasMouseLeaveValue) {\n switch (this.mouseLeaveValue) {\n case \"on\":\n this.on();\n break;\n case \"off\":\n this.off();\n break;\n case \"toggle\":\n this.toggle();\n break;\n }\n }\n return {};\n }\n\n on(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOn(target);\n });\n }\n\n off(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementOff(target);\n });\n }\n\n toggle(event?: Event) {\n this.toggleTargets.forEach((target) => {\n this._elementToggleStatus(target);\n this._elementToggle(target);\n });\n }\n\n private _elementWasToggled(el: HTMLElement): boolean {\n return el.dataset.toggled == \"true\";\n }\n\n private _elementToggleStatus(el: HTMLElement) {\n if (this._elementWasToggled(el)) {\n delete el.dataset.toggled;\n } else {\n el.dataset.toggled = \"true\";\n }\n }\n\n private _elementToggle(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass));\n }\n\n private _elementOn(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, true));\n }\n\n private _elementOff(el: HTMLElement) {\n let classes = this.classValue.split(\" \");\n classes.forEach((klass) => el.classList.toggle(klass, false));\n }\n\n}\n","import {controllerMethod} from \"../utilities/stimulus\";\nimport {Controller} from \"stimulus\";\n\nexport interface TrixElementsPayload {\n toolbar: HTMLElement,\n editor: HTMLElement\n}\n\nexport class TrixComposableController extends Controller {\n declare install?: (elements: TrixElementsPayload) => void;\n declare uninstall?: (elements: TrixElementsPayload) => void;\n}\n\nexport function useTrixModifiers(controller: TrixComposableController) {\n // keep a copy of the lifecycle function of the controller\n const controllerDisconnect = controller.disconnect.bind(controller);\n let observing = false;\n\n let observerCallback = (entries: MutationRecord[], observer: MutationObserver) => {\n entries.forEach(mutation => {\n if (mutation.type === 'childList' && Array.from(mutation.addedNodes).some((el) => (el as HTMLElement).tagName === 'TRIX-TOOLBAR')) {\n attemptSetup();\n observer.disconnect();\n }\n });\n };\n let pasteHandler = (event: Event) => controllerMethod(controller, 'pasteEvent').call(controller, event);\n\n let observer = new MutationObserver(observerCallback);\n\n let attemptSetup = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.addEventListener('trix-paste', pasteHandler);\n\n let toolbar = editorParent.querySelector('trix-toolbar');\n\n if (!observing && !toolbar) {\n // toolbar is not in the DOM yet, wait for it to arrive before running setup\n observing = true;\n observer.observe(editorParent, {childList: true});\n return;\n } else if (!toolbar) {\n // Fallback, in case this runs twice, or mutation observer logic fails\n throw new Error('Could not find an instance of <trix-toolbar> that is a sibling of this <trix-editor>');\n } else {\n // Do not need MutationObserver, all elements are present and correct\n observer.disconnect();\n }\n\n controllerMethod(controller, 'install').call(controller, {toolbar, editor});\n };\n\n let teardown = () => {\n if (controller.element.tagName !== 'TRIX-EDITOR') {\n throw new Error('Expected controller to be mounted on an instance of <trix-editor>');\n }\n let editor = controller.element;\n let editorParent = controller.element.parentElement;\n if (editorParent == null) {\n throw new Error('Could not traverse DOM tree from <trix-editor>');\n }\n\n editor.removeEventListener('trix-paste', pasteHandler);\n let toolbar = editorParent.querySelector('trix-toolbar');\n if (!toolbar) {\n throw new Error('Could not find <trix-toolbar> that is a sibling of this <trix-editor> element');\n }\n controllerMethod(controller, 'uninstall').call(controller, {toolbar, editor});\n };\n\n attemptSetup();\n\n Object.assign(controller, {\n disconnect() {\n observer.disconnect();\n teardown();\n controllerMethod(controller, 'uninstall').call({toolbar, editor: controller.element});\n controllerDisconnect();\n },\n });\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {TrixElementsPayload, useTrixModifiers} from \"../mixins/use_trix_modifiers\";\n\ninterface TrixInstallable {\n install: (elements: TrixElementsPayload) => void,\n uninstall: (elements: TrixElementsPayload) => void\n pasteEvent?: (event: TrixPasteEvent) => void\n}\n\ninterface TrixPasteEventPayload {\n dataTransfer: DataTransfer,\n html: string,\n range: [number, number],\n type: string,\n}\n\ninterface TrixPasteEvent extends CustomEvent {\n paste: TrixPasteEventPayload;\n}\n\nexport class TrixModifierController extends BaseController {\n\n get enabledBehaviours(): TrixInstallable[] {\n let enabled = (datasetProp: string | undefined) => datasetProp !== undefined && datasetProp !== 'false';\n let behaviourIfEnabled = (datasetProp: string | undefined, trixInstallable: TrixInstallable) => enabled(datasetProp) ? [trixInstallable] : [];\n return [\n ...(behaviourIfEnabled(this.el.dataset.noBold, this.bold)),\n ...(behaviourIfEnabled(this.el.dataset.noBulletList, this.bulletList)),\n ...(behaviourIfEnabled(this.el.dataset.noCode, this.code)),\n ...(behaviourIfEnabled(this.el.dataset.noHeading, this.heading)),\n ...(behaviourIfEnabled(this.el.dataset.noItalic, this.italic)),\n ...(behaviourIfEnabled(this.el.dataset.noStrikethrough, this.strikethrough)),\n ...(behaviourIfEnabled(this.el.dataset.noLink, this.link)),\n ...(behaviourIfEnabled(this.el.dataset.noIndents, this.indents)),\n ...(behaviourIfEnabled(this.el.dataset.noNumberList, this.numberList)),\n ...(behaviourIfEnabled(this.el.dataset.noQuote, this.quote)),\n ...(behaviourIfEnabled(this.el.dataset.noFileUploads, this.fileUploads)),\n ];\n }\n\n get bold() {\n return this.formattingHandlers('.trix-button--icon-bold', 'bold');\n }\n\n get bulletList() {\n return this.formattingHandlers('.trix-button--icon-bullet-list', 'bullet-list');\n }\n\n get code() {\n return this.formattingHandlers('.trix-button--icon-code', 'code');\n }\n\n get heading() {\n return this.formattingHandlers('.trix-button--icon-heading-1', 'heading');\n }\n\n get italic() {\n return this.formattingHandlers('.trix-button--icon-italic', 'italic');\n }\n\n get strikethrough() {\n return this.formattingHandlers('.trix-button--icon-strike', 'strike');\n }\n\n get link() {\n return this.formattingHandlers('.trix-button--icon-link', 'href');\n }\n\n get indents() {\n return this.simpleHideShowHandlers(\n [\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n \".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level\",\n ].join(', '),\n );\n }\n\n get numberList() {\n return this.simpleHideShowHandlers('.trix-button--icon-number-list');\n }\n\n get quote() {\n return this.simpleHideShowHandlers('.trix-button--icon-quote');\n }\n\n get fileUploads() {\n let selector = '.trix-button-group.trix-button-group--file-tools';\n let preventUploads = (e: Event) => e?.preventDefault();\n let self = this;\n let element = this.el as HTMLElement & { editor: any };\n return {\n install(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).install(elements);\n self.el.addEventListener('trix-file-accept', preventUploads);\n },\n pasteEvent(event: TrixPasteEvent) {\n let {dataTransfer, html} = event.paste;\n let {editor} = element;\n if (dataTransfer.files.length > 0 || html.includes('<img')) {\n alert('The content you pasted contains images and/or files. File uploads are not supported.');\n editor.undo();\n }\n },\n uninstall(elements: TrixElementsPayload) {\n self.simpleHideShowHandlers(selector).uninstall(elements);\n self.el.removeEventListener('trix-file-accept', preventUploads);\n },\n };\n }\n\n connect() {\n useTrixModifiers(this);\n }\n\n install(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.install(elements));\n }\n\n pasteEvent(event: TrixPasteEvent) {\n this.enabledBehaviours.forEach(behaviour => behaviour.pasteEvent && behaviour.pasteEvent(event));\n }\n\n uninstall(elements: TrixElementsPayload) {\n this.enabledBehaviours.forEach(behaviour => behaviour.uninstall(elements));\n }\n\n simpleHideShowHandlers(selector: string) {\n return {\n install: ({toolbar}: TrixElementsPayload) => this.hideToolbarSelector(toolbar, selector),\n uninstall: ({toolbar}: TrixElementsPayload) => this.showToolbarSelector(toolbar, selector),\n };\n }\n\n formattingHandlers(selector: string, trixAttribute: string) {\n let element = this.el as HTMLElement & { editor: any };\n let {editor} = element;\n return {\n install: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).install(elements);\n },\n pasteEvent(pasteEvent: TrixPasteEvent) {\n let {range} = pasteEvent.paste;\n let prevRange = element.editor.getSelectedRange();\n\n editor.setSelectedRange(range);\n editor.deactivateAttribute(trixAttribute);\n editor.setSelectedRange(prevRange);\n },\n uninstall: (elements: TrixElementsPayload) => {\n this.simpleHideShowHandlers(selector).uninstall(elements);\n },\n };\n }\n\n showToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = '');\n }\n\n hideToolbarSelector(toolbar: HTMLElement, selector: string) {\n toolbar.querySelectorAll(selector).forEach(el => (el as HTMLElement).style.display = 'none');\n }\n\n}","import {BaseController} from \"../utilities/base_controller\";\nimport {isHTMLAnchorElement} from \"../utilities/elements\";\nimport {isTurboFrame} from \"../utilities/turbo\";\n\nexport class TurboFrameRCController extends BaseController {\n\n static values = {\n frameId: String,\n src: String,\n loadingMessage: String,\n };\n\n declare readonly frameIdValue: string;\n declare readonly srcValue: string;\n declare readonly hasSrcValue: boolean;\n declare readonly loadingMessageValue: string;\n declare readonly hasLoadingMessageValue: boolean;\n\n toggle(event?: Event) {\n event?.preventDefault();\n let frame = this._getFrame();\n let frameSrc = frame.src;\n if (frameSrc == null || frameSrc !== this._getSrc()) {\n this._setSrc();\n } else {\n this._clear();\n }\n }\n\n setSrc(event?: Event) {\n event?.preventDefault();\n this._setSrc();\n }\n\n clear(event?: Event) {\n event?.preventDefault();\n this._clear();\n }\n\n private _setSrc() {\n let frame = this._getFrame();\n if (this.hasLoadingMessageValue) {\n frame.innerHTML = this.loadingMessageValue;\n }\n frame.src = this._getSrc();\n }\n\n private _clear() {\n let frame = this._getFrame();\n frame.src = \"\";\n frame.innerHTML = \"\";\n }\n\n private _getFrame(): TurboFrame {\n let frame = document.getElementById(`${this.frameIdValue}`);\n if (frame == null) {\n throw new Error(`Could not find frame with ID '${this.frameIdValue}'`);\n }\n if (!isTurboFrame(frame)) {\n throw new Error(`Element targeted by ID '${this.frameIdValue}'`);\n } else {\n return frame;\n }\n }\n\n private _getSrc(): string {\n let element = this.el;\n if (this.hasSrcValue) {\n return this.srcValue;\n } else if (isHTMLAnchorElement(element)) {\n return element.href;\n } else {\n throw new Error(\"No link given to drive frame to\");\n }\n }\n\n}\n","import {BaseController} from \"../utilities/base_controller\";\nimport {isTurboFrame} from \"../utilities/turbo\";\nimport {useTimeout} from \"../mixins/use_timeout\";\n\n// noinspection SillyAssignmentJS\nexport class TurboFrameRefreshController extends BaseController {\n\n static values = {\n interval: Number,\n poll: Boolean,\n };\n\n declare readonly intervalValue: number;\n declare readonly pollValue: boolean;\n declare readonly hasPollValue: boolean;\n\n get _poll(): boolean {\n return this.hasPollValue ? this.pollValue : false;\n }\n\n connect() {\n let element = this.el;\n if (isTurboFrame(element)) {\n if (!!element.src) {\n throw new Error('The provided <turbo-frame> element has no `src` attribute.');\n }\n } else {\n throw new Error('Expected controller to be mounted on a <turbo-frame> element.');\n }\n if (this._poll) {\n requestAnimationFrame(() => useTimeout(this, this.refresh, this.intervalValue));\n }\n }\n\n refresh(event?: Event) {\n event?.preventDefault();\n let element = this.el as TurboFrame;\n element.src = element.src;\n }\n\n}\n"],"names":["Controller","camelCase","debounce","upperFirst","clamp","isPast","intervalToDuration","formatDuration","toDate","formatDistanceToNow","_get","_set"],"mappings":"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"}