@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,243 @@
1
+ ## Overview
2
+
3
+ The `GlSprintf` component lets you do `sprintf`-style string interpolation with
4
+ child components. Each placeholder in the translated string, provided via the
5
+ `message` prop, becomes a slot that you can use to insert any components or
6
+ markup in the rendered output.
7
+
8
+ > NOTE: `gl-sprintf` does not translate the message for you; you must provide
9
+ > it already translated. In the following examples, it is assumed that
10
+ > a `gettext`-style `__` translation function is available in your Vue
11
+ > templates.
12
+
13
+ ## Displaying messages with text between placeholders (e.g., links, buttons)
14
+
15
+ Sentences should not be split up into different messages, otherwise they may
16
+ not be translatable into certain languages. To help with this, `GlSprintf`
17
+ interprets placeholders suffixed with `Start` and `End` to indicate the
18
+ boundaries of a component to display within the message. Any text between
19
+ them is passed, via the `content` scoped slot property, to the slot name common
20
+ to the placeholders.
21
+
22
+ For example, using `linkStart` and `linkEnd` placeholders in a message defines
23
+ a `link` scoped slot:
24
+
25
+ ```html
26
+ <div>
27
+ <gl-sprintf :message="__('Learn more about %{linkStart}zones%{linkEnd}')">
28
+ <template #link="{ content }">
29
+ <gl-link
30
+ href="https://cloud.google.com/compute/docs/regions-zones/regions-zones"
31
+ target="_blank"
32
+ >{{ content }}</gl-link>
33
+ </template>
34
+ </gl-sprintf>
35
+ </div>
36
+ ```
37
+
38
+ will render as:
39
+
40
+ ```html
41
+ <div>
42
+ Learn more about
43
+ <a
44
+ href="https://cloud.google.com/compute/docs/regions-zones/regions-zones"
45
+ target="_blank"
46
+ rel="noopener noreferrer"
47
+ >zones</a>
48
+ </div>
49
+ ```
50
+
51
+ Note that _any_ arbitrary HTML tags or Vue component(s) can be used within
52
+ a scoped slot, and that the content passed to it can be used in any way at all;
53
+ for instance, as regular text, or in component attributes or slots.
54
+
55
+ Here's a more complex example, which `<gl-sprintf>` lets you do in a breeze:
56
+
57
+ ```html
58
+ <div>
59
+ <gl-sprintf :message="__('Written by %{authorStart}someone%{authorEnd}')">
60
+ <template #author="{ content }">
61
+ <my-vue-component v-gl-tooltip="content" @event="handleEvent(content)">
62
+ {{ content }}
63
+ </my-vue-component>
64
+ <p>
65
+ {{ content }}
66
+ <div>{{ content }}</div>
67
+ </p>
68
+ </template>
69
+ </gl-sprintf>
70
+ </div>
71
+ ```
72
+
73
+ This is not feasible in a JS-only solution, since arbitrary Vue components
74
+ cannot easily be used. In addition, a JS-only solution is more likely to be
75
+ prone to XSS attacks, as the Vue compiler isn't available to help protect
76
+ against them.
77
+
78
+ ### Customizing start/end placeholders
79
+
80
+ You can customize the start and end placeholders that `GlSprintf` looks for
81
+ using the `placeholders` prop. For instance:
82
+
83
+ ```html
84
+ <div>
85
+ <gl-sprintf
86
+ :message="__('Learn more about %{my_custom_start}zones%{my_custom_end}')"
87
+ :placeholders="{ link: ['my_custom_start', 'my_custom_end'] }"
88
+ >
89
+ <template #link="{ content }">
90
+ <gl-link
91
+ href="https://cloud.google.com/compute/docs/regions-zones/regions-zones"
92
+ target="_blank"
93
+ >{{ content }}</gl-link>
94
+ </template>
95
+ </gl-sprintf>
96
+ </div>
97
+ ```
98
+
99
+ This can be useful if you are migrating an existing string to `GlSprintf` that
100
+ uses different placeholder naming conventions, and don't want invalidate
101
+ existing translations.
102
+
103
+ ## Displaying components within a message
104
+
105
+ Use slots to replace placeholders in the message with the slots' contents.
106
+ There is a slot for every placeholder in the message. For example, the `author`
107
+ slot name can be used when there is an `%{author}` placeholder in the message:
108
+
109
+ ```html
110
+ <script>
111
+ export default {
112
+ data() {
113
+ return {
114
+ authorName: 'Some author',
115
+ };
116
+ },
117
+ };
118
+ </script>
119
+
120
+ <template>
121
+ <div>
122
+ <gl-sprintf :message="__('Written by %{author}')">
123
+ <template #author>
124
+ <span>{{ authorName }}</span>
125
+ </template>
126
+ </gl-sprintf>
127
+ </div>
128
+ </template>
129
+ ```
130
+
131
+ The example above renders to this HTML:
132
+
133
+ ```html
134
+ <div>Written by <span>Some author</span></div>
135
+ ```
136
+
137
+ ## Usage caveats
138
+
139
+ ### White space
140
+
141
+ `GlSprintf` does not handle white space in scoped slots specially; it is passed
142
+ through and rendered just like regular text. This means that white space in the
143
+ scoped slot templates *themselves*, including newlines and indentation, are
144
+ passed through untouched (assuming the template compiler you're using doesn't
145
+ trim text nodes at compile time; `vue-template-compiler` preserves white space
146
+ by default, for instance).
147
+
148
+ Most of the time you don't need to worry about this, since
149
+ [browsers normalize white space][1] automatically, but here's an example, using
150
+ punctuation, where you might want to be conscious of the white space in the
151
+ template:
152
+
153
+ ```html
154
+ <div>
155
+ <gl-sprintf :message="__('Foo %{boldStart}bar%{boldEnd}!')">
156
+ <template #bold="{ content }">
157
+ <b>
158
+ {{ content }}
159
+ </b>
160
+ </template>
161
+ </gl-sprintf>
162
+ </div>
163
+ ```
164
+
165
+ As written, the literal markup rendered would be:
166
+
167
+ ```html
168
+ <div> Foo <b>
169
+ bar
170
+ </b>!
171
+ </div>
172
+ ```
173
+
174
+ where the white space (including newlines) before and after `bar` is exactly
175
+ the newlines and indentation in the source template. The browser will render
176
+ this as:
177
+
178
+ <div> Foo <b>
179
+ bar
180
+ </b>!
181
+ </div>
182
+
183
+ Note the single space between `bar` and `!`. To avoid that, remove the
184
+ white space in the template, or use `v-text`:
185
+
186
+ ```html
187
+ <div>
188
+ <gl-sprintf :message="__('Foo %{boldStart}bar%{boldEnd}!')">
189
+ <template #bold="{ content }">
190
+ <b>{{ content }}</b>
191
+ <!-- OR -->
192
+ <b v-text="content" />
193
+ </template>
194
+ </gl-sprintf>
195
+ </div>
196
+ ```
197
+
198
+ ### Miscellaneous
199
+
200
+ While there are a lot of caveats here, you don't need to worry about reading
201
+ them _unless_ you find `GlSprintf` isn't rendering what you'd expect.
202
+
203
+ - Since `GlSprintf` typically renders multiple elements, it can't be used as
204
+ a component's root, it must be wrapped with at least one other root element,
205
+ otherwise Vue will throw a `Multiple root nodes returned from render
206
+ function` error.
207
+ - If a slot for a given placeholder _isn't_ provided, the placeholder
208
+ will be rendered as-is, e.g., literally `Written by %{author}` if the
209
+ `author` slot _isn't_ provided, or literally `%{linkStart}foo%{linkEnd}` if
210
+ the `link` slot isn't provided.
211
+ - Content between `Start` and `End` placeholders is effectively thrown away if
212
+ the scoped slot of the correct name doesn't consume the `content` property in
213
+ some way, though the slot's components should still be rendered.
214
+ - If there's no placeholder in the message for a provided named slot, the
215
+ content of that slot is silently thrown away.
216
+ - If only one of the `Start` or `End` placeholders is in the message, or they
217
+ are in the wrong order, they are treated as plain slots, i.e., it is assumed
218
+ there is no text to extract and pass to the scoped slot. This allows you to
219
+ use plain slots whose names end in `Start` or `End`, e.g., `backEnd`, or
220
+ `fromStart` in isolation, without their `Start`/`End` counterparts.
221
+ - Text extraction between `Start` and `End` placeholders is only done one level
222
+ deep. This is intentional, so as to avoid building complex sprintf messages
223
+ that would better be implemented in components. As an example,
224
+ `${linkStart}test%{icon}%{linkEnd}`, if provided both the `link` and `icon`
225
+ slots, would pass `test%{icon}` as a literal string as content to the `link`
226
+ scoped slot.
227
+ - For more examples and edge cases, please see the test suite for `GlSprintf`.
228
+ - To be successfully used in `GlSprintf`, slot names should:
229
+ - start with a letter (`[A-Za-z]`)
230
+ - only contain alpha-numeric characters (`[A-Za-z0-9]`), underscore (`_`) and
231
+ dash (`-`),
232
+ - should not end with underscore (`_`) or dash (`-`) So for example:
233
+ `%{author}`, `%{author_name}`, `%{authorName}` or `%{author-name-100}` are
234
+ all valid placeholders.
235
+
236
+ ## Internet Explorer 11
237
+
238
+ This component uses [`String.prototype.startsWith()`] and [`String.prototype.endsWith()`] under the
239
+ hood. Make sure those methods are polyfilled if you plan on using the component on IE11.
240
+
241
+ [1]: https://www.w3.org/TR/css-text-3/#white-space-phase-1
242
+ [`String.prototype.startsWith()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
243
+ [`String.prototype.endsWith()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
@@ -0,0 +1,142 @@
1
+ <!-- eslint-disable vue/multi-word-component-names -->
2
+ <script>
3
+ /* eslint-disable no-continue */
4
+ import has from 'lodash/has';
5
+ import isString from 'lodash/isString';
6
+
7
+ const PREFIX = '%{';
8
+ const SUFFIX = '}';
9
+ const START_SUFFIX = 'Start';
10
+ const END_SUFFIX = 'End';
11
+ const PLACE_HOLDER_REGEX = new RegExp(`(${PREFIX}[a-z]+[\\w-]*[a-z0-9]+${SUFFIX})`, 'gi');
12
+
13
+ function groupPlaceholdersByStartTag(placeholders = {}) {
14
+ return Object.entries(placeholders).reduce((acc, [slotName, [startTag, endTag]]) => {
15
+ acc[startTag] = { slotName, endTag };
16
+ return acc;
17
+ }, {});
18
+ }
19
+
20
+ function getPlaceholderDefinition(chunk, placeholdersByStartTag) {
21
+ const tagName = chunk.slice(PREFIX.length, -SUFFIX.length);
22
+
23
+ if (has(placeholdersByStartTag, tagName)) {
24
+ // Use provided custom placeholder definition
25
+ return {
26
+ ...placeholdersByStartTag[tagName],
27
+ tagName,
28
+ };
29
+ }
30
+
31
+ if (tagName.endsWith(START_SUFFIX)) {
32
+ // Tag conforms to default start/end tag naming convention
33
+ const slotName = tagName.slice(0, -START_SUFFIX.length);
34
+
35
+ return {
36
+ slotName,
37
+ endTag: `${slotName}${END_SUFFIX}`,
38
+ tagName,
39
+ };
40
+ }
41
+
42
+ return {
43
+ slotName: tagName,
44
+ endTag: undefined,
45
+ tagName,
46
+ };
47
+ }
48
+
49
+ export default {
50
+ name: 'GlSprintf',
51
+ functional: true,
52
+ props: {
53
+ /**
54
+ * A translated string with named placeholders, e.g., "Written by %{author}".
55
+ */
56
+ message: {
57
+ type: String,
58
+ required: true,
59
+ },
60
+ /**
61
+ * An object mapping slot names to custom start/end placeholders. Use this
62
+ * to avoid changing an existing message, and in turn invalidating existing
63
+ * translations, in the case it uses non-default placeholders.
64
+ */
65
+ placeholders: {
66
+ type: Object,
67
+ required: false,
68
+ default: undefined,
69
+ validator: (value) =>
70
+ Object.values(value).every(
71
+ // eslint-disable-next-line unicorn/no-array-callback-reference
72
+ (tagPair) => Array.isArray(tagPair) && tagPair.length === 2 && tagPair.every(isString)
73
+ ),
74
+ },
75
+ },
76
+ /**
77
+ * Available slots are determined by the placeholders in the provided
78
+ * message prop. For example, a message of "Written by %{author}" has
79
+ * a slot called "author", and its content is used to replace "%{author}"
80
+ * in the rendered output. When two placeholders indicate a start and an
81
+ * end region in the message, e.g., "%{linkStart}foo%{linkEnd}", the common
82
+ * base name can be used as a scoped slot, where the content between the
83
+ * placeholders is passed via the `content` scoped slot prop.
84
+ * @slot * (arbitrary)
85
+ * @binding {string} content The content to place between start and end placeholders.
86
+ */
87
+ render(createElement, context) {
88
+ // While a functional style is generally preferred, an imperative style is
89
+ // used here, as it lends itself better to the message parsing algorithm.
90
+ // This approach is also more performant, as it minimizes (relatively) object
91
+ // creation/garbage collection, which is important given how frequently this
92
+ // code may run on a given page.
93
+
94
+ let i = 0;
95
+ const vnodes = [];
96
+ const slots = context.scopedSlots;
97
+ const chunks = context.props.message.split(PLACE_HOLDER_REGEX);
98
+ const placeholdersByStartTag = groupPlaceholdersByStartTag(context.props.placeholders);
99
+
100
+ while (i < chunks.length) {
101
+ const chunk = chunks[i];
102
+ // Skip past this chunk now we have it
103
+ i += 1;
104
+
105
+ if (!PLACE_HOLDER_REGEX.test(chunk)) {
106
+ // Not a placeholder, so pass through as-is
107
+ vnodes.push(chunk);
108
+ continue;
109
+ }
110
+
111
+ const { slotName, endTag, tagName } = getPlaceholderDefinition(chunk, placeholdersByStartTag);
112
+
113
+ if (endTag) {
114
+ // Peek ahead to find end placeholder, if any
115
+ const indexOfEnd = chunks.indexOf(`${PREFIX}${endTag}${SUFFIX}`, i);
116
+ if (indexOfEnd > -1) {
117
+ // We have a valid start/end placeholder pair! Extract the content
118
+ // between them and skip past the end placeholder
119
+ const content = chunks.slice(i, indexOfEnd);
120
+ i = indexOfEnd + 1;
121
+
122
+ if (!has(slots, slotName)) {
123
+ // Slot hasn't been provided; return placeholders and content as-is
124
+ vnodes.push(chunk, ...content, chunks[indexOfEnd]);
125
+ continue;
126
+ }
127
+
128
+ // Provide content to provided scoped slot
129
+ vnodes.push(slots[slotName]({ content: content.join('') }));
130
+ continue;
131
+ }
132
+ }
133
+
134
+ // By process of elimination, chunk must be a plain placeholder
135
+ vnodes.push(has(slots, tagName) ? slots[tagName]() : chunk);
136
+ continue;
137
+ }
138
+
139
+ return vnodes;
140
+ },
141
+ };
142
+ </script>
@@ -0,0 +1,5 @@
1
+ export const POSITION = {
2
+ START: 'start',
3
+ MIDDLE: 'middle',
4
+ END: 'end',
5
+ };
@@ -0,0 +1,14 @@
1
+ The `GlTruncate` component lets you truncate the long texts with ellipsis.
2
+
3
+ > **Tip:** Try resizing the side panel for truncation.
4
+
5
+ ## Usage
6
+
7
+ ```html
8
+ <gl-truncate :text="text" :position="position" />
9
+ ```
10
+
11
+ By default, the ellipsis position is at the `end`.
12
+
13
+ Pro Tip: Truncating long filepaths from the `middle` / `start` can help preventing the important
14
+ information in the end, i.e. filenames.
@@ -0,0 +1,21 @@
1
+ .gl-truncate-component {
2
+ display: inline-flex;
3
+ max-width: 100%;
4
+ }
5
+
6
+ .gl-truncate-start,
7
+ .gl-truncate-end {
8
+ flex: 0 1 auto;
9
+ white-space: nowrap;
10
+ overflow: hidden;
11
+ }
12
+
13
+ .gl-truncate-start {
14
+ direction: rtl;
15
+ text-align: left;
16
+ text-overflow: '';
17
+ }
18
+
19
+ .gl-truncate-end {
20
+ text-overflow: ellipsis;
21
+ }
@@ -0,0 +1,109 @@
1
+ <!-- eslint-disable vue/multi-word-component-names -->
2
+ <script>
3
+ import { GlTooltipDirective } from '../../../directives/tooltip';
4
+ import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
5
+ import { POSITION } from './constants';
6
+
7
+ export default {
8
+ name: 'GlTruncate',
9
+ POSITION,
10
+ directives: {
11
+ GlTooltip: GlTooltipDirective,
12
+ GlResizeObserver: GlResizeObserverDirective,
13
+ },
14
+ props: {
15
+ /**
16
+ * Text to be ellipsized
17
+ */
18
+ text: {
19
+ type: String,
20
+ required: true,
21
+ },
22
+ /**
23
+ * Ellipsis position
24
+ */
25
+ position: {
26
+ type: String,
27
+ required: false,
28
+ default: POSITION.END,
29
+ validator: (value) => Object.values(POSITION).includes(value),
30
+ },
31
+ /**
32
+ * Display the full text in a tooltip only if it is being truncated
33
+ */
34
+ withTooltip: {
35
+ type: Boolean,
36
+ required: false,
37
+ default: false,
38
+ },
39
+ },
40
+ data() {
41
+ return {
42
+ isTruncated: false,
43
+ };
44
+ },
45
+ computed: {
46
+ middleIndex() {
47
+ return Math.floor(this.text.length / 2);
48
+ },
49
+
50
+ first() {
51
+ return this.text.slice(0, this.middleIndex);
52
+ },
53
+ last() {
54
+ return this.text.slice(this.middleIndex);
55
+ },
56
+ isTooltipDisabled() {
57
+ return !this.withTooltip || !this.isTruncated;
58
+ },
59
+ },
60
+ watch: {
61
+ withTooltip(withTooltip) {
62
+ if (withTooltip) {
63
+ this.checkTruncationState();
64
+ }
65
+ },
66
+ },
67
+ methods: {
68
+ checkTruncationState() {
69
+ if (this.withTooltip) {
70
+ this.isTruncated = this.$refs.text.scrollWidth > this.$refs.text.offsetWidth;
71
+ }
72
+ },
73
+ },
74
+ };
75
+ </script>
76
+
77
+ <template>
78
+ <span
79
+ v-if="position === $options.POSITION.START"
80
+ v-gl-tooltip="{ disabled: isTooltipDisabled }"
81
+ v-gl-resize-observer:[withTooltip]="checkTruncationState"
82
+ class="gl-truncate-component"
83
+ :title="text"
84
+ >
85
+ <span ref="text" class="gl-truncate-start !gl-text-ellipsis">&lrm;{{ text }}&lrm;</span>
86
+ </span>
87
+
88
+ <span
89
+ v-else-if="position === $options.POSITION.MIDDLE"
90
+ v-gl-tooltip="{ disabled: isTooltipDisabled }"
91
+ v-gl-resize-observer:[withTooltip]="checkTruncationState"
92
+ class="gl-truncate-component"
93
+ :title="text"
94
+ >
95
+ <span ref="text" class="gl-truncate-end">{{ first }}</span
96
+ ><span class="gl-truncate-start">&lrm;{{ last }}&lrm;</span>
97
+ </span>
98
+
99
+ <span
100
+ v-else
101
+ v-gl-tooltip="{ disabled: isTooltipDisabled }"
102
+ v-gl-resize-observer:[withTooltip]="checkTruncationState"
103
+ class="gl-truncate-component"
104
+ data-testid="truncate-end-container"
105
+ :title="text"
106
+ >
107
+ <span ref="text" class="gl-truncate-end">{{ text }}</span>
108
+ </span>
109
+ </template>
@@ -0,0 +1,5 @@
1
+ export const STATES = {
2
+ INITIAL: 'initial',
3
+ TRUNCATED: 'truncated',
4
+ EXTENDED: 'extended',
5
+ };
@@ -0,0 +1,26 @@
1
+ The `GlTruncateText` component lets you truncate a large text by number of lines.
2
+ The last line ends with an ellipsis if the text is truncated.
3
+ Truncation can be toggled by a 'Show more' / 'Show less' button.
4
+ The button will not be shown when no truncation is necessary.
5
+ There is a separate property to set the number of lines initially shown on small screens.
6
+ Use the `showMoreText` and `showLessText` properties to provide translated strings.
7
+
8
+ > **Tip:** Try resizing the side panel to see the truncated number of lines change.
9
+
10
+ ## Usage
11
+
12
+ ```html
13
+ <gl-truncate-text :show-more-text="__('Show more')" :show-less-text="__('Show less')" :lines="3" :mobile-lines="10">
14
+ {{ largeText }}
15
+ </gl-truncate-text>
16
+ ```
17
+
18
+ ## Usage caveats
19
+
20
+ When the size of the window is large,
21
+ and the text is displayed on a number of lines greater than the value of the `lines` property,
22
+ but smaller than the value of the `mobileLines` property,
23
+ and the `Show more` button has been clicked to show the entire content of the text,
24
+ and the window is resized to a small size,
25
+ then instead of disappearing,
26
+ the `Show less` button will remain visible and will do nothing when clicked.
@@ -0,0 +1,14 @@
1
+ /**
2
+ Note: although vendor-prefixes are used here, these properties are supported by all browsers.
3
+ See https://caniuse.com/css-line-clamp
4
+ **/
5
+ .gl-truncate-text {
6
+ // stylelint-disable-next-line value-no-vendor-prefix
7
+ display: -webkit-box;
8
+ -webkit-line-clamp: var(--mobile-lines);
9
+ -webkit-box-orient: vertical;
10
+
11
+ @include gl-media-breakpoint-up(sm) {
12
+ -webkit-line-clamp: var(--lines);
13
+ }
14
+ }