@gitlab/duo-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (858) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +88 -0
  3. package/dist/tokens/css/tokens.css +953 -0
  4. package/dist/tokens/css/tokens.dark.css +953 -0
  5. package/dist/tokens/js/tokens.dark.js +951 -0
  6. package/dist/tokens/js/tokens.js +951 -0
  7. package/dist/tokens/json/tokens.dark.json +21803 -0
  8. package/dist/tokens/json/tokens.json +21803 -0
  9. package/dist/tokens/scss/_tokens.dark.scss +950 -0
  10. package/dist/tokens/scss/_tokens.scss +950 -0
  11. package/dist/tokens/scss/_tokens_custom_properties.scss +951 -0
  12. package/dist/tokens/tailwind/tokens.cjs +336 -0
  13. package/package.json +234 -0
  14. package/src/charts.js +14 -0
  15. package/src/components/base/accordion/accordion.md +3 -0
  16. package/src/components/base/accordion/accordion.vue +43 -0
  17. package/src/components/base/accordion/accordion_item.md +3 -0
  18. package/src/components/base/accordion/accordion_item.scss +16 -0
  19. package/src/components/base/accordion/accordion_item.vue +122 -0
  20. package/src/components/base/alert/alert.md +35 -0
  21. package/src/components/base/alert/alert.scss +179 -0
  22. package/src/components/base/alert/alert.vue +241 -0
  23. package/src/components/base/animated_icon/animated_chevron_right_down_icon.vue +28 -0
  24. package/src/components/base/animated_icon/animated_duo_chat_icon.vue +39 -0
  25. package/src/components/base/animated_icon/animated_icon.md +4 -0
  26. package/src/components/base/animated_icon/animated_icon.scss +456 -0
  27. package/src/components/base/animated_icon/animated_notifications_icon.vue +49 -0
  28. package/src/components/base/animated_icon/animated_sidebar_icon.vue +35 -0
  29. package/src/components/base/animated_icon/animated_smile_icon.vue +37 -0
  30. package/src/components/base/animated_icon/animated_sort_icon.vue +84 -0
  31. package/src/components/base/animated_icon/animated_star_icon.vue +27 -0
  32. package/src/components/base/animated_icon/animated_todo_icon.vue +49 -0
  33. package/src/components/base/animated_icon/animated_upload_icon.vue +41 -0
  34. package/src/components/base/animated_icon/base_animated_icon.vue +39 -0
  35. package/src/components/base/avatar/avatar.md +1 -0
  36. package/src/components/base/avatar/avatar.scss +228 -0
  37. package/src/components/base/avatar/avatar.vue +151 -0
  38. package/src/components/base/avatar_labeled/avatar_labeled.md +20 -0
  39. package/src/components/base/avatar_labeled/avatar_labeled.scss +30 -0
  40. package/src/components/base/avatar_labeled/avatar_labeled.vue +92 -0
  41. package/src/components/base/avatar_link/avatar_link.md +33 -0
  42. package/src/components/base/avatar_link/avatar_link.scss +41 -0
  43. package/src/components/base/avatar_link/avatar_link.vue +15 -0
  44. package/src/components/base/avatars_inline/avatars_inline.md +38 -0
  45. package/src/components/base/avatars_inline/avatars_inline.scss +64 -0
  46. package/src/components/base/avatars_inline/avatars_inline.vue +110 -0
  47. package/src/components/base/badge/badge.md +38 -0
  48. package/src/components/base/badge/badge.scss +251 -0
  49. package/src/components/base/badge/badge.vue +91 -0
  50. package/src/components/base/banner/banner.md +35 -0
  51. package/src/components/base/banner/banner.scss +35 -0
  52. package/src/components/base/banner/banner.vue +131 -0
  53. package/src/components/base/breadcrumb/breadcrumb.md +23 -0
  54. package/src/components/base/breadcrumb/breadcrumb.scss +62 -0
  55. package/src/components/base/breadcrumb/breadcrumb.vue +229 -0
  56. package/src/components/base/breadcrumb/breadcrumb_item.vue +44 -0
  57. package/src/components/base/broadcast_message/broadcast_message.md +25 -0
  58. package/src/components/base/broadcast_message/broadcast_message.scss +135 -0
  59. package/src/components/base/broadcast_message/broadcast_message.vue +98 -0
  60. package/src/components/base/broadcast_message/constants.js +3 -0
  61. package/src/components/base/button/button.md +61 -0
  62. package/src/components/base/button/button.scss +699 -0
  63. package/src/components/base/button/button.vue +143 -0
  64. package/src/components/base/button_group/button_group.md +28 -0
  65. package/src/components/base/button_group/button_group.vue +16 -0
  66. package/src/components/base/card/card.md +4 -0
  67. package/src/components/base/card/card.scss +46 -0
  68. package/src/components/base/card/card.vue +49 -0
  69. package/src/components/base/collapse/collapse.md +26 -0
  70. package/src/components/base/collapse/collapse.vue +29 -0
  71. package/src/components/base/datepicker/datepicker.md +8 -0
  72. package/src/components/base/datepicker/datepicker.scss +228 -0
  73. package/src/components/base/datepicker/datepicker.vue +454 -0
  74. package/src/components/base/daterange_picker/daterange_picker.md +32 -0
  75. package/src/components/base/daterange_picker/daterange_picker.scss +20 -0
  76. package/src/components/base/daterange_picker/daterange_picker.vue +345 -0
  77. package/src/components/base/drawer/drawer.md +17 -0
  78. package/src/components/base/drawer/drawer.scss +153 -0
  79. package/src/components/base/drawer/drawer.vue +136 -0
  80. package/src/components/base/dropdown/dropdown.md +72 -0
  81. package/src/components/base/dropdown/dropdown.scss +210 -0
  82. package/src/components/base/dropdown/dropdown.vue +323 -0
  83. package/src/components/base/dropdown/dropdown_divider.scss +20 -0
  84. package/src/components/base/dropdown/dropdown_divider.vue +15 -0
  85. package/src/components/base/dropdown/dropdown_form.vue +17 -0
  86. package/src/components/base/dropdown/dropdown_item.md +2 -0
  87. package/src/components/base/dropdown/dropdown_item.scss +102 -0
  88. package/src/components/base/dropdown/dropdown_item.vue +114 -0
  89. package/src/components/base/dropdown/dropdown_section_header.md +7 -0
  90. package/src/components/base/dropdown/dropdown_section_header.scss +22 -0
  91. package/src/components/base/dropdown/dropdown_section_header.vue +17 -0
  92. package/src/components/base/dropdown/dropdown_text.md +7 -0
  93. package/src/components/base/dropdown/dropdown_text.scss +6 -0
  94. package/src/components/base/dropdown/dropdown_text.vue +17 -0
  95. package/src/components/base/filtered_search/common_story_options.js +12 -0
  96. package/src/components/base/filtered_search/filtered_search.md +76 -0
  97. package/src/components/base/filtered_search/filtered_search.scss +51 -0
  98. package/src/components/base/filtered_search/filtered_search.vue +475 -0
  99. package/src/components/base/filtered_search/filtered_search_suggestion.md +15 -0
  100. package/src/components/base/filtered_search/filtered_search_suggestion.scss +11 -0
  101. package/src/components/base/filtered_search/filtered_search_suggestion.vue +64 -0
  102. package/src/components/base/filtered_search/filtered_search_suggestion_list.md +13 -0
  103. package/src/components/base/filtered_search/filtered_search_suggestion_list.scss +36 -0
  104. package/src/components/base/filtered_search/filtered_search_suggestion_list.vue +122 -0
  105. package/src/components/base/filtered_search/filtered_search_term.md +7 -0
  106. package/src/components/base/filtered_search/filtered_search_term.scss +19 -0
  107. package/src/components/base/filtered_search/filtered_search_term.vue +243 -0
  108. package/src/components/base/filtered_search/filtered_search_token.md +23 -0
  109. package/src/components/base/filtered_search/filtered_search_token.scss +63 -0
  110. package/src/components/base/filtered_search/filtered_search_token.vue +484 -0
  111. package/src/components/base/filtered_search/filtered_search_token_segment.md +14 -0
  112. package/src/components/base/filtered_search/filtered_search_token_segment.scss +25 -0
  113. package/src/components/base/filtered_search/filtered_search_token_segment.vue +468 -0
  114. package/src/components/base/filtered_search/filtered_search_utils.js +251 -0
  115. package/src/components/base/form/form.md +2 -0
  116. package/src/components/base/form/form.vue +17 -0
  117. package/src/components/base/form/form_character_count/form_character_count.md +53 -0
  118. package/src/components/base/form/form_character_count/form_character_count.vue +97 -0
  119. package/src/components/base/form/form_checkbox/form_checkbox.md +6 -0
  120. package/src/components/base/form/form_checkbox/form_checkbox.scss +221 -0
  121. package/src/components/base/form/form_checkbox/form_checkbox.vue +58 -0
  122. package/src/components/base/form/form_checkbox/form_checkbox_group.vue +44 -0
  123. package/src/components/base/form/form_checkbox_tree/checkbox_tree_node.vue +58 -0
  124. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.md +73 -0
  125. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.vue +116 -0
  126. package/src/components/base/form/form_checkbox_tree/models/constants.js +12 -0
  127. package/src/components/base/form/form_checkbox_tree/models/node.js +48 -0
  128. package/src/components/base/form/form_checkbox_tree/models/tree.js +186 -0
  129. package/src/components/base/form/form_combobox/constants.js +50 -0
  130. package/src/components/base/form/form_combobox/form_combobox.md +52 -0
  131. package/src/components/base/form/form_combobox/form_combobox.scss +5 -0
  132. package/src/components/base/form/form_combobox/form_combobox.vue +280 -0
  133. package/src/components/base/form/form_date/form_date.md +26 -0
  134. package/src/components/base/form/form_date/form_date.scss +7 -0
  135. package/src/components/base/form/form_date/form_date.vue +135 -0
  136. package/src/components/base/form/form_fields/form_field_validator.vue +59 -0
  137. package/src/components/base/form/form_fields/form_fields.md +41 -0
  138. package/src/components/base/form/form_fields/form_fields.vue +258 -0
  139. package/src/components/base/form/form_fields/mappers.js +11 -0
  140. package/src/components/base/form/form_fields/validators.js +49 -0
  141. package/src/components/base/form/form_group/form_group.md +1 -0
  142. package/src/components/base/form/form_group/form_group.scss +59 -0
  143. package/src/components/base/form/form_group/form_group.vue +76 -0
  144. package/src/components/base/form/form_input/form_input.md +1 -0
  145. package/src/components/base/form/form_input/form_input.scss +74 -0
  146. package/src/components/base/form/form_input/form_input.vue +98 -0
  147. package/src/components/base/form/form_input_group/form_input_group.md +67 -0
  148. package/src/components/base/form/form_input_group/form_input_group.vue +103 -0
  149. package/src/components/base/form/form_input_group/form_input_group_mixin.js +39 -0
  150. package/src/components/base/form/form_radio/form_radio.md +23 -0
  151. package/src/components/base/form/form_radio/form_radio.scss +1 -0
  152. package/src/components/base/form/form_radio/form_radio.vue +51 -0
  153. package/src/components/base/form/form_radio_group/form_radio_group.md +63 -0
  154. package/src/components/base/form/form_radio_group/form_radio_group.scss +4 -0
  155. package/src/components/base/form/form_radio_group/form_radio_group.vue +64 -0
  156. package/src/components/base/form/form_select/constants.js +5 -0
  157. package/src/components/base/form/form_select/form_select.md +1 -0
  158. package/src/components/base/form/form_select/form_select.scss +117 -0
  159. package/src/components/base/form/form_select/form_select.vue +61 -0
  160. package/src/components/base/form/form_textarea/form_textarea.md +3 -0
  161. package/src/components/base/form/form_textarea/form_textarea.vue +141 -0
  162. package/src/components/base/form/input_group_text/input_group_text.md +4 -0
  163. package/src/components/base/form/input_group_text/input_group_text.vue +17 -0
  164. package/src/components/base/icon/icon.md +27 -0
  165. package/src/components/base/icon/icon.scss +8 -0
  166. package/src/components/base/icon/icon.vue +98 -0
  167. package/src/components/base/infinite_scroll/infinite_scroll.md +104 -0
  168. package/src/components/base/infinite_scroll/infinite_scroll.scss +11 -0
  169. package/src/components/base/infinite_scroll/infinite_scroll.vue +169 -0
  170. package/src/components/base/keyset_pagination/keyset_pagination.md +49 -0
  171. package/src/components/base/keyset_pagination/keyset_pagination.scss +9 -0
  172. package/src/components/base/keyset_pagination/keyset_pagination.vue +152 -0
  173. package/src/components/base/label/label.md +15 -0
  174. package/src/components/base/label/label.scss +156 -0
  175. package/src/components/base/label/label.vue +160 -0
  176. package/src/components/base/link/link.md +22 -0
  177. package/src/components/base/link/link.scss +13 -0
  178. package/src/components/base/link/link.vue +25 -0
  179. package/src/components/base/loading_icon/loading_icon.md +3 -0
  180. package/src/components/base/loading_icon/loading_icon.scss +139 -0
  181. package/src/components/base/loading_icon/loading_icon.vue +96 -0
  182. package/src/components/base/markdown/markdown.md +73 -0
  183. package/src/components/base/markdown/markdown.scss +223 -0
  184. package/src/components/base/markdown/markdown.vue +18 -0
  185. package/src/components/base/markdown/markdown_typescale_demo.html +155 -0
  186. package/src/components/base/modal/modal.md +30 -0
  187. package/src/components/base/modal/modal.scss +130 -0
  188. package/src/components/base/modal/modal.vue +269 -0
  189. package/src/components/base/nav/nav.md +11 -0
  190. package/src/components/base/nav/nav.scss +7 -0
  191. package/src/components/base/nav/nav.vue +17 -0
  192. package/src/components/base/nav/nav_item.vue +17 -0
  193. package/src/components/base/nav/nav_item_dropdown.vue +40 -0
  194. package/src/components/base/navbar/navbar.md +4 -0
  195. package/src/components/base/navbar/navbar.scss +0 -0
  196. package/src/components/base/navbar/navbar.vue +17 -0
  197. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +507 -0
  198. package/src/components/base/new_dropdowns/base_dropdown/constants.js +2 -0
  199. package/src/components/base/new_dropdowns/constants.js +20 -0
  200. package/src/components/base/new_dropdowns/disclosure/constants.js +6 -0
  201. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.md +168 -0
  202. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.scss +17 -0
  203. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +458 -0
  204. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.vue +104 -0
  205. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.vue +131 -0
  206. package/src/components/base/new_dropdowns/disclosure/mock_data.js +201 -0
  207. package/src/components/base/new_dropdowns/disclosure/utils.js +70 -0
  208. package/src/components/base/new_dropdowns/dropdown.scss +243 -0
  209. package/src/components/base/new_dropdowns/dropdown_item.scss +134 -0
  210. package/src/components/base/new_dropdowns/listbox/listbox.md +159 -0
  211. package/src/components/base/new_dropdowns/listbox/listbox.scss +53 -0
  212. package/src/components/base/new_dropdowns/listbox/listbox.vue +940 -0
  213. package/src/components/base/new_dropdowns/listbox/listbox_group.vue +35 -0
  214. package/src/components/base/new_dropdowns/listbox/listbox_item.vue +77 -0
  215. package/src/components/base/new_dropdowns/listbox/listbox_search_input.vue +76 -0
  216. package/src/components/base/new_dropdowns/listbox/mock_data.js +139 -0
  217. package/src/components/base/new_dropdowns/listbox/utils.js +25 -0
  218. package/src/components/base/paginated_list/paginated_list.md +1 -0
  219. package/src/components/base/paginated_list/paginated_list.vue +179 -0
  220. package/src/components/base/pagination/pagination.md +45 -0
  221. package/src/components/base/pagination/pagination.scss +57 -0
  222. package/src/components/base/pagination/pagination.vue +498 -0
  223. package/src/components/base/path/data.js +43 -0
  224. package/src/components/base/path/path.md +41 -0
  225. package/src/components/base/path/path.scss +163 -0
  226. package/src/components/base/path/path.vue +191 -0
  227. package/src/components/base/popover/popover.scss +102 -0
  228. package/src/components/base/popover/popover.vue +111 -0
  229. package/src/components/base/progress_bar/progress_bar.scss +19 -0
  230. package/src/components/base/progress_bar/progress_bar.vue +15 -0
  231. package/src/components/base/search_box_by_click/search_box_by_click.md +1 -0
  232. package/src/components/base/search_box_by_click/search_box_by_click.scss +49 -0
  233. package/src/components/base/search_box_by_click/search_box_by_click.vue +296 -0
  234. package/src/components/base/search_box_by_type/search_box_by_type.md +1 -0
  235. package/src/components/base/search_box_by_type/search_box_by_type.scss +70 -0
  236. package/src/components/base/search_box_by_type/search_box_by_type.vue +159 -0
  237. package/src/components/base/segmented_control/segmented_control.md +1 -0
  238. package/src/components/base/segmented_control/segmented_control.scss +179 -0
  239. package/src/components/base/segmented_control/segmented_control.vue +77 -0
  240. package/src/components/base/skeleton_loader/skeleton_loader.md +46 -0
  241. package/src/components/base/skeleton_loader/skeleton_loader.scss +17 -0
  242. package/src/components/base/skeleton_loader/skeleton_loader.vue +249 -0
  243. package/src/components/base/sorting/sorting.md +80 -0
  244. package/src/components/base/sorting/sorting.vue +160 -0
  245. package/src/components/base/table/constants.js +48 -0
  246. package/src/components/base/table/table.md +72 -0
  247. package/src/components/base/table/table.scss +145 -0
  248. package/src/components/base/table/table.vue +144 -0
  249. package/src/components/base/table_lite/table_lite.md +68 -0
  250. package/src/components/base/table_lite/table_lite.vue +43 -0
  251. package/src/components/base/tabs/constants.js +1 -0
  252. package/src/components/base/tabs/tab/tab.vue +57 -0
  253. package/src/components/base/tabs/tabs/scrollable_tabs.vue +140 -0
  254. package/src/components/base/tabs/tabs/tabs.md +76 -0
  255. package/src/components/base/tabs/tabs/tabs.scss +164 -0
  256. package/src/components/base/tabs/tabs/tabs.vue +282 -0
  257. package/src/components/base/toast/toast.js +93 -0
  258. package/src/components/base/toast/toast.md +48 -0
  259. package/src/components/base/toast/toast.scss +62 -0
  260. package/src/components/base/toggle/toggle.md +4 -0
  261. package/src/components/base/toggle/toggle.scss +177 -0
  262. package/src/components/base/toggle/toggle.vue +194 -0
  263. package/src/components/base/token/token.md +12 -0
  264. package/src/components/base/token/token.scss +44 -0
  265. package/src/components/base/token/token.vue +67 -0
  266. package/src/components/base/token_selector/helpers.js +3 -0
  267. package/src/components/base/token_selector/token_container.vue +184 -0
  268. package/src/components/base/token_selector/token_selector.md +78 -0
  269. package/src/components/base/token_selector/token_selector.scss +19 -0
  270. package/src/components/base/token_selector/token_selector.vue +489 -0
  271. package/src/components/base/token_selector/token_selector_dropdown.vue +257 -0
  272. package/src/components/base/tooltip/tooltip.md +52 -0
  273. package/src/components/base/tooltip/tooltip.scss +52 -0
  274. package/src/components/base/tooltip/tooltip.vue +31 -0
  275. package/src/components/charts/area/area.vue +372 -0
  276. package/src/components/charts/bar/bar.md +3 -0
  277. package/src/components/charts/bar/bar.vue +237 -0
  278. package/src/components/charts/chart/chart.md +19 -0
  279. package/src/components/charts/chart/chart.vue +188 -0
  280. package/src/components/charts/column/column.vue +204 -0
  281. package/src/components/charts/discrete_scatter/discrete_scatter.vue +207 -0
  282. package/src/components/charts/gauge/gauge.md +8 -0
  283. package/src/components/charts/gauge/gauge.scss +0 -0
  284. package/src/components/charts/gauge/gauge.vue +178 -0
  285. package/src/components/charts/heatmap/heatmap.md +7 -0
  286. package/src/components/charts/heatmap/heatmap.scss +7 -0
  287. package/src/components/charts/heatmap/heatmap.vue +290 -0
  288. package/src/components/charts/heatmap/index.js +3 -0
  289. package/src/components/charts/legend/legend.md +16 -0
  290. package/src/components/charts/legend/legend.scss +97 -0
  291. package/src/components/charts/legend/legend.vue +284 -0
  292. package/src/components/charts/line/line.md +7 -0
  293. package/src/components/charts/line/line.vue +368 -0
  294. package/src/components/charts/series_label/series_label.md +1 -0
  295. package/src/components/charts/series_label/series_label.scss +23 -0
  296. package/src/components/charts/series_label/series_label.vue +85 -0
  297. package/src/components/charts/single_stat/single_stat.md +8 -0
  298. package/src/components/charts/single_stat/single_stat.scss +17 -0
  299. package/src/components/charts/single_stat/single_stat.vue +158 -0
  300. package/src/components/charts/sparkline/sparkline.md +8 -0
  301. package/src/components/charts/sparkline/sparkline.vue +308 -0
  302. package/src/components/charts/stacked_column/stacked_column.md +10 -0
  303. package/src/components/charts/stacked_column/stacked_column.vue +330 -0
  304. package/src/components/charts/tooltip/tooltip.md +3 -0
  305. package/src/components/charts/tooltip/tooltip.scss +9 -0
  306. package/src/components/charts/tooltip/tooltip.vue +253 -0
  307. package/src/components/experimental/duo/chat/components/duo_chat_context/constants.js +11 -0
  308. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_details_modal/duo_chat_context_item_details_modal.vue +112 -0
  309. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu.vue +279 -0
  310. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_category_items.vue +44 -0
  311. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_item.vue +84 -0
  312. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_items.vue +157 -0
  313. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_menu/duo_chat_context_item_menu_search_items_loading.vue +34 -0
  314. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_popover/duo_chat_context_item_popover.vue +153 -0
  315. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.vue +180 -0
  316. package/src/components/experimental/duo/chat/components/duo_chat_context/mock_context_data.js +214 -0
  317. package/src/components/experimental/duo/chat/components/duo_chat_context/utils.js +129 -0
  318. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.md +18 -0
  319. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.vue +90 -0
  320. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.md +1 -0
  321. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.scss +62 -0
  322. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.vue +105 -0
  323. package/src/components/experimental/duo/chat/components/duo_chat_message/buttons_utils.js +30 -0
  324. package/src/components/experimental/duo/chat/components/duo_chat_message/copy_code_element.js +15 -0
  325. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.md +69 -0
  326. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.scss +65 -0
  327. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.vue +327 -0
  328. package/src/components/experimental/duo/chat/components/duo_chat_message/insert_code_snippet_element.js +42 -0
  329. package/src/components/experimental/duo/chat/components/duo_chat_message/utils.js +9 -0
  330. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.md +1 -0
  331. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.vue +81 -0
  332. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.md +1 -0
  333. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.vue +36 -0
  334. package/src/components/experimental/duo/chat/constants.js +32 -0
  335. package/src/components/experimental/duo/chat/duo_chat.md +194 -0
  336. package/src/components/experimental/duo/chat/duo_chat.scss +168 -0
  337. package/src/components/experimental/duo/chat/duo_chat.vue +732 -0
  338. package/src/components/experimental/duo/chat/markdown_renderer.js +20 -0
  339. package/src/components/experimental/duo/chat/mock_data.js +178 -0
  340. package/src/components/experimental/duo/user_feedback/user_feedback.md +81 -0
  341. package/src/components/experimental/duo/user_feedback/user_feedback.vue +85 -0
  342. package/src/components/experimental/duo/user_feedback/user_feedback_modal.vue +157 -0
  343. package/src/components/experimental/duo/workflow/components/duo_workflow_panel/duo_workflow_panel.md +33 -0
  344. package/src/components/experimental/duo/workflow/components/duo_workflow_panel/duo_workflow_panel.vue +84 -0
  345. package/src/components/experimental/duo/workflow/components/duo_workflow_prompt/duo_workflow_prompt.md +37 -0
  346. package/src/components/experimental/duo/workflow/components/duo_workflow_prompt/duo_workflow_prompt.vue +258 -0
  347. package/src/components/experimental/experiment_badge/constants.js +2 -0
  348. package/src/components/experimental/experiment_badge/experiment_badge.md +9 -0
  349. package/src/components/experimental/experiment_badge/experiment_badge.vue +113 -0
  350. package/src/components/mixins/button_mixin.js +9 -0
  351. package/src/components/mixins/safe_link_mixin.js +28 -0
  352. package/src/components/mixins/tooltip_mixin.js +21 -0
  353. package/src/components/regions/dashboard_skeleton/dashboard_skeleton.md +4 -0
  354. package/src/components/regions/dashboard_skeleton/dashboard_skeleton.vue +40 -0
  355. package/src/components/regions/empty_state/empty_state.md +4 -0
  356. package/src/components/regions/empty_state/empty_state.scss +3 -0
  357. package/src/components/regions/empty_state/empty_state.vue +187 -0
  358. package/src/components/shared_components/charts/tooltip_default_format.scss +18 -0
  359. package/src/components/shared_components/charts/tooltip_default_format.vue +32 -0
  360. package/src/components/shared_components/clear_icon_button/clear_icon_button.scss +10 -0
  361. package/src/components/shared_components/clear_icon_button/clear_icon_button.vue +43 -0
  362. package/src/components/shared_components/close_button/close_button.vue +29 -0
  363. package/src/components/utilities/animated_number/animated_number.md +6 -0
  364. package/src/components/utilities/animated_number/animated_number.vue +99 -0
  365. package/src/components/utilities/friendly_wrap/friendly_wrap.md +66 -0
  366. package/src/components/utilities/friendly_wrap/friendly_wrap.vue +33 -0
  367. package/src/components/utilities/intersection_observer/intersection_observer.md +16 -0
  368. package/src/components/utilities/intersection_observer/intersection_observer.vue +67 -0
  369. package/src/components/utilities/intersperse/intersperse.md +90 -0
  370. package/src/components/utilities/intersperse/intersperse.vue +60 -0
  371. package/src/components/utilities/sprintf/sprintf.md +243 -0
  372. package/src/components/utilities/sprintf/sprintf.vue +142 -0
  373. package/src/components/utilities/truncate/constants.js +5 -0
  374. package/src/components/utilities/truncate/truncate.md +14 -0
  375. package/src/components/utilities/truncate/truncate.scss +21 -0
  376. package/src/components/utilities/truncate/truncate.vue +109 -0
  377. package/src/components/utilities/truncate_text/constants.js +5 -0
  378. package/src/components/utilities/truncate_text/truncate_text.md +26 -0
  379. package/src/components/utilities/truncate_text/truncate_text.scss +14 -0
  380. package/src/components/utilities/truncate_text/truncate_text.vue +124 -0
  381. package/src/config.js +86 -0
  382. package/src/directives/collapse_toggle.js +1 -0
  383. package/src/directives/hover_load/hover_load.js +46 -0
  384. package/src/directives/hover_load/hover_load.md +22 -0
  385. package/src/directives/modal.js +1 -0
  386. package/src/directives/outside/outside.js +151 -0
  387. package/src/directives/outside/outside.md +140 -0
  388. package/src/directives/resize_observer/resize_observer.js +45 -0
  389. package/src/directives/resize_observer/resize_observer.md +54 -0
  390. package/src/directives/safe_html/constants.js +14 -0
  391. package/src/directives/safe_html/safe_html.js +35 -0
  392. package/src/directives/safe_html/safe_html.md +58 -0
  393. package/src/directives/safe_link/mock_data.js +33 -0
  394. package/src/directives/safe_link/safe_link.js +56 -0
  395. package/src/directives/safe_link/safe_link.md +37 -0
  396. package/src/directives/tooltip.js +1 -0
  397. package/src/index.js +130 -0
  398. package/src/internal/color_contrast/color_contrast.md +8 -0
  399. package/src/internal/color_contrast/color_contrast.vue +52 -0
  400. package/src/scss/README.md +1 -0
  401. package/src/scss/body.scss +4 -0
  402. package/src/scss/bootstrap.scss +34 -0
  403. package/src/scss/bootstrap_vue.scss +25 -0
  404. package/src/scss/components.scss +83 -0
  405. package/src/scss/fonts.scss +67 -0
  406. package/src/scss/functions.scss +63 -0
  407. package/src/scss/gitlab_ui.scss +19 -0
  408. package/src/scss/mixins.scss +262 -0
  409. package/src/scss/storybook.scss +43 -0
  410. package/src/scss/storybook_dark_mode.scss +21 -0
  411. package/src/scss/tailwind.css +3 -0
  412. package/src/scss/tokens.scss +2 -0
  413. package/src/scss/typescale/_index.scss +103 -0
  414. package/src/scss/typescale/typeface_demo.html +70 -0
  415. package/src/scss/typescale/typescale.md +82 -0
  416. package/src/scss/typescale/typescale_demo.html +78 -0
  417. package/src/scss/typescale/typescale_demo.scss +8 -0
  418. package/src/scss/utilities.scss +9196 -0
  419. package/src/scss/utility-mixins/accessibility.scss +19 -0
  420. package/src/scss/utility-mixins/animation.scss +90 -0
  421. package/src/scss/utility-mixins/background.scss +421 -0
  422. package/src/scss/utility-mixins/border.scss +498 -0
  423. package/src/scss/utility-mixins/box-shadow.scss +220 -0
  424. package/src/scss/utility-mixins/clearfix.scss +9 -0
  425. package/src/scss/utility-mixins/color.scss +228 -0
  426. package/src/scss/utility-mixins/composite.scss +24 -0
  427. package/src/scss/utility-mixins/cursor.scss +36 -0
  428. package/src/scss/utility-mixins/deprecated.scss +20 -0
  429. package/src/scss/utility-mixins/display.scss +192 -0
  430. package/src/scss/utility-mixins/flex.scss +360 -0
  431. package/src/scss/utility-mixins/grid.scss +50 -0
  432. package/src/scss/utility-mixins/image.scss +8 -0
  433. package/src/scss/utility-mixins/index.scss +47 -0
  434. package/src/scss/utility-mixins/list-style.scss +12 -0
  435. package/src/scss/utility-mixins/opacity.scss +32 -0
  436. package/src/scss/utility-mixins/outline.scss +12 -0
  437. package/src/scss/utility-mixins/overflow.scss +45 -0
  438. package/src/scss/utility-mixins/pointer-events.scss +12 -0
  439. package/src/scss/utility-mixins/sizing.scss +582 -0
  440. package/src/scss/utility-mixins/spacing.scss +1564 -0
  441. package/src/scss/utility-mixins/svg.scss +79 -0
  442. package/src/scss/utility-mixins/text.scss +183 -0
  443. package/src/scss/utility-mixins/transform.scss +58 -0
  444. package/src/scss/utility-mixins/transition.scss +44 -0
  445. package/src/scss/utility-mixins/typography.scss +381 -0
  446. package/src/scss/utility-mixins/vertical-align.scss +22 -0
  447. package/src/scss/utility-mixins/visibility.scss +12 -0
  448. package/src/scss/utility-mixins/z-index.scss +37 -0
  449. package/src/scss/variables.scss +337 -0
  450. package/src/tokens/action.tokens.json +566 -0
  451. package/src/tokens/background.tokens.json +62 -0
  452. package/src/tokens/border.tokens.json +43 -0
  453. package/src/tokens/build/css/tokens.css +953 -0
  454. package/src/tokens/build/css/tokens.dark.css +953 -0
  455. package/src/tokens/build/js/tokens.dark.js +951 -0
  456. package/src/tokens/build/js/tokens.js +951 -0
  457. package/src/tokens/build/json/tokens.dark.json +21803 -0
  458. package/src/tokens/build/json/tokens.json +21803 -0
  459. package/src/tokens/build/scss/_tokens.dark.scss +950 -0
  460. package/src/tokens/build/scss/_tokens.scss +950 -0
  461. package/src/tokens/build/scss/_tokens_custom_properties.scss +951 -0
  462. package/src/tokens/build/tailwind/tokens.cjs +336 -0
  463. package/src/tokens/color.alpha.tokens.json +70 -0
  464. package/src/tokens/color.constant.tokens.json +660 -0
  465. package/src/tokens/color.data_viz.tokens.json +509 -0
  466. package/src/tokens/common_story_options.js +25 -0
  467. package/src/tokens/contextual/alert.tokens.json +209 -0
  468. package/src/tokens/contextual/avatar.tokens.json +112 -0
  469. package/src/tokens/contextual/badge.tokens.json +879 -0
  470. package/src/tokens/contextual/banner.tokens.json +38 -0
  471. package/src/tokens/contextual/breadcrumb.tokens.json +11 -0
  472. package/src/tokens/contextual/broadcast.tokens.json +222 -0
  473. package/src/tokens/contextual/button.tokens.json +874 -0
  474. package/src/tokens/contextual/datepicker.tokens.json +25 -0
  475. package/src/tokens/contextual/dropdown.tokens.json +148 -0
  476. package/src/tokens/contextual/filtered-search.tokens.json +72 -0
  477. package/src/tokens/contextual/label.tokens.json +118 -0
  478. package/src/tokens/contextual/link.tokens.json +46 -0
  479. package/src/tokens/contextual/progress-bar.tokens.json +38 -0
  480. package/src/tokens/contextual/skeleton-loader.tokens.json +24 -0
  481. package/src/tokens/contextual/spinner.tokens.json +38 -0
  482. package/src/tokens/contextual/table.tokens.json +24 -0
  483. package/src/tokens/contextual/tabs.tokens.json +18 -0
  484. package/src/tokens/contextual/toggle.tokens.json +59 -0
  485. package/src/tokens/contextual/token.tokens.json +21 -0
  486. package/src/tokens/control.tokens.json +177 -0
  487. package/src/tokens/deprecated.color.theme.tokens.json +736 -0
  488. package/src/tokens/deprecated.color.tokens.json +800 -0
  489. package/src/tokens/deprecated.color.transparency.tokens.json +110 -0
  490. package/src/tokens/feedback.tokens.json +200 -0
  491. package/src/tokens/focus-ring.tokens.json +21 -0
  492. package/src/tokens/icon.tokens.json +78 -0
  493. package/src/tokens/line_height.tokens.json +74 -0
  494. package/src/tokens/shadow.tokens.json +14 -0
  495. package/src/tokens/status.tokens.json +196 -0
  496. package/src/tokens/text.tokens.json +105 -0
  497. package/src/tokens/tokens_story.vue +84 -0
  498. package/src/tokens/tokens_table.vue +248 -0
  499. package/src/utils/breakpoints.js +21 -0
  500. package/src/utils/charts/config.js +514 -0
  501. package/src/utils/charts/constants.js +61 -0
  502. package/src/utils/charts/mock_data.js +259 -0
  503. package/src/utils/charts/story_config.js +21 -0
  504. package/src/utils/charts/theme.js +344 -0
  505. package/src/utils/charts/utils.js +49 -0
  506. package/src/utils/constants.js +347 -0
  507. package/src/utils/data_utils.js +28 -0
  508. package/src/utils/datetime_utility.js +63 -0
  509. package/src/utils/i18n.js +62 -0
  510. package/src/utils/is_slot_empty.js +40 -0
  511. package/src/utils/number_utils.js +120 -0
  512. package/src/utils/play_utils.js +9 -0
  513. package/src/utils/set_utils.js +24 -0
  514. package/src/utils/stories_constants.js +30 -0
  515. package/src/utils/stories_utils.js +5 -0
  516. package/src/utils/story_decorators/container.js +14 -0
  517. package/src/utils/string_utils.js +79 -0
  518. package/src/utils/svgs/svg_paths.js +10 -0
  519. package/src/utils/test_utils.js +33 -0
  520. package/src/utils/use_fake_date.js +27 -0
  521. package/src/utils/use_mock_intersection_observer.js +96 -0
  522. package/src/utils/utils.js +206 -0
  523. package/src/utils.js +4 -0
  524. package/src/vendor/bootstrap/scss/_alert.scss +52 -0
  525. package/src/vendor/bootstrap/scss/_badge.scss +54 -0
  526. package/src/vendor/bootstrap/scss/_breadcrumb.scss +42 -0
  527. package/src/vendor/bootstrap/scss/_button-group.scss +163 -0
  528. package/src/vendor/bootstrap/scss/_buttons.scss +142 -0
  529. package/src/vendor/bootstrap/scss/_card.scss +286 -0
  530. package/src/vendor/bootstrap/scss/_carousel.scss +200 -0
  531. package/src/vendor/bootstrap/scss/_close.scss +40 -0
  532. package/src/vendor/bootstrap/scss/_code.scss +48 -0
  533. package/src/vendor/bootstrap/scss/_custom-forms.scss +526 -0
  534. package/src/vendor/bootstrap/scss/_dropdown.scss +192 -0
  535. package/src/vendor/bootstrap/scss/_forms.scss +347 -0
  536. package/src/vendor/bootstrap/scss/_functions.scss +190 -0
  537. package/src/vendor/bootstrap/scss/_grid.scss +73 -0
  538. package/src/vendor/bootstrap/scss/_images.scss +42 -0
  539. package/src/vendor/bootstrap/scss/_input-group.scss +211 -0
  540. package/src/vendor/bootstrap/scss/_jumbotron.scss +17 -0
  541. package/src/vendor/bootstrap/scss/_list-group.scss +154 -0
  542. package/src/vendor/bootstrap/scss/_media.scss +8 -0
  543. package/src/vendor/bootstrap/scss/_mixins.scss +47 -0
  544. package/src/vendor/bootstrap/scss/_modal.scss +240 -0
  545. package/src/vendor/bootstrap/scss/_nav.scss +125 -0
  546. package/src/vendor/bootstrap/scss/_navbar.scss +332 -0
  547. package/src/vendor/bootstrap/scss/_pagination.scss +74 -0
  548. package/src/vendor/bootstrap/scss/_popover.scss +170 -0
  549. package/src/vendor/bootstrap/scss/_print.scss +132 -0
  550. package/src/vendor/bootstrap/scss/_progress.scss +47 -0
  551. package/src/vendor/bootstrap/scss/_reboot.scss +484 -0
  552. package/src/vendor/bootstrap/scss/_root.scss +19 -0
  553. package/src/vendor/bootstrap/scss/_spinners.scss +65 -0
  554. package/src/vendor/bootstrap/scss/_tables.scss +185 -0
  555. package/src/vendor/bootstrap/scss/_toasts.scss +46 -0
  556. package/src/vendor/bootstrap/scss/_tooltip.scss +115 -0
  557. package/src/vendor/bootstrap/scss/_transitions.scss +26 -0
  558. package/src/vendor/bootstrap/scss/_type.scss +125 -0
  559. package/src/vendor/bootstrap/scss/_utilities.scss +18 -0
  560. package/src/vendor/bootstrap/scss/_variables.scss +1149 -0
  561. package/src/vendor/bootstrap/scss/bootstrap-grid.scss +30 -0
  562. package/src/vendor/bootstrap/scss/bootstrap-reboot.scss +12 -0
  563. package/src/vendor/bootstrap/scss/bootstrap.scss +44 -0
  564. package/src/vendor/bootstrap/scss/mixins/_alert.scss +13 -0
  565. package/src/vendor/bootstrap/scss/mixins/_background-variant.scss +23 -0
  566. package/src/vendor/bootstrap/scss/mixins/_badge.scss +17 -0
  567. package/src/vendor/bootstrap/scss/mixins/_border-radius.scss +76 -0
  568. package/src/vendor/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  569. package/src/vendor/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  570. package/src/vendor/bootstrap/scss/mixins/_buttons.scss +110 -0
  571. package/src/vendor/bootstrap/scss/mixins/_caret.scss +62 -0
  572. package/src/vendor/bootstrap/scss/mixins/_clearfix.scss +7 -0
  573. package/src/vendor/bootstrap/scss/mixins/_deprecate.scss +10 -0
  574. package/src/vendor/bootstrap/scss/mixins/_float.scss +14 -0
  575. package/src/vendor/bootstrap/scss/mixins/_forms.scss +195 -0
  576. package/src/vendor/bootstrap/scss/mixins/_gradients.scss +45 -0
  577. package/src/vendor/bootstrap/scss/mixins/_grid-framework.scss +80 -0
  578. package/src/vendor/bootstrap/scss/mixins/_grid.scss +69 -0
  579. package/src/vendor/bootstrap/scss/mixins/_hover.scss +37 -0
  580. package/src/vendor/bootstrap/scss/mixins/_image.scss +36 -0
  581. package/src/vendor/bootstrap/scss/mixins/_list-group.scss +21 -0
  582. package/src/vendor/bootstrap/scss/mixins/_lists.scss +7 -0
  583. package/src/vendor/bootstrap/scss/mixins/_nav-divider.scss +11 -0
  584. package/src/vendor/bootstrap/scss/mixins/_pagination.scss +22 -0
  585. package/src/vendor/bootstrap/scss/mixins/_reset-text.scss +17 -0
  586. package/src/vendor/bootstrap/scss/mixins/_resize.scss +6 -0
  587. package/src/vendor/bootstrap/scss/mixins/_screen-reader.scss +34 -0
  588. package/src/vendor/bootstrap/scss/mixins/_size.scss +7 -0
  589. package/src/vendor/bootstrap/scss/mixins/_table-row.scss +39 -0
  590. package/src/vendor/bootstrap/scss/mixins/_text-emphasis.scss +17 -0
  591. package/src/vendor/bootstrap/scss/mixins/_text-hide.scss +11 -0
  592. package/src/vendor/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  593. package/src/vendor/bootstrap/scss/mixins/_transition.scss +26 -0
  594. package/src/vendor/bootstrap/scss/mixins/_visibility.scss +8 -0
  595. package/src/vendor/bootstrap/scss/utilities/_align.scss +8 -0
  596. package/src/vendor/bootstrap/scss/utilities/_background.scss +19 -0
  597. package/src/vendor/bootstrap/scss/utilities/_borders.scss +75 -0
  598. package/src/vendor/bootstrap/scss/utilities/_clearfix.scss +3 -0
  599. package/src/vendor/bootstrap/scss/utilities/_display.scss +26 -0
  600. package/src/vendor/bootstrap/scss/utilities/_embed.scss +39 -0
  601. package/src/vendor/bootstrap/scss/utilities/_flex.scss +51 -0
  602. package/src/vendor/bootstrap/scss/utilities/_float.scss +11 -0
  603. package/src/vendor/bootstrap/scss/utilities/_interactions.scss +5 -0
  604. package/src/vendor/bootstrap/scss/utilities/_overflow.scss +5 -0
  605. package/src/vendor/bootstrap/scss/utilities/_position.scss +32 -0
  606. package/src/vendor/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  607. package/src/vendor/bootstrap/scss/utilities/_shadows.scss +6 -0
  608. package/src/vendor/bootstrap/scss/utilities/_sizing.scss +20 -0
  609. package/src/vendor/bootstrap/scss/utilities/_spacing.scss +73 -0
  610. package/src/vendor/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  611. package/src/vendor/bootstrap/scss/utilities/_text.scss +72 -0
  612. package/src/vendor/bootstrap/scss/utilities/_visibility.scss +13 -0
  613. package/src/vendor/bootstrap/scss/vendor/_rfs.scss +228 -0
  614. package/src/vendor/bootstrap-vue/src/_utilities.scss +13 -0
  615. package/src/vendor/bootstrap-vue/src/_variables.scss +111 -0
  616. package/src/vendor/bootstrap-vue/src/browser.js +9 -0
  617. package/src/vendor/bootstrap-vue/src/bv-config.js +6 -0
  618. package/src/vendor/bootstrap-vue/src/components/badge/badge.js +55 -0
  619. package/src/vendor/bootstrap-vue/src/components/badge/index.js +3 -0
  620. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-item.js +27 -0
  621. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb-link.js +43 -0
  622. package/src/vendor/bootstrap-vue/src/components/breadcrumb/breadcrumb.js +52 -0
  623. package/src/vendor/bootstrap-vue/src/components/breadcrumb/index.js +5 -0
  624. package/src/vendor/bootstrap-vue/src/components/button/button-close.js +65 -0
  625. package/src/vendor/bootstrap-vue/src/components/button/button.js +179 -0
  626. package/src/vendor/bootstrap-vue/src/components/button/index.js +4 -0
  627. package/src/vendor/bootstrap-vue/src/components/button-group/button-group.js +42 -0
  628. package/src/vendor/bootstrap-vue/src/components/button-group/index.js +3 -0
  629. package/src/vendor/bootstrap-vue/src/components/collapse/collapse.js +272 -0
  630. package/src/vendor/bootstrap-vue/src/components/collapse/helpers/bv-collapse.js +88 -0
  631. package/src/vendor/bootstrap-vue/src/components/collapse/index.js +3 -0
  632. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown-form.scss +38 -0
  633. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown-text.scss +17 -0
  634. package/src/vendor/bootstrap-vue/src/components/dropdown/_dropdown.scss +58 -0
  635. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-divider.js +36 -0
  636. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-form.js +47 -0
  637. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-group.js +76 -0
  638. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-header.js +46 -0
  639. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item-button.js +93 -0
  640. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-item.js +87 -0
  641. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown-text.js +42 -0
  642. package/src/vendor/bootstrap-vue/src/components/dropdown/dropdown.js +202 -0
  643. package/src/vendor/bootstrap-vue/src/components/dropdown/index.js +19 -0
  644. package/src/vendor/bootstrap-vue/src/components/dropdown/index.scss +3 -0
  645. package/src/vendor/bootstrap-vue/src/components/form/form-invalid-feedback.js +51 -0
  646. package/src/vendor/bootstrap-vue/src/components/form/form-text.js +40 -0
  647. package/src/vendor/bootstrap-vue/src/components/form/form-valid-feedback.js +51 -0
  648. package/src/vendor/bootstrap-vue/src/components/form/form.js +41 -0
  649. package/src/vendor/bootstrap-vue/src/components/form/index.js +7 -0
  650. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox-group.scss +2 -0
  651. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox.scss +125 -0
  652. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +42 -0
  653. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +132 -0
  654. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.js +4 -0
  655. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.scss +2 -0
  656. package/src/vendor/bootstrap-vue/src/components/form-group/form-group.js +403 -0
  657. package/src/vendor/bootstrap-vue/src/components/form-group/index.js +3 -0
  658. package/src/vendor/bootstrap-vue/src/components/form-input/_form-input.scss +217 -0
  659. package/src/vendor/bootstrap-vue/src/components/form-input/form-input.js +168 -0
  660. package/src/vendor/bootstrap-vue/src/components/form-input/index.js +3 -0
  661. package/src/vendor/bootstrap-vue/src/components/form-input/index.scss +1 -0
  662. package/src/vendor/bootstrap-vue/src/components/form-radio/_form-radio-group.scss +3 -0
  663. package/src/vendor/bootstrap-vue/src/components/form-radio/_form-radio.scss +47 -0
  664. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio-group.js +30 -0
  665. package/src/vendor/bootstrap-vue/src/components/form-radio/form-radio.js +28 -0
  666. package/src/vendor/bootstrap-vue/src/components/form-radio/index.js +4 -0
  667. package/src/vendor/bootstrap-vue/src/components/form-radio/index.scss +2 -0
  668. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option-group.js +48 -0
  669. package/src/vendor/bootstrap-vue/src/components/form-select/form-select-option.js +35 -0
  670. package/src/vendor/bootstrap-vue/src/components/form-select/form-select.js +153 -0
  671. package/src/vendor/bootstrap-vue/src/components/form-select/helpers/mixin-options.js +56 -0
  672. package/src/vendor/bootstrap-vue/src/components/form-select/index.js +5 -0
  673. package/src/vendor/bootstrap-vue/src/components/form-textarea/form-textarea.js +226 -0
  674. package/src/vendor/bootstrap-vue/src/components/form-textarea/index.js +3 -0
  675. package/src/vendor/bootstrap-vue/src/components/index.js +11 -0
  676. package/src/vendor/bootstrap-vue/src/components/index.scss +12 -0
  677. package/src/vendor/bootstrap-vue/src/components/input-group/_input-group.scss +29 -0
  678. package/src/vendor/bootstrap-vue/src/components/input-group/index.js +7 -0
  679. package/src/vendor/bootstrap-vue/src/components/input-group/index.scss +1 -0
  680. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-addon.js +43 -0
  681. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-append.js +31 -0
  682. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-prepend.js +31 -0
  683. package/src/vendor/bootstrap-vue/src/components/input-group/input-group-text.js +31 -0
  684. package/src/vendor/bootstrap-vue/src/components/input-group/input-group.js +73 -0
  685. package/src/vendor/bootstrap-vue/src/components/layout/col.js +154 -0
  686. package/src/vendor/bootstrap-vue/src/components/layout/form-row.js +31 -0
  687. package/src/vendor/bootstrap-vue/src/components/layout/index.js +4 -0
  688. package/src/vendor/bootstrap-vue/src/components/link/index.js +3 -0
  689. package/src/vendor/bootstrap-vue/src/components/link/link.js +212 -0
  690. package/src/vendor/bootstrap-vue/src/components/modal/_modal.scss +5 -0
  691. package/src/vendor/bootstrap-vue/src/components/modal/helpers/bv-modal-event.class.js +22 -0
  692. package/src/vendor/bootstrap-vue/src/components/modal/helpers/modal-manager.js +219 -0
  693. package/src/vendor/bootstrap-vue/src/components/modal/index.js +3 -0
  694. package/src/vendor/bootstrap-vue/src/components/modal/index.scss +1 -0
  695. package/src/vendor/bootstrap-vue/src/components/modal/modal.js +981 -0
  696. package/src/vendor/bootstrap-vue/src/components/nav/_nav-item-dropdown.scss +1 -0
  697. package/src/vendor/bootstrap-vue/src/components/nav/index.js +5 -0
  698. package/src/vendor/bootstrap-vue/src/components/nav/index.scss +1 -0
  699. package/src/vendor/bootstrap-vue/src/components/nav/nav-item-dropdown.js +123 -0
  700. package/src/vendor/bootstrap-vue/src/components/nav/nav-item.js +49 -0
  701. package/src/vendor/bootstrap-vue/src/components/nav/nav.js +60 -0
  702. package/src/vendor/bootstrap-vue/src/components/navbar/_navbar.scss +1 -0
  703. package/src/vendor/bootstrap-vue/src/components/navbar/index.js +4 -0
  704. package/src/vendor/bootstrap-vue/src/components/navbar/index.scss +1 -0
  705. package/src/vendor/bootstrap-vue/src/components/navbar/navbar-brand.js +42 -0
  706. package/src/vendor/bootstrap-vue/src/components/navbar/navbar.js +78 -0
  707. package/src/vendor/bootstrap-vue/src/components/popover/_popover.scss +113 -0
  708. package/src/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover-template.js +50 -0
  709. package/src/vendor/bootstrap-vue/src/components/popover/helpers/bv-popover.js +28 -0
  710. package/src/vendor/bootstrap-vue/src/components/popover/index.js +3 -0
  711. package/src/vendor/bootstrap-vue/src/components/popover/index.scss +1 -0
  712. package/src/vendor/bootstrap-vue/src/components/popover/popover.js +46 -0
  713. package/src/vendor/bootstrap-vue/src/components/progress/index.js +4 -0
  714. package/src/vendor/bootstrap-vue/src/components/progress/progress-bar.js +133 -0
  715. package/src/vendor/bootstrap-vue/src/components/progress/progress.js +57 -0
  716. package/src/vendor/bootstrap-vue/src/components/table/_table.scss +474 -0
  717. package/src/vendor/bootstrap-vue/src/components/table/helpers/constants.js +30 -0
  718. package/src/vendor/bootstrap-vue/src/components/table/helpers/default-sort-compare.js +60 -0
  719. package/src/vendor/bootstrap-vue/src/components/table/helpers/filter-event.js +38 -0
  720. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-bottom-row.js +44 -0
  721. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-busy.js +88 -0
  722. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-caption.js +49 -0
  723. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-colgroup.js +27 -0
  724. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-empty.js +105 -0
  725. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-filtering.js +271 -0
  726. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-items.js +146 -0
  727. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-pagination.js +38 -0
  728. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-provider.js +188 -0
  729. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-selectable.js +241 -0
  730. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-sorting.js +299 -0
  731. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-stacked.js +33 -0
  732. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-table-renderer.js +209 -0
  733. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody-row.js +360 -0
  734. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tbody.js +258 -0
  735. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-tfoot.js +55 -0
  736. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-thead.js +238 -0
  737. package/src/vendor/bootstrap-vue/src/components/table/helpers/mixin-top-row.js +37 -0
  738. package/src/vendor/bootstrap-vue/src/components/table/helpers/normalize-fields.js +71 -0
  739. package/src/vendor/bootstrap-vue/src/components/table/helpers/sanitize-row.js +39 -0
  740. package/src/vendor/bootstrap-vue/src/components/table/helpers/stringify-record-values.js +11 -0
  741. package/src/vendor/bootstrap-vue/src/components/table/helpers/text-selection-active.js +13 -0
  742. package/src/vendor/bootstrap-vue/src/components/table/index.js +23 -0
  743. package/src/vendor/bootstrap-vue/src/components/table/index.scss +1 -0
  744. package/src/vendor/bootstrap-vue/src/components/table/table-lite.js +63 -0
  745. package/src/vendor/bootstrap-vue/src/components/table/table-simple.js +50 -0
  746. package/src/vendor/bootstrap-vue/src/components/table/table.js +89 -0
  747. package/src/vendor/bootstrap-vue/src/components/table/tbody.js +103 -0
  748. package/src/vendor/bootstrap-vue/src/components/table/td.js +195 -0
  749. package/src/vendor/bootstrap-vue/src/components/table/tfoot.js +95 -0
  750. package/src/vendor/bootstrap-vue/src/components/table/th.js +25 -0
  751. package/src/vendor/bootstrap-vue/src/components/table/thead.js +98 -0
  752. package/src/vendor/bootstrap-vue/src/components/table/tr.js +122 -0
  753. package/src/vendor/bootstrap-vue/src/components/tabs/index.js +4 -0
  754. package/src/vendor/bootstrap-vue/src/components/tabs/tab.js +197 -0
  755. package/src/vendor/bootstrap-vue/src/components/tabs/tabs.js +688 -0
  756. package/src/vendor/bootstrap-vue/src/components/toast/_toast.scss +79 -0
  757. package/src/vendor/bootstrap-vue/src/components/toast/_toaster-transition.scss +45 -0
  758. package/src/vendor/bootstrap-vue/src/components/toast/_toaster.scss +108 -0
  759. package/src/vendor/bootstrap-vue/src/components/toast/helpers/bv-toast.js +208 -0
  760. package/src/vendor/bootstrap-vue/src/components/toast/index.js +12 -0
  761. package/src/vendor/bootstrap-vue/src/components/toast/index.scss +3 -0
  762. package/src/vendor/bootstrap-vue/src/components/toast/toast.js +454 -0
  763. package/src/vendor/bootstrap-vue/src/components/toast/toaster.js +139 -0
  764. package/src/vendor/bootstrap-vue/src/components/tooltip/_tooltip.scss +86 -0
  765. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-popper.js +248 -0
  766. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +130 -0
  767. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +977 -0
  768. package/src/vendor/bootstrap-vue/src/components/tooltip/index.js +3 -0
  769. package/src/vendor/bootstrap-vue/src/components/tooltip/index.scss +1 -0
  770. package/src/vendor/bootstrap-vue/src/components/tooltip/tooltip.js +316 -0
  771. package/src/vendor/bootstrap-vue/src/components/transition/bv-transition.js +83 -0
  772. package/src/vendor/bootstrap-vue/src/components/transporter/transporter.js +202 -0
  773. package/src/vendor/bootstrap-vue/src/constants/classes.js +1 -0
  774. package/src/vendor/bootstrap-vue/src/constants/components.js +77 -0
  775. package/src/vendor/bootstrap-vue/src/constants/config.js +4 -0
  776. package/src/vendor/bootstrap-vue/src/constants/env.js +57 -0
  777. package/src/vendor/bootstrap-vue/src/constants/events.js +57 -0
  778. package/src/vendor/bootstrap-vue/src/constants/key-codes.js +10 -0
  779. package/src/vendor/bootstrap-vue/src/constants/popper.js +8 -0
  780. package/src/vendor/bootstrap-vue/src/constants/props.js +26 -0
  781. package/src/vendor/bootstrap-vue/src/constants/regex.js +33 -0
  782. package/src/vendor/bootstrap-vue/src/constants/safe-types.js +17 -0
  783. package/src/vendor/bootstrap-vue/src/constants/slots.js +32 -0
  784. package/src/vendor/bootstrap-vue/src/directives/modal/index.js +3 -0
  785. package/src/vendor/bootstrap-vue/src/directives/modal/modal.js +115 -0
  786. package/src/vendor/bootstrap-vue/src/directives/toggle/index.js +3 -0
  787. package/src/vendor/bootstrap-vue/src/directives/toggle/toggle.js +274 -0
  788. package/src/vendor/bootstrap-vue/src/directives/tooltip/index.js +3 -0
  789. package/src/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +270 -0
  790. package/src/vendor/bootstrap-vue/src/directives/visible/index.js +3 -0
  791. package/src/vendor/bootstrap-vue/src/directives/visible/visible.js +184 -0
  792. package/src/vendor/bootstrap-vue/src/index.js +187 -0
  793. package/src/vendor/bootstrap-vue/src/index.scss +11 -0
  794. package/src/vendor/bootstrap-vue/src/mixins/attrs.js +19 -0
  795. package/src/vendor/bootstrap-vue/src/mixins/click-out.js +72 -0
  796. package/src/vendor/bootstrap-vue/src/mixins/dropdown.js +460 -0
  797. package/src/vendor/bootstrap-vue/src/mixins/focus-in.js +44 -0
  798. package/src/vendor/bootstrap-vue/src/mixins/form-control.js +51 -0
  799. package/src/vendor/bootstrap-vue/src/mixins/form-custom.js +24 -0
  800. package/src/vendor/bootstrap-vue/src/mixins/form-options.js +73 -0
  801. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +162 -0
  802. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check.js +332 -0
  803. package/src/vendor/bootstrap-vue/src/mixins/form-selection.js +60 -0
  804. package/src/vendor/bootstrap-vue/src/mixins/form-size.js +24 -0
  805. package/src/vendor/bootstrap-vue/src/mixins/form-state.js +47 -0
  806. package/src/vendor/bootstrap-vue/src/mixins/form-text.js +250 -0
  807. package/src/vendor/bootstrap-vue/src/mixins/form-validity.js +48 -0
  808. package/src/vendor/bootstrap-vue/src/mixins/has-listener.js +26 -0
  809. package/src/vendor/bootstrap-vue/src/mixins/id.js +51 -0
  810. package/src/vendor/bootstrap-vue/src/mixins/listen-on-document.js +64 -0
  811. package/src/vendor/bootstrap-vue/src/mixins/listen-on-root.js +121 -0
  812. package/src/vendor/bootstrap-vue/src/mixins/listen-on-window.js +64 -0
  813. package/src/vendor/bootstrap-vue/src/mixins/listeners.js +24 -0
  814. package/src/vendor/bootstrap-vue/src/mixins/model.js +5 -0
  815. package/src/vendor/bootstrap-vue/src/mixins/normalize-slot.js +30 -0
  816. package/src/vendor/bootstrap-vue/src/mixins/scoped-style.js +14 -0
  817. package/src/vendor/bootstrap-vue/src/mixins/use-parent.js +12 -0
  818. package/src/vendor/bootstrap-vue/src/utils/array.js +17 -0
  819. package/src/vendor/bootstrap-vue/src/utils/bv-event.class.js +60 -0
  820. package/src/vendor/bootstrap-vue/src/utils/cache.js +37 -0
  821. package/src/vendor/bootstrap-vue/src/utils/clone-deep.js +15 -0
  822. package/src/vendor/bootstrap-vue/src/utils/config-set.js +80 -0
  823. package/src/vendor/bootstrap-vue/src/utils/config.js +72 -0
  824. package/src/vendor/bootstrap-vue/src/utils/create-new-child-component.js +10 -0
  825. package/src/vendor/bootstrap-vue/src/utils/css-escape.js +73 -0
  826. package/src/vendor/bootstrap-vue/src/utils/dom.js +308 -0
  827. package/src/vendor/bootstrap-vue/src/utils/element-to-vue-instance-registry.js +40 -0
  828. package/src/vendor/bootstrap-vue/src/utils/env.js +15 -0
  829. package/src/vendor/bootstrap-vue/src/utils/events.js +71 -0
  830. package/src/vendor/bootstrap-vue/src/utils/get-event-root.js +3 -0
  831. package/src/vendor/bootstrap-vue/src/utils/get-instance-from-directive.js +4 -0
  832. package/src/vendor/bootstrap-vue/src/utils/get-scope-id.js +6 -0
  833. package/src/vendor/bootstrap-vue/src/utils/get.js +64 -0
  834. package/src/vendor/bootstrap-vue/src/utils/html.js +8 -0
  835. package/src/vendor/bootstrap-vue/src/utils/identity.js +1 -0
  836. package/src/vendor/bootstrap-vue/src/utils/inspect.js +51 -0
  837. package/src/vendor/bootstrap-vue/src/utils/locale.js +34 -0
  838. package/src/vendor/bootstrap-vue/src/utils/loose-equal.js +57 -0
  839. package/src/vendor/bootstrap-vue/src/utils/loose-index-of.js +11 -0
  840. package/src/vendor/bootstrap-vue/src/utils/math.js +11 -0
  841. package/src/vendor/bootstrap-vue/src/utils/memoize.js +10 -0
  842. package/src/vendor/bootstrap-vue/src/utils/model.js +29 -0
  843. package/src/vendor/bootstrap-vue/src/utils/noop.js +1 -0
  844. package/src/vendor/bootstrap-vue/src/utils/normalize-slot.js +44 -0
  845. package/src/vendor/bootstrap-vue/src/utils/number.js +19 -0
  846. package/src/vendor/bootstrap-vue/src/utils/object.js +61 -0
  847. package/src/vendor/bootstrap-vue/src/utils/observe-dom.js +77 -0
  848. package/src/vendor/bootstrap-vue/src/utils/plugins.js +169 -0
  849. package/src/vendor/bootstrap-vue/src/utils/props.js +92 -0
  850. package/src/vendor/bootstrap-vue/src/utils/router.js +145 -0
  851. package/src/vendor/bootstrap-vue/src/utils/safe-vue-instance.js +13 -0
  852. package/src/vendor/bootstrap-vue/src/utils/stable-sort.js +31 -0
  853. package/src/vendor/bootstrap-vue/src/utils/string.js +59 -0
  854. package/src/vendor/bootstrap-vue/src/utils/stringify-object-values.js +31 -0
  855. package/src/vendor/bootstrap-vue/src/utils/warn.js +42 -0
  856. package/src/vendor/bootstrap-vue/src/vue.js +126 -0
  857. package/tailwind.defaults.js +543 -0
  858. package/translations.js +85 -0
@@ -0,0 +1,977 @@
1
+ // Tooltip "Class" (Built as a renderless Vue instance)
2
+ //
3
+ // Handles trigger events, etc.
4
+ // Instantiates template on demand
5
+
6
+ import { COMPONENT_UID_KEY, extend } from '../../../vue'
7
+ import { NAME_MODAL, NAME_TOOLTIP_HELPER } from '../../../constants/components'
8
+ import {
9
+ EVENT_NAME_DISABLE,
10
+ EVENT_NAME_DISABLED,
11
+ EVENT_NAME_ENABLE,
12
+ EVENT_NAME_ENABLED,
13
+ EVENT_NAME_FOCUSIN,
14
+ EVENT_NAME_FOCUSOUT,
15
+ EVENT_NAME_HIDDEN,
16
+ EVENT_NAME_HIDE,
17
+ EVENT_NAME_MOUSEENTER,
18
+ EVENT_NAME_MOUSELEAVE,
19
+ EVENT_NAME_SHOW,
20
+ EVENT_NAME_SHOWN,
21
+ EVENT_OPTIONS_NO_CAPTURE,
22
+ HOOK_EVENT_NAME_BEFORE_DESTROY,
23
+ HOOK_EVENT_NAME_DESTROYED
24
+ } from '../../../constants/events'
25
+ import { useParentMixin } from '../../../mixins/use-parent'
26
+ import { arrayIncludes, concat, from as arrayFrom } from '../../../utils/array'
27
+ import { getInstanceFromElement } from '../../../utils/element-to-vue-instance-registry'
28
+ import {
29
+ attemptFocus,
30
+ closest,
31
+ contains,
32
+ getAttr,
33
+ getById,
34
+ hasAttr,
35
+ hasClass,
36
+ isDisabled,
37
+ isElement,
38
+ isVisible,
39
+ removeAttr,
40
+ requestAF,
41
+ select,
42
+ setAttr
43
+ } from '../../../utils/dom'
44
+ import {
45
+ eventOff,
46
+ eventOn,
47
+ eventOnOff,
48
+ getRootActionEventName,
49
+ getRootEventName
50
+ } from '../../../utils/events'
51
+ import { getScopeId } from '../../../utils/get-scope-id'
52
+ import { identity } from '../../../utils/identity'
53
+ import {
54
+ isFunction,
55
+ isNumber,
56
+ isPlainObject,
57
+ isString,
58
+ isUndefined,
59
+ isUndefinedOrNull
60
+ } from '../../../utils/inspect'
61
+ import { looseEqual } from '../../../utils/loose-equal'
62
+ import { mathMax } from '../../../utils/math'
63
+ import { noop } from '../../../utils/noop'
64
+ import { toInteger } from '../../../utils/number'
65
+ import { keys } from '../../../utils/object'
66
+ import { warn } from '../../../utils/warn'
67
+ import { BvEvent } from '../../../utils/bv-event.class'
68
+ import { createNewChildComponent } from '../../../utils/create-new-child-component'
69
+ import { listenOnRootMixin } from '../../../mixins/listen-on-root'
70
+ import { BVTooltipTemplate } from './bv-tooltip-template'
71
+
72
+ // --- Constants ---
73
+
74
+ // Modal container selector for appending tooltip/popover
75
+ const MODAL_SELECTOR = '.modal-content'
76
+
77
+ // Modal `$root` hidden event
78
+ const ROOT_EVENT_NAME_MODAL_HIDDEN = getRootEventName(NAME_MODAL, EVENT_NAME_HIDDEN)
79
+
80
+ // For finding the container to append to
81
+ const CONTAINER_SELECTOR = MODAL_SELECTOR
82
+
83
+ // For dropdown sniffing
84
+ const DROPDOWN_CLASS = 'dropdown'
85
+ const DROPDOWN_OPEN_SELECTOR = '.dropdown-menu.show'
86
+
87
+ // Data attribute to temporary store the `title` attribute's value
88
+ const DATA_TITLE_ATTR = 'data-original-title'
89
+
90
+ // Data specific to popper and template
91
+ // We don't use props, as we need reactivity (we can't pass reactive props)
92
+ const templateData = {
93
+ // Text string or Scoped slot function
94
+ title: '',
95
+ // Text string or Scoped slot function
96
+ content: '',
97
+ // String
98
+ variant: null,
99
+ // String, Array, Object
100
+ customClass: null,
101
+ // String or array of Strings (overwritten by BVPopper)
102
+ triggers: '',
103
+ // String (overwritten by BVPopper)
104
+ placement: 'auto',
105
+ // String or array of strings
106
+ fallbackPlacement: 'flip',
107
+ // Element or Component reference (or function that returns element) of
108
+ // the element that will have the trigger events bound, and is also
109
+ // default element for positioning
110
+ target: null,
111
+ // HTML ID, Element or Component reference
112
+ container: null, // 'body'
113
+ // Boolean
114
+ noFade: false,
115
+ // 'scrollParent', 'viewport', 'window', Element, or Component reference
116
+ boundary: 'scrollParent',
117
+ // Tooltip/popover will try and stay away from
118
+ // boundary edge by this many pixels (Number)
119
+ boundaryPadding: 5,
120
+ // Arrow offset (Number)
121
+ offset: 0,
122
+ // Hover/focus delay (Number or Object)
123
+ delay: 0,
124
+ // Arrow of Tooltip/popover will try and stay away from
125
+ // the edge of tooltip/popover edge by this many pixels
126
+ arrowPadding: 6,
127
+ // Interactive state (Boolean)
128
+ interactive: true,
129
+ // Disabled state (Boolean)
130
+ disabled: false,
131
+ // ID to use for tooltip/popover
132
+ id: null,
133
+ // Flag used by directives only, for HTML content
134
+ html: false
135
+ }
136
+
137
+ // --- Main component ---
138
+
139
+ // @vue/component
140
+ export const BVTooltip = /*#__PURE__*/ extend({
141
+ name: NAME_TOOLTIP_HELPER,
142
+ mixins: [listenOnRootMixin, useParentMixin],
143
+ data() {
144
+ return {
145
+ // BTooltip/BPopover/VBTooltip will update this data
146
+ // Via the exposed updateData() method on this instance
147
+ // BVPopover will override some of these defaults
148
+ ...templateData,
149
+ // State management data
150
+ activeTrigger: {
151
+ // manual: false,
152
+ hover: false,
153
+ click: false,
154
+ focus: false
155
+ },
156
+ localShow: false
157
+ }
158
+ },
159
+ computed: {
160
+ templateType() {
161
+ // Overwritten by BVPopover
162
+ return 'tooltip'
163
+ },
164
+ computedId() {
165
+ return this.id || `__bv_${this.templateType}_${this[COMPONENT_UID_KEY]}__`
166
+ },
167
+ computedDelay() {
168
+ // Normalizes delay into object form
169
+ const delay = { show: 0, hide: 0 }
170
+ if (isPlainObject(this.delay)) {
171
+ delay.show = mathMax(toInteger(this.delay.show, 0), 0)
172
+ delay.hide = mathMax(toInteger(this.delay.hide, 0), 0)
173
+ } else if (isNumber(this.delay) || isString(this.delay)) {
174
+ delay.show = delay.hide = mathMax(toInteger(this.delay, 0), 0)
175
+ }
176
+ return delay
177
+ },
178
+ computedTriggers() {
179
+ // Returns the triggers in sorted array form
180
+ // TODO: Switch this to object form for easier lookup
181
+ return concat(this.triggers)
182
+ .filter(identity)
183
+ .join(' ')
184
+ .trim()
185
+ .toLowerCase()
186
+ .split(/\s+/)
187
+ .sort()
188
+ },
189
+ isWithActiveTrigger() {
190
+ for (const trigger in this.activeTrigger) {
191
+ if (this.activeTrigger[trigger]) {
192
+ return true
193
+ }
194
+ }
195
+ return false
196
+ },
197
+ computedTemplateData() {
198
+ const { title, content, variant, customClass, noFade, interactive } = this
199
+ return { title, content, variant, customClass, noFade, interactive }
200
+ }
201
+ },
202
+ watch: {
203
+ computedTriggers(newTriggers, oldTriggers) {
204
+ // Triggers have changed, so re-register them
205
+ /* istanbul ignore next */
206
+ if (!looseEqual(newTriggers, oldTriggers)) {
207
+ this.$nextTick(() => {
208
+ // Disable trigger listeners
209
+ this.unListen()
210
+ // Clear any active triggers that are no longer in the list of triggers
211
+ oldTriggers.forEach(trigger => {
212
+ if (!arrayIncludes(newTriggers, trigger)) {
213
+ if (this.activeTrigger[trigger]) {
214
+ this.activeTrigger[trigger] = false
215
+ }
216
+ }
217
+ })
218
+ // Re-enable the trigger listeners
219
+ this.listen()
220
+ })
221
+ }
222
+ },
223
+ computedTemplateData() {
224
+ // If any of the while open reactive "props" change,
225
+ // ensure that the template updates accordingly
226
+ this.handleTemplateUpdate()
227
+ },
228
+ title(newValue, oldValue) {
229
+ // Make sure to hide the tooltip when the title is set empty
230
+ if (newValue !== oldValue && !newValue) {
231
+ this.hide()
232
+ }
233
+ },
234
+ disabled(newValue) {
235
+ if (newValue) {
236
+ this.disable()
237
+ } else {
238
+ this.enable()
239
+ }
240
+ }
241
+ },
242
+ created() {
243
+ // Create non-reactive properties
244
+ this.$_tip = null
245
+ this.$_hoverTimeout = null
246
+ this.$_hoverState = ''
247
+ this.$_visibleInterval = null
248
+ this.$_enabled = !this.disabled
249
+ this.$_noop = noop.bind(this)
250
+
251
+ // Destroy ourselves when the parent is destroyed
252
+ if (this.bvParent) {
253
+ this.bvParent.$once(HOOK_EVENT_NAME_BEFORE_DESTROY, () => {
254
+ this.$nextTick(() => {
255
+ // In a `requestAF()` to release control back to application
256
+ requestAF(() => {
257
+ this.$destroy()
258
+ })
259
+ })
260
+ })
261
+ }
262
+
263
+ this.$nextTick(() => {
264
+ const target = this.getTarget()
265
+ if (target && contains(document.body, target)) {
266
+ // Copy the parent's scoped style attribute
267
+ this.scopeId = getScopeId(this.bvParent)
268
+ // Set up all trigger handlers and listeners
269
+ this.listen()
270
+ } else {
271
+ /* istanbul ignore next */
272
+ warn(
273
+ isString(this.target)
274
+ ? `Unable to find target element by ID "#${this.target}" in document.`
275
+ : 'The provided target is no valid HTML element.',
276
+ this.templateType
277
+ )
278
+ }
279
+ })
280
+ },
281
+ /* istanbul ignore next */
282
+ updated() {
283
+ // Usually called when the slots/data changes
284
+ this.$nextTick(this.handleTemplateUpdate)
285
+ },
286
+ /* istanbul ignore next */
287
+ deactivated() {
288
+ // In a keepalive that has been deactivated, so hide
289
+ // the tooltip/popover if it is showing
290
+ this.forceHide()
291
+ },
292
+ beforeDestroy() {
293
+ // Remove all handler/listeners
294
+ this.unListen()
295
+ this.setWhileOpenListeners(false)
296
+ // Clear any timeouts/intervals
297
+ this.clearHoverTimeout()
298
+ this.clearVisibilityInterval()
299
+ // Destroy the template
300
+ this.destroyTemplate()
301
+ // Remove any other private properties created during create
302
+ this.$_noop = null
303
+ },
304
+ methods: {
305
+ // --- Methods for creating and destroying the template ---
306
+ getTemplate() {
307
+ // Overridden by BVPopover
308
+ return BVTooltipTemplate
309
+ },
310
+ updateData(data = {}) {
311
+ // Method for updating popper/template data
312
+ // We only update data if it exists, and has not changed
313
+ let titleUpdated = false
314
+ keys(templateData).forEach(prop => {
315
+ if (!isUndefined(data[prop]) && this[prop] !== data[prop]) {
316
+ this[prop] = data[prop]
317
+ if (prop === 'title') {
318
+ titleUpdated = true
319
+ }
320
+ }
321
+ })
322
+ // If the title has updated, we may need to handle the `title`
323
+ // attribute on the trigger target
324
+ // We only do this while the template is open
325
+ if (titleUpdated && this.localShow) {
326
+ this.fixTitle()
327
+ }
328
+ },
329
+ createTemplateAndShow() {
330
+ // Creates the template instance and show it
331
+ const container = this.getContainer()
332
+ const Template = this.getTemplate()
333
+ const $tip = (this.$_tip = createNewChildComponent(this, Template, {
334
+ // The following is not reactive to changes in the props data
335
+ propsData: {
336
+ // These values cannot be changed while template is showing
337
+ id: this.computedId,
338
+ html: this.html,
339
+ placement: this.placement,
340
+ fallbackPlacement: this.fallbackPlacement,
341
+ target: this.getPlacementTarget(),
342
+ boundary: this.getBoundary(),
343
+ // Ensure the following are integers
344
+ offset: toInteger(this.offset, 0),
345
+ arrowPadding: toInteger(this.arrowPadding, 0),
346
+ boundaryPadding: toInteger(this.boundaryPadding, 0)
347
+ }
348
+ }))
349
+ // We set the initial reactive data (values that can be changed while open)
350
+ this.handleTemplateUpdate()
351
+ // Template transition phase events (handled once only)
352
+ // When the template has mounted, but not visibly shown yet
353
+ $tip.$once(EVENT_NAME_SHOW, this.onTemplateShow)
354
+ // When the template has completed showing
355
+ $tip.$once(EVENT_NAME_SHOWN, this.onTemplateShown)
356
+ // When the template has started to hide
357
+ $tip.$once(EVENT_NAME_HIDE, this.onTemplateHide)
358
+ // When the template has completed hiding
359
+ $tip.$once(EVENT_NAME_HIDDEN, this.onTemplateHidden)
360
+ // When the template gets destroyed for any reason
361
+ $tip.$once(HOOK_EVENT_NAME_DESTROYED, this.destroyTemplate)
362
+ // Convenience events from template
363
+ // To save us from manually adding/removing DOM
364
+ // listeners to tip element when it is open
365
+ $tip.$on(EVENT_NAME_FOCUSIN, this.handleEvent)
366
+ $tip.$on(EVENT_NAME_FOCUSOUT, this.handleEvent)
367
+ $tip.$on(EVENT_NAME_MOUSEENTER, this.handleEvent)
368
+ $tip.$on(EVENT_NAME_MOUSELEAVE, this.handleEvent)
369
+ // Mount (which triggers the `show`)
370
+ $tip.$mount(container.appendChild(document.createElement('div')))
371
+ // Template will automatically remove its markup from DOM when hidden
372
+ },
373
+ hideTemplate() {
374
+ // Trigger the template to start hiding
375
+ // The template will emit the `hide` event after this and
376
+ // then emit the `hidden` event once it is fully hidden
377
+ // The `hook:destroyed` will also be called (safety measure)
378
+ this.$_tip && this.$_tip.hide()
379
+ // Clear out any stragging active triggers
380
+ this.clearActiveTriggers()
381
+ // Reset the hover state
382
+ this.$_hoverState = ''
383
+ },
384
+ // Destroy the template instance and reset state
385
+ destroyTemplate() {
386
+ this.setWhileOpenListeners(false)
387
+ this.clearHoverTimeout()
388
+ this.$_hoverState = ''
389
+ this.clearActiveTriggers()
390
+ this.localPlacementTarget = null
391
+ try {
392
+ this.$_tip.$destroy()
393
+ } catch {}
394
+ this.$_tip = null
395
+ this.removeAriaDescribedby()
396
+ this.restoreTitle()
397
+ this.localShow = false
398
+ },
399
+ getTemplateElement() {
400
+ return this.$_tip ? this.$_tip.$el : null
401
+ },
402
+ handleTemplateUpdate() {
403
+ // Update our template title/content "props"
404
+ // So that the template updates accordingly
405
+ const $tip = this.$_tip
406
+ if ($tip) {
407
+ const props = ['title', 'content', 'variant', 'customClass', 'noFade', 'interactive']
408
+ // Only update the values if they have changed
409
+ props.forEach(prop => {
410
+ if ($tip[prop] !== this[prop]) {
411
+ $tip[prop] = this[prop]
412
+ }
413
+ })
414
+ }
415
+ },
416
+ // --- Show/Hide handlers ---
417
+ // Show the tooltip
418
+ show() {
419
+ const target = this.getTarget()
420
+ if (
421
+ !target ||
422
+ !contains(document.body, target) ||
423
+ !isVisible(target) ||
424
+ this.dropdownOpen() ||
425
+ ((isUndefinedOrNull(this.title) || this.title === '') &&
426
+ (isUndefinedOrNull(this.content) || this.content === ''))
427
+ ) {
428
+ // If trigger element isn't in the DOM or is not visible, or
429
+ // is on an open dropdown toggle, or has no content, then
430
+ // we exit without showing
431
+ return
432
+ }
433
+ // If tip already exists, exit early
434
+ if (this.$_tip || this.localShow) {
435
+ /* istanbul ignore next */
436
+ return
437
+ }
438
+ // In the process of showing
439
+ this.localShow = true
440
+ // Create a cancelable BvEvent
441
+ const showEvent = this.buildEvent(EVENT_NAME_SHOW, { cancelable: true })
442
+ this.emitEvent(showEvent)
443
+ // Don't show if event cancelled
444
+ /* istanbul ignore if */
445
+ if (showEvent.defaultPrevented) {
446
+ // Destroy the template (if for some reason it was created)
447
+ this.destroyTemplate()
448
+ return
449
+ }
450
+ // Fix the title attribute on target
451
+ this.fixTitle()
452
+ // Set aria-describedby on target
453
+ this.addAriaDescribedby()
454
+ // Create and show the tooltip
455
+ this.createTemplateAndShow()
456
+ },
457
+ hide(force = false) {
458
+ // Hide the tooltip
459
+ const tip = this.getTemplateElement()
460
+ /* istanbul ignore if */
461
+ if (!tip || !this.localShow) {
462
+ this.restoreTitle()
463
+ return
464
+ }
465
+
466
+ // Emit cancelable BvEvent 'hide'
467
+ // We disable cancelling if `force` is true
468
+ const hideEvent = this.buildEvent(EVENT_NAME_HIDE, { cancelable: !force })
469
+ this.emitEvent(hideEvent)
470
+ /* istanbul ignore if: ignore for now */
471
+ if (hideEvent.defaultPrevented) {
472
+ // Don't hide if event cancelled
473
+ return
474
+ }
475
+
476
+ // Tell the template to hide
477
+ this.hideTemplate()
478
+ },
479
+ forceHide() {
480
+ // Forcefully hides/destroys the template, regardless of any active triggers
481
+ const tip = this.getTemplateElement()
482
+ if (!tip || !this.localShow) {
483
+ /* istanbul ignore next */
484
+ return
485
+ }
486
+ // Disable while open listeners/watchers
487
+ // This is also done in the template `hide` event handler
488
+ this.setWhileOpenListeners(false)
489
+ // Clear any hover enter/leave event
490
+ this.clearHoverTimeout()
491
+ this.$_hoverState = ''
492
+ this.clearActiveTriggers()
493
+ // Disable the fade animation on the template
494
+ if (this.$_tip) {
495
+ this.$_tip.noFade = true
496
+ }
497
+ // Hide the tip (with force = true)
498
+ this.hide(true)
499
+ },
500
+ enable() {
501
+ this.$_enabled = true
502
+ // Create a non-cancelable BvEvent
503
+ this.emitEvent(this.buildEvent(EVENT_NAME_ENABLED))
504
+ },
505
+ disable() {
506
+ this.$_enabled = false
507
+ // Create a non-cancelable BvEvent
508
+ this.emitEvent(this.buildEvent(EVENT_NAME_DISABLED))
509
+ },
510
+ // --- Handlers for template events ---
511
+ // When template is inserted into DOM, but not yet shown
512
+ onTemplateShow() {
513
+ // Enable while open listeners/watchers
514
+ this.setWhileOpenListeners(true)
515
+ },
516
+ // When template show transition completes
517
+ onTemplateShown() {
518
+ const prevHoverState = this.$_hoverState
519
+ this.$_hoverState = ''
520
+ /* istanbul ignore next: occasional Node 10 coverage error */
521
+ if (prevHoverState === 'out') {
522
+ this.leave(null)
523
+ }
524
+ // Emit a non-cancelable BvEvent 'shown'
525
+ this.emitEvent(this.buildEvent(EVENT_NAME_SHOWN))
526
+ },
527
+ // When template is starting to hide
528
+ onTemplateHide() {
529
+ // Disable while open listeners/watchers
530
+ this.setWhileOpenListeners(false)
531
+ },
532
+ // When template has completed closing (just before it self destructs)
533
+ onTemplateHidden() {
534
+ // Destroy the template
535
+ this.destroyTemplate()
536
+ // Emit a non-cancelable BvEvent 'shown'
537
+ this.emitEvent(this.buildEvent(EVENT_NAME_HIDDEN))
538
+ },
539
+ // --- Helper methods ---
540
+ getTarget() {
541
+ let { target } = this
542
+ if (isString(target)) {
543
+ target = getById(target.replace(/^#/, ''))
544
+ } else if (isFunction(target)) {
545
+ target = target()
546
+ } else if (target) {
547
+ target = target.$el || target
548
+ }
549
+ return isElement(target) ? target : null
550
+ },
551
+ getPlacementTarget() {
552
+ // This is the target that the tooltip will be placed on, which may not
553
+ // necessarily be the same element that has the trigger event listeners
554
+ // For now, this is the same as target
555
+ // TODO:
556
+ // Add in child selector support
557
+ // Add in visibility checks for this element
558
+ // Fallback to target if not found
559
+ return this.getTarget()
560
+ },
561
+ getTargetId() {
562
+ // Returns the ID of the trigger element
563
+ const target = this.getTarget()
564
+ return target && target.id ? target.id : null
565
+ },
566
+ getContainer() {
567
+ // Handle case where container may be a component ref
568
+ const container = this.container ? this.container.$el || this.container : false
569
+ const body = document.body
570
+ const target = this.getTarget()
571
+ // If we are in a modal, we append to the modal, else append
572
+ // to body, unless a container is specified
573
+ // TODO:
574
+ // Template should periodically check to see if it is in dom
575
+ // And if not, self destruct (if container got v-if'ed out of DOM)
576
+ // Or this could possibly be part of the visibility check
577
+ return container === false
578
+ ? closest(CONTAINER_SELECTOR, target) || body
579
+ : /*istanbul ignore next */ isString(container)
580
+ ? /*istanbul ignore next */ getById(container.replace(/^#/, '')) || body
581
+ : /*istanbul ignore next */ body
582
+ },
583
+ getBoundary() {
584
+ return this.boundary ? this.boundary.$el || this.boundary : 'scrollParent'
585
+ },
586
+ isInModal() {
587
+ const target = this.getTarget()
588
+ return target && closest(MODAL_SELECTOR, target)
589
+ },
590
+ isDropdown() {
591
+ // Returns true if trigger is a dropdown
592
+ const target = this.getTarget()
593
+ return target && hasClass(target, DROPDOWN_CLASS)
594
+ },
595
+ dropdownOpen() {
596
+ // Returns true if trigger is a dropdown and the dropdown menu is open
597
+ const target = this.getTarget()
598
+ return this.isDropdown() && target && select(DROPDOWN_OPEN_SELECTOR, target)
599
+ },
600
+ clearHoverTimeout() {
601
+ clearTimeout(this.$_hoverTimeout)
602
+ this.$_hoverTimeout = null
603
+ },
604
+ clearVisibilityInterval() {
605
+ clearInterval(this.$_visibleInterval)
606
+ this.$_visibleInterval = null
607
+ },
608
+ clearActiveTriggers() {
609
+ for (const trigger in this.activeTrigger) {
610
+ this.activeTrigger[trigger] = false
611
+ }
612
+ },
613
+ addAriaDescribedby() {
614
+ // Add aria-describedby on trigger element, without removing any other IDs
615
+ const target = this.getTarget()
616
+ let desc = getAttr(target, 'aria-describedby') || ''
617
+ desc = desc
618
+ .split(/\s+/)
619
+ .concat(this.computedId)
620
+ .join(' ')
621
+ .trim()
622
+ // Update/add aria-described by
623
+ setAttr(target, 'aria-describedby', desc)
624
+ },
625
+ removeAriaDescribedby() {
626
+ // Remove aria-describedby on trigger element, without removing any other IDs
627
+ const target = this.getTarget()
628
+ let desc = getAttr(target, 'aria-describedby') || ''
629
+ desc = desc
630
+ .split(/\s+/)
631
+ .filter(d => d !== this.computedId)
632
+ .join(' ')
633
+ .trim()
634
+ // Update or remove aria-describedby
635
+ if (desc) {
636
+ /* istanbul ignore next */
637
+ setAttr(target, 'aria-describedby', desc)
638
+ } else {
639
+ removeAttr(target, 'aria-describedby')
640
+ }
641
+ },
642
+ fixTitle() {
643
+ // If the target has a `title` attribute,
644
+ // remove it and store it on a data attribute
645
+ const target = this.getTarget()
646
+ if (hasAttr(target, 'title')) {
647
+ // Get `title` attribute value and remove it from target
648
+ const title = getAttr(target, 'title')
649
+ setAttr(target, 'title', '')
650
+ // Only set the data attribute when the value is truthy
651
+ if (title) {
652
+ setAttr(target, DATA_TITLE_ATTR, title)
653
+ }
654
+ }
655
+ },
656
+ restoreTitle() {
657
+ // If the target had a `title` attribute,
658
+ // restore it and remove the data attribute
659
+ const target = this.getTarget()
660
+ if (hasAttr(target, DATA_TITLE_ATTR)) {
661
+ // Get data attribute value and remove it from target
662
+ const title = getAttr(target, DATA_TITLE_ATTR)
663
+ removeAttr(target, DATA_TITLE_ATTR)
664
+ // Only restore the `title` attribute when the value is truthy
665
+ if (title) {
666
+ setAttr(target, 'title', title)
667
+ }
668
+ }
669
+ },
670
+ // --- BvEvent helpers ---
671
+ buildEvent(type, options = {}) {
672
+ // Defaults to a non-cancellable event
673
+ return new BvEvent(type, {
674
+ cancelable: false,
675
+ target: this.getTarget(),
676
+ relatedTarget: this.getTemplateElement() || null,
677
+ componentId: this.computedId,
678
+ vueTarget: this,
679
+ // Add in option overrides
680
+ ...options
681
+ })
682
+ },
683
+ emitEvent(bvEvent) {
684
+ const { type } = bvEvent
685
+ this.emitOnRoot(getRootEventName(this.templateType, type), bvEvent)
686
+ this.$emit(type, bvEvent)
687
+ },
688
+ // --- Event handler setup methods ---
689
+ listen() {
690
+ // Enable trigger event handlers
691
+ const el = this.getTarget()
692
+ if (!el) {
693
+ /* istanbul ignore next */
694
+ return
695
+ }
696
+ // Listen for global show/hide events
697
+ this.setRootListener(true)
698
+ // Set up our listeners on the target trigger element
699
+ this.computedTriggers.forEach(trigger => {
700
+ if (trigger === 'click') {
701
+ eventOn(el, 'click', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
702
+ } else if (trigger === 'focus') {
703
+ eventOn(el, 'focusin', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
704
+ eventOn(el, 'focusout', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
705
+ } else if (trigger === 'blur') {
706
+ // Used to close $tip when element loses focus
707
+ /* istanbul ignore next */
708
+ eventOn(el, 'focusout', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
709
+ } else if (trigger === 'hover') {
710
+ eventOn(el, 'mouseenter', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
711
+ eventOn(el, 'mouseleave', this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
712
+ }
713
+ }, this)
714
+ },
715
+ /* istanbul ignore next */
716
+ unListen() {
717
+ // Remove trigger event handlers
718
+ const events = ['click', 'focusin', 'focusout', 'mouseenter', 'mouseleave']
719
+ const target = this.getTarget()
720
+
721
+ // Stop listening for global show/hide/enable/disable events
722
+ this.setRootListener(false)
723
+
724
+ // Clear out any active target listeners
725
+ events.forEach(event => {
726
+ target && eventOff(target, event, this.handleEvent, EVENT_OPTIONS_NO_CAPTURE)
727
+ }, this)
728
+ },
729
+ setRootListener(on) {
730
+ // Listen for global `bv::{hide|show}::{tooltip|popover}` hide request event
731
+ const method = on ? 'listenOnRoot' : 'listenOffRoot'
732
+ const type = this.templateType
733
+ this[method](getRootActionEventName(type, EVENT_NAME_HIDE), this.doHide)
734
+ this[method](getRootActionEventName(type, EVENT_NAME_SHOW), this.doShow)
735
+ this[method](getRootActionEventName(type, EVENT_NAME_DISABLE), this.doDisable)
736
+ this[method](getRootActionEventName(type, EVENT_NAME_ENABLE), this.doEnable)
737
+ },
738
+ setWhileOpenListeners(on) {
739
+ // Events that are only registered when the template is showing
740
+ // Modal close events
741
+ this.setModalListener(on)
742
+ // Dropdown open events (if we are attached to a dropdown)
743
+ this.setDropdownListener(on)
744
+ // Periodic $element visibility check
745
+ // For handling when tip target is in <keepalive>, tabs, etc
746
+ this.visibleCheck(on)
747
+ // On-touch start listeners
748
+ this.setOnTouchStartListener(on)
749
+ },
750
+ // Handler for periodic visibility check
751
+ visibleCheck(on) {
752
+ this.clearVisibilityInterval()
753
+ const target = this.getTarget()
754
+ if (on) {
755
+ this.$_visibleInterval = setInterval(() => {
756
+ const tip = this.getTemplateElement()
757
+ if (tip && this.localShow && (!target.parentNode || !isVisible(target))) {
758
+ // Target element is no longer visible or not in DOM, so force-hide the tooltip
759
+ this.forceHide()
760
+ }
761
+ }, 100)
762
+ }
763
+ },
764
+ setModalListener(on) {
765
+ // Handle case where tooltip/target is in a modal
766
+ if (this.isInModal()) {
767
+ // We can listen for modal hidden events on `$root`
768
+ this[on ? 'listenOnRoot' : 'listenOffRoot'](ROOT_EVENT_NAME_MODAL_HIDDEN, this.forceHide)
769
+ }
770
+ },
771
+ /* istanbul ignore next: JSDOM doesn't support `ontouchstart` */
772
+ setOnTouchStartListener(on) {
773
+ // If this is a touch-enabled device we add extra empty
774
+ // `mouseover` listeners to the body's immediate children
775
+ // Only needed because of broken event delegation on iOS
776
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
777
+ if ('ontouchstart' in document.documentElement) {
778
+ arrayFrom(document.body.children).forEach(el => {
779
+ eventOnOff(on, el, 'mouseover', this.$_noop)
780
+ })
781
+ }
782
+ },
783
+ setDropdownListener(on) {
784
+ const target = this.getTarget()
785
+ if (!target || !this.bvEventRoot || !this.isDropdown) {
786
+ return
787
+ }
788
+ // We can listen for dropdown shown events on its instance
789
+ // TODO:
790
+ // We could grab the ID from the dropdown, and listen for
791
+ // $root events for that particular dropdown id
792
+ // Dropdown shown and hidden events will need to emit
793
+ // Note: Dropdown auto-ID happens in a `$nextTick()` after mount
794
+ // So the ID lookup would need to be done in a `$nextTick()`
795
+ const instance = getInstanceFromElement(target)
796
+
797
+ if (instance) {
798
+ instance[on ? '$on' : '$off'](EVENT_NAME_SHOWN, this.forceHide)
799
+ }
800
+ },
801
+ // --- Event handlers ---
802
+ handleEvent(event) {
803
+ // General trigger event handler
804
+ // target is the trigger element
805
+ const target = this.getTarget()
806
+ if (!target || isDisabled(target) || !this.$_enabled || this.dropdownOpen()) {
807
+ // If disabled or not enabled, or if a dropdown that is open, don't do anything
808
+ // If tip is shown before element gets disabled, then tip will not
809
+ // close until no longer disabled or forcefully closed
810
+ return
811
+ }
812
+ const type = event.type
813
+ const triggers = this.computedTriggers
814
+
815
+ if (type === 'click' && arrayIncludes(triggers, 'click')) {
816
+ this.click(event)
817
+ } else if (type === 'mouseenter' && arrayIncludes(triggers, 'hover')) {
818
+ // `mouseenter` is a non-bubbling event
819
+ this.enter(event)
820
+ } else if (type === 'focusin' && arrayIncludes(triggers, 'focus')) {
821
+ // `focusin` is a bubbling event
822
+ // `event` includes `relatedTarget` (element losing focus)
823
+ this.enter(event)
824
+ } else if (
825
+ (type === 'focusout' &&
826
+ (arrayIncludes(triggers, 'focus') || arrayIncludes(triggers, 'blur'))) ||
827
+ (type === 'mouseleave' && arrayIncludes(triggers, 'hover'))
828
+ ) {
829
+ // `focusout` is a bubbling event
830
+ // `mouseleave` is a non-bubbling event
831
+ // `tip` is the template (will be null if not open)
832
+ const tip = this.getTemplateElement()
833
+ // `eventTarget` is the element which is losing focus/hover and
834
+ const eventTarget = event.target
835
+ // `relatedTarget` is the element gaining focus/hover
836
+ const relatedTarget = event.relatedTarget
837
+ /* istanbul ignore next */
838
+ if (
839
+ // From tip to target
840
+ (tip && contains(tip, eventTarget) && contains(target, relatedTarget)) ||
841
+ // From target to tip
842
+ (tip && contains(target, eventTarget) && contains(tip, relatedTarget)) ||
843
+ // Within tip
844
+ (tip && contains(tip, eventTarget) && contains(tip, relatedTarget)) ||
845
+ // Within target
846
+ (contains(target, eventTarget) && contains(target, relatedTarget))
847
+ ) {
848
+ // If focus/hover moves within `tip` and `target`, don't trigger a leave
849
+ return
850
+ }
851
+ // Otherwise trigger a leave
852
+ this.leave(event)
853
+ }
854
+ },
855
+ doHide(id) {
856
+ // Programmatically hide tooltip or popover
857
+ if (!id || (this.getTargetId() === id || this.computedId === id)) {
858
+ // Close all tooltips or popovers, or this specific tip (with ID)
859
+ this.forceHide()
860
+ }
861
+ },
862
+ doShow(id) {
863
+ // Programmatically show tooltip or popover
864
+ if (!id || (this.getTargetId() === id || this.computedId === id)) {
865
+ // Open all tooltips or popovers, or this specific tip (with ID)
866
+ this.show()
867
+ }
868
+ },
869
+ /*istanbul ignore next: ignore for now */
870
+ doDisable(id) /*istanbul ignore next: ignore for now */ {
871
+ // Programmatically disable tooltip or popover
872
+ if (!id || (this.getTargetId() === id || this.computedId === id)) {
873
+ // Disable all tooltips or popovers (no ID), or this specific tip (with ID)
874
+ this.disable()
875
+ }
876
+ },
877
+ /*istanbul ignore next: ignore for now */
878
+ doEnable(id) /*istanbul ignore next: ignore for now */ {
879
+ // Programmatically enable tooltip or popover
880
+ if (!id || (this.getTargetId() === id || this.computedId === id)) {
881
+ // Enable all tooltips or popovers (no ID), or this specific tip (with ID)
882
+ this.enable()
883
+ }
884
+ },
885
+ click(event) {
886
+ if (!this.$_enabled || this.dropdownOpen()) {
887
+ /* istanbul ignore next */
888
+ return
889
+ }
890
+ // Get around a WebKit bug where `click` does not trigger focus events
891
+ // On most browsers, `click` triggers a `focusin`/`focus` event first
892
+ // Needed so that trigger 'click blur' works on iOS
893
+ // https://github.com/bootstrap-vue/bootstrap-vue/issues/5099
894
+ // We use `currentTarget` rather than `target` to trigger on the
895
+ // element, not the inner content
896
+ attemptFocus(event.currentTarget)
897
+ this.activeTrigger.click = !this.activeTrigger.click
898
+ if (this.isWithActiveTrigger) {
899
+ this.enter(null)
900
+ } else {
901
+ /* istanbul ignore next */
902
+ this.leave(null)
903
+ }
904
+ },
905
+ /* istanbul ignore next */
906
+ toggle() {
907
+ // Manual toggle handler
908
+ if (!this.$_enabled || this.dropdownOpen()) {
909
+ /* istanbul ignore next */
910
+ return
911
+ }
912
+ // Should we register as an active trigger?
913
+ // this.activeTrigger.manual = !this.activeTrigger.manual
914
+ if (this.localShow) {
915
+ this.leave(null)
916
+ } else {
917
+ this.enter(null)
918
+ }
919
+ },
920
+ enter(event = null) {
921
+ // Opening trigger handler
922
+ // Note: Click events are sent with event === null
923
+ if (event) {
924
+ this.activeTrigger[event.type === 'focusin' ? 'focus' : 'hover'] = true
925
+ }
926
+ /* istanbul ignore next */
927
+ if (this.localShow || this.$_hoverState === 'in') {
928
+ this.$_hoverState = 'in'
929
+ return
930
+ }
931
+ this.clearHoverTimeout()
932
+ this.$_hoverState = 'in'
933
+ if (!this.computedDelay.show) {
934
+ this.show()
935
+ } else {
936
+ // Hide any title attribute while enter delay is active
937
+ this.fixTitle()
938
+ this.$_hoverTimeout = setTimeout(() => {
939
+ /* istanbul ignore else */
940
+ if (this.$_hoverState === 'in') {
941
+ this.show()
942
+ } else if (!this.localShow) {
943
+ this.restoreTitle()
944
+ }
945
+ }, this.computedDelay.show)
946
+ }
947
+ },
948
+ leave(event = null) {
949
+ // Closing trigger handler
950
+ // Note: Click events are sent with event === null
951
+ if (event) {
952
+ this.activeTrigger[event.type === 'focusout' ? 'focus' : 'hover'] = false
953
+ /* istanbul ignore next */
954
+ if (event.type === 'focusout' && arrayIncludes(this.computedTriggers, 'blur')) {
955
+ // Special case for `blur`: we clear out the other triggers
956
+ this.activeTrigger.click = false
957
+ this.activeTrigger.hover = false
958
+ }
959
+ }
960
+ /* istanbul ignore next: ignore for now */
961
+ if (this.isWithActiveTrigger) {
962
+ return
963
+ }
964
+ this.clearHoverTimeout()
965
+ this.$_hoverState = 'out'
966
+ if (!this.computedDelay.hide) {
967
+ this.hide()
968
+ } else {
969
+ this.$_hoverTimeout = setTimeout(() => {
970
+ if (this.$_hoverState === 'out') {
971
+ this.hide()
972
+ }
973
+ }, this.computedDelay.hide)
974
+ }
975
+ }
976
+ }
977
+ })