j1-template 2021.3.2 → 2022.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (276) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/blocks/ads/ad.html +14 -14
  3. data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +4 -4
  4. data/_includes/themes/j1/layouts/content_generator_post.html +4 -4
  5. data/_includes/themes/j1/modules/connectors/analytic/google-analytics.html +3 -13
  6. data/_includes/themes/j1/modules/connectors/comment/hyvor.html +4 -5
  7. data/_includes/themes/j1/modules/navigator/generator.html +9 -11
  8. data/_includes/themes/j1/modules/search/docsearch.html +1 -1
  9. data/_includes/themes/j1/procedures/global/create_bs_button.proc +5 -5
  10. data/_includes/themes/j1/procedures/global/create_word_cloud.proc +5 -3
  11. data/_includes/themes/j1/procedures/layouts/module_writer.proc +1 -1
  12. data/_includes/themes/j1/procedures/posts/collate_timeline.proc +3 -3
  13. data/_includes/themes/j1/procedures/posts/create_series_header.proc +1 -1
  14. data/_layouts/default.html +66 -22
  15. data/_layouts/home.html +1 -1
  16. data/_layouts/raw.html +2 -1
  17. data/assets/data/article_navigator/index.html +1 -1
  18. data/assets/data/authclient.html +11 -11
  19. data/assets/data/banner.html +7 -25
  20. data/assets/data/cookieconsent.html +20 -20
  21. data/assets/data/{fam.html → fab.html} +42 -24
  22. data/assets/data/gallery_customizer.html +6 -6
  23. data/assets/data/menu.html +13 -13
  24. data/assets/data/mmenu.html +2 -2
  25. data/assets/data/panel.html +17 -23
  26. data/assets/data/private.json +1 -1
  27. data/assets/data/quicklinks.html +6 -7
  28. data/assets/data/rtext_resizer.html +1 -1
  29. data/assets/data/themes.bootswatch.json +75 -0
  30. data/assets/data/themes.json +6 -6
  31. data/assets/data/translator.html +23 -23
  32. data/assets/error_pages/HTTP445.html +110 -0
  33. data/assets/themes/j1/adapter/js/bmd.js +1 -1
  34. data/assets/themes/j1/adapter/js/clipboard.js +1 -1
  35. data/assets/themes/j1/adapter/js/cookieConsent.js +19 -10
  36. data/assets/themes/j1/adapter/js/{fam.js → fab.js} +121 -116
  37. data/assets/themes/j1/adapter/js/j1.js +258 -190
  38. data/assets/themes/j1/adapter/js/mmenu.js +18 -24
  39. data/assets/themes/j1/adapter/js/navigator.js +6 -4
  40. data/assets/themes/j1/adapter/js/themer.js +13 -4
  41. data/assets/themes/j1/adapter/js/toccer.js +37 -76
  42. data/assets/themes/j1/adapter/js/translator.js +10 -2
  43. data/assets/themes/j1/core/country-flags/css/theme/uno.min.css +15 -0
  44. data/assets/themes/j1/core/css/icon-fonts/mdi.css +22307 -0
  45. data/assets/themes/j1/core/css/icon-fonts/mdi.min.css +1 -0
  46. data/assets/themes/j1/core/css/icon-fonts/mdil.css +1222 -0
  47. data/assets/themes/j1/core/css/icon-fonts/mdil.min.css +1 -0
  48. data/assets/themes/j1/core/css/icon-fonts/twemoji.css +4 -0
  49. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.css +5341 -4730
  50. data/assets/themes/j1/core/css/themes/bootstrap/bootstrap.min.css +3 -1
  51. data/assets/themes/j1/core/css/themes/theme_vapor/bootstrap.css +8301 -0
  52. data/assets/themes/j1/core/css/themes/theme_vapor/bootstrap.min.css +3 -0
  53. data/assets/themes/j1/core/css/themes/{uno-dark → unodark}/bootstrap.css +5284 -4646
  54. data/assets/themes/j1/core/css/themes/unodark/bootstrap.min.css +3 -0
  55. data/assets/themes/j1/core/css/themes/{uno-light → unolight}/bootstrap.css +12188 -12734
  56. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +23 -0
  57. data/assets/themes/j1/core/css/vendor.css +2 -28
  58. data/assets/themes/j1/core/css/vendor.min.css +1 -1
  59. data/assets/themes/j1/core/js/template.js +111 -29
  60. data/assets/themes/j1/core/js/template.min.js +1 -1
  61. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  62. data/assets/themes/j1/modules/bmd/js/bmd.js +2280 -0
  63. data/assets/themes/j1/modules/bmd/js/bmd.min.js +20 -0
  64. data/assets/themes/j1/modules/bootstrap/js/bootstrap.js +5072 -0
  65. data/assets/themes/j1/modules/bootstrap/js/bootstrap.min.js +7 -0
  66. data/assets/themes/j1/modules/bootstrap/js/bootstrap.min.js.map +1 -0
  67. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +19 -17
  68. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.min.js +1 -1
  69. data/assets/themes/j1/modules/cryptoJS/js/aes.js +35 -0
  70. data/assets/themes/j1/modules/cryptoJS/js/aes.min.js +35 -0
  71. data/assets/themes/j1/modules/cryptoJS/js/hmac-md5.js +21 -0
  72. data/assets/themes/j1/modules/cryptoJS/js/hmac-ripemd160.js +31 -0
  73. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha1.js +17 -0
  74. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha224.js +19 -0
  75. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha256.js +18 -0
  76. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha3.js +21 -0
  77. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha384.js +27 -0
  78. data/assets/themes/j1/modules/cryptoJS/js/hmac-sha512.js +25 -0
  79. data/assets/themes/j1/modules/cryptoJS/js/md5.js +19 -0
  80. data/assets/themes/j1/modules/cryptoJS/js/pbkdf2.js +19 -0
  81. data/assets/themes/j1/modules/cryptoJS/js/rabbit-legacy.js +36 -0
  82. data/assets/themes/j1/modules/cryptoJS/js/rabbit.js +36 -0
  83. data/assets/themes/j1/modules/cryptoJS/js/rc4.js +33 -0
  84. data/assets/themes/j1/modules/cryptoJS/js/ripemd160.js +29 -0
  85. data/assets/themes/j1/modules/cryptoJS/js/sha1.js +15 -0
  86. data/assets/themes/j1/modules/cryptoJS/js/sha224.js +17 -0
  87. data/assets/themes/j1/modules/cryptoJS/js/sha256.js +16 -0
  88. data/assets/themes/j1/modules/cryptoJS/js/sha3.js +19 -0
  89. data/assets/themes/j1/modules/cryptoJS/js/sha384.js +25 -0
  90. data/assets/themes/j1/modules/cryptoJS/js/sha512.js +23 -0
  91. data/assets/themes/j1/modules/cryptoJS/js/tripledes.js +51 -0
  92. data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.2.js +460 -0
  93. data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.js +379 -353
  94. data/assets/themes/j1/modules/deeplAPI/js/deeplAPI.min.js +1 -1
  95. data/assets/themes/j1/modules/{fam/css/theme/uno/fam.css → fab/css/theme/uno/fab.css} +32 -28
  96. data/assets/themes/j1/modules/{fam/css/theme/uno/fam.min.css → fab/css/theme/uno/fab.min.css} +3 -3
  97. data/assets/themes/j1/modules/{materialize → fab}/js/cash.js +20 -2
  98. data/assets/themes/j1/modules/{fam/js/fam.js → fab/js/fab.js} +4 -2
  99. data/assets/themes/j1/modules/gtag-opt-in/js/gtag-opt-in.js +107 -0
  100. data/assets/themes/j1/modules/{util/js/gtag-opt-in.js → gtag-opt-in/js/gtag-opt-in.min.js} +15 -1
  101. data/assets/themes/j1/modules/lightGallery/js/modules/lg-thumbnail.min.js +4 -1
  102. data/assets/themes/j1/modules/materialize/js/autocomplete.js +1 -1
  103. data/assets/themes/j1/modules/materialize/js/bin/materialize.js +12374 -0
  104. data/assets/themes/j1/modules/materialize/js/bin/materialize.min.js +6 -0
  105. data/assets/themes/j1/modules/materialize/js/global.js +1 -1
  106. data/assets/themes/j1/modules/materialize/js/select.js +1 -1
  107. data/assets/themes/j1/modules/materialize/js/{tapTarget.js → tapTarget.cash.js} +1 -1
  108. data/assets/themes/j1/modules/materialize/js/tapTarget.jQuery.js +187 -0
  109. data/assets/themes/j1/modules/msDropdown/css/themes/uno/msDropdown.css +278 -0
  110. data/assets/themes/j1/modules/popper/js/popper.js +1670 -2346
  111. data/assets/themes/j1/modules/popper/js/popper.min.js +6 -4
  112. data/assets/themes/j1/modules/popper/js/popper.min.js.map +1 -1
  113. data/assets/themes/j1/modules/scroller/js/scroller.js +6 -6
  114. data/assets/themes/j1/modules/scroller/js/scroller.min.js +1 -1
  115. data/assets/themes/j1/modules/translator/js/translator.js +6 -2
  116. data/assets/themes/j1/modules/translator/js/translator.min.js +1 -1
  117. data/assets/themes/j1/modules/twemoji/js/picker/twemoji-picker.js +2 -2
  118. data/assets/themes/j1/modules/twemoji/js/picker/twemoji-picker.min.js +1 -1
  119. data/exe/j1 +6 -7
  120. data/lib/j1/commands/generate.rb +15 -16
  121. data/lib/j1/version.rb +1 -1
  122. data/lib/starter_web/Gemfile +7 -1
  123. data/lib/starter_web/_config.yml +21 -24
  124. data/lib/starter_web/_data/_defaults/j1_config.yml +1 -1
  125. data/lib/starter_web/_data/_defaults/private.yml +3 -2
  126. data/lib/starter_web/_data/_defaults/resources.yml +1 -1
  127. data/lib/starter_web/_data/blocks/banner.yml +71 -68
  128. data/lib/starter_web/_data/blocks/defaults/banner.yml +5 -5
  129. data/lib/starter_web/_data/blocks/defaults/panel.yml +3 -3
  130. data/lib/starter_web/_data/blocks/panel.yml +171 -73
  131. data/lib/starter_web/_data/builder/defaults/_blog_navigator.yml +396 -0
  132. data/lib/starter_web/_data/builder/defaults/blog_navigator.yml +77 -64
  133. data/lib/starter_web/_data/j1_config.yml +3 -3
  134. data/lib/starter_web/_data/layouts/article_navigator.yml +1 -1
  135. data/lib/starter_web/_data/layouts/blog_archive.yml +1 -1
  136. data/lib/starter_web/_data/layouts/collection.yml +1 -1
  137. data/lib/starter_web/_data/layouts/default.yml +1 -1
  138. data/lib/starter_web/_data/layouts/home.yml +6 -26
  139. data/lib/starter_web/_data/layouts/news_panel_posts.yml +1 -1
  140. data/lib/starter_web/_data/layouts/page.yml +1 -1
  141. data/lib/starter_web/_data/layouts/post.yml +1 -1
  142. data/lib/starter_web/_data/modules/defaults/attics.yml +1 -1
  143. data/lib/starter_web/_data/modules/defaults/{fam.yml → fab.yml} +8 -7
  144. data/lib/starter_web/_data/modules/defaults/navigator.yml +3 -0
  145. data/lib/starter_web/_data/modules/defaults/rtable.yml +2 -1
  146. data/lib/starter_web/_data/modules/defaults/scoller.yml +33 -0
  147. data/lib/starter_web/_data/modules/defaults/themer.yml +1 -1
  148. data/lib/starter_web/_data/modules/defaults/toccer.yml +5 -4
  149. data/lib/starter_web/_data/modules/{fam.yml → fab.yml} +31 -31
  150. data/lib/starter_web/_data/modules/scroller.yml +2 -2
  151. data/lib/starter_web/_data/modules/toccer.yml +3 -5
  152. data/lib/starter_web/_data/modules/translator.yml +3 -3
  153. data/lib/starter_web/_data/private.yml +3 -2
  154. data/lib/starter_web/_data/resources.yml +72 -33
  155. data/lib/starter_web/_includes/attributes.asciidoc +121 -122
  156. data/lib/starter_web/_plugins/encodeBase64.rb +46 -0
  157. data/lib/starter_web/_plugins/encryptAES.rb +53 -0
  158. data/lib/starter_web/_plugins/filters.rb +2 -1
  159. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  160. data/lib/starter_web/_plugins/minifyJSON.rb +2 -2
  161. data/lib/starter_web/assets/images/pages/roundtrip/500_themes/themes-menu-1280x800.jpg +0 -0
  162. data/lib/starter_web/collections/posts/public/featured/_posts/0000-00-00-welcome-to-j1.adoc.erb +1 -4
  163. data/lib/starter_web/collections/posts/public/featured/_posts/2021-01-01-about-cookies.adoc +2 -2
  164. data/lib/starter_web/collections/posts/public/featured/_posts/2021-02-01-site-generators.adoc +2 -2
  165. data/lib/starter_web/collections/posts/public/featured/_posts/2021-03-03-about-j1.adoc +2 -2
  166. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-01-post-wiki-series.adoc +1 -1
  167. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-02-post-wiki-series.adoc +1 -1
  168. data/lib/starter_web/collections/posts/public/series/_posts/2020-01-03-post-wiki-series.adoc +2 -2
  169. data/lib/starter_web/index.html +1 -1
  170. data/lib/starter_web/package.json +1 -1
  171. data/lib/starter_web/pages/_test_pages/100_side-bar-tester.adoc +244 -0
  172. data/lib/starter_web/pages/_test_pages/_includes/attributes.asciidoc +110 -0
  173. data/lib/starter_web/pages/_test_pages/_includes/documents/100_gistblock.asciidoc +28 -0
  174. data/lib/starter_web/pages/_test_pages/_includes/documents/410_bottom_info.asciidoc +14 -0
  175. data/lib/starter_web/pages/_test_pages/_includes/documents/410_bottom_left_warning.asciidoc +11 -0
  176. data/lib/starter_web/pages/_test_pages/_includes/documents/410_bottom_right_danger.asciidoc +11 -0
  177. data/lib/starter_web/pages/_test_pages/_includes/documents/410_central_success.asciidoc +11 -0
  178. data/lib/starter_web/pages/_test_pages/_includes/documents/410_full_height_left_info.asciidoc +11 -0
  179. data/lib/starter_web/pages/_test_pages/_includes/documents/410_full_height_right_success.asciidoc +11 -0
  180. data/lib/starter_web/pages/_test_pages/_includes/documents/410_table_bs_modal_examples.asciidoc +47 -0
  181. data/lib/starter_web/pages/_test_pages/_includes/documents/410_top_info.asciidoc +11 -0
  182. data/lib/starter_web/pages/_test_pages/_includes/documents/410_top_left_info.asciidoc +11 -0
  183. data/lib/starter_web/pages/_test_pages/_includes/documents/410_top_right_success.asciidoc +11 -0
  184. data/lib/starter_web/pages/_test_pages/_includes/documents/419_advanced_modals_demo.asciidoc +337 -0
  185. data/lib/starter_web/pages/_test_pages/_includes/documents/tables/bs_modal_examples.asciidoc +47 -0
  186. data/lib/starter_web/pages/_test_pages/accordion-01-tester.adoc +220 -0
  187. data/lib/starter_web/pages/_test_pages/accordion-02-tester.adoc +177 -0
  188. data/lib/starter_web/pages/_test_pages/accordion-03-tester.adoc +148 -0
  189. data/lib/starter_web/pages/_test_pages/attribute-changes-01-tester.adoc +226 -0
  190. data/lib/starter_web/pages/_test_pages/backdrop-tester.adoc +109 -0
  191. data/lib/starter_web/pages/_test_pages/button-tester-1.adoc +127 -0
  192. data/lib/starter_web/pages/_test_pages/card-tester.adoc +128 -0
  193. data/lib/starter_web/pages/_test_pages/cookieConsent.adoc +96 -0
  194. data/lib/starter_web/pages/_test_pages/deepl.0.adoc +258 -0
  195. data/lib/starter_web/pages/_test_pages/deepl.adoc +204 -0
  196. data/lib/starter_web/pages/_test_pages/desandro-button.adoc +171 -0
  197. data/lib/starter_web/pages/_test_pages/desandro.adoc +147 -0
  198. data/lib/starter_web/pages/_test_pages/flipcard-1-tester.adoc +308 -0
  199. data/lib/starter_web/pages/_test_pages/formular-01-tester.adoc +167 -0
  200. data/lib/starter_web/pages/_test_pages/formular-02-tester.adoc +727 -0
  201. data/lib/starter_web/pages/_test_pages/google-translate-tester.0.adoc +113 -0
  202. data/lib/starter_web/pages/_test_pages/google-translate-tester.1.adoc +233 -0
  203. data/lib/starter_web/pages/_test_pages/google-translate-tester.3.adoc +149 -0
  204. data/lib/starter_web/pages/_test_pages/google-translate-tester.4.adoc +239 -0
  205. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester-2.adoc +183 -0
  206. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester-3.adoc +235 -0
  207. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester-4.adoc +222 -0
  208. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester-5.adoc +119 -0
  209. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester.1.adoc +236 -0
  210. data/lib/starter_web/pages/_test_pages/infinite-scroll-tester.adoc +225 -0
  211. data/lib/starter_web/pages/_test_pages/list-group-tester.adoc +265 -0
  212. data/lib/starter_web/pages/_test_pages/tictok.adoc +127 -0
  213. data/lib/starter_web/pages/public/about/about_site.adoc +1 -1
  214. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/000_intro.adoc +1 -1
  215. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/100_converter.adoc +1 -1
  216. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/200_themes.adoc +1 -1
  217. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.a2p +1 -1
  218. data/lib/starter_web/pages/public/asciidoc_skeletons/documentation/documentation.adoc +2 -2
  219. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +2 -2
  220. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +2 -2
  221. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +5 -5
  222. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +4 -4
  223. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +4 -3
  224. data/lib/starter_web/pages/public/blog/navigator/archive.html +4 -4
  225. data/lib/starter_web/pages/public/blog/navigator/index.html +1 -1
  226. data/lib/starter_web/pages/public/learn/quickstart.adoc +3 -3
  227. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +2 -2
  228. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +2 -2
  229. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +6 -7
  230. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +2 -2
  231. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +2 -2
  232. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +3 -3
  233. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +2 -2
  234. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +4 -4
  235. data/lib/starter_web/pages/public/learn/roundtrip/600_quicksearch.adoc +13 -11
  236. data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +1 -1
  237. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_bottom_info.asciidoc +3 -3
  238. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_bottom_left_warning.asciidoc +1 -1
  239. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_bottom_right_danger.asciidoc +1 -1
  240. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_central_success.asciidoc +1 -1
  241. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_full_height_left_info.asciidoc +1 -1
  242. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_full_height_right_success.asciidoc +1 -1
  243. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_top_info.asciidoc +1 -1
  244. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_top_left_info.asciidoc +1 -1
  245. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/410_top_right_success.asciidoc +1 -1
  246. data/lib/starter_web/pages/public/learn/roundtrip/_includes/documents/419_advanced_modals_demo.asciidoc +51 -51
  247. data/lib/starter_web/pages/public/learn/where_to_go.adoc +3 -3
  248. data/lib/starter_web/pages/public/legal/de/100_copyright.adoc +3 -3
  249. data/lib/starter_web/pages/public/legal/de/100_impress.adoc +3 -3
  250. data/lib/starter_web/pages/public/legal/de/300_privacy.adoc +7 -7
  251. data/lib/starter_web/pages/public/legal/de/400_comment_policy.adoc +3 -3
  252. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +3 -3
  253. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +3 -3
  254. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +6 -7
  255. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +3 -3
  256. data/lib/starter_web/pages/public/manuals/dropdown-help.adoc +1 -1
  257. data/lib/starter_web/pages/public/panels/intro_panel/_includes/attributes.asciidoc +55 -0
  258. data/lib/starter_web/pages/public/panels/intro_panel/panel.adoc +53 -5
  259. data/lib/starter_web/pages/public/previewer/preview_bootstrap_theme.adoc +1688 -686
  260. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  261. data/lib/starter_web/utilsrv/package.json +1 -1
  262. metadata +107 -29
  263. data/assets/themes/j1/core/css/themes/uno-dark/bootstrap.min.css +0 -1
  264. data/assets/themes/j1/core/css/themes/uno-light/bootstrap.min.css +0 -23
  265. data/assets/themes/j1/modules/bmd/css/bootstrap-material-design.css +0 -12177
  266. data/assets/themes/j1/modules/bmd/css/bootstrap-material-design.min.css +0 -8
  267. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.full.js +0 -6930
  268. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.js +0 -6936
  269. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.js.map +0 -1
  270. data/assets/themes/j1/modules/bmd/js/bootstrap-material-design.min.js +0 -1
  271. data/assets/themes/j1/modules/popper/js/popper.js.map +0 -1
  272. data/assets/themes/j1/modules/util/js/domready.js +0 -146
  273. data/lib/j1/commands/help.rb +0 -32
  274. data/lib/j1/commands/module.rb +0 -69
  275. data/lib/starter_web/_data/blocks/defaults/panel.1.yml +0 -256
  276. data/lib/starter_web/_data/blocks/defaults/panel.2.yml +0 -250
@@ -0,0 +1,5072 @@
1
+ /*!
2
+ * Bootstrap v5.1.3 (https://getbootstrap.com/)
3
+ * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ */
6
+ (function (global, factory) {
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :
8
+ typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :
9
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));
10
+ })(this, (function (Popper) { 'use strict';
11
+
12
+ function _interopNamespace(e) {
13
+ if (e && e.__esModule) return e;
14
+ const n = Object.create(null);
15
+ if (e) {
16
+ for (const k in e) {
17
+ if (k !== 'default') {
18
+ const d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: () => e[k]
22
+ });
23
+ }
24
+ }
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);
31
+
32
+ /**
33
+ * --------------------------------------------------------------------------
34
+ * Bootstrap (v5.1.3): util/index.js
35
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
36
+ * --------------------------------------------------------------------------
37
+ */
38
+ const MAX_UID = 1000000;
39
+ const MILLISECONDS_MULTIPLIER = 1000;
40
+ const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
41
+
42
+ const toType = obj => {
43
+ if (obj === null || obj === undefined) {
44
+ return `${obj}`;
45
+ }
46
+
47
+ return Object.prototype.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
48
+ };
49
+ /**
50
+ * Public Util API
51
+ */
52
+
53
+
54
+ const getUID = prefix => {
55
+ do {
56
+ prefix += Math.floor(Math.random() * MAX_UID);
57
+ } while (document.getElementById(prefix));
58
+
59
+ return prefix;
60
+ };
61
+
62
+ const getSelector = element => {
63
+ let selector = element.getAttribute('data-bs-target');
64
+
65
+ if (!selector || selector === '#') {
66
+ let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,
67
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
68
+ // `document.querySelector` will rightfully complain it is invalid.
69
+ // See https://github.com/twbs/bootstrap/issues/32273
70
+
71
+ if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {
72
+ return null;
73
+ } // Just in case some CMS puts out a full URL with the anchor appended
74
+
75
+
76
+ if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {
77
+ hrefAttr = `#${hrefAttr.split('#')[1]}`;
78
+ }
79
+
80
+ selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;
81
+ }
82
+
83
+ return selector;
84
+ };
85
+
86
+ const getSelectorFromElement = element => {
87
+ const selector = getSelector(element);
88
+
89
+ if (selector) {
90
+ return document.querySelector(selector) ? selector : null;
91
+ }
92
+
93
+ return null;
94
+ };
95
+
96
+ const getElementFromSelector = element => {
97
+ const selector = getSelector(element);
98
+ return selector ? document.querySelector(selector) : null;
99
+ };
100
+
101
+ const getTransitionDurationFromElement = element => {
102
+ if (!element) {
103
+ return 0;
104
+ } // Get transition-duration of the element
105
+
106
+
107
+ let {
108
+ transitionDuration,
109
+ transitionDelay
110
+ } = window.getComputedStyle(element);
111
+ const floatTransitionDuration = Number.parseFloat(transitionDuration);
112
+ const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found
113
+
114
+ if (!floatTransitionDuration && !floatTransitionDelay) {
115
+ return 0;
116
+ } // If multiple durations are defined, take the first
117
+
118
+
119
+ transitionDuration = transitionDuration.split(',')[0];
120
+ transitionDelay = transitionDelay.split(',')[0];
121
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
122
+ };
123
+
124
+ const triggerTransitionEnd = element => {
125
+ element.dispatchEvent(new Event(TRANSITION_END));
126
+ };
127
+
128
+ const isElement = obj => {
129
+ if (!obj || typeof obj !== 'object') {
130
+ return false;
131
+ }
132
+
133
+ if (typeof obj.jquery !== 'undefined') {
134
+ obj = obj[0];
135
+ }
136
+
137
+ return typeof obj.nodeType !== 'undefined';
138
+ };
139
+
140
+ const getElement = obj => {
141
+ // it's a jQuery object or a node element
142
+ if (isElement(obj)) {
143
+ return obj.jquery ? obj[0] : obj;
144
+ }
145
+
146
+ if (typeof obj === 'string' && obj.length > 0) {
147
+ return document.querySelector(obj);
148
+ }
149
+
150
+ return null;
151
+ };
152
+
153
+ const typeCheckConfig = (componentName, config, configTypes) => {
154
+ for (const property of Object.keys(configTypes)) {
155
+ const expectedTypes = configTypes[property];
156
+ const value = config[property];
157
+ const valueType = value && isElement(value) ? 'element' : toType(value);
158
+
159
+ if (!new RegExp(expectedTypes).test(valueType)) {
160
+ throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
161
+ }
162
+ }
163
+ };
164
+
165
+ const isVisible = element => {
166
+ if (!isElement(element) || element.getClientRects().length === 0) {
167
+ return false;
168
+ }
169
+
170
+ return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
171
+ };
172
+
173
+ const isDisabled = element => {
174
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
175
+ return true;
176
+ }
177
+
178
+ if (element.classList.contains('disabled')) {
179
+ return true;
180
+ }
181
+
182
+ if (typeof element.disabled !== 'undefined') {
183
+ return element.disabled;
184
+ }
185
+
186
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';
187
+ };
188
+
189
+ const findShadowRoot = element => {
190
+ if (!document.documentElement.attachShadow) {
191
+ return null;
192
+ } // Can find the shadow root otherwise it'll return the document
193
+
194
+
195
+ if (typeof element.getRootNode === 'function') {
196
+ const root = element.getRootNode();
197
+ return root instanceof ShadowRoot ? root : null;
198
+ }
199
+
200
+ if (element instanceof ShadowRoot) {
201
+ return element;
202
+ } // when we don't find a shadow root
203
+
204
+
205
+ if (!element.parentNode) {
206
+ return null;
207
+ }
208
+
209
+ return findShadowRoot(element.parentNode);
210
+ };
211
+
212
+ const noop = () => {};
213
+ /**
214
+ * Trick to restart an element's animation
215
+ *
216
+ * @param {HTMLElement} element
217
+ * @return void
218
+ *
219
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
220
+ */
221
+
222
+
223
+ const reflow = element => {
224
+ element.offsetHeight; // eslint-disable-line no-unused-expressions
225
+ };
226
+
227
+ const getjQuery = () => {
228
+ const {
229
+ jQuery
230
+ } = window;
231
+
232
+ if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
233
+ return jQuery;
234
+ }
235
+
236
+ return null;
237
+ };
238
+
239
+ const DOMContentLoadedCallbacks = [];
240
+
241
+ const onDOMContentLoaded = callback => {
242
+ if (document.readyState === 'loading') {
243
+ // add listener on the first call when the document is in loading state
244
+ if (!DOMContentLoadedCallbacks.length) {
245
+ document.addEventListener('DOMContentLoaded', () => {
246
+ for (const callback of DOMContentLoadedCallbacks) {
247
+ callback();
248
+ }
249
+ });
250
+ }
251
+
252
+ DOMContentLoadedCallbacks.push(callback);
253
+ } else {
254
+ callback();
255
+ }
256
+ };
257
+
258
+ const isRTL = () => document.documentElement.dir === 'rtl';
259
+
260
+ const defineJQueryPlugin = plugin => {
261
+ onDOMContentLoaded(() => {
262
+ const $ = getjQuery();
263
+ /* istanbul ignore if */
264
+
265
+ if ($) {
266
+ const name = plugin.NAME;
267
+ const JQUERY_NO_CONFLICT = $.fn[name];
268
+ $.fn[name] = plugin.jQueryInterface;
269
+ $.fn[name].Constructor = plugin;
270
+
271
+ $.fn[name].noConflict = () => {
272
+ $.fn[name] = JQUERY_NO_CONFLICT;
273
+ return plugin.jQueryInterface;
274
+ };
275
+ }
276
+ });
277
+ };
278
+
279
+ const execute = callback => {
280
+ if (typeof callback === 'function') {
281
+ callback();
282
+ }
283
+ };
284
+
285
+ const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
286
+ if (!waitForTransition) {
287
+ execute(callback);
288
+ return;
289
+ }
290
+
291
+ const durationPadding = 5;
292
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
293
+ let called = false;
294
+
295
+ const handler = ({
296
+ target
297
+ }) => {
298
+ if (target !== transitionElement) {
299
+ return;
300
+ }
301
+
302
+ called = true;
303
+ transitionElement.removeEventListener(TRANSITION_END, handler);
304
+ execute(callback);
305
+ };
306
+
307
+ transitionElement.addEventListener(TRANSITION_END, handler);
308
+ setTimeout(() => {
309
+ if (!called) {
310
+ triggerTransitionEnd(transitionElement);
311
+ }
312
+ }, emulatedDuration);
313
+ };
314
+ /**
315
+ * Return the previous/next element of a list.
316
+ *
317
+ * @param {array} list The list of elements
318
+ * @param activeElement The active element
319
+ * @param shouldGetNext Choose to get next or previous element
320
+ * @param isCycleAllowed
321
+ * @return {Element|elem} The proper element
322
+ */
323
+
324
+
325
+ const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
326
+ let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed
327
+
328
+ if (index === -1) {
329
+ return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];
330
+ }
331
+
332
+ const listLength = list.length;
333
+ index += shouldGetNext ? 1 : -1;
334
+
335
+ if (isCycleAllowed) {
336
+ index = (index + listLength) % listLength;
337
+ }
338
+
339
+ return list[Math.max(0, Math.min(index, listLength - 1))];
340
+ };
341
+
342
+ /**
343
+ * --------------------------------------------------------------------------
344
+ * Bootstrap (v5.1.3): dom/event-handler.js
345
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
346
+ * --------------------------------------------------------------------------
347
+ */
348
+ /**
349
+ * Constants
350
+ */
351
+
352
+ const namespaceRegex = /[^.]*(?=\..*)\.|.*/;
353
+ const stripNameRegex = /\..*/;
354
+ const stripUidRegex = /::\d+$/;
355
+ const eventRegistry = {}; // Events storage
356
+
357
+ let uidEvent = 1;
358
+ const customEvents = {
359
+ mouseenter: 'mouseover',
360
+ mouseleave: 'mouseout'
361
+ };
362
+ const customEventsRegex = /^(mouseenter|mouseleave)/i;
363
+ const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);
364
+ /**
365
+ * Private methods
366
+ */
367
+
368
+ function getUidEvent(element, uid) {
369
+ return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
370
+ }
371
+
372
+ function getEvent(element) {
373
+ const uid = getUidEvent(element);
374
+ element.uidEvent = uid;
375
+ eventRegistry[uid] = eventRegistry[uid] || {};
376
+ return eventRegistry[uid];
377
+ }
378
+
379
+ function bootstrapHandler(element, fn) {
380
+ return function handler(event) {
381
+ event.delegateTarget = element;
382
+
383
+ if (handler.oneOff) {
384
+ EventHandler.off(element, event.type, fn);
385
+ }
386
+
387
+ return fn.apply(element, [event]);
388
+ };
389
+ }
390
+
391
+ function bootstrapDelegationHandler(element, selector, fn) {
392
+ return function handler(event) {
393
+ const domElements = element.querySelectorAll(selector);
394
+
395
+ for (let {
396
+ target
397
+ } = event; target && target !== this; target = target.parentNode) {
398
+ for (let i = domElements.length; i--;) {
399
+ if (domElements[i] === target) {
400
+ event.delegateTarget = target;
401
+
402
+ if (handler.oneOff) {
403
+ EventHandler.off(element, event.type, selector, fn);
404
+ }
405
+
406
+ return fn.apply(target, [event]);
407
+ }
408
+ }
409
+ } // To please ESLint
410
+
411
+
412
+ return null;
413
+ };
414
+ }
415
+
416
+ function findHandler(events, handler, delegationSelector = null) {
417
+ const uidEventList = Object.keys(events);
418
+
419
+ for (const uidEvent of uidEventList) {
420
+ const event = events[uidEvent];
421
+
422
+ if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {
423
+ return event;
424
+ }
425
+ }
426
+
427
+ return null;
428
+ }
429
+
430
+ function normalizeParams(originalTypeEvent, handler, delegationFn) {
431
+ const delegation = typeof handler === 'string';
432
+ const originalHandler = delegation ? delegationFn : handler;
433
+ let typeEvent = getTypeEvent(originalTypeEvent);
434
+ const isNative = nativeEvents.has(typeEvent);
435
+
436
+ if (!isNative) {
437
+ typeEvent = originalTypeEvent;
438
+ }
439
+
440
+ return [delegation, originalHandler, typeEvent];
441
+ }
442
+
443
+ function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {
444
+ if (typeof originalTypeEvent !== 'string' || !element) {
445
+ return;
446
+ }
447
+
448
+ if (!handler) {
449
+ handler = delegationFn;
450
+ delegationFn = null;
451
+ } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position
452
+ // this prevents the handler from being dispatched the same way as mouseover or mouseout does
453
+
454
+
455
+ if (customEventsRegex.test(originalTypeEvent)) {
456
+ const wrapFn = fn => {
457
+ return function (event) {
458
+ if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
459
+ return fn.call(this, event);
460
+ }
461
+ };
462
+ };
463
+
464
+ if (delegationFn) {
465
+ delegationFn = wrapFn(delegationFn);
466
+ } else {
467
+ handler = wrapFn(handler);
468
+ }
469
+ }
470
+
471
+ const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
472
+ const events = getEvent(element);
473
+ const handlers = events[typeEvent] || (events[typeEvent] = {});
474
+ const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);
475
+
476
+ if (previousFn) {
477
+ previousFn.oneOff = previousFn.oneOff && oneOff;
478
+ return;
479
+ }
480
+
481
+ const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));
482
+ const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);
483
+ fn.delegationSelector = delegation ? handler : null;
484
+ fn.originalHandler = originalHandler;
485
+ fn.oneOff = oneOff;
486
+ fn.uidEvent = uid;
487
+ handlers[uid] = fn;
488
+ element.addEventListener(typeEvent, fn, delegation);
489
+ }
490
+
491
+ function removeHandler(element, events, typeEvent, handler, delegationSelector) {
492
+ const fn = findHandler(events[typeEvent], handler, delegationSelector);
493
+
494
+ if (!fn) {
495
+ return;
496
+ }
497
+
498
+ element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));
499
+ delete events[typeEvent][fn.uidEvent];
500
+ }
501
+
502
+ function removeNamespacedHandlers(element, events, typeEvent, namespace) {
503
+ const storeElementEvent = events[typeEvent] || {};
504
+
505
+ for (const handlerKey of Object.keys(storeElementEvent)) {
506
+ if (handlerKey.includes(namespace)) {
507
+ const event = storeElementEvent[handlerKey];
508
+ removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
509
+ }
510
+ }
511
+ }
512
+
513
+ function getTypeEvent(event) {
514
+ // allow to get the native events from namespaced events ('click.bs.button' --> 'click')
515
+ event = event.replace(stripNameRegex, '');
516
+ return customEvents[event] || event;
517
+ }
518
+
519
+ const EventHandler = {
520
+ on(element, event, handler, delegationFn) {
521
+ addHandler(element, event, handler, delegationFn, false);
522
+ },
523
+
524
+ one(element, event, handler, delegationFn) {
525
+ addHandler(element, event, handler, delegationFn, true);
526
+ },
527
+
528
+ off(element, originalTypeEvent, handler, delegationFn) {
529
+ if (typeof originalTypeEvent !== 'string' || !element) {
530
+ return;
531
+ }
532
+
533
+ const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);
534
+ const inNamespace = typeEvent !== originalTypeEvent;
535
+ const events = getEvent(element);
536
+ const isNamespace = originalTypeEvent.startsWith('.');
537
+
538
+ if (typeof originalHandler !== 'undefined') {
539
+ // Simplest case: handler is passed, remove that listener ONLY.
540
+ if (!events || !events[typeEvent]) {
541
+ return;
542
+ }
543
+
544
+ removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);
545
+ return;
546
+ }
547
+
548
+ if (isNamespace) {
549
+ for (const elementEvent of Object.keys(events)) {
550
+ removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
551
+ }
552
+ }
553
+
554
+ const storeElementEvent = events[typeEvent] || {};
555
+
556
+ for (const keyHandlers of Object.keys(storeElementEvent)) {
557
+ const handlerKey = keyHandlers.replace(stripUidRegex, '');
558
+
559
+ if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
560
+ const event = storeElementEvent[keyHandlers];
561
+ removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);
562
+ }
563
+ }
564
+ },
565
+
566
+ trigger(element, event, args) {
567
+ if (typeof event !== 'string' || !element) {
568
+ return null;
569
+ }
570
+
571
+ const $ = getjQuery();
572
+ const typeEvent = getTypeEvent(event);
573
+ const inNamespace = event !== typeEvent;
574
+ const isNative = nativeEvents.has(typeEvent);
575
+ let jQueryEvent;
576
+ let bubbles = true;
577
+ let nativeDispatch = true;
578
+ let defaultPrevented = false;
579
+ let evt = null;
580
+
581
+ if (inNamespace && $) {
582
+ jQueryEvent = $.Event(event, args);
583
+ $(element).trigger(jQueryEvent);
584
+ bubbles = !jQueryEvent.isPropagationStopped();
585
+ nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
586
+ defaultPrevented = jQueryEvent.isDefaultPrevented();
587
+ }
588
+
589
+ if (isNative) {
590
+ evt = document.createEvent('HTMLEvents');
591
+ evt.initEvent(typeEvent, bubbles, true);
592
+ } else {
593
+ evt = new CustomEvent(event, {
594
+ bubbles,
595
+ cancelable: true
596
+ });
597
+ } // merge custom information in our event
598
+
599
+
600
+ if (typeof args !== 'undefined') {
601
+ for (const key of Object.keys(args)) {
602
+ Object.defineProperty(evt, key, {
603
+ get() {
604
+ return args[key];
605
+ }
606
+
607
+ });
608
+ }
609
+ }
610
+
611
+ if (defaultPrevented) {
612
+ evt.preventDefault();
613
+ }
614
+
615
+ if (nativeDispatch) {
616
+ element.dispatchEvent(evt);
617
+ }
618
+
619
+ if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {
620
+ jQueryEvent.preventDefault();
621
+ }
622
+
623
+ return evt;
624
+ }
625
+
626
+ };
627
+
628
+ /**
629
+ * --------------------------------------------------------------------------
630
+ * Bootstrap (v5.1.3): dom/data.js
631
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
632
+ * --------------------------------------------------------------------------
633
+ */
634
+
635
+ /**
636
+ * Constants
637
+ */
638
+ const elementMap = new Map();
639
+ const Data = {
640
+ set(element, key, instance) {
641
+ if (!elementMap.has(element)) {
642
+ elementMap.set(element, new Map());
643
+ }
644
+
645
+ const instanceMap = elementMap.get(element); // make it clear we only want one instance per element
646
+ // can be removed later when multiple key/instances are fine to be used
647
+
648
+ if (!instanceMap.has(key) && instanceMap.size !== 0) {
649
+ // eslint-disable-next-line no-console
650
+ console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
651
+ return;
652
+ }
653
+
654
+ instanceMap.set(key, instance);
655
+ },
656
+
657
+ get(element, key) {
658
+ if (elementMap.has(element)) {
659
+ return elementMap.get(element).get(key) || null;
660
+ }
661
+
662
+ return null;
663
+ },
664
+
665
+ remove(element, key) {
666
+ if (!elementMap.has(element)) {
667
+ return;
668
+ }
669
+
670
+ const instanceMap = elementMap.get(element);
671
+ instanceMap.delete(key); // free up element references if there are no instances left for an element
672
+
673
+ if (instanceMap.size === 0) {
674
+ elementMap.delete(element);
675
+ }
676
+ }
677
+
678
+ };
679
+
680
+ /**
681
+ * --------------------------------------------------------------------------
682
+ * Bootstrap (v5.1.3): base-component.js
683
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
684
+ * --------------------------------------------------------------------------
685
+ */
686
+ /**
687
+ * Constants
688
+ */
689
+
690
+ const VERSION = '5.1.3';
691
+ /**
692
+ * Class definition
693
+ */
694
+
695
+ class BaseComponent {
696
+ constructor(element) {
697
+ element = getElement(element);
698
+
699
+ if (!element) {
700
+ return;
701
+ }
702
+
703
+ this._element = element;
704
+ Data.set(this._element, this.constructor.DATA_KEY, this);
705
+ } // Public
706
+
707
+
708
+ dispose() {
709
+ Data.remove(this._element, this.constructor.DATA_KEY);
710
+ EventHandler.off(this._element, this.constructor.EVENT_KEY);
711
+
712
+ for (const propertyName of Object.getOwnPropertyNames(this)) {
713
+ this[propertyName] = null;
714
+ }
715
+ }
716
+
717
+ _queueCallback(callback, element, isAnimated = true) {
718
+ executeAfterTransition(callback, element, isAnimated);
719
+ } // Static
720
+
721
+
722
+ static getInstance(element) {
723
+ return Data.get(getElement(element), this.DATA_KEY);
724
+ }
725
+
726
+ static getOrCreateInstance(element, config = {}) {
727
+ return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);
728
+ }
729
+
730
+ static get VERSION() {
731
+ return VERSION;
732
+ }
733
+
734
+ static get NAME() {
735
+ throw new Error('You have to implement the static method "NAME" for each component!');
736
+ }
737
+
738
+ static get DATA_KEY() {
739
+ return `bs.${this.NAME}`;
740
+ }
741
+
742
+ static get EVENT_KEY() {
743
+ return `.${this.DATA_KEY}`;
744
+ }
745
+
746
+ }
747
+
748
+ /**
749
+ * --------------------------------------------------------------------------
750
+ * Bootstrap (v5.1.3): util/component-functions.js
751
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
752
+ * --------------------------------------------------------------------------
753
+ */
754
+
755
+ const enableDismissTrigger = (component, method = 'hide') => {
756
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`;
757
+ const name = component.NAME;
758
+ EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
759
+ if (['A', 'AREA'].includes(this.tagName)) {
760
+ event.preventDefault();
761
+ }
762
+
763
+ if (isDisabled(this)) {
764
+ return;
765
+ }
766
+
767
+ const target = getElementFromSelector(this) || this.closest(`.${name}`);
768
+ const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
769
+
770
+ instance[method]();
771
+ });
772
+ };
773
+
774
+ /**
775
+ * --------------------------------------------------------------------------
776
+ * Bootstrap (v5.1.3): alert.js
777
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
778
+ * --------------------------------------------------------------------------
779
+ */
780
+ /**
781
+ * Constants
782
+ */
783
+
784
+ const NAME$e = 'alert';
785
+ const DATA_KEY$c = 'bs.alert';
786
+ const EVENT_KEY$d = `.${DATA_KEY$c}`;
787
+ const EVENT_CLOSE = `close${EVENT_KEY$d}`;
788
+ const EVENT_CLOSED = `closed${EVENT_KEY$d}`;
789
+ const CLASS_NAME_FADE$5 = 'fade';
790
+ const CLASS_NAME_SHOW$8 = 'show';
791
+ /**
792
+ * Class definition
793
+ */
794
+
795
+ class Alert extends BaseComponent {
796
+ // Getters
797
+ static get NAME() {
798
+ return NAME$e;
799
+ } // Public
800
+
801
+
802
+ close() {
803
+ const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
804
+
805
+ if (closeEvent.defaultPrevented) {
806
+ return;
807
+ }
808
+
809
+ this._element.classList.remove(CLASS_NAME_SHOW$8);
810
+
811
+ const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
812
+
813
+ this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
814
+ } // Private
815
+
816
+
817
+ _destroyElement() {
818
+ this._element.remove();
819
+
820
+ EventHandler.trigger(this._element, EVENT_CLOSED);
821
+ this.dispose();
822
+ } // Static
823
+
824
+
825
+ static jQueryInterface(config) {
826
+ return this.each(function () {
827
+ const data = Alert.getOrCreateInstance(this);
828
+
829
+ if (typeof config !== 'string') {
830
+ return;
831
+ }
832
+
833
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
834
+ throw new TypeError(`No method named "${config}"`);
835
+ }
836
+
837
+ data[config](this);
838
+ });
839
+ }
840
+
841
+ }
842
+ /**
843
+ * Data API implementation
844
+ */
845
+
846
+
847
+ enableDismissTrigger(Alert, 'close');
848
+ /**
849
+ * jQuery
850
+ */
851
+
852
+ defineJQueryPlugin(Alert);
853
+
854
+ /**
855
+ * --------------------------------------------------------------------------
856
+ * Bootstrap (v5.1.3): button.js
857
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
858
+ * --------------------------------------------------------------------------
859
+ */
860
+ /**
861
+ * Constants
862
+ */
863
+
864
+ const NAME$d = 'button';
865
+ const DATA_KEY$b = 'bs.button';
866
+ const EVENT_KEY$c = `.${DATA_KEY$b}`;
867
+ const DATA_API_KEY$7 = '.data-api';
868
+ const CLASS_NAME_ACTIVE$3 = 'active';
869
+ const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
870
+ const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$c}${DATA_API_KEY$7}`;
871
+ /**
872
+ * Class definition
873
+ */
874
+
875
+ class Button extends BaseComponent {
876
+ // Getters
877
+ static get NAME() {
878
+ return NAME$d;
879
+ } // Public
880
+
881
+
882
+ toggle() {
883
+ // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method
884
+ this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
885
+ } // Static
886
+
887
+
888
+ static jQueryInterface(config) {
889
+ return this.each(function () {
890
+ const data = Button.getOrCreateInstance(this);
891
+
892
+ if (config === 'toggle') {
893
+ data[config]();
894
+ }
895
+ });
896
+ }
897
+
898
+ }
899
+ /**
900
+ * Data API implementation
901
+ */
902
+
903
+
904
+ EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {
905
+ event.preventDefault();
906
+ const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
907
+ const data = Button.getOrCreateInstance(button);
908
+ data.toggle();
909
+ });
910
+ /**
911
+ * jQuery
912
+ */
913
+
914
+ defineJQueryPlugin(Button);
915
+
916
+ /**
917
+ * --------------------------------------------------------------------------
918
+ * Bootstrap (v5.1.3): dom/manipulator.js
919
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
920
+ * --------------------------------------------------------------------------
921
+ */
922
+ function normalizeData(val) {
923
+ if (val === 'true') {
924
+ return true;
925
+ }
926
+
927
+ if (val === 'false') {
928
+ return false;
929
+ }
930
+
931
+ if (val === Number(val).toString()) {
932
+ return Number(val);
933
+ }
934
+
935
+ if (val === '' || val === 'null') {
936
+ return null;
937
+ }
938
+
939
+ return val;
940
+ }
941
+
942
+ function normalizeDataKey(key) {
943
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);
944
+ }
945
+
946
+ const Manipulator = {
947
+ setDataAttribute(element, key, value) {
948
+ element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
949
+ },
950
+
951
+ removeDataAttribute(element, key) {
952
+ element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
953
+ },
954
+
955
+ getDataAttributes(element) {
956
+ if (!element) {
957
+ return {};
958
+ }
959
+
960
+ const attributes = {};
961
+ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs'));
962
+
963
+ for (const key of bsKeys) {
964
+ let pureKey = key.replace(/^bs/, '');
965
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
966
+ attributes[pureKey] = normalizeData(element.dataset[key]);
967
+ }
968
+
969
+ return attributes;
970
+ },
971
+
972
+ getDataAttribute(element, key) {
973
+ return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
974
+ },
975
+
976
+ offset(element) {
977
+ const rect = element.getBoundingClientRect();
978
+ return {
979
+ top: rect.top + window.pageYOffset,
980
+ left: rect.left + window.pageXOffset
981
+ };
982
+ },
983
+
984
+ position(element) {
985
+ return {
986
+ top: element.offsetTop,
987
+ left: element.offsetLeft
988
+ };
989
+ }
990
+
991
+ };
992
+
993
+ /**
994
+ * --------------------------------------------------------------------------
995
+ * Bootstrap (v5.1.3): dom/selector-engine.js
996
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
997
+ * --------------------------------------------------------------------------
998
+ */
999
+ /**
1000
+ * Constants
1001
+ */
1002
+
1003
+ const NODE_TEXT = 3;
1004
+ const SelectorEngine = {
1005
+ find(selector, element = document.documentElement) {
1006
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
1007
+ },
1008
+
1009
+ findOne(selector, element = document.documentElement) {
1010
+ return Element.prototype.querySelector.call(element, selector);
1011
+ },
1012
+
1013
+ children(element, selector) {
1014
+ return [].concat(...element.children).filter(child => child.matches(selector));
1015
+ },
1016
+
1017
+ parents(element, selector) {
1018
+ const parents = [];
1019
+ let ancestor = element.parentNode;
1020
+
1021
+ while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {
1022
+ if (ancestor.matches(selector)) {
1023
+ parents.push(ancestor);
1024
+ }
1025
+
1026
+ ancestor = ancestor.parentNode;
1027
+ }
1028
+
1029
+ return parents;
1030
+ },
1031
+
1032
+ prev(element, selector) {
1033
+ let previous = element.previousElementSibling;
1034
+
1035
+ while (previous) {
1036
+ if (previous.matches(selector)) {
1037
+ return [previous];
1038
+ }
1039
+
1040
+ previous = previous.previousElementSibling;
1041
+ }
1042
+
1043
+ return [];
1044
+ },
1045
+
1046
+ next(element, selector) {
1047
+ let next = element.nextElementSibling;
1048
+
1049
+ while (next) {
1050
+ if (next.matches(selector)) {
1051
+ return [next];
1052
+ }
1053
+
1054
+ next = next.nextElementSibling;
1055
+ }
1056
+
1057
+ return [];
1058
+ },
1059
+
1060
+ focusableChildren(element) {
1061
+ const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable="true"]'].map(selector => `${selector}:not([tabindex^="-"])`).join(', ');
1062
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));
1063
+ }
1064
+
1065
+ };
1066
+
1067
+ /**
1068
+ * --------------------------------------------------------------------------
1069
+ * Bootstrap (v5.1.3): util/swipe.js
1070
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1071
+ * --------------------------------------------------------------------------
1072
+ */
1073
+ /**
1074
+ * Constants
1075
+ */
1076
+
1077
+ const NAME$c = 'swipe';
1078
+ const EVENT_KEY$b = '.bs.swipe';
1079
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$b}`;
1080
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$b}`;
1081
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY$b}`;
1082
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$b}`;
1083
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY$b}`;
1084
+ const POINTER_TYPE_TOUCH = 'touch';
1085
+ const POINTER_TYPE_PEN = 'pen';
1086
+ const CLASS_NAME_POINTER_EVENT = 'pointer-event';
1087
+ const SWIPE_THRESHOLD = 40;
1088
+ const Default$b = {
1089
+ leftCallback: null,
1090
+ rightCallback: null,
1091
+ endCallback: null
1092
+ };
1093
+ const DefaultType$b = {
1094
+ leftCallback: '(function|null)',
1095
+ rightCallback: '(function|null)',
1096
+ endCallback: '(function|null)'
1097
+ };
1098
+ /**
1099
+ * Class definition
1100
+ */
1101
+
1102
+ class Swipe {
1103
+ constructor(element, config) {
1104
+ this._element = element;
1105
+
1106
+ if (!element || !Swipe.isSupported()) {
1107
+ return;
1108
+ }
1109
+
1110
+ this._config = this._getConfig(config);
1111
+ this._deltaX = 0;
1112
+ this._supportPointerEvents = Boolean(window.PointerEvent);
1113
+
1114
+ this._initEvents();
1115
+ } // Public
1116
+
1117
+
1118
+ dispose() {
1119
+ EventHandler.off(this._element, EVENT_KEY$b);
1120
+ } // Private
1121
+
1122
+
1123
+ _start(event) {
1124
+ if (!this._supportPointerEvents) {
1125
+ this._deltaX = event.touches[0].clientX;
1126
+ return;
1127
+ }
1128
+
1129
+ if (this._eventIsPointerPenTouch(event)) {
1130
+ this._deltaX = event.clientX;
1131
+ }
1132
+ }
1133
+
1134
+ _end(event) {
1135
+ if (this._eventIsPointerPenTouch(event)) {
1136
+ this._deltaX = event.clientX - this._deltaX;
1137
+ }
1138
+
1139
+ this._handleSwipe();
1140
+
1141
+ execute(this._config.endCallback);
1142
+ }
1143
+
1144
+ _move(event) {
1145
+ this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
1146
+ }
1147
+
1148
+ _handleSwipe() {
1149
+ const absDeltaX = Math.abs(this._deltaX);
1150
+
1151
+ if (absDeltaX <= SWIPE_THRESHOLD) {
1152
+ return;
1153
+ }
1154
+
1155
+ const direction = absDeltaX / this._deltaX;
1156
+ this._deltaX = 0;
1157
+
1158
+ if (!direction) {
1159
+ return;
1160
+ }
1161
+
1162
+ execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
1163
+ }
1164
+
1165
+ _initEvents() {
1166
+ if (this._supportPointerEvents) {
1167
+ EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));
1168
+ EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));
1169
+
1170
+ this._element.classList.add(CLASS_NAME_POINTER_EVENT);
1171
+ } else {
1172
+ EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));
1173
+ EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));
1174
+ EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));
1175
+ }
1176
+ }
1177
+
1178
+ _getConfig(config) {
1179
+ config = { ...Default$b,
1180
+ ...(typeof config === 'object' ? config : {})
1181
+ };
1182
+ typeCheckConfig(NAME$c, config, DefaultType$b);
1183
+ return config;
1184
+ }
1185
+
1186
+ _eventIsPointerPenTouch(event) {
1187
+ return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
1188
+ } // Static
1189
+
1190
+
1191
+ static isSupported() {
1192
+ return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;
1193
+ }
1194
+
1195
+ }
1196
+
1197
+ /**
1198
+ * --------------------------------------------------------------------------
1199
+ * Bootstrap (v5.1.3): carousel.js
1200
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1201
+ * --------------------------------------------------------------------------
1202
+ */
1203
+ /**
1204
+ * Constants
1205
+ */
1206
+
1207
+ const NAME$b = 'carousel';
1208
+ const DATA_KEY$a = 'bs.carousel';
1209
+ const EVENT_KEY$a = `.${DATA_KEY$a}`;
1210
+ const DATA_API_KEY$6 = '.data-api';
1211
+ const ARROW_LEFT_KEY = 'ArrowLeft';
1212
+ const ARROW_RIGHT_KEY = 'ArrowRight';
1213
+ const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
1214
+
1215
+ const ORDER_NEXT = 'next';
1216
+ const ORDER_PREV = 'prev';
1217
+ const DIRECTION_LEFT = 'left';
1218
+ const DIRECTION_RIGHT = 'right';
1219
+ const EVENT_SLIDE = `slide${EVENT_KEY$a}`;
1220
+ const EVENT_SLID = `slid${EVENT_KEY$a}`;
1221
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;
1222
+ const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;
1223
+ const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;
1224
+ const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;
1225
+ const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;
1226
+ const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
1227
+ const CLASS_NAME_CAROUSEL = 'carousel';
1228
+ const CLASS_NAME_ACTIVE$2 = 'active';
1229
+ const CLASS_NAME_SLIDE = 'slide';
1230
+ const CLASS_NAME_END = 'carousel-item-end';
1231
+ const CLASS_NAME_START = 'carousel-item-start';
1232
+ const CLASS_NAME_NEXT = 'carousel-item-next';
1233
+ const CLASS_NAME_PREV = 'carousel-item-prev';
1234
+ const SELECTOR_ACTIVE$1 = '.active';
1235
+ const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';
1236
+ const SELECTOR_ITEM = '.carousel-item';
1237
+ const SELECTOR_ITEM_IMG = '.carousel-item img';
1238
+ const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';
1239
+ const SELECTOR_INDICATORS = '.carousel-indicators';
1240
+ const SELECTOR_INDICATOR = '[data-bs-target]';
1241
+ const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';
1242
+ const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
1243
+ const KEY_TO_DIRECTION = {
1244
+ [ARROW_LEFT_KEY]: DIRECTION_RIGHT,
1245
+ [ARROW_RIGHT_KEY]: DIRECTION_LEFT
1246
+ };
1247
+ const Default$a = {
1248
+ interval: 5000,
1249
+ keyboard: true,
1250
+ slide: false,
1251
+ pause: 'hover',
1252
+ wrap: true,
1253
+ touch: true
1254
+ };
1255
+ const DefaultType$a = {
1256
+ interval: '(number|boolean)',
1257
+ keyboard: 'boolean',
1258
+ slide: '(boolean|string)',
1259
+ pause: '(string|boolean)',
1260
+ wrap: 'boolean',
1261
+ touch: 'boolean'
1262
+ };
1263
+ /**
1264
+ * Class definition
1265
+ */
1266
+
1267
+ class Carousel extends BaseComponent {
1268
+ constructor(element, config) {
1269
+ super(element);
1270
+ this._items = null;
1271
+ this._interval = null;
1272
+ this._activeElement = null;
1273
+ this._isPaused = false;
1274
+ this._isSliding = false;
1275
+ this.touchTimeout = null;
1276
+ this._swipeHelper = null;
1277
+ this._config = this._getConfig(config);
1278
+ this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
1279
+
1280
+ this._addEventListeners();
1281
+ } // Getters
1282
+
1283
+
1284
+ static get Default() {
1285
+ return Default$a;
1286
+ }
1287
+
1288
+ static get NAME() {
1289
+ return NAME$b;
1290
+ } // Public
1291
+
1292
+
1293
+ next() {
1294
+ this._slide(ORDER_NEXT);
1295
+ }
1296
+
1297
+ nextWhenVisible() {
1298
+ // Don't call next when the page isn't visible
1299
+ // or the carousel or its parent isn't visible
1300
+ if (!document.hidden && isVisible(this._element)) {
1301
+ this.next();
1302
+ }
1303
+ }
1304
+
1305
+ prev() {
1306
+ this._slide(ORDER_PREV);
1307
+ }
1308
+
1309
+ pause(event) {
1310
+ if (!event) {
1311
+ this._isPaused = true;
1312
+ }
1313
+
1314
+ if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {
1315
+ triggerTransitionEnd(this._element);
1316
+ this.cycle(true);
1317
+ }
1318
+
1319
+ clearInterval(this._interval);
1320
+ this._interval = null;
1321
+ }
1322
+
1323
+ cycle(event) {
1324
+ if (!event) {
1325
+ this._isPaused = false;
1326
+ }
1327
+
1328
+ if (this._interval) {
1329
+ clearInterval(this._interval);
1330
+ this._interval = null;
1331
+ }
1332
+
1333
+ if (this._config && this._config.interval && !this._isPaused) {
1334
+ this._updateInterval();
1335
+
1336
+ this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
1337
+ }
1338
+ }
1339
+
1340
+ to(index) {
1341
+ this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1342
+
1343
+ const activeIndex = this._getItemIndex(this._activeElement);
1344
+
1345
+ if (index > this._items.length - 1 || index < 0) {
1346
+ return;
1347
+ }
1348
+
1349
+ if (this._isSliding) {
1350
+ EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
1351
+ return;
1352
+ }
1353
+
1354
+ if (activeIndex === index) {
1355
+ this.pause();
1356
+ this.cycle();
1357
+ return;
1358
+ }
1359
+
1360
+ const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
1361
+
1362
+ this._slide(order, this._items[index]);
1363
+ }
1364
+
1365
+ dispose() {
1366
+ if (this._swipeHelper) {
1367
+ this._swipeHelper.dispose();
1368
+ }
1369
+
1370
+ super.dispose();
1371
+ } // Private
1372
+
1373
+
1374
+ _getConfig(config) {
1375
+ config = { ...Default$a,
1376
+ ...Manipulator.getDataAttributes(this._element),
1377
+ ...(typeof config === 'object' ? config : {})
1378
+ };
1379
+ typeCheckConfig(NAME$b, config, DefaultType$a);
1380
+ return config;
1381
+ }
1382
+
1383
+ _addEventListeners() {
1384
+ if (this._config.keyboard) {
1385
+ EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));
1386
+ }
1387
+
1388
+ if (this._config.pause === 'hover') {
1389
+ EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));
1390
+ EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));
1391
+ }
1392
+
1393
+ if (this._config.touch && Swipe.isSupported()) {
1394
+ this._addTouchEventListeners();
1395
+ }
1396
+ }
1397
+
1398
+ _addTouchEventListeners() {
1399
+ for (const itemImg of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
1400
+ EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault());
1401
+ }
1402
+
1403
+ const endCallBack = () => {
1404
+ if (this._config.pause === 'hover') {
1405
+ // If it's a touch-enabled device, mouseenter/leave are fired as
1406
+ // part of the mouse compatibility events on first tap - the carousel
1407
+ // would stop cycling until user tapped out of it;
1408
+ // here, we listen for touchend, explicitly pause the carousel
1409
+ // (as if it's the second time we tap on it, mouseenter compat event
1410
+ // is NOT fired) and after a timeout (to allow for mouse compatibility
1411
+ // events to fire) we explicitly restart cycling
1412
+ this.pause();
1413
+
1414
+ if (this.touchTimeout) {
1415
+ clearTimeout(this.touchTimeout);
1416
+ }
1417
+
1418
+ this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
1419
+ }
1420
+ };
1421
+
1422
+ const swipeConfig = {
1423
+ leftCallback: () => this._slide(DIRECTION_LEFT),
1424
+ rightCallback: () => this._slide(DIRECTION_RIGHT),
1425
+ endCallback: endCallBack
1426
+ };
1427
+ this._swipeHelper = new Swipe(this._element, swipeConfig);
1428
+ }
1429
+
1430
+ _keydown(event) {
1431
+ if (/input|textarea/i.test(event.target.tagName)) {
1432
+ return;
1433
+ }
1434
+
1435
+ const direction = KEY_TO_DIRECTION[event.key];
1436
+
1437
+ if (direction) {
1438
+ event.preventDefault();
1439
+
1440
+ this._slide(direction);
1441
+ }
1442
+ }
1443
+
1444
+ _getItemIndex(element) {
1445
+ this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];
1446
+ return this._items.indexOf(element);
1447
+ }
1448
+
1449
+ _getItemByOrder(order, activeElement) {
1450
+ const isNext = order === ORDER_NEXT;
1451
+ return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);
1452
+ }
1453
+
1454
+ _triggerSlideEvent(relatedTarget, eventDirectionName) {
1455
+ const targetIndex = this._getItemIndex(relatedTarget);
1456
+
1457
+ const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));
1458
+
1459
+ return EventHandler.trigger(this._element, EVENT_SLIDE, {
1460
+ relatedTarget,
1461
+ direction: eventDirectionName,
1462
+ from: fromIndex,
1463
+ to: targetIndex
1464
+ });
1465
+ }
1466
+
1467
+ _setActiveIndicatorElement(element) {
1468
+ if (this._indicatorsElement) {
1469
+ const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);
1470
+ activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
1471
+ activeIndicator.removeAttribute('aria-current');
1472
+ const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);
1473
+
1474
+ for (const indicator of indicators) {
1475
+ if (Number.parseInt(indicator.getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {
1476
+ indicator.classList.add(CLASS_NAME_ACTIVE$2);
1477
+ indicator.setAttribute('aria-current', 'true');
1478
+ break;
1479
+ }
1480
+ }
1481
+ }
1482
+ }
1483
+
1484
+ _updateInterval() {
1485
+ const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1486
+
1487
+ if (!element) {
1488
+ return;
1489
+ }
1490
+
1491
+ const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);
1492
+
1493
+ if (elementInterval) {
1494
+ this._config.defaultInterval = this._config.defaultInterval || this._config.interval;
1495
+ this._config.interval = elementInterval;
1496
+ } else {
1497
+ this._config.interval = this._config.defaultInterval || this._config.interval;
1498
+ }
1499
+ }
1500
+
1501
+ _slide(directionOrOrder, element) {
1502
+ const order = this._directionToOrder(directionOrOrder);
1503
+
1504
+ const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
1505
+
1506
+ const activeElementIndex = this._getItemIndex(activeElement);
1507
+
1508
+ const nextElement = element || this._getItemByOrder(order, activeElement);
1509
+
1510
+ const nextElementIndex = this._getItemIndex(nextElement);
1511
+
1512
+ const isCycling = Boolean(this._interval);
1513
+ const isNext = order === ORDER_NEXT;
1514
+ const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
1515
+ const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
1516
+
1517
+ const eventDirectionName = this._orderToDirection(order);
1518
+
1519
+ if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {
1520
+ this._isSliding = false;
1521
+ return;
1522
+ }
1523
+
1524
+ if (this._isSliding) {
1525
+ return;
1526
+ }
1527
+
1528
+ const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
1529
+
1530
+ if (slideEvent.defaultPrevented) {
1531
+ return;
1532
+ }
1533
+
1534
+ if (!activeElement || !nextElement) {
1535
+ // Some weirdness is happening, so we bail
1536
+ return;
1537
+ }
1538
+
1539
+ this._isSliding = true;
1540
+
1541
+ if (isCycling) {
1542
+ this.pause();
1543
+ }
1544
+
1545
+ this._setActiveIndicatorElement(nextElement);
1546
+
1547
+ this._activeElement = nextElement;
1548
+
1549
+ const triggerSlidEvent = () => {
1550
+ EventHandler.trigger(this._element, EVENT_SLID, {
1551
+ relatedTarget: nextElement,
1552
+ direction: eventDirectionName,
1553
+ from: activeElementIndex,
1554
+ to: nextElementIndex
1555
+ });
1556
+ };
1557
+
1558
+ if (this._element.classList.contains(CLASS_NAME_SLIDE)) {
1559
+ nextElement.classList.add(orderClassName);
1560
+ reflow(nextElement);
1561
+ activeElement.classList.add(directionalClassName);
1562
+ nextElement.classList.add(directionalClassName);
1563
+
1564
+ const completeCallBack = () => {
1565
+ nextElement.classList.remove(directionalClassName, orderClassName);
1566
+ nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1567
+ activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
1568
+ this._isSliding = false;
1569
+ setTimeout(triggerSlidEvent, 0);
1570
+ };
1571
+
1572
+ this._queueCallback(completeCallBack, activeElement, true);
1573
+ } else {
1574
+ activeElement.classList.remove(CLASS_NAME_ACTIVE$2);
1575
+ nextElement.classList.add(CLASS_NAME_ACTIVE$2);
1576
+ this._isSliding = false;
1577
+ triggerSlidEvent();
1578
+ }
1579
+
1580
+ if (isCycling) {
1581
+ this.cycle();
1582
+ }
1583
+ }
1584
+
1585
+ _directionToOrder(direction) {
1586
+ if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {
1587
+ return direction;
1588
+ }
1589
+
1590
+ if (isRTL()) {
1591
+ return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
1592
+ }
1593
+
1594
+ return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
1595
+ }
1596
+
1597
+ _orderToDirection(order) {
1598
+ if (![ORDER_NEXT, ORDER_PREV].includes(order)) {
1599
+ return order;
1600
+ }
1601
+
1602
+ if (isRTL()) {
1603
+ return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
1604
+ }
1605
+
1606
+ return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
1607
+ } // Static
1608
+
1609
+
1610
+ static carouselInterface(element, config) {
1611
+ const data = Carousel.getOrCreateInstance(element, config);
1612
+ let {
1613
+ _config
1614
+ } = data;
1615
+
1616
+ if (typeof config === 'object') {
1617
+ _config = { ..._config,
1618
+ ...config
1619
+ };
1620
+ }
1621
+
1622
+ const action = typeof config === 'string' ? config : _config.slide;
1623
+
1624
+ if (typeof config === 'number') {
1625
+ data.to(config);
1626
+ } else if (typeof action === 'string') {
1627
+ if (typeof data[action] === 'undefined') {
1628
+ throw new TypeError(`No method named "${action}"`);
1629
+ }
1630
+
1631
+ data[action]();
1632
+ } else if (_config.interval && _config.ride) {
1633
+ data.pause();
1634
+ data.cycle();
1635
+ }
1636
+ }
1637
+
1638
+ static jQueryInterface(config) {
1639
+ return this.each(function () {
1640
+ Carousel.carouselInterface(this, config);
1641
+ });
1642
+ }
1643
+
1644
+ static dataApiClickHandler(event) {
1645
+ const target = getElementFromSelector(this);
1646
+
1647
+ if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
1648
+ return;
1649
+ }
1650
+
1651
+ const config = { ...Manipulator.getDataAttributes(target),
1652
+ ...Manipulator.getDataAttributes(this)
1653
+ };
1654
+ const slideIndex = this.getAttribute('data-bs-slide-to');
1655
+
1656
+ if (slideIndex) {
1657
+ config.interval = false;
1658
+ }
1659
+
1660
+ Carousel.carouselInterface(target, config);
1661
+
1662
+ if (slideIndex) {
1663
+ Carousel.getInstance(target).to(slideIndex);
1664
+ }
1665
+
1666
+ event.preventDefault();
1667
+ }
1668
+
1669
+ }
1670
+ /**
1671
+ * Data API implementation
1672
+ */
1673
+
1674
+
1675
+ EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);
1676
+ EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
1677
+ const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
1678
+
1679
+ for (const carousel of carousels) {
1680
+ Carousel.carouselInterface(carousel, Carousel.getInstance(carousel));
1681
+ }
1682
+ });
1683
+ /**
1684
+ * jQuery
1685
+ */
1686
+
1687
+ defineJQueryPlugin(Carousel);
1688
+
1689
+ /**
1690
+ * --------------------------------------------------------------------------
1691
+ * Bootstrap (v5.1.3): collapse.js
1692
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1693
+ * --------------------------------------------------------------------------
1694
+ */
1695
+ /**
1696
+ * Constants
1697
+ */
1698
+
1699
+ const NAME$a = 'collapse';
1700
+ const DATA_KEY$9 = 'bs.collapse';
1701
+ const EVENT_KEY$9 = `.${DATA_KEY$9}`;
1702
+ const DATA_API_KEY$5 = '.data-api';
1703
+ const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;
1704
+ const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;
1705
+ const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;
1706
+ const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;
1707
+ const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;
1708
+ const CLASS_NAME_SHOW$7 = 'show';
1709
+ const CLASS_NAME_COLLAPSE = 'collapse';
1710
+ const CLASS_NAME_COLLAPSING = 'collapsing';
1711
+ const CLASS_NAME_COLLAPSED = 'collapsed';
1712
+ const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
1713
+ const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';
1714
+ const WIDTH = 'width';
1715
+ const HEIGHT = 'height';
1716
+ const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';
1717
+ const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
1718
+ const Default$9 = {
1719
+ toggle: true,
1720
+ parent: null
1721
+ };
1722
+ const DefaultType$9 = {
1723
+ toggle: 'boolean',
1724
+ parent: '(null|element)'
1725
+ };
1726
+ /**
1727
+ * Class definition
1728
+ */
1729
+
1730
+ class Collapse extends BaseComponent {
1731
+ constructor(element, config) {
1732
+ super(element);
1733
+ this._isTransitioning = false;
1734
+ this._config = this._getConfig(config);
1735
+ this._triggerArray = [];
1736
+ const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
1737
+
1738
+ for (const elem of toggleList) {
1739
+ const selector = getSelectorFromElement(elem);
1740
+ const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);
1741
+
1742
+ if (selector !== null && filterElement.length) {
1743
+ this._triggerArray.push(elem);
1744
+ }
1745
+ }
1746
+
1747
+ this._initializeChildren();
1748
+
1749
+ if (!this._config.parent) {
1750
+ this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
1751
+ }
1752
+
1753
+ if (this._config.toggle) {
1754
+ this.toggle();
1755
+ }
1756
+ } // Getters
1757
+
1758
+
1759
+ static get Default() {
1760
+ return Default$9;
1761
+ }
1762
+
1763
+ static get NAME() {
1764
+ return NAME$a;
1765
+ } // Public
1766
+
1767
+
1768
+ toggle() {
1769
+ if (this._isShown()) {
1770
+ this.hide();
1771
+ } else {
1772
+ this.show();
1773
+ }
1774
+ }
1775
+
1776
+ show() {
1777
+ if (this._isTransitioning || this._isShown()) {
1778
+ return;
1779
+ }
1780
+
1781
+ let activeChildren = []; // find active children
1782
+
1783
+ if (this._config.parent) {
1784
+ activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {
1785
+ toggle: false
1786
+ }));
1787
+ }
1788
+
1789
+ if (activeChildren.length && activeChildren[0]._isTransitioning) {
1790
+ return;
1791
+ }
1792
+
1793
+ const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);
1794
+
1795
+ if (startEvent.defaultPrevented) {
1796
+ return;
1797
+ }
1798
+
1799
+ for (const activeInstance of activeChildren) {
1800
+ activeInstance.hide();
1801
+ }
1802
+
1803
+ const dimension = this._getDimension();
1804
+
1805
+ this._element.classList.remove(CLASS_NAME_COLLAPSE);
1806
+
1807
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
1808
+
1809
+ this._element.style[dimension] = 0;
1810
+
1811
+ this._addAriaAndCollapsedClass(this._triggerArray, true);
1812
+
1813
+ this._isTransitioning = true;
1814
+
1815
+ const complete = () => {
1816
+ this._isTransitioning = false;
1817
+
1818
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
1819
+
1820
+ this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1821
+
1822
+ this._element.style[dimension] = '';
1823
+ EventHandler.trigger(this._element, EVENT_SHOWN$5);
1824
+ };
1825
+
1826
+ const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
1827
+ const scrollSize = `scroll${capitalizedDimension}`;
1828
+
1829
+ this._queueCallback(complete, this._element, true);
1830
+
1831
+ this._element.style[dimension] = `${this._element[scrollSize]}px`;
1832
+ }
1833
+
1834
+ hide() {
1835
+ if (this._isTransitioning || !this._isShown()) {
1836
+ return;
1837
+ }
1838
+
1839
+ const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);
1840
+
1841
+ if (startEvent.defaultPrevented) {
1842
+ return;
1843
+ }
1844
+
1845
+ const dimension = this._getDimension();
1846
+
1847
+ this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
1848
+ reflow(this._element);
1849
+
1850
+ this._element.classList.add(CLASS_NAME_COLLAPSING);
1851
+
1852
+ this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
1853
+
1854
+ for (const trigger of this._triggerArray) {
1855
+ const elem = getElementFromSelector(trigger);
1856
+
1857
+ if (elem && !this._isShown(elem)) {
1858
+ this._addAriaAndCollapsedClass([trigger], false);
1859
+ }
1860
+ }
1861
+
1862
+ this._isTransitioning = true;
1863
+
1864
+ const complete = () => {
1865
+ this._isTransitioning = false;
1866
+
1867
+ this._element.classList.remove(CLASS_NAME_COLLAPSING);
1868
+
1869
+ this._element.classList.add(CLASS_NAME_COLLAPSE);
1870
+
1871
+ EventHandler.trigger(this._element, EVENT_HIDDEN$5);
1872
+ };
1873
+
1874
+ this._element.style[dimension] = '';
1875
+
1876
+ this._queueCallback(complete, this._element, true);
1877
+ }
1878
+
1879
+ _isShown(element = this._element) {
1880
+ return element.classList.contains(CLASS_NAME_SHOW$7);
1881
+ } // Private
1882
+
1883
+
1884
+ _getConfig(config) {
1885
+ config = { ...Default$9,
1886
+ ...Manipulator.getDataAttributes(this._element),
1887
+ ...config
1888
+ };
1889
+ config.toggle = Boolean(config.toggle); // Coerce string values
1890
+
1891
+ config.parent = getElement(config.parent);
1892
+ typeCheckConfig(NAME$a, config, DefaultType$9);
1893
+ return config;
1894
+ }
1895
+
1896
+ _getDimension() {
1897
+ return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
1898
+ }
1899
+
1900
+ _initializeChildren() {
1901
+ if (!this._config.parent) {
1902
+ return;
1903
+ }
1904
+
1905
+ const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
1906
+
1907
+ for (const element of children) {
1908
+ const selected = getElementFromSelector(element);
1909
+
1910
+ if (selected) {
1911
+ this._addAriaAndCollapsedClass([element], this._isShown(selected));
1912
+ }
1913
+ }
1914
+ }
1915
+
1916
+ _getFirstLevelChildren(selector) {
1917
+ const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent); // remove children if greater depth
1918
+
1919
+ return SelectorEngine.find(selector, this._config.parent).filter(elem => !children.includes(elem));
1920
+ }
1921
+
1922
+ _addAriaAndCollapsedClass(triggerArray, isOpen) {
1923
+ if (!triggerArray.length) {
1924
+ return;
1925
+ }
1926
+
1927
+ for (const elem of triggerArray) {
1928
+ if (isOpen) {
1929
+ elem.classList.remove(CLASS_NAME_COLLAPSED);
1930
+ } else {
1931
+ elem.classList.add(CLASS_NAME_COLLAPSED);
1932
+ }
1933
+
1934
+ elem.setAttribute('aria-expanded', isOpen);
1935
+ }
1936
+ } // Static
1937
+
1938
+
1939
+ static jQueryInterface(config) {
1940
+ return this.each(function () {
1941
+ const _config = {};
1942
+
1943
+ if (typeof config === 'string' && /show|hide/.test(config)) {
1944
+ _config.toggle = false;
1945
+ }
1946
+
1947
+ const data = Collapse.getOrCreateInstance(this, _config);
1948
+
1949
+ if (typeof config === 'string') {
1950
+ if (typeof data[config] === 'undefined') {
1951
+ throw new TypeError(`No method named "${config}"`);
1952
+ }
1953
+
1954
+ data[config]();
1955
+ }
1956
+ });
1957
+ }
1958
+
1959
+ }
1960
+ /**
1961
+ * Data API implementation
1962
+ */
1963
+
1964
+
1965
+ EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {
1966
+ // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
1967
+ if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {
1968
+ event.preventDefault();
1969
+ }
1970
+
1971
+ const selector = getSelectorFromElement(this);
1972
+ const selectorElements = SelectorEngine.find(selector);
1973
+
1974
+ for (const element of selectorElements) {
1975
+ Collapse.getOrCreateInstance(element, {
1976
+ toggle: false
1977
+ }).toggle();
1978
+ }
1979
+ });
1980
+ /**
1981
+ * jQuery
1982
+ */
1983
+
1984
+ defineJQueryPlugin(Collapse);
1985
+
1986
+ /**
1987
+ * --------------------------------------------------------------------------
1988
+ * Bootstrap (v5.1.3): dropdown.js
1989
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
1990
+ * --------------------------------------------------------------------------
1991
+ */
1992
+ /**
1993
+ * Constants
1994
+ */
1995
+
1996
+ const NAME$9 = 'dropdown';
1997
+ const DATA_KEY$8 = 'bs.dropdown';
1998
+ const EVENT_KEY$8 = `.${DATA_KEY$8}`;
1999
+ const DATA_API_KEY$4 = '.data-api';
2000
+ const ESCAPE_KEY$2 = 'Escape';
2001
+ const SPACE_KEY = 'Space';
2002
+ const TAB_KEY$1 = 'Tab';
2003
+ const ARROW_UP_KEY = 'ArrowUp';
2004
+ const ARROW_DOWN_KEY = 'ArrowDown';
2005
+ const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button
2006
+
2007
+ const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);
2008
+ const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;
2009
+ const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;
2010
+ const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;
2011
+ const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;
2012
+ const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;
2013
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;
2014
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;
2015
+ const CLASS_NAME_SHOW$6 = 'show';
2016
+ const CLASS_NAME_DROPUP = 'dropup';
2017
+ const CLASS_NAME_DROPEND = 'dropend';
2018
+ const CLASS_NAME_DROPSTART = 'dropstart';
2019
+ const CLASS_NAME_NAVBAR = 'navbar';
2020
+ const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]';
2021
+ const SELECTOR_MENU = '.dropdown-menu';
2022
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav';
2023
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';
2024
+ const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';
2025
+ const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';
2026
+ const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';
2027
+ const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';
2028
+ const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';
2029
+ const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';
2030
+ const Default$8 = {
2031
+ offset: [0, 2],
2032
+ boundary: 'clippingParents',
2033
+ reference: 'toggle',
2034
+ display: 'dynamic',
2035
+ popperConfig: null,
2036
+ autoClose: true
2037
+ };
2038
+ const DefaultType$8 = {
2039
+ offset: '(array|string|function)',
2040
+ boundary: '(string|element)',
2041
+ reference: '(string|element|object)',
2042
+ display: 'string',
2043
+ popperConfig: '(null|object|function)',
2044
+ autoClose: '(boolean|string)'
2045
+ };
2046
+ /**
2047
+ * Class definition
2048
+ */
2049
+
2050
+ class Dropdown extends BaseComponent {
2051
+ constructor(element, config) {
2052
+ super(element);
2053
+ this._popper = null;
2054
+ this._config = this._getConfig(config);
2055
+ this._menu = this._getMenuElement();
2056
+ this._inNavbar = this._detectNavbar();
2057
+ } // Getters
2058
+
2059
+
2060
+ static get Default() {
2061
+ return Default$8;
2062
+ }
2063
+
2064
+ static get DefaultType() {
2065
+ return DefaultType$8;
2066
+ }
2067
+
2068
+ static get NAME() {
2069
+ return NAME$9;
2070
+ } // Public
2071
+
2072
+
2073
+ toggle() {
2074
+ return this._isShown() ? this.hide() : this.show();
2075
+ }
2076
+
2077
+ show() {
2078
+ if (isDisabled(this._element) || this._isShown(this._menu)) {
2079
+ return;
2080
+ }
2081
+
2082
+ const relatedTarget = {
2083
+ relatedTarget: this._element
2084
+ };
2085
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);
2086
+
2087
+ if (showEvent.defaultPrevented) {
2088
+ return;
2089
+ }
2090
+
2091
+ const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar
2092
+
2093
+ if (this._inNavbar) {
2094
+ Manipulator.setDataAttribute(this._menu, 'popper', 'none');
2095
+ } else {
2096
+ this._createPopper(parent);
2097
+ } // If this is a touch-enabled device we add extra
2098
+ // empty mouseover listeners to the body's immediate children;
2099
+ // only needed because of broken event delegation on iOS
2100
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
2101
+
2102
+
2103
+ if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {
2104
+ for (const elem of [].concat(...document.body.children)) {
2105
+ EventHandler.on(elem, 'mouseover', noop);
2106
+ }
2107
+ }
2108
+
2109
+ this._element.focus();
2110
+
2111
+ this._element.setAttribute('aria-expanded', true);
2112
+
2113
+ this._menu.classList.add(CLASS_NAME_SHOW$6);
2114
+
2115
+ this._element.classList.add(CLASS_NAME_SHOW$6);
2116
+
2117
+ EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);
2118
+ }
2119
+
2120
+ hide() {
2121
+ if (isDisabled(this._element) || !this._isShown(this._menu)) {
2122
+ return;
2123
+ }
2124
+
2125
+ const relatedTarget = {
2126
+ relatedTarget: this._element
2127
+ };
2128
+
2129
+ this._completeHide(relatedTarget);
2130
+ }
2131
+
2132
+ dispose() {
2133
+ if (this._popper) {
2134
+ this._popper.destroy();
2135
+ }
2136
+
2137
+ super.dispose();
2138
+ }
2139
+
2140
+ update() {
2141
+ this._inNavbar = this._detectNavbar();
2142
+
2143
+ if (this._popper) {
2144
+ this._popper.update();
2145
+ }
2146
+ } // Private
2147
+
2148
+
2149
+ _completeHide(relatedTarget) {
2150
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);
2151
+
2152
+ if (hideEvent.defaultPrevented) {
2153
+ return;
2154
+ } // If this is a touch-enabled device we remove the extra
2155
+ // empty mouseover listeners we added for iOS support
2156
+
2157
+
2158
+ if ('ontouchstart' in document.documentElement) {
2159
+ for (const elem of [].concat(...document.body.children)) {
2160
+ EventHandler.off(elem, 'mouseover', noop);
2161
+ }
2162
+ }
2163
+
2164
+ if (this._popper) {
2165
+ this._popper.destroy();
2166
+ }
2167
+
2168
+ this._menu.classList.remove(CLASS_NAME_SHOW$6);
2169
+
2170
+ this._element.classList.remove(CLASS_NAME_SHOW$6);
2171
+
2172
+ this._element.setAttribute('aria-expanded', 'false');
2173
+
2174
+ Manipulator.removeDataAttribute(this._menu, 'popper');
2175
+ EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);
2176
+ }
2177
+
2178
+ _getConfig(config) {
2179
+ config = { ...this.constructor.Default,
2180
+ ...Manipulator.getDataAttributes(this._element),
2181
+ ...config
2182
+ };
2183
+ typeCheckConfig(NAME$9, config, this.constructor.DefaultType);
2184
+
2185
+ if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {
2186
+ // Popper virtual elements require a getBoundingClientRect method
2187
+ throw new TypeError(`${NAME$9.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
2188
+ }
2189
+
2190
+ return config;
2191
+ }
2192
+
2193
+ _createPopper(parent) {
2194
+ if (typeof Popper__namespace === 'undefined') {
2195
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)');
2196
+ }
2197
+
2198
+ let referenceElement = this._element;
2199
+
2200
+ if (this._config.reference === 'parent') {
2201
+ referenceElement = parent;
2202
+ } else if (isElement(this._config.reference)) {
2203
+ referenceElement = getElement(this._config.reference);
2204
+ } else if (typeof this._config.reference === 'object') {
2205
+ referenceElement = this._config.reference;
2206
+ }
2207
+
2208
+ const popperConfig = this._getPopperConfig();
2209
+
2210
+ const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);
2211
+ this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);
2212
+
2213
+ if (isDisplayStatic) {
2214
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static');
2215
+ }
2216
+ }
2217
+
2218
+ _isShown(element = this._element) {
2219
+ return element.classList.contains(CLASS_NAME_SHOW$6);
2220
+ }
2221
+
2222
+ _getMenuElement() {
2223
+ return SelectorEngine.next(this._element, SELECTOR_MENU)[0];
2224
+ }
2225
+
2226
+ _getPlacement() {
2227
+ const parentDropdown = this._element.parentNode;
2228
+
2229
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
2230
+ return PLACEMENT_RIGHT;
2231
+ }
2232
+
2233
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
2234
+ return PLACEMENT_LEFT;
2235
+ } // We need to trim the value because custom properties can also include spaces
2236
+
2237
+
2238
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';
2239
+
2240
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
2241
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
2242
+ }
2243
+
2244
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
2245
+ }
2246
+
2247
+ _detectNavbar() {
2248
+ return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;
2249
+ }
2250
+
2251
+ _getOffset() {
2252
+ const {
2253
+ offset
2254
+ } = this._config;
2255
+
2256
+ if (typeof offset === 'string') {
2257
+ return offset.split(',').map(val => Number.parseInt(val, 10));
2258
+ }
2259
+
2260
+ if (typeof offset === 'function') {
2261
+ return popperData => offset(popperData, this._element);
2262
+ }
2263
+
2264
+ return offset;
2265
+ }
2266
+
2267
+ _getPopperConfig() {
2268
+ const defaultBsPopperConfig = {
2269
+ placement: this._getPlacement(),
2270
+ modifiers: [{
2271
+ name: 'preventOverflow',
2272
+ options: {
2273
+ boundary: this._config.boundary
2274
+ }
2275
+ }, {
2276
+ name: 'offset',
2277
+ options: {
2278
+ offset: this._getOffset()
2279
+ }
2280
+ }]
2281
+ }; // Disable Popper if we have a static display
2282
+
2283
+ if (this._config.display === 'static') {
2284
+ defaultBsPopperConfig.modifiers = [{
2285
+ name: 'applyStyles',
2286
+ enabled: false
2287
+ }];
2288
+ }
2289
+
2290
+ return { ...defaultBsPopperConfig,
2291
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
2292
+ };
2293
+ }
2294
+
2295
+ _selectMenuItem({
2296
+ key,
2297
+ target
2298
+ }) {
2299
+ const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(el => isVisible(el));
2300
+
2301
+ if (!items.length) {
2302
+ return;
2303
+ } // if target isn't included in items (e.g. when expanding the dropdown)
2304
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
2305
+
2306
+
2307
+ getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();
2308
+ } // Static
2309
+
2310
+
2311
+ static jQueryInterface(config) {
2312
+ return this.each(function () {
2313
+ const data = Dropdown.getOrCreateInstance(this, config);
2314
+
2315
+ if (typeof config !== 'string') {
2316
+ return;
2317
+ }
2318
+
2319
+ if (typeof data[config] === 'undefined') {
2320
+ throw new TypeError(`No method named "${config}"`);
2321
+ }
2322
+
2323
+ data[config]();
2324
+ });
2325
+ }
2326
+
2327
+ static clearMenus(event) {
2328
+ if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {
2329
+ return;
2330
+ }
2331
+
2332
+ const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);
2333
+
2334
+ for (const toggle of toggles) {
2335
+ const context = Dropdown.getInstance(toggle);
2336
+
2337
+ if (!context || context._config.autoClose === false) {
2338
+ continue;
2339
+ }
2340
+
2341
+ if (!context._isShown()) {
2342
+ continue;
2343
+ }
2344
+
2345
+ const relatedTarget = {
2346
+ relatedTarget: context._element
2347
+ };
2348
+
2349
+ if (event) {
2350
+ const composedPath = event.composedPath();
2351
+ const isMenuTarget = composedPath.includes(context._menu);
2352
+
2353
+ if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {
2354
+ continue;
2355
+ } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
2356
+
2357
+
2358
+ if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
2359
+ continue;
2360
+ }
2361
+
2362
+ if (event.type === 'click') {
2363
+ relatedTarget.clickEvent = event;
2364
+ }
2365
+ }
2366
+
2367
+ context._completeHide(relatedTarget);
2368
+ }
2369
+ }
2370
+
2371
+ static getParentFromElement(element) {
2372
+ return getElementFromSelector(element) || element.parentNode;
2373
+ }
2374
+
2375
+ static dataApiKeydownHandler(event) {
2376
+ // If not input/textarea:
2377
+ // - And not a key in REGEXP_KEYDOWN => not a dropdown command
2378
+ // If input/textarea:
2379
+ // - If space key => not a dropdown command
2380
+ // - If key is other than escape
2381
+ // - If key is not up or down => not a dropdown command
2382
+ // - If trigger inside the menu => not a dropdown command
2383
+ if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {
2384
+ return;
2385
+ }
2386
+
2387
+ const isActive = this.classList.contains(CLASS_NAME_SHOW$6);
2388
+
2389
+ if (!isActive && event.key === ESCAPE_KEY$2) {
2390
+ return;
2391
+ }
2392
+
2393
+ event.preventDefault();
2394
+ event.stopPropagation();
2395
+
2396
+ if (isDisabled(this)) {
2397
+ return;
2398
+ }
2399
+
2400
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];
2401
+ const instance = Dropdown.getOrCreateInstance(getToggleButton);
2402
+
2403
+ if (event.key === ESCAPE_KEY$2) {
2404
+ instance.hide();
2405
+ return;
2406
+ }
2407
+
2408
+ if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {
2409
+ if (!isActive) {
2410
+ instance.show();
2411
+ }
2412
+
2413
+ instance._selectMenuItem(event);
2414
+
2415
+ return;
2416
+ }
2417
+
2418
+ if (!isActive || event.key === SPACE_KEY) {
2419
+ Dropdown.clearMenus();
2420
+ }
2421
+ }
2422
+
2423
+ }
2424
+ /**
2425
+ * Data API implementation
2426
+ */
2427
+
2428
+
2429
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
2430
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
2431
+ EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
2432
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
2433
+ EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {
2434
+ event.preventDefault();
2435
+ Dropdown.getOrCreateInstance(this).toggle();
2436
+ });
2437
+ /**
2438
+ * jQuery
2439
+ */
2440
+
2441
+ defineJQueryPlugin(Dropdown);
2442
+
2443
+ /**
2444
+ * --------------------------------------------------------------------------
2445
+ * Bootstrap (v5.1.3): util/scrollBar.js
2446
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2447
+ * --------------------------------------------------------------------------
2448
+ */
2449
+ /**
2450
+ * Constants
2451
+ */
2452
+
2453
+ const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';
2454
+ const SELECTOR_STICKY_CONTENT = '.sticky-top';
2455
+ /**
2456
+ * Class definition
2457
+ */
2458
+
2459
+ class ScrollBarHelper {
2460
+ constructor() {
2461
+ this._element = document.body;
2462
+ } // Public
2463
+
2464
+
2465
+ getWidth() {
2466
+ // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
2467
+ const documentWidth = document.documentElement.clientWidth;
2468
+ return Math.abs(window.innerWidth - documentWidth);
2469
+ }
2470
+
2471
+ hide() {
2472
+ const width = this.getWidth();
2473
+
2474
+ this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width
2475
+
2476
+
2477
+ this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
2478
+
2479
+
2480
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);
2481
+
2482
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);
2483
+ }
2484
+
2485
+ reset() {
2486
+ this._resetElementAttributes(this._element, 'overflow');
2487
+
2488
+ this._resetElementAttributes(this._element, 'paddingRight');
2489
+
2490
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');
2491
+
2492
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');
2493
+ }
2494
+
2495
+ isOverflowing() {
2496
+ return this.getWidth() > 0;
2497
+ } // Private
2498
+
2499
+
2500
+ _disableOverFlow() {
2501
+ this._saveInitialAttribute(this._element, 'overflow');
2502
+
2503
+ this._element.style.overflow = 'hidden';
2504
+ }
2505
+
2506
+ _setElementAttributes(selector, styleProp, callback) {
2507
+ const scrollbarWidth = this.getWidth();
2508
+
2509
+ const manipulationCallBack = element => {
2510
+ if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
2511
+ return;
2512
+ }
2513
+
2514
+ this._saveInitialAttribute(element, styleProp);
2515
+
2516
+ const calculatedValue = window.getComputedStyle(element)[styleProp];
2517
+ element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;
2518
+ };
2519
+
2520
+ this._applyManipulationCallback(selector, manipulationCallBack);
2521
+ }
2522
+
2523
+ _saveInitialAttribute(element, styleProp) {
2524
+ const actualValue = element.style[styleProp];
2525
+
2526
+ if (actualValue) {
2527
+ Manipulator.setDataAttribute(element, styleProp, actualValue);
2528
+ }
2529
+ }
2530
+
2531
+ _resetElementAttributes(selector, styleProp) {
2532
+ const manipulationCallBack = element => {
2533
+ const value = Manipulator.getDataAttribute(element, styleProp);
2534
+
2535
+ if (typeof value === 'undefined') {
2536
+ element.style.removeProperty(styleProp);
2537
+ } else {
2538
+ Manipulator.removeDataAttribute(element, styleProp);
2539
+ element.style[styleProp] = value;
2540
+ }
2541
+ };
2542
+
2543
+ this._applyManipulationCallback(selector, manipulationCallBack);
2544
+ }
2545
+
2546
+ _applyManipulationCallback(selector, callBack) {
2547
+ if (isElement(selector)) {
2548
+ callBack(selector);
2549
+ } else {
2550
+ for (const sel of SelectorEngine.find(selector, this._element)) {
2551
+ callBack(sel);
2552
+ }
2553
+ }
2554
+ }
2555
+
2556
+ }
2557
+
2558
+ /**
2559
+ * --------------------------------------------------------------------------
2560
+ * Bootstrap (v5.1.3): util/backdrop.js
2561
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2562
+ * --------------------------------------------------------------------------
2563
+ */
2564
+ /**
2565
+ * Constants
2566
+ */
2567
+
2568
+ const NAME$8 = 'backdrop';
2569
+ const CLASS_NAME_FADE$4 = 'fade';
2570
+ const CLASS_NAME_SHOW$5 = 'show';
2571
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;
2572
+ const Default$7 = {
2573
+ className: 'modal-backdrop',
2574
+ isVisible: true,
2575
+ // if false, we use the backdrop helper without adding any element to the dom
2576
+ isAnimated: false,
2577
+ rootElement: 'body',
2578
+ // give the choice to place backdrop under different elements
2579
+ clickCallback: null
2580
+ };
2581
+ const DefaultType$7 = {
2582
+ className: 'string',
2583
+ isVisible: 'boolean',
2584
+ isAnimated: 'boolean',
2585
+ rootElement: '(element|string)',
2586
+ clickCallback: '(function|null)'
2587
+ };
2588
+ /**
2589
+ * Class definition
2590
+ */
2591
+
2592
+ class Backdrop {
2593
+ constructor(config) {
2594
+ this._config = this._getConfig(config);
2595
+ this._isAppended = false;
2596
+ this._element = null;
2597
+ } // Public
2598
+
2599
+
2600
+ show(callback) {
2601
+ if (!this._config.isVisible) {
2602
+ execute(callback);
2603
+ return;
2604
+ }
2605
+
2606
+ this._append();
2607
+
2608
+ if (this._config.isAnimated) {
2609
+ reflow(this._getElement());
2610
+ }
2611
+
2612
+ this._getElement().classList.add(CLASS_NAME_SHOW$5);
2613
+
2614
+ this._emulateAnimation(() => {
2615
+ execute(callback);
2616
+ });
2617
+ }
2618
+
2619
+ hide(callback) {
2620
+ if (!this._config.isVisible) {
2621
+ execute(callback);
2622
+ return;
2623
+ }
2624
+
2625
+ this._getElement().classList.remove(CLASS_NAME_SHOW$5);
2626
+
2627
+ this._emulateAnimation(() => {
2628
+ this.dispose();
2629
+ execute(callback);
2630
+ });
2631
+ }
2632
+
2633
+ dispose() {
2634
+ if (!this._isAppended) {
2635
+ return;
2636
+ }
2637
+
2638
+ EventHandler.off(this._element, EVENT_MOUSEDOWN);
2639
+
2640
+ this._element.remove();
2641
+
2642
+ this._isAppended = false;
2643
+ } // Private
2644
+
2645
+
2646
+ _getElement() {
2647
+ if (!this._element) {
2648
+ const backdrop = document.createElement('div');
2649
+ backdrop.className = this._config.className;
2650
+
2651
+ if (this._config.isAnimated) {
2652
+ backdrop.classList.add(CLASS_NAME_FADE$4);
2653
+ }
2654
+
2655
+ this._element = backdrop;
2656
+ }
2657
+
2658
+ return this._element;
2659
+ }
2660
+
2661
+ _getConfig(config) {
2662
+ config = { ...Default$7,
2663
+ ...(typeof config === 'object' ? config : {})
2664
+ }; // use getElement() with the default "body" to get a fresh Element on each instantiation
2665
+
2666
+ config.rootElement = getElement(config.rootElement);
2667
+ typeCheckConfig(NAME$8, config, DefaultType$7);
2668
+ return config;
2669
+ }
2670
+
2671
+ _append() {
2672
+ if (this._isAppended) {
2673
+ return;
2674
+ }
2675
+
2676
+ this._config.rootElement.append(this._getElement());
2677
+
2678
+ EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {
2679
+ execute(this._config.clickCallback);
2680
+ });
2681
+ this._isAppended = true;
2682
+ }
2683
+
2684
+ _emulateAnimation(callback) {
2685
+ executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
2686
+ }
2687
+
2688
+ }
2689
+
2690
+ /**
2691
+ * --------------------------------------------------------------------------
2692
+ * Bootstrap (v5.1.3): util/focustrap.js
2693
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2694
+ * --------------------------------------------------------------------------
2695
+ */
2696
+ /**
2697
+ * Constants
2698
+ */
2699
+
2700
+ const NAME$7 = 'focustrap';
2701
+ const DATA_KEY$7 = 'bs.focustrap';
2702
+ const EVENT_KEY$7 = `.${DATA_KEY$7}`;
2703
+ const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;
2704
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;
2705
+ const TAB_KEY = 'Tab';
2706
+ const TAB_NAV_FORWARD = 'forward';
2707
+ const TAB_NAV_BACKWARD = 'backward';
2708
+ const Default$6 = {
2709
+ trapElement: null,
2710
+ // The element to trap focus inside of
2711
+ autofocus: true
2712
+ };
2713
+ const DefaultType$6 = {
2714
+ trapElement: 'element',
2715
+ autofocus: 'boolean'
2716
+ };
2717
+ /**
2718
+ * Class definition
2719
+ */
2720
+
2721
+ class FocusTrap {
2722
+ constructor(config) {
2723
+ this._config = this._getConfig(config);
2724
+ this._isActive = false;
2725
+ this._lastTabNavDirection = null;
2726
+ } // Public
2727
+
2728
+
2729
+ activate() {
2730
+ const {
2731
+ trapElement,
2732
+ autofocus
2733
+ } = this._config;
2734
+
2735
+ if (this._isActive) {
2736
+ return;
2737
+ }
2738
+
2739
+ if (autofocus) {
2740
+ trapElement.focus();
2741
+ }
2742
+
2743
+ EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop
2744
+
2745
+ EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));
2746
+ EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));
2747
+ this._isActive = true;
2748
+ }
2749
+
2750
+ deactivate() {
2751
+ if (!this._isActive) {
2752
+ return;
2753
+ }
2754
+
2755
+ this._isActive = false;
2756
+ EventHandler.off(document, EVENT_KEY$7);
2757
+ } // Private
2758
+
2759
+
2760
+ _handleFocusin(event) {
2761
+ const {
2762
+ target
2763
+ } = event;
2764
+ const {
2765
+ trapElement
2766
+ } = this._config;
2767
+
2768
+ if (target === document || target === trapElement || trapElement.contains(target)) {
2769
+ return;
2770
+ }
2771
+
2772
+ const elements = SelectorEngine.focusableChildren(trapElement);
2773
+
2774
+ if (elements.length === 0) {
2775
+ trapElement.focus();
2776
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
2777
+ elements[elements.length - 1].focus();
2778
+ } else {
2779
+ elements[0].focus();
2780
+ }
2781
+ }
2782
+
2783
+ _handleKeydown(event) {
2784
+ if (event.key !== TAB_KEY) {
2785
+ return;
2786
+ }
2787
+
2788
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
2789
+ }
2790
+
2791
+ _getConfig(config) {
2792
+ config = { ...Default$6,
2793
+ ...(typeof config === 'object' ? config : {})
2794
+ };
2795
+ typeCheckConfig(NAME$7, config, DefaultType$6);
2796
+ return config;
2797
+ }
2798
+
2799
+ }
2800
+
2801
+ /**
2802
+ * --------------------------------------------------------------------------
2803
+ * Bootstrap (v5.1.3): modal.js
2804
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
2805
+ * --------------------------------------------------------------------------
2806
+ */
2807
+ /**
2808
+ * Constants
2809
+ */
2810
+
2811
+ const NAME$6 = 'modal';
2812
+ const DATA_KEY$6 = 'bs.modal';
2813
+ const EVENT_KEY$6 = `.${DATA_KEY$6}`;
2814
+ const DATA_API_KEY$3 = '.data-api';
2815
+ const ESCAPE_KEY$1 = 'Escape';
2816
+ const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;
2817
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;
2818
+ const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;
2819
+ const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;
2820
+ const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;
2821
+ const EVENT_RESIZE = `resize${EVENT_KEY$6}`;
2822
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;
2823
+ const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;
2824
+ const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;
2825
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;
2826
+ const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
2827
+ const CLASS_NAME_OPEN = 'modal-open';
2828
+ const CLASS_NAME_FADE$3 = 'fade';
2829
+ const CLASS_NAME_SHOW$4 = 'show';
2830
+ const CLASS_NAME_STATIC = 'modal-static';
2831
+ const OPEN_SELECTOR$1 = '.modal.show';
2832
+ const SELECTOR_DIALOG = '.modal-dialog';
2833
+ const SELECTOR_MODAL_BODY = '.modal-body';
2834
+ const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
2835
+ const Default$5 = {
2836
+ backdrop: true,
2837
+ keyboard: true,
2838
+ focus: true
2839
+ };
2840
+ const DefaultType$5 = {
2841
+ backdrop: '(boolean|string)',
2842
+ keyboard: 'boolean',
2843
+ focus: 'boolean'
2844
+ };
2845
+ /**
2846
+ * Class definition
2847
+ */
2848
+
2849
+ class Modal extends BaseComponent {
2850
+ constructor(element, config) {
2851
+ super(element);
2852
+ this._config = this._getConfig(config);
2853
+ this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
2854
+ this._backdrop = this._initializeBackDrop();
2855
+ this._focustrap = this._initializeFocusTrap();
2856
+ this._isShown = false;
2857
+ this._ignoreBackdropClick = false;
2858
+ this._isTransitioning = false;
2859
+ this._scrollBar = new ScrollBarHelper();
2860
+ } // Getters
2861
+
2862
+
2863
+ static get Default() {
2864
+ return Default$5;
2865
+ }
2866
+
2867
+ static get NAME() {
2868
+ return NAME$6;
2869
+ } // Public
2870
+
2871
+
2872
+ toggle(relatedTarget) {
2873
+ return this._isShown ? this.hide() : this.show(relatedTarget);
2874
+ }
2875
+
2876
+ show(relatedTarget) {
2877
+ if (this._isShown || this._isTransitioning) {
2878
+ return;
2879
+ }
2880
+
2881
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
2882
+ relatedTarget
2883
+ });
2884
+
2885
+ if (showEvent.defaultPrevented) {
2886
+ return;
2887
+ }
2888
+
2889
+ this._isShown = true;
2890
+
2891
+ if (this._isAnimated()) {
2892
+ this._isTransitioning = true;
2893
+ }
2894
+
2895
+ this._scrollBar.hide();
2896
+
2897
+ document.body.classList.add(CLASS_NAME_OPEN);
2898
+
2899
+ this._adjustDialog();
2900
+
2901
+ this._setEscapeEvent();
2902
+
2903
+ this._setResizeEvent();
2904
+
2905
+ EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {
2906
+ EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {
2907
+ if (event.target === this._element) {
2908
+ this._ignoreBackdropClick = true;
2909
+ }
2910
+ });
2911
+ });
2912
+
2913
+ this._showBackdrop(() => this._showElement(relatedTarget));
2914
+ }
2915
+
2916
+ hide() {
2917
+ if (!this._isShown || this._isTransitioning) {
2918
+ return;
2919
+ }
2920
+
2921
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
2922
+
2923
+ if (hideEvent.defaultPrevented) {
2924
+ return;
2925
+ }
2926
+
2927
+ this._isShown = false;
2928
+
2929
+ const isAnimated = this._isAnimated();
2930
+
2931
+ if (isAnimated) {
2932
+ this._isTransitioning = true;
2933
+ }
2934
+
2935
+ this._setEscapeEvent();
2936
+
2937
+ this._setResizeEvent();
2938
+
2939
+ this._focustrap.deactivate();
2940
+
2941
+ this._element.classList.remove(CLASS_NAME_SHOW$4);
2942
+
2943
+ EventHandler.off(this._element, EVENT_CLICK_DISMISS);
2944
+ EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);
2945
+
2946
+ this._queueCallback(() => this._hideModal(), this._element, isAnimated);
2947
+ }
2948
+
2949
+ dispose() {
2950
+ for (const htmlElement of [window, this._dialog]) {
2951
+ EventHandler.off(htmlElement, EVENT_KEY$6);
2952
+ }
2953
+
2954
+ this._backdrop.dispose();
2955
+
2956
+ this._focustrap.deactivate();
2957
+
2958
+ super.dispose();
2959
+ }
2960
+
2961
+ handleUpdate() {
2962
+ this._adjustDialog();
2963
+ } // Private
2964
+
2965
+
2966
+ _initializeBackDrop() {
2967
+ return new Backdrop({
2968
+ isVisible: Boolean(this._config.backdrop),
2969
+ // 'static' option will be translated to true, and booleans will keep their value
2970
+ isAnimated: this._isAnimated()
2971
+ });
2972
+ }
2973
+
2974
+ _initializeFocusTrap() {
2975
+ return new FocusTrap({
2976
+ trapElement: this._element
2977
+ });
2978
+ }
2979
+
2980
+ _getConfig(config) {
2981
+ config = { ...Default$5,
2982
+ ...Manipulator.getDataAttributes(this._element),
2983
+ ...(typeof config === 'object' ? config : {})
2984
+ };
2985
+ typeCheckConfig(NAME$6, config, DefaultType$5);
2986
+ return config;
2987
+ }
2988
+
2989
+ _showElement(relatedTarget) {
2990
+ const isAnimated = this._isAnimated();
2991
+
2992
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
2993
+
2994
+ if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
2995
+ // Don't move modal's DOM position
2996
+ document.body.append(this._element);
2997
+ }
2998
+
2999
+ this._element.style.display = 'block';
3000
+
3001
+ this._element.removeAttribute('aria-hidden');
3002
+
3003
+ this._element.setAttribute('aria-modal', true);
3004
+
3005
+ this._element.setAttribute('role', 'dialog');
3006
+
3007
+ this._element.scrollTop = 0;
3008
+
3009
+ if (modalBody) {
3010
+ modalBody.scrollTop = 0;
3011
+ }
3012
+
3013
+ if (isAnimated) {
3014
+ reflow(this._element);
3015
+ }
3016
+
3017
+ this._element.classList.add(CLASS_NAME_SHOW$4);
3018
+
3019
+ const transitionComplete = () => {
3020
+ if (this._config.focus) {
3021
+ this._focustrap.activate();
3022
+ }
3023
+
3024
+ this._isTransitioning = false;
3025
+ EventHandler.trigger(this._element, EVENT_SHOWN$3, {
3026
+ relatedTarget
3027
+ });
3028
+ };
3029
+
3030
+ this._queueCallback(transitionComplete, this._dialog, isAnimated);
3031
+ }
3032
+
3033
+ _setEscapeEvent() {
3034
+ if (this._isShown) {
3035
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {
3036
+ if (this._config.keyboard && event.key === ESCAPE_KEY$1) {
3037
+ event.preventDefault();
3038
+ this.hide();
3039
+ } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {
3040
+ this._triggerBackdropTransition();
3041
+ }
3042
+ });
3043
+ } else {
3044
+ EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);
3045
+ }
3046
+ }
3047
+
3048
+ _setResizeEvent() {
3049
+ if (this._isShown) {
3050
+ EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());
3051
+ } else {
3052
+ EventHandler.off(window, EVENT_RESIZE);
3053
+ }
3054
+ }
3055
+
3056
+ _hideModal() {
3057
+ this._element.style.display = 'none';
3058
+
3059
+ this._element.setAttribute('aria-hidden', true);
3060
+
3061
+ this._element.removeAttribute('aria-modal');
3062
+
3063
+ this._element.removeAttribute('role');
3064
+
3065
+ this._isTransitioning = false;
3066
+
3067
+ this._backdrop.hide(() => {
3068
+ document.body.classList.remove(CLASS_NAME_OPEN);
3069
+
3070
+ this._resetAdjustments();
3071
+
3072
+ this._scrollBar.reset();
3073
+
3074
+ EventHandler.trigger(this._element, EVENT_HIDDEN$3);
3075
+ });
3076
+ }
3077
+
3078
+ _showBackdrop(callback) {
3079
+ EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {
3080
+ if (this._ignoreBackdropClick) {
3081
+ this._ignoreBackdropClick = false;
3082
+ return;
3083
+ }
3084
+
3085
+ if (event.target !== event.currentTarget) {
3086
+ return;
3087
+ }
3088
+
3089
+ if (this._config.backdrop === true) {
3090
+ this.hide();
3091
+ } else if (this._config.backdrop === 'static') {
3092
+ this._triggerBackdropTransition();
3093
+ }
3094
+ });
3095
+
3096
+ this._backdrop.show(callback);
3097
+ }
3098
+
3099
+ _isAnimated() {
3100
+ return this._element.classList.contains(CLASS_NAME_FADE$3);
3101
+ }
3102
+
3103
+ _triggerBackdropTransition() {
3104
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
3105
+
3106
+ if (hideEvent.defaultPrevented) {
3107
+ return;
3108
+ }
3109
+
3110
+ const {
3111
+ classList,
3112
+ scrollHeight,
3113
+ style
3114
+ } = this._element;
3115
+ const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed
3116
+
3117
+ if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {
3118
+ return;
3119
+ }
3120
+
3121
+ if (!isModalOverflowing) {
3122
+ style.overflowY = 'hidden';
3123
+ }
3124
+
3125
+ classList.add(CLASS_NAME_STATIC);
3126
+
3127
+ this._queueCallback(() => {
3128
+ classList.remove(CLASS_NAME_STATIC);
3129
+
3130
+ if (!isModalOverflowing) {
3131
+ this._queueCallback(() => {
3132
+ style.overflowY = '';
3133
+ }, this._dialog);
3134
+ }
3135
+ }, this._dialog);
3136
+
3137
+ this._element.focus();
3138
+ }
3139
+ /**
3140
+ * The following methods are used to handle overflowing modals
3141
+ */
3142
+
3143
+
3144
+ _adjustDialog() {
3145
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
3146
+
3147
+ const scrollbarWidth = this._scrollBar.getWidth();
3148
+
3149
+ const isBodyOverflowing = scrollbarWidth > 0;
3150
+
3151
+ if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {
3152
+ this._element.style.paddingLeft = `${scrollbarWidth}px`;
3153
+ }
3154
+
3155
+ if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {
3156
+ this._element.style.paddingRight = `${scrollbarWidth}px`;
3157
+ }
3158
+ }
3159
+
3160
+ _resetAdjustments() {
3161
+ this._element.style.paddingLeft = '';
3162
+ this._element.style.paddingRight = '';
3163
+ } // Static
3164
+
3165
+
3166
+ static jQueryInterface(config, relatedTarget) {
3167
+ return this.each(function () {
3168
+ const data = Modal.getOrCreateInstance(this, config);
3169
+
3170
+ if (typeof config !== 'string') {
3171
+ return;
3172
+ }
3173
+
3174
+ if (typeof data[config] === 'undefined') {
3175
+ throw new TypeError(`No method named "${config}"`);
3176
+ }
3177
+
3178
+ data[config](relatedTarget);
3179
+ });
3180
+ }
3181
+
3182
+ }
3183
+ /**
3184
+ * Data API implementation
3185
+ */
3186
+
3187
+
3188
+ EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {
3189
+ const target = getElementFromSelector(this);
3190
+
3191
+ if (['A', 'AREA'].includes(this.tagName)) {
3192
+ event.preventDefault();
3193
+ }
3194
+
3195
+ EventHandler.one(target, EVENT_SHOW$3, showEvent => {
3196
+ if (showEvent.defaultPrevented) {
3197
+ // only register focus restorer if modal will actually get shown
3198
+ return;
3199
+ }
3200
+
3201
+ EventHandler.one(target, EVENT_HIDDEN$3, () => {
3202
+ if (isVisible(this)) {
3203
+ this.focus();
3204
+ }
3205
+ });
3206
+ }); // avoid conflict when clicking moddal toggler while another one is open
3207
+
3208
+ const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
3209
+
3210
+ if (allReadyOpen) {
3211
+ Modal.getInstance(allReadyOpen).hide();
3212
+ }
3213
+
3214
+ const data = Modal.getOrCreateInstance(target);
3215
+ data.toggle(this);
3216
+ });
3217
+ enableDismissTrigger(Modal);
3218
+ /**
3219
+ * jQuery
3220
+ */
3221
+
3222
+ defineJQueryPlugin(Modal);
3223
+
3224
+ /**
3225
+ * --------------------------------------------------------------------------
3226
+ * Bootstrap (v5.1.3): offcanvas.js
3227
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3228
+ * --------------------------------------------------------------------------
3229
+ */
3230
+ /**
3231
+ * Constants
3232
+ */
3233
+
3234
+ const NAME$5 = 'offcanvas';
3235
+ const DATA_KEY$5 = 'bs.offcanvas';
3236
+ const EVENT_KEY$5 = `.${DATA_KEY$5}`;
3237
+ const DATA_API_KEY$2 = '.data-api';
3238
+ const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;
3239
+ const ESCAPE_KEY = 'Escape';
3240
+ const CLASS_NAME_SHOW$3 = 'show';
3241
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';
3242
+ const OPEN_SELECTOR = '.offcanvas.show';
3243
+ const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;
3244
+ const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;
3245
+ const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;
3246
+ const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;
3247
+ const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;
3248
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;
3249
+ const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
3250
+ const Default$4 = {
3251
+ backdrop: true,
3252
+ keyboard: true,
3253
+ scroll: false
3254
+ };
3255
+ const DefaultType$4 = {
3256
+ backdrop: 'boolean',
3257
+ keyboard: 'boolean',
3258
+ scroll: 'boolean'
3259
+ };
3260
+ /**
3261
+ * Class definition
3262
+ */
3263
+
3264
+ class Offcanvas extends BaseComponent {
3265
+ constructor(element, config) {
3266
+ super(element);
3267
+ this._config = this._getConfig(config);
3268
+ this._isShown = false;
3269
+ this._backdrop = this._initializeBackDrop();
3270
+ this._focustrap = this._initializeFocusTrap();
3271
+
3272
+ this._addEventListeners();
3273
+ } // Getters
3274
+
3275
+
3276
+ static get NAME() {
3277
+ return NAME$5;
3278
+ }
3279
+
3280
+ static get Default() {
3281
+ return Default$4;
3282
+ } // Public
3283
+
3284
+
3285
+ toggle(relatedTarget) {
3286
+ return this._isShown ? this.hide() : this.show(relatedTarget);
3287
+ }
3288
+
3289
+ show(relatedTarget) {
3290
+ if (this._isShown) {
3291
+ return;
3292
+ }
3293
+
3294
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {
3295
+ relatedTarget
3296
+ });
3297
+
3298
+ if (showEvent.defaultPrevented) {
3299
+ return;
3300
+ }
3301
+
3302
+ this._isShown = true;
3303
+ this._element.style.visibility = 'visible';
3304
+
3305
+ this._backdrop.show();
3306
+
3307
+ if (!this._config.scroll) {
3308
+ new ScrollBarHelper().hide();
3309
+ }
3310
+
3311
+ this._element.removeAttribute('aria-hidden');
3312
+
3313
+ this._element.setAttribute('aria-modal', true);
3314
+
3315
+ this._element.setAttribute('role', 'dialog');
3316
+
3317
+ this._element.classList.add(CLASS_NAME_SHOW$3);
3318
+
3319
+ const completeCallBack = () => {
3320
+ if (!this._config.scroll) {
3321
+ this._focustrap.activate();
3322
+ }
3323
+
3324
+ EventHandler.trigger(this._element, EVENT_SHOWN$2, {
3325
+ relatedTarget
3326
+ });
3327
+ };
3328
+
3329
+ this._queueCallback(completeCallBack, this._element, true);
3330
+ }
3331
+
3332
+ hide() {
3333
+ if (!this._isShown) {
3334
+ return;
3335
+ }
3336
+
3337
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);
3338
+
3339
+ if (hideEvent.defaultPrevented) {
3340
+ return;
3341
+ }
3342
+
3343
+ this._focustrap.deactivate();
3344
+
3345
+ this._element.blur();
3346
+
3347
+ this._isShown = false;
3348
+
3349
+ this._element.classList.remove(CLASS_NAME_SHOW$3);
3350
+
3351
+ this._backdrop.hide();
3352
+
3353
+ const completeCallback = () => {
3354
+ this._element.setAttribute('aria-hidden', true);
3355
+
3356
+ this._element.removeAttribute('aria-modal');
3357
+
3358
+ this._element.removeAttribute('role');
3359
+
3360
+ this._element.style.visibility = 'hidden';
3361
+
3362
+ if (!this._config.scroll) {
3363
+ new ScrollBarHelper().reset();
3364
+ }
3365
+
3366
+ EventHandler.trigger(this._element, EVENT_HIDDEN$2);
3367
+ };
3368
+
3369
+ this._queueCallback(completeCallback, this._element, true);
3370
+ }
3371
+
3372
+ dispose() {
3373
+ this._backdrop.dispose();
3374
+
3375
+ this._focustrap.deactivate();
3376
+
3377
+ super.dispose();
3378
+ } // Private
3379
+
3380
+
3381
+ _getConfig(config) {
3382
+ config = { ...Default$4,
3383
+ ...Manipulator.getDataAttributes(this._element),
3384
+ ...(typeof config === 'object' ? config : {})
3385
+ };
3386
+ typeCheckConfig(NAME$5, config, DefaultType$4);
3387
+ return config;
3388
+ }
3389
+
3390
+ _initializeBackDrop() {
3391
+ return new Backdrop({
3392
+ className: CLASS_NAME_BACKDROP,
3393
+ isVisible: this._config.backdrop,
3394
+ isAnimated: true,
3395
+ rootElement: this._element.parentNode,
3396
+ clickCallback: () => this.hide()
3397
+ });
3398
+ }
3399
+
3400
+ _initializeFocusTrap() {
3401
+ return new FocusTrap({
3402
+ trapElement: this._element
3403
+ });
3404
+ }
3405
+
3406
+ _addEventListeners() {
3407
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
3408
+ if (this._config.keyboard && event.key === ESCAPE_KEY) {
3409
+ this.hide();
3410
+ }
3411
+ });
3412
+ } // Static
3413
+
3414
+
3415
+ static jQueryInterface(config) {
3416
+ return this.each(function () {
3417
+ const data = Offcanvas.getOrCreateInstance(this, config);
3418
+
3419
+ if (typeof config !== 'string') {
3420
+ return;
3421
+ }
3422
+
3423
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
3424
+ throw new TypeError(`No method named "${config}"`);
3425
+ }
3426
+
3427
+ data[config](this);
3428
+ });
3429
+ }
3430
+
3431
+ }
3432
+ /**
3433
+ * Data API implementation
3434
+ */
3435
+
3436
+
3437
+ EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {
3438
+ const target = getElementFromSelector(this);
3439
+
3440
+ if (['A', 'AREA'].includes(this.tagName)) {
3441
+ event.preventDefault();
3442
+ }
3443
+
3444
+ if (isDisabled(this)) {
3445
+ return;
3446
+ }
3447
+
3448
+ EventHandler.one(target, EVENT_HIDDEN$2, () => {
3449
+ // focus on trigger when it is closed
3450
+ if (isVisible(this)) {
3451
+ this.focus();
3452
+ }
3453
+ }); // avoid conflict when clicking a toggler of an offcanvas, while another is open
3454
+
3455
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
3456
+
3457
+ if (alreadyOpen && alreadyOpen !== target) {
3458
+ Offcanvas.getInstance(alreadyOpen).hide();
3459
+ }
3460
+
3461
+ const data = Offcanvas.getOrCreateInstance(target);
3462
+ data.toggle(this);
3463
+ });
3464
+ EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
3465
+ for (const el of SelectorEngine.find(OPEN_SELECTOR)) {
3466
+ Offcanvas.getOrCreateInstance(el).show();
3467
+ }
3468
+ });
3469
+ enableDismissTrigger(Offcanvas);
3470
+ /**
3471
+ * jQuery
3472
+ */
3473
+
3474
+ defineJQueryPlugin(Offcanvas);
3475
+
3476
+ /**
3477
+ * --------------------------------------------------------------------------
3478
+ * Bootstrap (v5.1.3): util/sanitizer.js
3479
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3480
+ * --------------------------------------------------------------------------
3481
+ */
3482
+ const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);
3483
+ const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
3484
+ /**
3485
+ * A pattern that recognizes a commonly useful subset of URLs that are safe.
3486
+ *
3487
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3488
+ */
3489
+
3490
+ const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
3491
+ /**
3492
+ * A pattern that matches safe data URLs. Only matches image, video and audio types.
3493
+ *
3494
+ * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts
3495
+ */
3496
+
3497
+ const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
3498
+
3499
+ const allowedAttribute = (attribute, allowedAttributeList) => {
3500
+ const attributeName = attribute.nodeName.toLowerCase();
3501
+
3502
+ if (allowedAttributeList.includes(attributeName)) {
3503
+ if (uriAttributes.has(attributeName)) {
3504
+ return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
3505
+ }
3506
+
3507
+ return true;
3508
+ } // Check if a regular expression validates the attribute.
3509
+
3510
+
3511
+ return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));
3512
+ };
3513
+
3514
+ const DefaultAllowlist = {
3515
+ // Global attributes allowed on any supplied element below.
3516
+ '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
3517
+ a: ['target', 'href', 'title', 'rel'],
3518
+ area: [],
3519
+ b: [],
3520
+ br: [],
3521
+ col: [],
3522
+ code: [],
3523
+ div: [],
3524
+ em: [],
3525
+ hr: [],
3526
+ h1: [],
3527
+ h2: [],
3528
+ h3: [],
3529
+ h4: [],
3530
+ h5: [],
3531
+ h6: [],
3532
+ i: [],
3533
+ img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],
3534
+ li: [],
3535
+ ol: [],
3536
+ p: [],
3537
+ pre: [],
3538
+ s: [],
3539
+ small: [],
3540
+ span: [],
3541
+ sub: [],
3542
+ sup: [],
3543
+ strong: [],
3544
+ u: [],
3545
+ ul: []
3546
+ };
3547
+ function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {
3548
+ if (!unsafeHtml.length) {
3549
+ return unsafeHtml;
3550
+ }
3551
+
3552
+ if (sanitizeFn && typeof sanitizeFn === 'function') {
3553
+ return sanitizeFn(unsafeHtml);
3554
+ }
3555
+
3556
+ const domParser = new window.DOMParser();
3557
+ const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');
3558
+ const elements = [].concat(...createdDocument.body.querySelectorAll('*'));
3559
+
3560
+ for (const element of elements) {
3561
+ const elementName = element.nodeName.toLowerCase();
3562
+
3563
+ if (!Object.keys(allowList).includes(elementName)) {
3564
+ element.remove();
3565
+ continue;
3566
+ }
3567
+
3568
+ const attributeList = [].concat(...element.attributes);
3569
+ const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);
3570
+
3571
+ for (const attribute of attributeList) {
3572
+ if (!allowedAttribute(attribute, allowedAttributes)) {
3573
+ element.removeAttribute(attribute.nodeName);
3574
+ }
3575
+ }
3576
+ }
3577
+
3578
+ return createdDocument.body.innerHTML;
3579
+ }
3580
+
3581
+ /**
3582
+ * --------------------------------------------------------------------------
3583
+ * Bootstrap (v5.1.3): tooltip.js
3584
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
3585
+ * --------------------------------------------------------------------------
3586
+ */
3587
+ /**
3588
+ * Constants
3589
+ */
3590
+
3591
+ const NAME$4 = 'tooltip';
3592
+ const DATA_KEY$4 = 'bs.tooltip';
3593
+ const EVENT_KEY$4 = `.${DATA_KEY$4}`;
3594
+ const CLASS_PREFIX$1 = 'bs-tooltip';
3595
+ const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);
3596
+ const CLASS_NAME_FADE$2 = 'fade';
3597
+ const CLASS_NAME_MODAL = 'modal';
3598
+ const CLASS_NAME_SHOW$2 = 'show';
3599
+ const HOVER_STATE_SHOW = 'show';
3600
+ const HOVER_STATE_OUT = 'out';
3601
+ const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';
3602
+ const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
3603
+ const EVENT_MODAL_HIDE = 'hide.bs.modal';
3604
+ const TRIGGER_HOVER = 'hover';
3605
+ const TRIGGER_FOCUS = 'focus';
3606
+ const TRIGGER_CLICK = 'click';
3607
+ const TRIGGER_MANUAL = 'manual';
3608
+ const AttachmentMap = {
3609
+ AUTO: 'auto',
3610
+ TOP: 'top',
3611
+ RIGHT: isRTL() ? 'left' : 'right',
3612
+ BOTTOM: 'bottom',
3613
+ LEFT: isRTL() ? 'right' : 'left'
3614
+ };
3615
+ const Default$3 = {
3616
+ animation: true,
3617
+ template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-arrow"></div>' + '<div class="tooltip-inner"></div>' + '</div>',
3618
+ trigger: 'hover focus',
3619
+ title: '',
3620
+ delay: 0,
3621
+ html: false,
3622
+ selector: false,
3623
+ placement: 'top',
3624
+ offset: [0, 0],
3625
+ container: false,
3626
+ fallbackPlacements: ['top', 'right', 'bottom', 'left'],
3627
+ boundary: 'clippingParents',
3628
+ customClass: '',
3629
+ sanitize: true,
3630
+ sanitizeFn: null,
3631
+ allowList: DefaultAllowlist,
3632
+ popperConfig: null
3633
+ };
3634
+ const DefaultType$3 = {
3635
+ animation: 'boolean',
3636
+ template: 'string',
3637
+ title: '(string|element|function)',
3638
+ trigger: 'string',
3639
+ delay: '(number|object)',
3640
+ html: 'boolean',
3641
+ selector: '(string|boolean)',
3642
+ placement: '(string|function)',
3643
+ offset: '(array|string|function)',
3644
+ container: '(string|element|boolean)',
3645
+ fallbackPlacements: 'array',
3646
+ boundary: '(string|element)',
3647
+ customClass: '(string|function)',
3648
+ sanitize: 'boolean',
3649
+ sanitizeFn: '(null|function)',
3650
+ allowList: 'object',
3651
+ popperConfig: '(null|object|function)'
3652
+ };
3653
+ const Event$2 = {
3654
+ HIDE: `hide${EVENT_KEY$4}`,
3655
+ HIDDEN: `hidden${EVENT_KEY$4}`,
3656
+ SHOW: `show${EVENT_KEY$4}`,
3657
+ SHOWN: `shown${EVENT_KEY$4}`,
3658
+ INSERTED: `inserted${EVENT_KEY$4}`,
3659
+ CLICK: `click${EVENT_KEY$4}`,
3660
+ FOCUSIN: `focusin${EVENT_KEY$4}`,
3661
+ FOCUSOUT: `focusout${EVENT_KEY$4}`,
3662
+ MOUSEENTER: `mouseenter${EVENT_KEY$4}`,
3663
+ MOUSELEAVE: `mouseleave${EVENT_KEY$4}`
3664
+ };
3665
+ /**
3666
+ * Class definition
3667
+ */
3668
+
3669
+ class Tooltip extends BaseComponent {
3670
+ constructor(element, config) {
3671
+ if (typeof Popper__namespace === 'undefined') {
3672
+ throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)');
3673
+ }
3674
+
3675
+ super(element); // Private
3676
+
3677
+ this._isEnabled = true;
3678
+ this._timeout = 0;
3679
+ this._hoverState = '';
3680
+ this._activeTrigger = {};
3681
+ this._popper = null; // Protected
3682
+
3683
+ this._config = this._getConfig(config);
3684
+ this.tip = null;
3685
+
3686
+ this._setListeners();
3687
+ } // Getters
3688
+
3689
+
3690
+ static get Default() {
3691
+ return Default$3;
3692
+ }
3693
+
3694
+ static get NAME() {
3695
+ return NAME$4;
3696
+ }
3697
+
3698
+ static get Event() {
3699
+ return Event$2;
3700
+ }
3701
+
3702
+ static get DefaultType() {
3703
+ return DefaultType$3;
3704
+ } // Public
3705
+
3706
+
3707
+ enable() {
3708
+ this._isEnabled = true;
3709
+ }
3710
+
3711
+ disable() {
3712
+ this._isEnabled = false;
3713
+ }
3714
+
3715
+ toggleEnabled() {
3716
+ this._isEnabled = !this._isEnabled;
3717
+ }
3718
+
3719
+ toggle(event) {
3720
+ if (!this._isEnabled) {
3721
+ return;
3722
+ }
3723
+
3724
+ if (event) {
3725
+ const context = this._initializeOnDelegatedTarget(event);
3726
+
3727
+ context._activeTrigger.click = !context._activeTrigger.click;
3728
+
3729
+ if (context._isWithActiveTrigger()) {
3730
+ context._enter(null, context);
3731
+ } else {
3732
+ context._leave(null, context);
3733
+ }
3734
+ } else {
3735
+ if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {
3736
+ this._leave(null, this);
3737
+
3738
+ return;
3739
+ }
3740
+
3741
+ this._enter(null, this);
3742
+ }
3743
+ }
3744
+
3745
+ dispose() {
3746
+ clearTimeout(this._timeout);
3747
+ EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
3748
+
3749
+ if (this.tip) {
3750
+ this.tip.remove();
3751
+ }
3752
+
3753
+ this._disposePopper();
3754
+
3755
+ super.dispose();
3756
+ }
3757
+
3758
+ show() {
3759
+ if (this._element.style.display === 'none') {
3760
+ throw new Error('Please use show on visible elements');
3761
+ }
3762
+
3763
+ if (!(this.isWithContent() && this._isEnabled)) {
3764
+ return;
3765
+ }
3766
+
3767
+ const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);
3768
+ const shadowRoot = findShadowRoot(this._element);
3769
+ const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);
3770
+
3771
+ if (showEvent.defaultPrevented || !isInTheDom) {
3772
+ return;
3773
+ } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`
3774
+ // This will be removed later in favor of a `setContent` method
3775
+
3776
+
3777
+ if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {
3778
+ this._disposePopper();
3779
+
3780
+ this.tip.remove();
3781
+ this.tip = null;
3782
+ }
3783
+
3784
+ const tip = this.getTipElement();
3785
+ const tipId = getUID(this.constructor.NAME);
3786
+ tip.setAttribute('id', tipId);
3787
+
3788
+ this._element.setAttribute('aria-describedby', tipId);
3789
+
3790
+ if (this._config.animation) {
3791
+ tip.classList.add(CLASS_NAME_FADE$2);
3792
+ }
3793
+
3794
+ const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;
3795
+
3796
+ const attachment = this._getAttachment(placement);
3797
+
3798
+ this._addAttachmentClass(attachment);
3799
+
3800
+ const {
3801
+ container
3802
+ } = this._config;
3803
+ Data.set(tip, this.constructor.DATA_KEY, this);
3804
+
3805
+ if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
3806
+ container.append(tip);
3807
+ EventHandler.trigger(this._element, this.constructor.Event.INSERTED);
3808
+ }
3809
+
3810
+ if (this._popper) {
3811
+ this._popper.update();
3812
+ } else {
3813
+ this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));
3814
+ }
3815
+
3816
+ tip.classList.add(CLASS_NAME_SHOW$2);
3817
+
3818
+ const customClass = this._resolvePossibleFunction(this._config.customClass);
3819
+
3820
+ if (customClass) {
3821
+ tip.classList.add(...customClass.split(' '));
3822
+ } // If this is a touch-enabled device we add extra
3823
+ // empty mouseover listeners to the body's immediate children;
3824
+ // only needed because of broken event delegation on iOS
3825
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
3826
+
3827
+
3828
+ if ('ontouchstart' in document.documentElement) {
3829
+ for (const element of [].concat(...document.body.children)) {
3830
+ EventHandler.on(element, 'mouseover', noop);
3831
+ }
3832
+ }
3833
+
3834
+ const complete = () => {
3835
+ const prevHoverState = this._hoverState;
3836
+ this._hoverState = null;
3837
+ EventHandler.trigger(this._element, this.constructor.Event.SHOWN);
3838
+
3839
+ if (prevHoverState === HOVER_STATE_OUT) {
3840
+ this._leave(null, this);
3841
+ }
3842
+ };
3843
+
3844
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3845
+
3846
+ this._queueCallback(complete, this.tip, isAnimated);
3847
+ }
3848
+
3849
+ hide() {
3850
+ if (!this._popper) {
3851
+ return;
3852
+ }
3853
+
3854
+ const tip = this.getTipElement();
3855
+
3856
+ const complete = () => {
3857
+ if (this._isWithActiveTrigger()) {
3858
+ return;
3859
+ }
3860
+
3861
+ if (this._hoverState !== HOVER_STATE_SHOW) {
3862
+ tip.remove();
3863
+ }
3864
+
3865
+ this._cleanTipClass();
3866
+
3867
+ this._element.removeAttribute('aria-describedby');
3868
+
3869
+ EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);
3870
+
3871
+ this._disposePopper();
3872
+ };
3873
+
3874
+ const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);
3875
+
3876
+ if (hideEvent.defaultPrevented) {
3877
+ return;
3878
+ }
3879
+
3880
+ tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra
3881
+ // empty mouseover listeners we added for iOS support
3882
+
3883
+ if ('ontouchstart' in document.documentElement) {
3884
+ for (const element of [].concat(...document.body.children)) {
3885
+ EventHandler.off(element, 'mouseover', noop);
3886
+ }
3887
+ }
3888
+
3889
+ this._activeTrigger[TRIGGER_CLICK] = false;
3890
+ this._activeTrigger[TRIGGER_FOCUS] = false;
3891
+ this._activeTrigger[TRIGGER_HOVER] = false;
3892
+ const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);
3893
+
3894
+ this._queueCallback(complete, this.tip, isAnimated);
3895
+
3896
+ this._hoverState = '';
3897
+ }
3898
+
3899
+ update() {
3900
+ if (this._popper !== null) {
3901
+ this._popper.update();
3902
+ }
3903
+ } // Protected
3904
+
3905
+
3906
+ isWithContent() {
3907
+ return Boolean(this.getTitle());
3908
+ }
3909
+
3910
+ getTipElement() {
3911
+ if (this.tip) {
3912
+ return this.tip;
3913
+ }
3914
+
3915
+ const element = document.createElement('div');
3916
+ element.innerHTML = this._config.template;
3917
+ const tip = element.children[0];
3918
+ this.setContent(tip);
3919
+ tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
3920
+ this.tip = tip;
3921
+ return this.tip;
3922
+ }
3923
+
3924
+ setContent(tip) {
3925
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);
3926
+ }
3927
+
3928
+ _sanitizeAndSetContent(template, content, selector) {
3929
+ const templateElement = SelectorEngine.findOne(selector, template);
3930
+
3931
+ if (!content && templateElement) {
3932
+ templateElement.remove();
3933
+ return;
3934
+ } // we use append for html objects to maintain js events
3935
+
3936
+
3937
+ this.setElementContent(templateElement, content);
3938
+ }
3939
+
3940
+ setElementContent(element, content) {
3941
+ if (element === null) {
3942
+ return;
3943
+ }
3944
+
3945
+ if (isElement(content)) {
3946
+ content = getElement(content); // content is a DOM node or a jQuery
3947
+
3948
+ if (this._config.html) {
3949
+ if (content.parentNode !== element) {
3950
+ element.innerHTML = '';
3951
+ element.append(content);
3952
+ }
3953
+ } else {
3954
+ element.textContent = content.textContent;
3955
+ }
3956
+
3957
+ return;
3958
+ }
3959
+
3960
+ if (this._config.html) {
3961
+ if (this._config.sanitize) {
3962
+ content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);
3963
+ }
3964
+
3965
+ element.innerHTML = content; // lgtm [js/xss-through-dom]
3966
+ } else {
3967
+ element.textContent = content;
3968
+ }
3969
+ }
3970
+
3971
+ getTitle() {
3972
+ const title = this._element.getAttribute('data-bs-original-title') || this._config.title;
3973
+
3974
+ return this._resolvePossibleFunction(title);
3975
+ }
3976
+
3977
+ updateAttachment(attachment) {
3978
+ if (attachment === 'right') {
3979
+ return 'end';
3980
+ }
3981
+
3982
+ if (attachment === 'left') {
3983
+ return 'start';
3984
+ }
3985
+
3986
+ return attachment;
3987
+ } // Private
3988
+
3989
+
3990
+ _initializeOnDelegatedTarget(event, context) {
3991
+ return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
3992
+ }
3993
+
3994
+ _getOffset() {
3995
+ const {
3996
+ offset
3997
+ } = this._config;
3998
+
3999
+ if (typeof offset === 'string') {
4000
+ return offset.split(',').map(val => Number.parseInt(val, 10));
4001
+ }
4002
+
4003
+ if (typeof offset === 'function') {
4004
+ return popperData => offset(popperData, this._element);
4005
+ }
4006
+
4007
+ return offset;
4008
+ }
4009
+
4010
+ _resolvePossibleFunction(content) {
4011
+ return typeof content === 'function' ? content.call(this._element) : content;
4012
+ }
4013
+
4014
+ _getPopperConfig(attachment) {
4015
+ const defaultBsPopperConfig = {
4016
+ placement: attachment,
4017
+ modifiers: [{
4018
+ name: 'flip',
4019
+ options: {
4020
+ fallbackPlacements: this._config.fallbackPlacements
4021
+ }
4022
+ }, {
4023
+ name: 'offset',
4024
+ options: {
4025
+ offset: this._getOffset()
4026
+ }
4027
+ }, {
4028
+ name: 'preventOverflow',
4029
+ options: {
4030
+ boundary: this._config.boundary
4031
+ }
4032
+ }, {
4033
+ name: 'arrow',
4034
+ options: {
4035
+ element: `.${this.constructor.NAME}-arrow`
4036
+ }
4037
+ }, {
4038
+ name: 'onChange',
4039
+ enabled: true,
4040
+ phase: 'afterWrite',
4041
+ fn: data => this._handlePopperPlacementChange(data)
4042
+ }],
4043
+ onFirstUpdate: data => {
4044
+ if (data.options.placement !== data.placement) {
4045
+ this._handlePopperPlacementChange(data);
4046
+ }
4047
+ }
4048
+ };
4049
+ return { ...defaultBsPopperConfig,
4050
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
4051
+ };
4052
+ }
4053
+
4054
+ _addAttachmentClass(attachment) {
4055
+ this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);
4056
+ }
4057
+
4058
+ _getAttachment(placement) {
4059
+ return AttachmentMap[placement.toUpperCase()];
4060
+ }
4061
+
4062
+ _setListeners() {
4063
+ const triggers = this._config.trigger.split(' ');
4064
+
4065
+ for (const trigger of triggers) {
4066
+ if (trigger === 'click') {
4067
+ EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));
4068
+ } else if (trigger !== TRIGGER_MANUAL) {
4069
+ const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;
4070
+ const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;
4071
+ EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));
4072
+ EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));
4073
+ }
4074
+ }
4075
+
4076
+ this._hideModalHandler = () => {
4077
+ if (this._element) {
4078
+ this.hide();
4079
+ }
4080
+ };
4081
+
4082
+ EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
4083
+
4084
+ if (this._config.selector) {
4085
+ this._config = { ...this._config,
4086
+ trigger: 'manual',
4087
+ selector: ''
4088
+ };
4089
+ } else {
4090
+ this._fixTitle();
4091
+ }
4092
+ }
4093
+
4094
+ _fixTitle() {
4095
+ const title = this._element.getAttribute('title');
4096
+
4097
+ const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');
4098
+
4099
+ if (title || originalTitleType !== 'string') {
4100
+ this._element.setAttribute('data-bs-original-title', title || '');
4101
+
4102
+ if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {
4103
+ this._element.setAttribute('aria-label', title);
4104
+ }
4105
+
4106
+ this._element.setAttribute('title', '');
4107
+ }
4108
+ }
4109
+
4110
+ _enter(event, context) {
4111
+ context = this._initializeOnDelegatedTarget(event, context);
4112
+
4113
+ if (event) {
4114
+ context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
4115
+ }
4116
+
4117
+ if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {
4118
+ context._hoverState = HOVER_STATE_SHOW;
4119
+ return;
4120
+ }
4121
+
4122
+ clearTimeout(context._timeout);
4123
+ context._hoverState = HOVER_STATE_SHOW;
4124
+
4125
+ if (!context._config.delay || !context._config.delay.show) {
4126
+ context.show();
4127
+ return;
4128
+ }
4129
+
4130
+ context._timeout = setTimeout(() => {
4131
+ if (context._hoverState === HOVER_STATE_SHOW) {
4132
+ context.show();
4133
+ }
4134
+ }, context._config.delay.show);
4135
+ }
4136
+
4137
+ _leave(event, context) {
4138
+ context = this._initializeOnDelegatedTarget(event, context);
4139
+
4140
+ if (event) {
4141
+ context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
4142
+ }
4143
+
4144
+ if (context._isWithActiveTrigger()) {
4145
+ return;
4146
+ }
4147
+
4148
+ clearTimeout(context._timeout);
4149
+ context._hoverState = HOVER_STATE_OUT;
4150
+
4151
+ if (!context._config.delay || !context._config.delay.hide) {
4152
+ context.hide();
4153
+ return;
4154
+ }
4155
+
4156
+ context._timeout = setTimeout(() => {
4157
+ if (context._hoverState === HOVER_STATE_OUT) {
4158
+ context.hide();
4159
+ }
4160
+ }, context._config.delay.hide);
4161
+ }
4162
+
4163
+ _isWithActiveTrigger() {
4164
+ for (const trigger in this._activeTrigger) {
4165
+ if (this._activeTrigger[trigger]) {
4166
+ return true;
4167
+ }
4168
+ }
4169
+
4170
+ return false;
4171
+ }
4172
+
4173
+ _getConfig(config) {
4174
+ const dataAttributes = Manipulator.getDataAttributes(this._element);
4175
+
4176
+ for (const dataAttr of Object.keys(dataAttributes)) {
4177
+ if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {
4178
+ delete dataAttributes[dataAttr];
4179
+ }
4180
+ }
4181
+
4182
+ config = { ...this.constructor.Default,
4183
+ ...dataAttributes,
4184
+ ...(typeof config === 'object' && config ? config : {})
4185
+ };
4186
+ config.container = config.container === false ? document.body : getElement(config.container);
4187
+
4188
+ if (typeof config.delay === 'number') {
4189
+ config.delay = {
4190
+ show: config.delay,
4191
+ hide: config.delay
4192
+ };
4193
+ }
4194
+
4195
+ if (typeof config.title === 'number') {
4196
+ config.title = config.title.toString();
4197
+ }
4198
+
4199
+ if (typeof config.content === 'number') {
4200
+ config.content = config.content.toString();
4201
+ }
4202
+
4203
+ typeCheckConfig(NAME$4, config, this.constructor.DefaultType);
4204
+
4205
+ if (config.sanitize) {
4206
+ config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);
4207
+ }
4208
+
4209
+ return config;
4210
+ }
4211
+
4212
+ _getDelegateConfig() {
4213
+ const config = {};
4214
+
4215
+ for (const key in this._config) {
4216
+ if (this.constructor.Default[key] !== this._config[key]) {
4217
+ config[key] = this._config[key];
4218
+ }
4219
+ } // In the future can be replaced with:
4220
+ // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])
4221
+ // `Object.fromEntries(keysWithDifferentValues)`
4222
+
4223
+
4224
+ return config;
4225
+ }
4226
+
4227
+ _cleanTipClass() {
4228
+ const tip = this.getTipElement();
4229
+ const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g');
4230
+ const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);
4231
+
4232
+ if (tabClass !== null && tabClass.length > 0) {
4233
+ for (const tClass of tabClass.map(token => token.trim())) {
4234
+ tip.classList.remove(tClass);
4235
+ }
4236
+ }
4237
+ }
4238
+
4239
+ _getBasicClassPrefix() {
4240
+ return CLASS_PREFIX$1;
4241
+ }
4242
+
4243
+ _handlePopperPlacementChange(popperData) {
4244
+ const {
4245
+ state
4246
+ } = popperData;
4247
+
4248
+ if (!state) {
4249
+ return;
4250
+ }
4251
+
4252
+ this.tip = state.elements.popper;
4253
+
4254
+ this._cleanTipClass();
4255
+
4256
+ this._addAttachmentClass(this._getAttachment(state.placement));
4257
+ }
4258
+
4259
+ _disposePopper() {
4260
+ if (this._popper) {
4261
+ this._popper.destroy();
4262
+
4263
+ this._popper = null;
4264
+ }
4265
+ } // Static
4266
+
4267
+
4268
+ static jQueryInterface(config) {
4269
+ return this.each(function () {
4270
+ const data = Tooltip.getOrCreateInstance(this, config);
4271
+
4272
+ if (typeof config === 'string') {
4273
+ if (typeof data[config] === 'undefined') {
4274
+ throw new TypeError(`No method named "${config}"`);
4275
+ }
4276
+
4277
+ data[config]();
4278
+ }
4279
+ });
4280
+ }
4281
+
4282
+ }
4283
+ /**
4284
+ * jQuery
4285
+ */
4286
+
4287
+
4288
+ defineJQueryPlugin(Tooltip);
4289
+
4290
+ /**
4291
+ * --------------------------------------------------------------------------
4292
+ * Bootstrap (v5.1.3): popover.js
4293
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4294
+ * --------------------------------------------------------------------------
4295
+ */
4296
+ /**
4297
+ * Constants
4298
+ */
4299
+
4300
+ const NAME$3 = 'popover';
4301
+ const DATA_KEY$3 = 'bs.popover';
4302
+ const EVENT_KEY$3 = `.${DATA_KEY$3}`;
4303
+ const CLASS_PREFIX = 'bs-popover';
4304
+ const SELECTOR_TITLE = '.popover-header';
4305
+ const SELECTOR_CONTENT = '.popover-body';
4306
+ const Default$2 = { ...Tooltip.Default,
4307
+ placement: 'right',
4308
+ offset: [0, 8],
4309
+ trigger: 'click',
4310
+ content: '',
4311
+ template: '<div class="popover" role="tooltip">' + '<div class="popover-arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div>' + '</div>'
4312
+ };
4313
+ const DefaultType$2 = { ...Tooltip.DefaultType,
4314
+ content: '(string|element|function)'
4315
+ };
4316
+ const Event$1 = {
4317
+ HIDE: `hide${EVENT_KEY$3}`,
4318
+ HIDDEN: `hidden${EVENT_KEY$3}`,
4319
+ SHOW: `show${EVENT_KEY$3}`,
4320
+ SHOWN: `shown${EVENT_KEY$3}`,
4321
+ INSERTED: `inserted${EVENT_KEY$3}`,
4322
+ CLICK: `click${EVENT_KEY$3}`,
4323
+ FOCUSIN: `focusin${EVENT_KEY$3}`,
4324
+ FOCUSOUT: `focusout${EVENT_KEY$3}`,
4325
+ MOUSEENTER: `mouseenter${EVENT_KEY$3}`,
4326
+ MOUSELEAVE: `mouseleave${EVENT_KEY$3}`
4327
+ };
4328
+ /**
4329
+ * Class definition
4330
+ */
4331
+
4332
+ class Popover extends Tooltip {
4333
+ // Getters
4334
+ static get Default() {
4335
+ return Default$2;
4336
+ }
4337
+
4338
+ static get NAME() {
4339
+ return NAME$3;
4340
+ }
4341
+
4342
+ static get Event() {
4343
+ return Event$1;
4344
+ }
4345
+
4346
+ static get DefaultType() {
4347
+ return DefaultType$2;
4348
+ } // Overrides
4349
+
4350
+
4351
+ isWithContent() {
4352
+ return this.getTitle() || this._getContent();
4353
+ }
4354
+
4355
+ setContent(tip) {
4356
+ this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);
4357
+
4358
+ this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);
4359
+ } // Private
4360
+
4361
+
4362
+ _getContent() {
4363
+ return this._resolvePossibleFunction(this._config.content);
4364
+ }
4365
+
4366
+ _getBasicClassPrefix() {
4367
+ return CLASS_PREFIX;
4368
+ } // Static
4369
+
4370
+
4371
+ static jQueryInterface(config) {
4372
+ return this.each(function () {
4373
+ const data = Popover.getOrCreateInstance(this, config);
4374
+
4375
+ if (typeof config === 'string') {
4376
+ if (typeof data[config] === 'undefined') {
4377
+ throw new TypeError(`No method named "${config}"`);
4378
+ }
4379
+
4380
+ data[config]();
4381
+ }
4382
+ });
4383
+ }
4384
+
4385
+ }
4386
+ /**
4387
+ * jQuery
4388
+ */
4389
+
4390
+
4391
+ defineJQueryPlugin(Popover);
4392
+
4393
+ /**
4394
+ * --------------------------------------------------------------------------
4395
+ * Bootstrap (v5.1.3): scrollspy.js
4396
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4397
+ * --------------------------------------------------------------------------
4398
+ */
4399
+ /**
4400
+ * Constants
4401
+ */
4402
+
4403
+ const NAME$2 = 'scrollspy';
4404
+ const DATA_KEY$2 = 'bs.scrollspy';
4405
+ const EVENT_KEY$2 = `.${DATA_KEY$2}`;
4406
+ const DATA_API_KEY$1 = '.data-api';
4407
+ const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
4408
+ const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;
4409
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;
4410
+ const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';
4411
+ const CLASS_NAME_ACTIVE$1 = 'active';
4412
+ const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
4413
+ const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';
4414
+ const SELECTOR_NAV_LINKS = '.nav-link';
4415
+ const SELECTOR_NAV_ITEMS = '.nav-item';
4416
+ const SELECTOR_LIST_ITEMS = '.list-group-item';
4417
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;
4418
+ const SELECTOR_DROPDOWN$1 = '.dropdown';
4419
+ const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';
4420
+ const METHOD_OFFSET = 'offset';
4421
+ const METHOD_POSITION = 'position';
4422
+ const Default$1 = {
4423
+ offset: 10,
4424
+ method: 'auto',
4425
+ target: ''
4426
+ };
4427
+ const DefaultType$1 = {
4428
+ offset: 'number',
4429
+ method: 'string',
4430
+ target: '(string|element)'
4431
+ };
4432
+ /**
4433
+ * Class definition
4434
+ */
4435
+
4436
+ class ScrollSpy extends BaseComponent {
4437
+ constructor(element, config) {
4438
+ super(element);
4439
+ this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;
4440
+ this._config = this._getConfig(config);
4441
+ this._offsets = [];
4442
+ this._targets = [];
4443
+ this._activeTarget = null;
4444
+ this._scrollHeight = 0;
4445
+ EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());
4446
+ this.refresh();
4447
+
4448
+ this._process();
4449
+ } // Getters
4450
+
4451
+
4452
+ static get Default() {
4453
+ return Default$1;
4454
+ }
4455
+
4456
+ static get NAME() {
4457
+ return NAME$2;
4458
+ } // Public
4459
+
4460
+
4461
+ refresh() {
4462
+ const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;
4463
+ const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
4464
+ const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;
4465
+ this._offsets = [];
4466
+ this._targets = [];
4467
+ this._scrollHeight = this._getScrollHeight();
4468
+ const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).map(element => {
4469
+ const targetSelector = getSelectorFromElement(element);
4470
+ const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;
4471
+
4472
+ if (target) {
4473
+ const targetBCR = target.getBoundingClientRect();
4474
+
4475
+ if (targetBCR.width || targetBCR.height) {
4476
+ return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];
4477
+ }
4478
+ }
4479
+
4480
+ return null;
4481
+ }).filter(item => item).sort((a, b) => a[0] - b[0]);
4482
+
4483
+ for (const item of targets) {
4484
+ this._offsets.push(item[0]);
4485
+
4486
+ this._targets.push(item[1]);
4487
+ }
4488
+ }
4489
+
4490
+ dispose() {
4491
+ EventHandler.off(this._scrollElement, EVENT_KEY$2);
4492
+ super.dispose();
4493
+ } // Private
4494
+
4495
+
4496
+ _getConfig(config) {
4497
+ config = { ...Default$1,
4498
+ ...Manipulator.getDataAttributes(this._element),
4499
+ ...(typeof config === 'object' && config ? config : {})
4500
+ };
4501
+ config.target = getElement(config.target) || document.documentElement;
4502
+ typeCheckConfig(NAME$2, config, DefaultType$1);
4503
+ return config;
4504
+ }
4505
+
4506
+ _getScrollTop() {
4507
+ return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
4508
+ }
4509
+
4510
+ _getScrollHeight() {
4511
+ return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
4512
+ }
4513
+
4514
+ _getOffsetHeight() {
4515
+ return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
4516
+ }
4517
+
4518
+ _process() {
4519
+ const scrollTop = this._getScrollTop() + this._config.offset;
4520
+
4521
+ const scrollHeight = this._getScrollHeight();
4522
+
4523
+ const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
4524
+
4525
+ if (this._scrollHeight !== scrollHeight) {
4526
+ this.refresh();
4527
+ }
4528
+
4529
+ if (scrollTop >= maxScroll) {
4530
+ const target = this._targets[this._targets.length - 1];
4531
+
4532
+ if (this._activeTarget !== target) {
4533
+ this._activate(target);
4534
+ }
4535
+
4536
+ return;
4537
+ }
4538
+
4539
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
4540
+ this._activeTarget = null;
4541
+
4542
+ this._clear();
4543
+
4544
+ return;
4545
+ }
4546
+
4547
+ for (let i = this._offsets.length; i--;) {
4548
+ const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
4549
+
4550
+ if (isActiveTarget) {
4551
+ this._activate(this._targets[i]);
4552
+ }
4553
+ }
4554
+ }
4555
+
4556
+ _activate(target) {
4557
+ this._activeTarget = target;
4558
+
4559
+ this._clear();
4560
+
4561
+ const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`);
4562
+ const link = SelectorEngine.findOne(queries.join(','), this._config.target);
4563
+ link.classList.add(CLASS_NAME_ACTIVE$1);
4564
+
4565
+ if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
4566
+ SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);
4567
+ } else {
4568
+ for (const listGroup of SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1)) {
4569
+ // Set triggered links parents as active
4570
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
4571
+ for (const item of SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`)) {
4572
+ item.classList.add(CLASS_NAME_ACTIVE$1);
4573
+ } // Handle special case when .nav-link is inside .nav-item
4574
+
4575
+
4576
+ for (const navItem of SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS)) {
4577
+ for (const item of SelectorEngine.children(navItem, SELECTOR_NAV_LINKS)) {
4578
+ item.classList.add(CLASS_NAME_ACTIVE$1);
4579
+ }
4580
+ }
4581
+ }
4582
+ }
4583
+
4584
+ EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {
4585
+ relatedTarget: target
4586
+ });
4587
+ }
4588
+
4589
+ _clear() {
4590
+ const activeNodes = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1));
4591
+
4592
+ for (const node of activeNodes) {
4593
+ node.classList.remove(CLASS_NAME_ACTIVE$1);
4594
+ }
4595
+ } // Static
4596
+
4597
+
4598
+ static jQueryInterface(config) {
4599
+ return this.each(function () {
4600
+ const data = ScrollSpy.getOrCreateInstance(this, config);
4601
+
4602
+ if (typeof config !== 'string') {
4603
+ return;
4604
+ }
4605
+
4606
+ if (typeof data[config] === 'undefined') {
4607
+ throw new TypeError(`No method named "${config}"`);
4608
+ }
4609
+
4610
+ data[config]();
4611
+ });
4612
+ }
4613
+
4614
+ }
4615
+ /**
4616
+ * Data API implementation
4617
+ */
4618
+
4619
+
4620
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
4621
+ for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
4622
+ new ScrollSpy(spy); // eslint-disable-line no-new
4623
+ }
4624
+ });
4625
+ /**
4626
+ * jQuery
4627
+ */
4628
+
4629
+ defineJQueryPlugin(ScrollSpy);
4630
+
4631
+ /**
4632
+ * --------------------------------------------------------------------------
4633
+ * Bootstrap (v5.1.3): tab.js
4634
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4635
+ * --------------------------------------------------------------------------
4636
+ */
4637
+ /**
4638
+ * Constants
4639
+ */
4640
+
4641
+ const NAME$1 = 'tab';
4642
+ const DATA_KEY$1 = 'bs.tab';
4643
+ const EVENT_KEY$1 = `.${DATA_KEY$1}`;
4644
+ const DATA_API_KEY = '.data-api';
4645
+ const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
4646
+ const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
4647
+ const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
4648
+ const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
4649
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;
4650
+ const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';
4651
+ const CLASS_NAME_ACTIVE = 'active';
4652
+ const CLASS_NAME_FADE$1 = 'fade';
4653
+ const CLASS_NAME_SHOW$1 = 'show';
4654
+ const SELECTOR_DROPDOWN = '.dropdown';
4655
+ const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';
4656
+ const SELECTOR_ACTIVE = '.active';
4657
+ const SELECTOR_ACTIVE_UL = ':scope > li > .active';
4658
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
4659
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';
4660
+ const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';
4661
+ /**
4662
+ * Class definition
4663
+ */
4664
+
4665
+ class Tab extends BaseComponent {
4666
+ // Getters
4667
+ static get NAME() {
4668
+ return NAME$1;
4669
+ } // Public
4670
+
4671
+
4672
+ show() {
4673
+ if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {
4674
+ return;
4675
+ }
4676
+
4677
+ let previous;
4678
+ const target = getElementFromSelector(this._element);
4679
+
4680
+ const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);
4681
+
4682
+ if (listElement) {
4683
+ const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;
4684
+ previous = SelectorEngine.find(itemSelector, listElement);
4685
+ previous = previous[previous.length - 1];
4686
+ }
4687
+
4688
+ const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {
4689
+ relatedTarget: this._element
4690
+ }) : null;
4691
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {
4692
+ relatedTarget: previous
4693
+ });
4694
+
4695
+ if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {
4696
+ return;
4697
+ }
4698
+
4699
+ this._activate(this._element, listElement);
4700
+
4701
+ const complete = () => {
4702
+ EventHandler.trigger(previous, EVENT_HIDDEN$1, {
4703
+ relatedTarget: this._element
4704
+ });
4705
+ EventHandler.trigger(this._element, EVENT_SHOWN$1, {
4706
+ relatedTarget: previous
4707
+ });
4708
+ };
4709
+
4710
+ if (target) {
4711
+ this._activate(target, target.parentNode, complete);
4712
+ } else {
4713
+ complete();
4714
+ }
4715
+ } // Private
4716
+
4717
+
4718
+ _activate(element, container, callback) {
4719
+ const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);
4720
+ const active = activeElements[0];
4721
+ const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);
4722
+
4723
+ const complete = () => this._transitionComplete(element, active, callback);
4724
+
4725
+ if (active && isTransitioning) {
4726
+ active.classList.remove(CLASS_NAME_SHOW$1);
4727
+
4728
+ this._queueCallback(complete, element, true);
4729
+ } else {
4730
+ complete();
4731
+ }
4732
+ }
4733
+
4734
+ _transitionComplete(element, active, callback) {
4735
+ if (active) {
4736
+ active.classList.remove(CLASS_NAME_ACTIVE);
4737
+ const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);
4738
+
4739
+ if (dropdownChild) {
4740
+ dropdownChild.classList.remove(CLASS_NAME_ACTIVE);
4741
+ }
4742
+
4743
+ if (active.getAttribute('role') === 'tab') {
4744
+ active.setAttribute('aria-selected', false);
4745
+ }
4746
+ }
4747
+
4748
+ element.classList.add(CLASS_NAME_ACTIVE);
4749
+
4750
+ if (element.getAttribute('role') === 'tab') {
4751
+ element.setAttribute('aria-selected', true);
4752
+ }
4753
+
4754
+ reflow(element);
4755
+
4756
+ if (element.classList.contains(CLASS_NAME_FADE$1)) {
4757
+ element.classList.add(CLASS_NAME_SHOW$1);
4758
+ }
4759
+
4760
+ let parent = element.parentNode;
4761
+
4762
+ if (parent && parent.nodeName === 'LI') {
4763
+ parent = parent.parentNode;
4764
+ }
4765
+
4766
+ if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {
4767
+ const dropdownElement = element.closest(SELECTOR_DROPDOWN);
4768
+
4769
+ if (dropdownElement) {
4770
+ for (const dropdown of SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement)) {
4771
+ dropdown.classList.add(CLASS_NAME_ACTIVE);
4772
+ }
4773
+ }
4774
+
4775
+ element.setAttribute('aria-expanded', true);
4776
+ }
4777
+
4778
+ if (callback) {
4779
+ callback();
4780
+ }
4781
+ } // Static
4782
+
4783
+
4784
+ static jQueryInterface(config) {
4785
+ return this.each(function () {
4786
+ const data = Tab.getOrCreateInstance(this);
4787
+
4788
+ if (typeof config === 'string') {
4789
+ if (typeof data[config] === 'undefined') {
4790
+ throw new TypeError(`No method named "${config}"`);
4791
+ }
4792
+
4793
+ data[config]();
4794
+ }
4795
+ });
4796
+ }
4797
+
4798
+ }
4799
+ /**
4800
+ * Data API implementation
4801
+ */
4802
+
4803
+
4804
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
4805
+ if (['A', 'AREA'].includes(this.tagName)) {
4806
+ event.preventDefault();
4807
+ }
4808
+
4809
+ if (isDisabled(this)) {
4810
+ return;
4811
+ }
4812
+
4813
+ const data = Tab.getOrCreateInstance(this);
4814
+ data.show();
4815
+ });
4816
+ /**
4817
+ * jQuery
4818
+ */
4819
+
4820
+ defineJQueryPlugin(Tab);
4821
+
4822
+ /**
4823
+ * --------------------------------------------------------------------------
4824
+ * Bootstrap (v5.1.3): toast.js
4825
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
4826
+ * --------------------------------------------------------------------------
4827
+ */
4828
+ /**
4829
+ * Constants
4830
+ */
4831
+
4832
+ const NAME = 'toast';
4833
+ const DATA_KEY = 'bs.toast';
4834
+ const EVENT_KEY = `.${DATA_KEY}`;
4835
+ const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
4836
+ const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
4837
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
4838
+ const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
4839
+ const EVENT_HIDE = `hide${EVENT_KEY}`;
4840
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`;
4841
+ const EVENT_SHOW = `show${EVENT_KEY}`;
4842
+ const EVENT_SHOWN = `shown${EVENT_KEY}`;
4843
+ const CLASS_NAME_FADE = 'fade';
4844
+ const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility
4845
+
4846
+ const CLASS_NAME_SHOW = 'show';
4847
+ const CLASS_NAME_SHOWING = 'showing';
4848
+ const DefaultType = {
4849
+ animation: 'boolean',
4850
+ autohide: 'boolean',
4851
+ delay: 'number'
4852
+ };
4853
+ const Default = {
4854
+ animation: true,
4855
+ autohide: true,
4856
+ delay: 5000
4857
+ };
4858
+ /**
4859
+ * Class definition
4860
+ */
4861
+
4862
+ class Toast extends BaseComponent {
4863
+ constructor(element, config) {
4864
+ super(element);
4865
+ this._config = this._getConfig(config);
4866
+ this._timeout = null;
4867
+ this._hasMouseInteraction = false;
4868
+ this._hasKeyboardInteraction = false;
4869
+
4870
+ this._setListeners();
4871
+ } // Getters
4872
+
4873
+
4874
+ static get DefaultType() {
4875
+ return DefaultType;
4876
+ }
4877
+
4878
+ static get Default() {
4879
+ return Default;
4880
+ }
4881
+
4882
+ static get NAME() {
4883
+ return NAME;
4884
+ } // Public
4885
+
4886
+
4887
+ show() {
4888
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
4889
+
4890
+ if (showEvent.defaultPrevented) {
4891
+ return;
4892
+ }
4893
+
4894
+ this._clearTimeout();
4895
+
4896
+ if (this._config.animation) {
4897
+ this._element.classList.add(CLASS_NAME_FADE);
4898
+ }
4899
+
4900
+ const complete = () => {
4901
+ this._element.classList.remove(CLASS_NAME_SHOWING);
4902
+
4903
+ EventHandler.trigger(this._element, EVENT_SHOWN);
4904
+
4905
+ this._maybeScheduleHide();
4906
+ };
4907
+
4908
+ this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated
4909
+
4910
+
4911
+ reflow(this._element);
4912
+
4913
+ this._element.classList.add(CLASS_NAME_SHOW);
4914
+
4915
+ this._element.classList.add(CLASS_NAME_SHOWING);
4916
+
4917
+ this._queueCallback(complete, this._element, this._config.animation);
4918
+ }
4919
+
4920
+ hide() {
4921
+ if (!this._element.classList.contains(CLASS_NAME_SHOW)) {
4922
+ return;
4923
+ }
4924
+
4925
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
4926
+
4927
+ if (hideEvent.defaultPrevented) {
4928
+ return;
4929
+ }
4930
+
4931
+ const complete = () => {
4932
+ this._element.classList.add(CLASS_NAME_HIDE); // @deprecated
4933
+
4934
+
4935
+ this._element.classList.remove(CLASS_NAME_SHOWING);
4936
+
4937
+ this._element.classList.remove(CLASS_NAME_SHOW);
4938
+
4939
+ EventHandler.trigger(this._element, EVENT_HIDDEN);
4940
+ };
4941
+
4942
+ this._element.classList.add(CLASS_NAME_SHOWING);
4943
+
4944
+ this._queueCallback(complete, this._element, this._config.animation);
4945
+ }
4946
+
4947
+ dispose() {
4948
+ this._clearTimeout();
4949
+
4950
+ if (this._element.classList.contains(CLASS_NAME_SHOW)) {
4951
+ this._element.classList.remove(CLASS_NAME_SHOW);
4952
+ }
4953
+
4954
+ super.dispose();
4955
+ } // Private
4956
+
4957
+
4958
+ _getConfig(config) {
4959
+ config = { ...Default,
4960
+ ...Manipulator.getDataAttributes(this._element),
4961
+ ...(typeof config === 'object' && config ? config : {})
4962
+ };
4963
+ typeCheckConfig(NAME, config, this.constructor.DefaultType);
4964
+ return config;
4965
+ }
4966
+
4967
+ _maybeScheduleHide() {
4968
+ if (!this._config.autohide) {
4969
+ return;
4970
+ }
4971
+
4972
+ if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
4973
+ return;
4974
+ }
4975
+
4976
+ this._timeout = setTimeout(() => {
4977
+ this.hide();
4978
+ }, this._config.delay);
4979
+ }
4980
+
4981
+ _onInteraction(event, isInteracting) {
4982
+ switch (event.type) {
4983
+ case 'mouseover':
4984
+ case 'mouseout':
4985
+ this._hasMouseInteraction = isInteracting;
4986
+ break;
4987
+
4988
+ case 'focusin':
4989
+ case 'focusout':
4990
+ this._hasKeyboardInteraction = isInteracting;
4991
+ break;
4992
+ }
4993
+
4994
+ if (isInteracting) {
4995
+ this._clearTimeout();
4996
+
4997
+ return;
4998
+ }
4999
+
5000
+ const nextElement = event.relatedTarget;
5001
+
5002
+ if (this._element === nextElement || this._element.contains(nextElement)) {
5003
+ return;
5004
+ }
5005
+
5006
+ this._maybeScheduleHide();
5007
+ }
5008
+
5009
+ _setListeners() {
5010
+ EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));
5011
+ EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));
5012
+ EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));
5013
+ EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));
5014
+ }
5015
+
5016
+ _clearTimeout() {
5017
+ clearTimeout(this._timeout);
5018
+ this._timeout = null;
5019
+ } // Static
5020
+
5021
+
5022
+ static jQueryInterface(config) {
5023
+ return this.each(function () {
5024
+ const data = Toast.getOrCreateInstance(this, config);
5025
+
5026
+ if (typeof config === 'string') {
5027
+ if (typeof data[config] === 'undefined') {
5028
+ throw new TypeError(`No method named "${config}"`);
5029
+ }
5030
+
5031
+ data[config](this);
5032
+ }
5033
+ });
5034
+ }
5035
+
5036
+ }
5037
+ /**
5038
+ * Data API implementation
5039
+ */
5040
+
5041
+
5042
+ enableDismissTrigger(Toast);
5043
+ /**
5044
+ * jQuery
5045
+ */
5046
+
5047
+ defineJQueryPlugin(Toast);
5048
+
5049
+ /**
5050
+ * --------------------------------------------------------------------------
5051
+ * Bootstrap (v5.1.3): index.umd.js
5052
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5053
+ * --------------------------------------------------------------------------
5054
+ */
5055
+ const index_umd = {
5056
+ Alert,
5057
+ Button,
5058
+ Carousel,
5059
+ Collapse,
5060
+ Dropdown,
5061
+ Modal,
5062
+ Offcanvas,
5063
+ Popover,
5064
+ ScrollSpy,
5065
+ Tab,
5066
+ Toast,
5067
+ Tooltip
5068
+ };
5069
+
5070
+ return index_umd;
5071
+
5072
+ }));