@gitlab/ui 132.0.1 → 132.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/dist/charts.js +13 -0
  2. package/dist/components/base/accordion/accordion.js +69 -0
  3. package/dist/components/base/accordion/accordion_item.js +160 -0
  4. package/dist/components/base/accordion/constants.js +3 -0
  5. package/dist/components/base/alert/alert.js +263 -0
  6. package/dist/components/base/animated_icon/animated_chevron_down_up_icon.js +45 -0
  7. package/dist/components/base/animated_icon/animated_chevron_lg_down_up_icon.js +45 -0
  8. package/dist/components/base/animated_icon/animated_chevron_lg_right_down_icon.js +45 -0
  9. package/dist/components/base/animated_icon/animated_chevron_right_down_icon.js +45 -0
  10. package/dist/components/base/animated_icon/animated_duo_chat_icon.js +45 -0
  11. package/dist/components/base/animated_icon/animated_loader_icon.js +45 -0
  12. package/dist/components/base/animated_icon/animated_notifications_icon.js +45 -0
  13. package/dist/components/base/animated_icon/animated_sidebar_icon.js +45 -0
  14. package/dist/components/base/animated_icon/animated_smile_icon.js +45 -0
  15. package/dist/components/base/animated_icon/animated_sort_icon.js +45 -0
  16. package/dist/components/base/animated_icon/animated_star_icon.js +45 -0
  17. package/dist/components/base/animated_icon/animated_todo_icon.js +45 -0
  18. package/dist/components/base/animated_icon/animated_upload_icon.js +45 -0
  19. package/dist/components/base/animated_icon/base_animated_icon.js +77 -0
  20. package/dist/components/base/attribute_list/attribute_list.js +100 -0
  21. package/dist/components/base/avatar/avatar.js +175 -0
  22. package/dist/components/base/avatar/utils.js +17 -0
  23. package/dist/components/base/avatar_labeled/avatar_labeled.js +198 -0
  24. package/dist/components/base/avatar_link/avatar_link.js +47 -0
  25. package/dist/components/base/avatars_inline/avatars_inline.js +139 -0
  26. package/dist/components/base/badge/badge.js +197 -0
  27. package/dist/components/base/banner/banner.js +149 -0
  28. package/dist/components/base/breadcrumb/breadcrumb.js +282 -0
  29. package/dist/components/base/breadcrumb/breadcrumb_item.js +96 -0
  30. package/dist/components/base/broadcast_message/broadcast_message.js +113 -0
  31. package/dist/components/base/broadcast_message/constants.js +5 -0
  32. package/dist/components/base/button/button.js +419 -0
  33. package/dist/components/base/button_group/button_group.js +53 -0
  34. package/dist/components/base/card/card.js +69 -0
  35. package/dist/components/base/collapse/collapse.js +163 -0
  36. package/dist/components/base/color_mode_toggle/color_mode_toggle.js +92 -0
  37. package/dist/components/base/datepicker/datepicker.js +475 -0
  38. package/dist/components/base/daterange_picker/daterange_picker.js +394 -0
  39. package/dist/components/base/drawer/drawer.js +156 -0
  40. package/dist/components/base/dropdown/dropdown.js +330 -0
  41. package/dist/components/base/dropdown/dropdown_divider.js +48 -0
  42. package/dist/components/base/dropdown/dropdown_form.js +48 -0
  43. package/dist/components/base/dropdown/dropdown_item.js +175 -0
  44. package/dist/components/base/dropdown/dropdown_section_header.js +48 -0
  45. package/dist/components/base/dropdown/dropdown_text.js +48 -0
  46. package/dist/components/base/filtered_search/common_story_options.js +14 -0
  47. package/dist/components/base/filtered_search/filtered_search.js +428 -0
  48. package/dist/components/base/filtered_search/filtered_search_suggestion.js +95 -0
  49. package/dist/components/base/filtered_search/filtered_search_suggestion_list.js +139 -0
  50. package/dist/components/base/filtered_search/filtered_search_term.js +217 -0
  51. package/dist/components/base/filtered_search/filtered_search_token.js +383 -0
  52. package/dist/components/base/filtered_search/filtered_search_token_segment.js +444 -0
  53. package/dist/components/base/filtered_search/filtered_search_utils.js +241 -0
  54. package/dist/components/base/form/form.js +43 -0
  55. package/dist/components/base/form/form_character_count/form_character_count.js +107 -0
  56. package/dist/components/base/form/form_checkbox/form_checkbox.js +342 -0
  57. package/dist/components/base/form/form_checkbox/form_checkbox_group.js +188 -0
  58. package/dist/components/base/form/form_combobox/constants.js +55 -0
  59. package/dist/components/base/form/form_combobox/form_combobox.js +239 -0
  60. package/dist/components/base/form/form_date/form_date.js +143 -0
  61. package/dist/components/base/form/form_fields/form_field_validator.js +93 -0
  62. package/dist/components/base/form/form_fields/form_fields.js +289 -0
  63. package/dist/components/base/form/form_fields/form_fields_loop.js +75 -0
  64. package/dist/components/base/form/form_fields/mappers.js +13 -0
  65. package/dist/components/base/form/form_fields/validators.js +48 -0
  66. package/dist/components/base/form/form_group/form_group.js +119 -0
  67. package/dist/components/base/form/form_input/form_input.js +695 -0
  68. package/dist/components/base/form/form_input_group/form_input_group.js +120 -0
  69. package/dist/components/base/form/form_input_group/form_input_group_mixin.js +41 -0
  70. package/dist/components/base/form/form_radio/form_radio.js +259 -0
  71. package/dist/components/base/form/form_radio_group/form_radio_group.js +189 -0
  72. package/dist/components/base/form/form_select/constants.js +12 -0
  73. package/dist/components/base/form/form_select/form_select.js +96 -0
  74. package/dist/components/base/form/form_textarea/form_textarea.js +166 -0
  75. package/dist/components/base/form/input_group_text/input_group_text.js +43 -0
  76. package/dist/components/base/icon/icon.js +113 -0
  77. package/dist/components/base/illustration/illustration.js +80 -0
  78. package/dist/components/base/infinite_scroll/infinite_scroll.js +196 -0
  79. package/dist/components/base/keyset_pagination/keyset_pagination.js +152 -0
  80. package/dist/components/base/label/label.js +174 -0
  81. package/dist/components/base/link/link.js +330 -0
  82. package/dist/components/base/loading_icon/loading_icon.js +120 -0
  83. package/dist/components/base/markdown/markdown.js +50 -0
  84. package/dist/components/base/modal/modal.js +259 -0
  85. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +716 -0
  86. package/dist/components/base/new_dropdowns/base_dropdown/constants.js +5 -0
  87. package/dist/components/base/new_dropdowns/base_dropdown/dropdown_container.js +32 -0
  88. package/dist/components/base/new_dropdowns/constants.js +24 -0
  89. package/dist/components/base/new_dropdowns/disclosure/constants.js +8 -0
  90. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +400 -0
  91. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.js +112 -0
  92. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.js +196 -0
  93. package/dist/components/base/new_dropdowns/disclosure/mock_data.js +168 -0
  94. package/dist/components/base/new_dropdowns/disclosure/utils.js +84 -0
  95. package/dist/components/base/new_dropdowns/listbox/listbox.js +997 -0
  96. package/dist/components/base/new_dropdowns/listbox/listbox_group.js +58 -0
  97. package/dist/components/base/new_dropdowns/listbox/listbox_item.js +112 -0
  98. package/dist/components/base/new_dropdowns/listbox/listbox_search_input.js +94 -0
  99. package/dist/components/base/new_dropdowns/listbox/mock_data.js +131 -0
  100. package/dist/components/base/new_dropdowns/listbox/utils.js +33 -0
  101. package/dist/components/base/pagination/pagination.js +397 -0
  102. package/dist/components/base/path/data.js +34 -0
  103. package/dist/components/base/path/path.js +177 -0
  104. package/dist/components/base/popover/popover.js +142 -0
  105. package/dist/components/base/progress_bar/progress_bar.js +117 -0
  106. package/dist/components/base/search_box_by_click/search_box_by_click.js +245 -0
  107. package/dist/components/base/search_box_by_type/search_box_by_type.js +187 -0
  108. package/dist/components/base/segmented_control/segmented_control.js +73 -0
  109. package/dist/components/base/skeleton_loader/skeleton_loader.js +232 -0
  110. package/dist/components/base/sorting/sorting.js +180 -0
  111. package/dist/components/base/table/constants.js +5 -0
  112. package/dist/components/base/table/table.js +187 -0
  113. package/dist/components/base/table_lite/table_lite.js +80 -0
  114. package/dist/components/base/tabs/constants.js +3 -0
  115. package/dist/components/base/tabs/tab/tab.js +113 -0
  116. package/dist/components/base/tabs/tabs/scrollable_tabs.js +162 -0
  117. package/dist/components/base/tabs/tabs/tabs.js +223 -0
  118. package/dist/components/base/toast/index.js +66 -0
  119. package/dist/components/base/toast/toast.js +125 -0
  120. package/dist/components/base/toast/toaster.js +87 -0
  121. package/dist/components/base/toggle/toggle.js +178 -0
  122. package/dist/components/base/token/token.js +97 -0
  123. package/dist/components/base/token_selector/helpers.js +5 -0
  124. package/dist/components/base/token_selector/token_container.js +160 -0
  125. package/dist/components/base/token_selector/token_selector.js +454 -0
  126. package/dist/components/base/token_selector/token_selector_dropdown.js +223 -0
  127. package/dist/components/base/tooltip/tooltip.js +54 -0
  128. package/dist/components/charts/area/area.js +329 -0
  129. package/dist/components/charts/bar/bar.js +207 -0
  130. package/dist/components/charts/chart/chart.js +215 -0
  131. package/dist/components/charts/column/column.js +221 -0
  132. package/dist/components/charts/discrete_scatter/discrete_scatter.js +199 -0
  133. package/dist/components/charts/gauge/gauge.js +205 -0
  134. package/dist/components/charts/heatmap/heatmap.js +299 -0
  135. package/dist/components/charts/heatmap/index.js +2 -0
  136. package/dist/components/charts/legend/legend.js +245 -0
  137. package/dist/components/charts/line/line.js +340 -0
  138. package/dist/components/charts/series_label/series_label.js +101 -0
  139. package/dist/components/charts/shared/tooltip/tooltip.js +369 -0
  140. package/dist/components/charts/shared/tooltip/tooltip_default_format/tooltip_default_format.js +53 -0
  141. package/dist/components/charts/single_stat/single_stat.js +164 -0
  142. package/dist/components/charts/sparkline/sparkline.js +299 -0
  143. package/dist/components/charts/stacked_column/stacked_column.js +380 -0
  144. package/dist/components/dashboards/dashboard_layout/dashboard_layout.js +125 -0
  145. package/dist/components/dashboards/dashboard_layout/grid_layout/grid_layout.js +326 -0
  146. package/dist/components/dashboards/dashboard_layout/validators.js +14 -0
  147. package/dist/components/dashboards/dashboard_panel/dashboard_panel.js +236 -0
  148. package/dist/components/dashboards/mock_data.js +49 -0
  149. package/dist/components/experimental/experiment_badge/constants.js +4 -0
  150. package/dist/components/experimental/experiment_badge/experiment_badge.js +102 -0
  151. package/dist/components/extended/multi_step_form_template/multi_step_form_template.js +87 -0
  152. package/dist/components/index.js +107 -0
  153. package/dist/components/mixins/button_mixin.js +11 -0
  154. package/dist/components/mixins/safe_link_mixin.js +30 -0
  155. package/dist/components/mixins/tooltip_mixin.js +21 -0
  156. package/dist/components/regions/dashboard_skeleton/dashboard_skeleton.js +53 -0
  157. package/dist/components/regions/empty_state/empty_state.js +181 -0
  158. package/dist/components/shared_components/clear_icon_button/clear_icon_button.js +64 -0
  159. package/dist/components/shared_components/clipboard_button/clipboard_button.js +100 -0
  160. package/dist/components/shared_components/close_button/close_button.js +55 -0
  161. package/dist/components/utilities/animated_number/animated_number.js +131 -0
  162. package/dist/components/utilities/friendly_wrap/friendly_wrap.js +75 -0
  163. package/dist/components/utilities/intersection_observer/intersection_observer.js +88 -0
  164. package/dist/components/utilities/intersperse/intersperse.js +104 -0
  165. package/dist/components/utilities/sprintf/sprintf.js +171 -0
  166. package/dist/components/utilities/truncate/constants.js +8 -0
  167. package/dist/components/utilities/truncate/truncate.js +154 -0
  168. package/dist/components/utilities/truncate_text/constants.js +7 -0
  169. package/dist/components/utilities/truncate_text/truncate_text.js +146 -0
  170. package/dist/config.js +53 -0
  171. package/dist/directives/hover_load/hover_load.js +45 -0
  172. package/dist/directives/index.js +8 -0
  173. package/dist/directives/modal.js +1 -0
  174. package/dist/directives/outside/outside.js +149 -0
  175. package/dist/directives/resize_observer/resize_observer.js +58 -0
  176. package/dist/directives/safe_html/constants.js +6 -0
  177. package/dist/directives/safe_html/safe_html.js +39 -0
  178. package/dist/directives/safe_link/mock_data.js +10 -0
  179. package/dist/directives/safe_link/safe_link.js +67 -0
  180. package/dist/directives/tooltip/container.js +7 -0
  181. package/dist/directives/tooltip/tooltip.js +18 -0
  182. package/dist/index.css +7 -0
  183. package/dist/index.css.map +1 -0
  184. package/dist/index.js +2 -0
  185. package/dist/tailwind.css +2 -0
  186. package/dist/tailwind.css.map +1 -0
  187. package/dist/tokens/build/js/tokens.dark.js +1410 -0
  188. package/dist/tokens/build/js/tokens.js +1410 -0
  189. package/dist/tokens/common_story_options.js +29 -0
  190. package/dist/tokens/tokens_story.js +76 -0
  191. package/dist/utils/breakpoints.js +20 -0
  192. package/dist/utils/charts/config.js +616 -0
  193. package/dist/utils/charts/constants.js +69 -0
  194. package/dist/utils/charts/mock_data.js +191 -0
  195. package/dist/utils/charts/story_config.js +24 -0
  196. package/dist/utils/charts/theme.js +200 -0
  197. package/dist/utils/charts/utils.js +54 -0
  198. package/dist/utils/constants.js +331 -0
  199. package/dist/utils/data_utils.js +19 -0
  200. package/dist/utils/datetime_utility.js +61 -0
  201. package/dist/utils/equality_utils.js +84 -0
  202. package/dist/utils/form_options_utils.js +46 -0
  203. package/dist/utils/i18n.js +65 -0
  204. package/dist/utils/is_slot_empty.js +34 -0
  205. package/dist/utils/number_utils.js +132 -0
  206. package/dist/utils/play_utils.js +11 -0
  207. package/dist/utils/set_utils.js +25 -0
  208. package/dist/utils/stories_constants.js +29 -0
  209. package/dist/utils/stories_utils.js +62 -0
  210. package/dist/utils/story_decorators/container.js +19 -0
  211. package/dist/utils/string_utils.js +69 -0
  212. package/dist/utils/svgs/svg_paths.js +7 -0
  213. package/dist/utils/test_utils.js +33 -0
  214. package/dist/utils/use_fake_date.js +29 -0
  215. package/dist/utils/use_mock_intersection_observer.js +105 -0
  216. package/dist/utils/utils.js +205 -0
  217. package/dist/utils/vue_utils.js +57 -0
  218. package/dist/utils.js +5 -0
  219. package/dist/vendor/bootstrap-vue/src/bv-config.js +8 -0
  220. package/dist/vendor/bootstrap-vue/src/components/button/button-close.js +81 -0
  221. package/dist/vendor/bootstrap-vue/src/components/button/button.js +204 -0
  222. package/dist/vendor/bootstrap-vue/src/components/button/index.js +2 -0
  223. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +41 -0
  224. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +52 -0
  225. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +75 -0
  226. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +52 -0
  227. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +85 -0
  228. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +97 -0
  229. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +60 -0
  230. package/dist/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +270 -0
  231. package/dist/vendor/bootstrap-vue/src/components/dropdown/index.js +8 -0
  232. package/dist/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +53 -0
  233. package/dist/vendor/bootstrap-vue/src/components/form/form-text.js +55 -0
  234. package/dist/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +53 -0
  235. package/dist/vendor/bootstrap-vue/src/components/form/form.js +56 -0
  236. package/dist/vendor/bootstrap-vue/src/components/form/index.js +4 -0
  237. package/dist/vendor/bootstrap-vue/src/components/form-group/form-group.js +347 -0
  238. package/dist/vendor/bootstrap-vue/src/components/form-group/index.js +1 -0
  239. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +54 -0
  240. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +41 -0
  241. package/dist/vendor/bootstrap-vue/src/components/form-select/form-select.js +143 -0
  242. package/dist/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +56 -0
  243. package/dist/vendor/bootstrap-vue/src/components/form-select/index.js +3 -0
  244. package/dist/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +217 -0
  245. package/dist/vendor/bootstrap-vue/src/components/form-textarea/index.js +1 -0
  246. package/dist/vendor/bootstrap-vue/src/components/layout/col.js +155 -0
  247. package/dist/vendor/bootstrap-vue/src/components/layout/form-row.js +34 -0
  248. package/dist/vendor/bootstrap-vue/src/components/layout/index.js +2 -0
  249. package/dist/vendor/bootstrap-vue/src/components/link/index.js +1 -0
  250. package/dist/vendor/bootstrap-vue/src/components/link/link.js +283 -0
  251. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +21 -0
  252. package/dist/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +212 -0
  253. package/dist/vendor/bootstrap-vue/src/components/modal/index.js +1 -0
  254. package/dist/vendor/bootstrap-vue/src/components/modal/modal.js +1059 -0
  255. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +55 -0
  256. package/dist/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +31 -0
  257. package/dist/vendor/bootstrap-vue/src/components/popover/index.js +1 -0
  258. package/dist/vendor/bootstrap-vue/src/components/popover/popover.js +49 -0
  259. package/dist/vendor/bootstrap-vue/src/components/table/helpers/constants.js +22 -0
  260. package/dist/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +64 -0
  261. package/dist/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +40 -0
  262. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +43 -0
  263. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +83 -0
  264. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +50 -0
  265. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +32 -0
  266. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +82 -0
  267. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +292 -0
  268. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +154 -0
  269. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +44 -0
  270. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +191 -0
  271. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +213 -0
  272. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +274 -0
  273. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +39 -0
  274. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +186 -0
  275. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +338 -0
  276. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +243 -0
  277. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +50 -0
  278. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +218 -0
  279. package/dist/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +42 -0
  280. package/dist/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +86 -0
  281. package/dist/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +31 -0
  282. package/dist/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
  283. package/dist/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +14 -0
  284. package/dist/vendor/bootstrap-vue/src/components/table/index.js +9 -0
  285. package/dist/vendor/bootstrap-vue/src/components/table/table-lite.js +51 -0
  286. package/dist/vendor/bootstrap-vue/src/components/table/table-simple.js +44 -0
  287. package/dist/vendor/bootstrap-vue/src/components/table/table.js +67 -0
  288. package/dist/vendor/bootstrap-vue/src/components/table/tbody.js +116 -0
  289. package/dist/vendor/bootstrap-vue/src/components/table/td.js +204 -0
  290. package/dist/vendor/bootstrap-vue/src/components/table/tfoot.js +96 -0
  291. package/dist/vendor/bootstrap-vue/src/components/table/th.js +26 -0
  292. package/dist/vendor/bootstrap-vue/src/components/table/thead.js +99 -0
  293. package/dist/vendor/bootstrap-vue/src/components/table/tr.js +121 -0
  294. package/dist/vendor/bootstrap-vue/src/components/tabs/index.js +2 -0
  295. package/dist/vendor/bootstrap-vue/src/components/tabs/tab.js +238 -0
  296. package/dist/vendor/bootstrap-vue/src/components/tabs/tabs.js +690 -0
  297. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +251 -0
  298. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +118 -0
  299. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +932 -0
  300. package/dist/vendor/bootstrap-vue/src/components/tooltip/index.js +1 -0
  301. package/dist/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +337 -0
  302. package/dist/vendor/bootstrap-vue/src/components/transition/bv-transition.js +103 -0
  303. package/dist/vendor/bootstrap-vue/src/components/transporter/transporter.js +205 -0
  304. package/dist/vendor/bootstrap-vue/src/constants/components.js +55 -0
  305. package/dist/vendor/bootstrap-vue/src/constants/config.js +11 -0
  306. package/dist/vendor/bootstrap-vue/src/constants/env.js +36 -0
  307. package/dist/vendor/bootstrap-vue/src/constants/events.js +56 -0
  308. package/dist/vendor/bootstrap-vue/src/constants/key-codes.js +11 -0
  309. package/dist/vendor/bootstrap-vue/src/constants/popper.js +10 -0
  310. package/dist/vendor/bootstrap-vue/src/constants/props.js +24 -0
  311. package/dist/vendor/bootstrap-vue/src/constants/regex.js +35 -0
  312. package/dist/vendor/bootstrap-vue/src/constants/safe-types.js +15 -0
  313. package/dist/vendor/bootstrap-vue/src/constants/slots.js +36 -0
  314. package/dist/vendor/bootstrap-vue/src/directives/modal/index.js +1 -0
  315. package/dist/vendor/bootstrap-vue/src/directives/modal/modal.js +112 -0
  316. package/dist/vendor/bootstrap-vue/src/directives/tooltip/index.js +1 -0
  317. package/dist/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +267 -0
  318. package/dist/vendor/bootstrap-vue/src/directives/visible/index.js +1 -0
  319. package/dist/vendor/bootstrap-vue/src/directives/visible/visible.js +187 -0
  320. package/dist/vendor/bootstrap-vue/src/mixins/attrs.js +5 -0
  321. package/dist/vendor/bootstrap-vue/src/mixins/click-out.js +54 -0
  322. package/dist/vendor/bootstrap-vue/src/mixins/dropdown.js +470 -0
  323. package/dist/vendor/bootstrap-vue/src/mixins/focus-in.js +46 -0
  324. package/dist/vendor/bootstrap-vue/src/mixins/form-control.js +73 -0
  325. package/dist/vendor/bootstrap-vue/src/mixins/form-custom.js +26 -0
  326. package/dist/vendor/bootstrap-vue/src/mixins/form-options.js +91 -0
  327. package/dist/vendor/bootstrap-vue/src/mixins/form-selection.js +62 -0
  328. package/dist/vendor/bootstrap-vue/src/mixins/form-size.js +26 -0
  329. package/dist/vendor/bootstrap-vue/src/mixins/form-state.js +50 -0
  330. package/dist/vendor/bootstrap-vue/src/mixins/form-text.js +293 -0
  331. package/dist/vendor/bootstrap-vue/src/mixins/form-validity.js +50 -0
  332. package/dist/vendor/bootstrap-vue/src/mixins/has-listener.js +29 -0
  333. package/dist/vendor/bootstrap-vue/src/mixins/id.js +57 -0
  334. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-document.js +62 -0
  335. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-root.js +120 -0
  336. package/dist/vendor/bootstrap-vue/src/mixins/listen-on-window.js +62 -0
  337. package/dist/vendor/bootstrap-vue/src/mixins/listeners.js +25 -0
  338. package/dist/vendor/bootstrap-vue/src/mixins/model.js +10 -0
  339. package/dist/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
  340. package/dist/vendor/bootstrap-vue/src/mixins/scoped-style.js +18 -0
  341. package/dist/vendor/bootstrap-vue/src/mixins/use-parent.js +14 -0
  342. package/dist/vendor/bootstrap-vue/src/utils/array.js +27 -0
  343. package/dist/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
  344. package/dist/vendor/bootstrap-vue/src/utils/cache.js +60 -0
  345. package/dist/vendor/bootstrap-vue/src/utils/clone-deep.js +18 -0
  346. package/dist/vendor/bootstrap-vue/src/utils/config-set.js +86 -0
  347. package/dist/vendor/bootstrap-vue/src/utils/config.js +71 -0
  348. package/dist/vendor/bootstrap-vue/src/utils/create-new-child-component.js +133 -0
  349. package/dist/vendor/bootstrap-vue/src/utils/css-escape.js +70 -0
  350. package/dist/vendor/bootstrap-vue/src/utils/dom.js +298 -0
  351. package/dist/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +28 -0
  352. package/dist/vendor/bootstrap-vue/src/utils/env.js +16 -0
  353. package/dist/vendor/bootstrap-vue/src/utils/events.js +78 -0
  354. package/dist/vendor/bootstrap-vue/src/utils/get-event-root.js +5 -0
  355. package/dist/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +3 -0
  356. package/dist/vendor/bootstrap-vue/src/utils/get-scope-id.js +9 -0
  357. package/dist/vendor/bootstrap-vue/src/utils/get.js +63 -0
  358. package/dist/vendor/bootstrap-vue/src/utils/html.js +16 -0
  359. package/dist/vendor/bootstrap-vue/src/utils/identity.js +3 -0
  360. package/dist/vendor/bootstrap-vue/src/utils/inspect.js +35 -0
  361. package/dist/vendor/bootstrap-vue/src/utils/locale.js +18 -0
  362. package/dist/vendor/bootstrap-vue/src/utils/loose-equal.js +59 -0
  363. package/dist/vendor/bootstrap-vue/src/utils/loose-index-of.js +13 -0
  364. package/dist/vendor/bootstrap-vue/src/utils/math.js +9 -0
  365. package/dist/vendor/bootstrap-vue/src/utils/memoize.js +14 -0
  366. package/dist/vendor/bootstrap-vue/src/utils/model.js +33 -0
  367. package/dist/vendor/bootstrap-vue/src/utils/noop.js +3 -0
  368. package/dist/vendor/bootstrap-vue/src/utils/normalize-slot.js +51 -0
  369. package/dist/vendor/bootstrap-vue/src/utils/number.js +23 -0
  370. package/dist/vendor/bootstrap-vue/src/utils/object.js +72 -0
  371. package/dist/vendor/bootstrap-vue/src/utils/observe-dom.js +76 -0
  372. package/dist/vendor/bootstrap-vue/src/utils/on-instance-destroy.js +22 -0
  373. package/dist/vendor/bootstrap-vue/src/utils/plugins.js +124 -0
  374. package/dist/vendor/bootstrap-vue/src/utils/props.js +67 -0
  375. package/dist/vendor/bootstrap-vue/src/utils/router.js +150 -0
  376. package/dist/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +14 -0
  377. package/dist/vendor/bootstrap-vue/src/utils/stable-sort.js +28 -0
  378. package/dist/vendor/bootstrap-vue/src/utils/string.js +47 -0
  379. package/dist/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
  380. package/dist/vendor/bootstrap-vue/src/utils/warn.js +45 -0
  381. package/dist/vendor/bootstrap-vue/src/vue.js +55 -0
  382. package/package.json +4 -3
  383. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +2 -2
  384. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.js +2 -2
  385. package/src/vendor/bootstrap-vue/src/components/layout/col.js +2 -2
  386. package/src/vendor/bootstrap-vue/src/components/modal/modal.js +2 -2
  387. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.js +2 -2
  388. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +8 -9
  389. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.js +1 -2
  390. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.js +1 -2
  391. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.js +1 -2
  392. package/src/vendor/bootstrap-vue/src/utils/array.js +0 -1
  393. package/src/vendor/bootstrap-vue/src/utils/locale.js +1 -2
@@ -0,0 +1,716 @@
1
+ import { uniqueId, isBoolean } from 'lodash-es';
2
+ import { offset, autoPlacement, shift, arrow, size, autoUpdate, computePosition } from '@floating-ui/dom';
3
+ import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions, dropdownPlacements, dropdownAllowedAutoPlacements } from '../../../../utils/constants';
4
+ import { POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_CONTENTS_CLASS, GL_DROPDOWN_BEFORE_CLOSE, GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, KEY_CODE_ESCAPE, ENTER, SPACE, ARROW_DOWN, GL_DROPDOWN_FOCUS_CONTENT } from '../constants';
5
+ import { logWarning, isElementFocusable, isElementTabbable, stopEvent } from '../../../../utils/utils';
6
+ import { OutsideDirective } from '../../../../directives/outside/outside';
7
+ import GlButton from '../../button/button';
8
+ import GlIcon from '../../icon/icon';
9
+ import DropdownContainer from './dropdown_container';
10
+ import { DEFAULT_OFFSET, FIXED_WIDTH_CLASS, ARROW_X_MINIMUM } from './constants';
11
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
12
+
13
+ const BASE_DROPDOWN_CLASS = 'gl-new-dropdown';
14
+ const DROPDOWN_CONTAINER_CLASS = 'gl-new-dropdown-container';
15
+ var script = {
16
+ name: 'BaseDropdown',
17
+ expose: ['open', 'close', 'closeAndFocus', 'containsElement'],
18
+ BASE_DROPDOWN_CLASS,
19
+ DROPDOWN_CONTAINER_CLASS,
20
+ components: {
21
+ DropdownContainer,
22
+ GlButton,
23
+ GlIcon
24
+ },
25
+ directives: {
26
+ Outside: OutsideDirective
27
+ },
28
+ inject: {
29
+ getFormGroupInstance: {
30
+ default: () => () => {}
31
+ }
32
+ },
33
+ props: {
34
+ toggleText: {
35
+ type: String,
36
+ required: false,
37
+ default: ''
38
+ },
39
+ textSrOnly: {
40
+ type: Boolean,
41
+ required: false,
42
+ default: false
43
+ },
44
+ block: {
45
+ type: Boolean,
46
+ required: false,
47
+ default: false
48
+ },
49
+ category: {
50
+ type: String,
51
+ required: false,
52
+ default: buttonCategoryOptions.primary,
53
+ validator: value => Object.keys(buttonCategoryOptions).includes(value)
54
+ },
55
+ variant: {
56
+ type: String,
57
+ required: false,
58
+ default: dropdownVariantOptions.default,
59
+ validator: value => Object.keys(dropdownVariantOptions).includes(value)
60
+ },
61
+ size: {
62
+ type: String,
63
+ required: false,
64
+ default: 'medium',
65
+ validator: value => Object.keys(buttonSizeOptions).includes(value)
66
+ },
67
+ icon: {
68
+ type: String,
69
+ required: false,
70
+ default: ''
71
+ },
72
+ disabled: {
73
+ type: Boolean,
74
+ required: false,
75
+ default: false
76
+ },
77
+ loading: {
78
+ type: Boolean,
79
+ required: false,
80
+ default: false
81
+ },
82
+ toggleClass: {
83
+ type: [String, Array, Object],
84
+ required: false,
85
+ default: null
86
+ },
87
+ noCaret: {
88
+ type: Boolean,
89
+ required: false,
90
+ default: false
91
+ },
92
+ /**
93
+ * Controls the validation state appearance of the component. `true` for valid, `false` for invalid, or `null` for no validation state
94
+ */
95
+ state: {
96
+ type: Boolean,
97
+ required: false,
98
+ default: null
99
+ },
100
+ placement: {
101
+ type: String,
102
+ required: false,
103
+ default: 'bottom-start',
104
+ validator: value => {
105
+ if (['left', 'center', 'right'].includes(value)) {
106
+ logWarning(`"${value}" placement is deprecated. Use ${dropdownPlacements[value]} instead.`, {
107
+ name: 'GlDisclosureDropdown/GlCollapsibleListbox'
108
+ });
109
+ }
110
+ return Object.keys(dropdownPlacements).includes(value);
111
+ }
112
+ },
113
+ // ARIA props
114
+ ariaHaspopup: {
115
+ type: [String, Boolean],
116
+ required: false,
117
+ default: false,
118
+ validator: value => {
119
+ return ['menu', 'listbox', 'tree', 'grid', 'dialog', true, false].includes(value);
120
+ }
121
+ },
122
+ activeItemId: {
123
+ type: String,
124
+ required: false,
125
+ default: undefined
126
+ },
127
+ hasExternalLabel: {
128
+ type: Boolean,
129
+ required: false,
130
+ default: false
131
+ },
132
+ hasSearchableListbox: {
133
+ type: Boolean,
134
+ required: false,
135
+ default: false
136
+ },
137
+ isDisclosure: {
138
+ type: Boolean,
139
+ required: false,
140
+ default: false
141
+ },
142
+ /**
143
+ * Id that will be referenced by `aria-labelledby` attribute of the dropdown content`
144
+ */
145
+ toggleId: {
146
+ type: String,
147
+ required: true
148
+ },
149
+ /**
150
+ * Span Id that will be referenced by listbox `aria-labelledby` if there's an external label.
151
+ * This prop will only be defined by `GlCollapsibleListbox` when `isInFormGroup` injected is true.
152
+ */
153
+ listboxId: {
154
+ type: String,
155
+ required: false,
156
+ default: undefined
157
+ },
158
+ /**
159
+ * The `aria-labelledby` attribute value for the toggle `button`
160
+ */
161
+ ariaLabelledby: {
162
+ type: String,
163
+ required: false,
164
+ default: null
165
+ },
166
+ /**
167
+ * The `aria-label` attribute value for the toggle `button`.
168
+ */
169
+ ariaLabel: {
170
+ type: String,
171
+ required: false,
172
+ default: null
173
+ },
174
+ /**
175
+ * Custom value to be passed to the offset middleware.
176
+ * https://floating-ui.com/docs/offset
177
+ */
178
+ offset: {
179
+ type: [Number, Object],
180
+ required: false,
181
+ default: () => ({
182
+ mainAxis: DEFAULT_OFFSET
183
+ })
184
+ },
185
+ fluidWidth: {
186
+ type: Boolean,
187
+ required: false,
188
+ default: false
189
+ },
190
+ /**
191
+ * Allows the dropdown panel to match the width of the trigger element
192
+ */
193
+ panelMatchTriggerWidth: {
194
+ type: Boolean,
195
+ required: false,
196
+ default: false
197
+ },
198
+ /**
199
+ * Strategy to be applied by computePosition. If this is set to fixed, the dropdown's position
200
+ * needs to be set to fixed in CSS as well.
201
+ * https://floating-ui.com/docs/computePosition#strategy
202
+ */
203
+ positioningStrategy: {
204
+ type: String,
205
+ required: false,
206
+ default: POSITION_ABSOLUTE,
207
+ validator: strategy => [POSITION_ABSOLUTE, POSITION_FIXED].includes(strategy)
208
+ }
209
+ },
210
+ data() {
211
+ return {
212
+ openedYet: false,
213
+ visible: false,
214
+ baseDropdownId: uniqueId('base-dropdown-')
215
+ };
216
+ },
217
+ computed: {
218
+ ariaActiveDescendant() {
219
+ if (!this.isDisclosure && this.visible) return this.activeItemId;
220
+ return undefined;
221
+ },
222
+ hasNoVisibleToggleText() {
223
+ var _this$toggleText;
224
+ return !((_this$toggleText = this.toggleText) !== null && _this$toggleText !== void 0 && _this$toggleText.length) || this.textSrOnly;
225
+ },
226
+ isIconOnly() {
227
+ return Boolean(this.icon && this.hasNoVisibleToggleText);
228
+ },
229
+ isEllipsisButton() {
230
+ return this.isIconOnly && this.icon === 'ellipsis_h';
231
+ },
232
+ isCaretOnly() {
233
+ return !this.noCaret && !this.icon && this.hasNoVisibleToggleText;
234
+ },
235
+ computedState() {
236
+ // If not a boolean, ensure that value is null
237
+ return isBoolean(this.state) ? this.state : null;
238
+ },
239
+ stateClass() {
240
+ if (this.computedState === true) return 'is-valid';
241
+ if (this.computedState === false) return 'is-invalid';
242
+ return null;
243
+ },
244
+ isDefaultToggle() {
245
+ return !this.$scopedSlots.toggle;
246
+ },
247
+ isToggleCombobox() {
248
+ if (this.hasSearchableListbox || this.isDisclosure) {
249
+ return false;
250
+ }
251
+ return true;
252
+ },
253
+ isToggleLabelledExternally() {
254
+ if (this.hasExternalLabel && this.toggleId) return true;
255
+ return false;
256
+ },
257
+ computedToggleId() {
258
+ if (this.isDisclosure) {
259
+ return this.isDefaultToggle ? this.toggleId : undefined;
260
+ }
261
+ if (this.isToggleLabelledExternally) {
262
+ return this.isDefaultToggle ? this.toggleId : undefined;
263
+ }
264
+ if (this.hasSearchableListbox) {
265
+ return this.toggleId;
266
+ }
267
+ return undefined;
268
+ },
269
+ computedToggleInnerId() {
270
+ if (this.isToggleCombobox && !this.isToggleLabelledExternally) {
271
+ return this.toggleId;
272
+ }
273
+ if (this.isToggleCombobox && this.isToggleLabelledExternally) {
274
+ return this.listboxId;
275
+ }
276
+ return undefined;
277
+ },
278
+ toggleAriaAttributes() {
279
+ return {
280
+ 'aria-controls': this.baseDropdownId,
281
+ 'aria-expanded': String(this.visible),
282
+ 'aria-haspopup': this.ariaHaspopup,
283
+ 'aria-labelledby': this.toggleLabelledBy,
284
+ 'aria-label': this.ariaLabel || undefined,
285
+ 'aria-activedescendant': this.ariaActiveDescendant
286
+ };
287
+ },
288
+ toggleButtonClasses() {
289
+ return [this.toggleClass, {
290
+ 'gl-new-dropdown-toggle': true,
291
+ 'button-ellipsis-horizontal': this.isEllipsisButton,
292
+ 'gl-new-dropdown-icon-only btn-icon': this.isIconOnly && !this.isEllipsisButton,
293
+ 'gl-new-dropdown-toggle-no-caret': this.noCaret,
294
+ 'gl-new-dropdown-caret-only btn-icon': this.isCaretOnly
295
+ }, this.stateClass];
296
+ },
297
+ toggleButtonTextClasses() {
298
+ return this.block ? 'gl-w-full' : '';
299
+ },
300
+ // Set the aria-labelledby property with one or more ID strings
301
+ toggleLabelledBy() {
302
+ var _this$getFormGroupIns;
303
+ const formGroupLabelId = (_this$getFormGroupIns = this.getFormGroupInstance()) === null || _this$getFormGroupIns === void 0 ? void 0 : _this$getFormGroupIns.labelId;
304
+ if (this.isToggleCombobox) {
305
+ // Comboboxes announce label and self value when aria-labelledby is label ID.
306
+ // Tested with VoiceOver, NVDA, JAWS, Narrator and preferred browsers.
307
+ if (this.ariaLabelledby) {
308
+ return `${this.ariaLabelledby}`;
309
+ }
310
+
311
+ // Combobox inside GlFormGroup
312
+ if (formGroupLabelId) {
313
+ return `${formGroupLabelId} ${this.toggleId}`;
314
+ }
315
+
316
+ // Fallback calculated toggleId value
317
+ return this.toggleId;
318
+ }
319
+ if (!this.isToggleCombobox) {
320
+ // Disclosures or buttons with listbox require both IDs to announce correctly.
321
+ // Tested with VoiceOver, NVDA, JAWS, Narrator and preferred browsers.
322
+ if (this.ariaLabelledby) {
323
+ return `${this.ariaLabelledby} ${this.toggleId}`;
324
+ }
325
+
326
+ // Disclosure or button with listbox inside GlFormGroup
327
+ if (formGroupLabelId) {
328
+ return `${formGroupLabelId} ${this.toggleId}`;
329
+ }
330
+
331
+ // Disclosures and buttons self-identify. aria-labelledby is not needed.
332
+ return undefined;
333
+ }
334
+ return undefined;
335
+ },
336
+ toggleRole() {
337
+ if (this.isToggleCombobox) {
338
+ return 'combobox';
339
+ }
340
+ return undefined;
341
+ },
342
+ toggleAccessibilityAttributes() {
343
+ return {
344
+ ...this.toggleAriaAttributes,
345
+ id: this.toggleId,
346
+ role: this.toggleRole
347
+ };
348
+ },
349
+ toggleOptions() {
350
+ if (this.isDefaultToggle) {
351
+ return {
352
+ is: GlButton,
353
+ icon: this.icon,
354
+ block: this.block,
355
+ buttonTextClasses: this.toggleButtonTextClasses,
356
+ category: this.category,
357
+ variant: this.variant,
358
+ size: this.size,
359
+ disabled: this.disabled,
360
+ loading: this.loading,
361
+ class: this.toggleButtonClasses,
362
+ role: this.toggleRole,
363
+ ...this.toggleAriaAttributes,
364
+ listeners: {
365
+ keydown: event => this.onKeydown(event),
366
+ click: event => this.toggle(event)
367
+ }
368
+ };
369
+ }
370
+ return {
371
+ is: 'div',
372
+ class: 'gl-new-dropdown-custom-toggle',
373
+ listeners: {
374
+ keydown: event => this.onKeydown(event),
375
+ click: event => this.toggle(event)
376
+ }
377
+ };
378
+ },
379
+ toggleListeners() {
380
+ return this.toggleOptions.listeners;
381
+ },
382
+ toggleAttributes() {
383
+ const {
384
+ listeners,
385
+ is,
386
+ ...attributes
387
+ } = this.toggleOptions;
388
+ return attributes;
389
+ },
390
+ toggleComponent() {
391
+ return this.toggleOptions.is;
392
+ },
393
+ toggleElement() {
394
+ var _this$$refs$toggle;
395
+ return this.$refs.toggle.$el || ((_this$$refs$toggle = this.$refs.toggle) === null || _this$$refs$toggle === void 0 ? void 0 : _this$$refs$toggle.firstElementChild);
396
+ },
397
+ panelClasses() {
398
+ return {
399
+ '!gl-block': this.visible,
400
+ [FIXED_WIDTH_CLASS]: !this.fluidWidth && !this.panelMatchTriggerWidth,
401
+ 'gl-new-dropdown-panel-fluid-width': this.fluidWidth && !this.panelMatchTriggerWidth,
402
+ 'gl-fixed': this.openedYet && this.isFixed,
403
+ 'gl-absolute': this.openedYet && !this.isFixed
404
+ };
405
+ },
406
+ isFixed() {
407
+ return this.positioningStrategy === POSITION_FIXED;
408
+ },
409
+ floatingUIConfig() {
410
+ const placement = dropdownPlacements[this.placement];
411
+ const [, alignment] = placement.split('-');
412
+ return {
413
+ placement,
414
+ strategy: this.positioningStrategy,
415
+ middleware: [offset(this.offset), autoPlacement({
416
+ alignment,
417
+ allowedPlacements: dropdownAllowedAutoPlacements[this.placement]
418
+ }), shift(), arrow({
419
+ element: this.$refs.dropdownArrow
420
+ }), size({
421
+ apply: _ref => {
422
+ var _this$nonScrollableCo;
423
+ let {
424
+ availableWidth,
425
+ availableHeight,
426
+ elements
427
+ } = _ref;
428
+ const contentsEl = elements.floating.querySelector(`.${GL_DROPDOWN_CONTENTS_CLASS}`);
429
+ if (!contentsEl) return;
430
+ const contentsAvailableHeight = availableHeight - ((_this$nonScrollableCo = this.nonScrollableContentHeight) !== null && _this$nonScrollableCo !== void 0 ? _this$nonScrollableCo : 0) - DEFAULT_OFFSET;
431
+ const maxWidth = this.fluidWidth ? {
432
+ maxWidth: `${Math.max(0, availableWidth)}px`
433
+ } : {};
434
+ const triggerWidth = this.panelMatchTriggerWidth ? {
435
+ minWidth: `${this.toggleElement.getBoundingClientRect().width}px`
436
+ } : {};
437
+ Object.assign(contentsEl.style, {
438
+ maxHeight: `${Math.max(contentsAvailableHeight, 0)}px`
439
+ }, maxWidth, triggerWidth);
440
+ }
441
+ })]
442
+ };
443
+ }
444
+ },
445
+ mounted() {
446
+ this.checkToggleFocusable();
447
+ },
448
+ beforeDestroy() {
449
+ this.stopFloating();
450
+ },
451
+ methods: {
452
+ checkToggleFocusable() {
453
+ if (!isElementFocusable(this.toggleElement) && !isElementTabbable(this.toggleElement)) {
454
+ logWarning(`Toggle is missing a 'tabindex' and cannot be focused.
455
+ Use 'a' or 'button' element instead or make sure to add 'role="button"' along with 'tabindex' otherwise.`, {
456
+ name: 'GlDisclosureDropdown/GlCollapsibleListbox',
457
+ element: this.$el
458
+ });
459
+ }
460
+ },
461
+ getArrowOffsets(actualPlacement) {
462
+ // Try to extract the base direction (top, bottom, left, right) from the placement
463
+ const direction = actualPlacement === null || actualPlacement === void 0 ? void 0 : actualPlacement.split('-')[0];
464
+ const offsetConfigs = {
465
+ top: {
466
+ staticSide: 'bottom',
467
+ rotation: '225deg'
468
+ },
469
+ bottom: {
470
+ staticSide: 'top',
471
+ rotation: '45deg'
472
+ },
473
+ left: {
474
+ staticSide: 'right',
475
+ rotation: '135deg'
476
+ },
477
+ right: {
478
+ staticSide: 'left',
479
+ rotation: '315deg'
480
+ }
481
+ };
482
+ return offsetConfigs[direction] || offsetConfigs.bottom;
483
+ },
484
+ async startFloating() {
485
+ this.calculateNonScrollableAreaHeight();
486
+ this.observer = new MutationObserver(this.calculateNonScrollableAreaHeight);
487
+ this.observer.observe(this.$refs.content, {
488
+ childList: true,
489
+ subtree: true
490
+ });
491
+ this.stopAutoUpdate = autoUpdate(this.toggleElement, this.$refs.content, async () => {
492
+ const result = await computePosition(this.toggleElement, this.$refs.content, this.floatingUIConfig);
493
+
494
+ /**
495
+ * Due to the asynchronous nature of computePosition, it's technically possible for the
496
+ * component to have been destroyed by the time the promise resolves. In such case, we exit
497
+ * early to prevent a TypeError.
498
+ */
499
+ if (!this.$refs.content) return;
500
+ const {
501
+ x,
502
+ y,
503
+ middlewareData,
504
+ placement
505
+ } = result;
506
+
507
+ // Get offsets based on actual placement, not requested placement
508
+ const {
509
+ rotation,
510
+ staticSide
511
+ } = this.getArrowOffsets(placement);
512
+
513
+ // Assign dropdown window position
514
+ Object.assign(this.$refs.content.style, {
515
+ left: `${x}px`,
516
+ top: `${y}px`
517
+ });
518
+
519
+ // Assign arrow position
520
+ if (middlewareData && middlewareData.arrow) {
521
+ const {
522
+ x: arrowX,
523
+ y: arrowY
524
+ } = middlewareData.arrow;
525
+
526
+ /**
527
+ * Clamp arrow X position to a minimum of 24px from the edge of the dropdown.
528
+ * This prevents wide toggles from pushing the arrow to the very edge of the dropdown.
529
+ */
530
+ const toggleRect = this.toggleElement.getBoundingClientRect();
531
+ const contentRect = this.$refs.content.getBoundingClientRect();
532
+ const clampedArrowX = toggleRect.width > contentRect.width ? Math.min(Math.max(arrowX, ARROW_X_MINIMUM), contentRect.width - ARROW_X_MINIMUM) : arrowX;
533
+ Object.assign(this.$refs.dropdownArrow.style, {
534
+ left: arrowX != null ? `${clampedArrowX}px` : '',
535
+ top: arrowY != null ? `${arrowY}px` : '',
536
+ right: '',
537
+ bottom: '',
538
+ [staticSide]: '-4px',
539
+ transform: `rotate(${rotation})`
540
+ });
541
+ }
542
+ });
543
+ },
544
+ stopFloating() {
545
+ var _this$observer, _this$stopAutoUpdate;
546
+ (_this$observer = this.observer) === null || _this$observer === void 0 ? void 0 : _this$observer.disconnect();
547
+ (_this$stopAutoUpdate = this.stopAutoUpdate) === null || _this$stopAutoUpdate === void 0 ? void 0 : _this$stopAutoUpdate.call(this);
548
+ },
549
+ async toggle(event) {
550
+ if (event && this.visible) {
551
+ let prevented = false;
552
+ this.$emit(GL_DROPDOWN_BEFORE_CLOSE, {
553
+ originalEvent: event,
554
+ preventDefault() {
555
+ prevented = true;
556
+ }
557
+ });
558
+ if (prevented) return false;
559
+ }
560
+ this.visible = !this.visible;
561
+ if (this.visible) {
562
+ // The dropdown needs to be actually visible before we compute its position with Floating UI.
563
+ await this.$nextTick();
564
+ this.openedYet = true;
565
+ /**
566
+ * We wait until the dropdown's position has been computed before emitting the `shown` event.
567
+ * This ensures that, if the parent component attempts to focus an inner element, the dropdown
568
+ * is already properly placed in the page. Otherwise, the page would scroll back to the top.
569
+ */
570
+ this.startFloating();
571
+ this.$emit(GL_DROPDOWN_SHOWN);
572
+ } else {
573
+ this.stopFloating();
574
+ this.$emit(GL_DROPDOWN_HIDDEN, event);
575
+ }
576
+
577
+ // this is to check whether `toggle` was prevented or not
578
+ return true;
579
+ },
580
+ open() {
581
+ if (this.visible) {
582
+ return;
583
+ }
584
+ this.toggle();
585
+ },
586
+ close(event) {
587
+ if (!this.visible) {
588
+ return;
589
+ }
590
+ this.toggle(event);
591
+ },
592
+ clickedToggle(event) {
593
+ var _this$$refs$toggle$co, _this$$refs$toggle2, _this$$refs$toggle$$e, _this$$refs$toggle$$e2;
594
+ return ((_this$$refs$toggle$co = (_this$$refs$toggle2 = this.$refs.toggle).contains) === null || _this$$refs$toggle$co === void 0 ? void 0 : _this$$refs$toggle$co.call(_this$$refs$toggle2, event.target)) || ((_this$$refs$toggle$$e = this.$refs.toggle.$el) === null || _this$$refs$toggle$$e === void 0 ? void 0 : (_this$$refs$toggle$$e2 = _this$$refs$toggle$$e.contains) === null || _this$$refs$toggle$$e2 === void 0 ? void 0 : _this$$refs$toggle$$e2.call(_this$$refs$toggle$$e, event.target));
595
+ },
596
+ handleClickOutside(event) {
597
+ // Ignore "click outside" events if the toggle was clicked
598
+ if (this.clickedToggle(event)) {
599
+ return;
600
+ }
601
+ this.close(event);
602
+ },
603
+ /**
604
+ * Closes the dropdown and returns the focus to the toggle unless it has has moved outside
605
+ * of the dropdown, meaning that the consumer needed to put some other element in focus.
606
+ *
607
+ * @param {KeyboardEvent?} event The keyboard event that caused the dropdown to close.
608
+ */
609
+ async closeAndFocus(event) {
610
+ if (!this.visible) {
611
+ return;
612
+ }
613
+ const hadFocusWithin = this.$el.contains(document.activeElement);
614
+ const hasToggled = await this.toggle(event);
615
+ if (!hadFocusWithin) {
616
+ return;
617
+ }
618
+ if (hasToggled) {
619
+ this.focusToggle();
620
+ }
621
+ },
622
+ focusToggle() {
623
+ this.toggleElement.focus();
624
+ },
625
+ onKeydown(event) {
626
+ const {
627
+ keyCode,
628
+ code,
629
+ target: {
630
+ tagName
631
+ }
632
+ } = event;
633
+
634
+ // Use keyCode because @vue/test-utils doesn't correctly set the
635
+ // `code` and `key` KeyboardEvent properties. This is only needed in this case because:
636
+ // - We are not using the @keydown.esc template syntax, which under Vue 2 checks against `keyCode` anyway.
637
+ // - The `.trigger('keydown.esc')` shorthand @vue/test-utils provides is useful.
638
+ // See https://github.com/vuejs/vue-test-utils/issues/2096
639
+ if (keyCode === KEY_CODE_ESCAPE && this.visible) {
640
+ stopEvent(event);
641
+ this.close();
642
+ return;
643
+ }
644
+ let toggleOnEnter = true;
645
+ let toggleOnSpace = true;
646
+ if (tagName === 'BUTTON') {
647
+ toggleOnEnter = false;
648
+ toggleOnSpace = false;
649
+ } else if (tagName === 'A') {
650
+ toggleOnEnter = false;
651
+ }
652
+ if (code === ENTER && toggleOnEnter || code === SPACE && toggleOnSpace) {
653
+ this.toggle(event);
654
+ }
655
+ if (code === ARROW_DOWN) {
656
+ this.$emit(GL_DROPDOWN_FOCUS_CONTENT, event);
657
+ }
658
+ },
659
+ calculateNonScrollableAreaHeight() {
660
+ var _this$$refs$content;
661
+ const scrollableArea = (_this$$refs$content = this.$refs.content) === null || _this$$refs$content === void 0 ? void 0 : _this$$refs$content.querySelector(`.${GL_DROPDOWN_CONTENTS_CLASS}`);
662
+ if (!scrollableArea) return;
663
+ const floatingElementBoundingBox = this.$refs.content.getBoundingClientRect();
664
+ const scrollableAreaBoundingBox = scrollableArea.getBoundingClientRect();
665
+ this.nonScrollableContentHeight = floatingElementBoundingBox.height - scrollableAreaBoundingBox.height;
666
+ },
667
+ /**
668
+ * Public method which returns `true` if the given element is in the DOM tree of this component,
669
+ * and `false` otherwise.
670
+ *
671
+ * Useful for checking whether an event was dispatched against something in this dropdown,
672
+ * e.g., pressing <kbd>Esc</kbd>.
673
+ */
674
+ containsElement(element) {
675
+ return element.closest(`.${BASE_DROPDOWN_CLASS}`) === this.$el || element.closest(`.${DROPDOWN_CONTAINER_CLASS}`) === this.$refs.dropdownContainer;
676
+ }
677
+ }
678
+ };
679
+
680
+ /* script */
681
+ const __vue_script__ = script;
682
+
683
+ /* template */
684
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[_vm.$options.BASE_DROPDOWN_CLASS, { '!gl-block': _vm.block }]},[_c(_vm.toggleComponent,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.computedToggleId,"data-testid":"base-dropdown-toggle"}},'component',_vm.toggleAttributes,false),_vm.toggleListeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-new-dropdown-button-text",class:{ 'gl-sr-only': _vm.textSrOnly },attrs:{"id":_vm.computedToggleInnerId,"data-testid":"base-dropdown-span"}},[_vm._v("\n "+_vm._s(_vm.toggleText)+"\n ")]),_vm._v(" "),(!_vm.noCaret)?_c('gl-icon',{staticClass:"gl-button-icon gl-new-dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]},{"accessibilityAttributes":_vm.toggleAccessibilityAttributes})],2),_vm._v(" "),_c('dropdown-container',{attrs:{"positioning-strategy":_vm.positioningStrategy}},[_c('div',{directives:[{name:"outside",rawName:"v-outside.click.focusin",value:(_vm.handleClickOutside),expression:"handleClickOutside",modifiers:{"click":true,"focusin":true}}],ref:"dropdownContainer",class:_vm.$options.DROPDOWN_CONTAINER_CLASS},[_c('div',{ref:"content",staticClass:"gl-new-dropdown-panel",class:_vm.panelClasses,attrs:{"id":_vm.baseDropdownId,"data-testid":"base-dropdown-menu"},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"esc",27,$event.key,["Esc","Escape"])){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.closeAndFocus.apply(null, arguments)}}},[_c('div',{ref:"dropdownArrow",staticClass:"gl-new-dropdown-arrow"}),_vm._v(" "),_c('div',{staticClass:"gl-new-dropdown-inner"},[_vm._t("default",null,{"visible":_vm.visible})],2)])])])],1)};
685
+ var __vue_staticRenderFns__ = [];
686
+
687
+ /* style */
688
+ const __vue_inject_styles__ = undefined;
689
+ /* scoped */
690
+ const __vue_scope_id__ = undefined;
691
+ /* module identifier */
692
+ const __vue_module_identifier__ = undefined;
693
+ /* functional template */
694
+ const __vue_is_functional_template__ = false;
695
+ /* style inject */
696
+
697
+ /* style inject SSR */
698
+
699
+ /* style inject shadow dom */
700
+
701
+
702
+
703
+ const __vue_component__ = /*#__PURE__*/__vue_normalize__(
704
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
705
+ __vue_inject_styles__,
706
+ __vue_script__,
707
+ __vue_scope_id__,
708
+ __vue_is_functional_template__,
709
+ __vue_module_identifier__,
710
+ false,
711
+ undefined,
712
+ undefined,
713
+ undefined
714
+ );
715
+
716
+ export { __vue_component__ as default };