@gitlab/ui 80.13.1 → 80.14.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 (299) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/components/experimental/experiment_badge/experiment_badge.js +6 -6
  3. package/dist/tokens/build/js/tokens.dark.js +5 -1
  4. package/dist/tokens/build/js/tokens.js +5 -1
  5. package/dist/tokens/css/tokens.css +4 -0
  6. package/dist/tokens/css/tokens.dark.css +4 -0
  7. package/dist/tokens/js/tokens.dark.js +4 -0
  8. package/dist/tokens/js/tokens.js +4 -0
  9. package/dist/tokens/json/tokens.dark.json +92 -0
  10. package/dist/tokens/json/tokens.json +92 -0
  11. package/dist/tokens/scss/_tokens.dark.scss +4 -0
  12. package/dist/tokens/scss/_tokens.scss +4 -0
  13. package/dist/tokens/scss/_tokens_custom_properties.scss +4 -0
  14. package/dist/tokens/tailwind/tokens.cjs +16 -0
  15. package/package.json +16 -12
  16. package/src/components/experimental/experiment_badge/experiment_badge.vue +12 -11
  17. package/src/tokens/background.tokens.json +38 -0
  18. package/src/tokens/build/css/tokens.css +4 -0
  19. package/src/tokens/build/css/tokens.dark.css +4 -0
  20. package/src/tokens/build/js/tokens.dark.js +4 -0
  21. package/src/tokens/build/js/tokens.js +4 -0
  22. package/src/tokens/build/json/tokens.dark.json +92 -0
  23. package/src/tokens/build/json/tokens.json +92 -0
  24. package/src/tokens/build/scss/_tokens.dark.scss +4 -0
  25. package/src/tokens/build/scss/_tokens.scss +4 -0
  26. package/src/tokens/build/scss/_tokens_custom_properties.scss +4 -0
  27. package/src/tokens/build/tailwind/tokens.cjs +16 -0
  28. package/tailwind.defaults.js +2 -1
  29. package/src/components/base/accordion/accordion.spec.js +0 -58
  30. package/src/components/base/accordion/accordion.stories.js +0 -59
  31. package/src/components/base/accordion/accordion_item.spec.js +0 -131
  32. package/src/components/base/accordion/accordion_item.stories.js +0 -57
  33. package/src/components/base/alert/alert.spec.js +0 -229
  34. package/src/components/base/alert/alert.stories.js +0 -166
  35. package/src/components/base/avatar/avatar.spec.js +0 -91
  36. package/src/components/base/avatar/avatar.stories.js +0 -160
  37. package/src/components/base/avatar_labeled/avatar_labeled.spec.js +0 -109
  38. package/src/components/base/avatar_labeled/avatar_labeled.stories.js +0 -187
  39. package/src/components/base/avatar_link/avatar_link.stories.js +0 -86
  40. package/src/components/base/avatars_inline/avatars_inline.spec.js +0 -124
  41. package/src/components/base/avatars_inline/avatars_inline.stories.js +0 -83
  42. package/src/components/base/badge/badge.spec.js +0 -83
  43. package/src/components/base/badge/badge.stories.js +0 -184
  44. package/src/components/base/banner/banner.spec.js +0 -112
  45. package/src/components/base/banner/banner.stories.js +0 -103
  46. package/src/components/base/breadcrumb/breadcrumb.spec.js +0 -240
  47. package/src/components/base/breadcrumb/breadcrumb.stories.js +0 -100
  48. package/src/components/base/breadcrumb/breadcrumb_item.spec.js +0 -45
  49. package/src/components/base/broadcast_message/broadcast_message.spec.js +0 -32
  50. package/src/components/base/broadcast_message/broadcast_message.stories.js +0 -112
  51. package/src/components/base/button/button.spec.js +0 -225
  52. package/src/components/base/button/button.stories.js +0 -529
  53. package/src/components/base/button_group/button_group.stories.js +0 -132
  54. package/src/components/base/card/card.spec.js +0 -139
  55. package/src/components/base/card/card.stories.js +0 -48
  56. package/src/components/base/carousel/carousel.spec.js +0 -24
  57. package/src/components/base/carousel/carousel.stories.js +0 -51
  58. package/src/components/base/collapse/collapse.spec.js +0 -24
  59. package/src/components/base/collapse/collapse.stories.js +0 -42
  60. package/src/components/base/datepicker/datepicker.spec.js +0 -431
  61. package/src/components/base/datepicker/datepicker.stories.js +0 -149
  62. package/src/components/base/daterange_picker/daterange_picker.spec.js +0 -307
  63. package/src/components/base/daterange_picker/daterange_picker.stories.js +0 -145
  64. package/src/components/base/drawer/drawer.spec.js +0 -136
  65. package/src/components/base/drawer/drawer.stories.js +0 -272
  66. package/src/components/base/dropdown/dropdown.spec.js +0 -457
  67. package/src/components/base/dropdown/dropdown.stories.js +0 -574
  68. package/src/components/base/dropdown/dropdown_form.spec.js +0 -9
  69. package/src/components/base/dropdown/dropdown_item.spec.js +0 -67
  70. package/src/components/base/dropdown/dropdown_item.stories.js +0 -113
  71. package/src/components/base/filtered_search/__snapshots__/filtered_search_term.spec.js.snap +0 -31
  72. package/src/components/base/filtered_search/filtered_search.spec.js +0 -908
  73. package/src/components/base/filtered_search/filtered_search.stories.js +0 -678
  74. package/src/components/base/filtered_search/filtered_search_suggestion.spec.js +0 -67
  75. package/src/components/base/filtered_search/filtered_search_suggestion.stories.js +0 -33
  76. package/src/components/base/filtered_search/filtered_search_suggestion_list.spec.js +0 -337
  77. package/src/components/base/filtered_search/filtered_search_suggestion_list.stories.js +0 -53
  78. package/src/components/base/filtered_search/filtered_search_term.spec.js +0 -212
  79. package/src/components/base/filtered_search/filtered_search_term.stories.js +0 -60
  80. package/src/components/base/filtered_search/filtered_search_token.spec.js +0 -461
  81. package/src/components/base/filtered_search/filtered_search_token.stories.js +0 -199
  82. package/src/components/base/filtered_search/filtered_search_token_segment.spec.js +0 -393
  83. package/src/components/base/filtered_search/filtered_search_token_segment.stories.js +0 -110
  84. package/src/components/base/filtered_search/filtered_search_utils.spec.js +0 -82
  85. package/src/components/base/form/form.stories.js +0 -101
  86. package/src/components/base/form/form_checkbox/form_checkbox.stories.js +0 -55
  87. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.spec.js +0 -265
  88. package/src/components/base/form/form_checkbox_tree/form_checkbox_tree.stories.js +0 -134
  89. package/src/components/base/form/form_combobox/form_combobox.spec.js +0 -301
  90. package/src/components/base/form/form_combobox/form_combobox.stories.js +0 -116
  91. package/src/components/base/form/form_date/form_date.spec.js +0 -85
  92. package/src/components/base/form/form_date/form_date.stories.js +0 -108
  93. package/src/components/base/form/form_fields/form_field_validator.spec.js +0 -51
  94. package/src/components/base/form/form_fields/form_fields.spec.js +0 -531
  95. package/src/components/base/form/form_fields/form_fields.stories.js +0 -150
  96. package/src/components/base/form/form_fields/mappers.spec.js +0 -17
  97. package/src/components/base/form/form_fields/validators.spec.js +0 -56
  98. package/src/components/base/form/form_group/form_group.spec.js +0 -110
  99. package/src/components/base/form/form_group/form_group.stories.js +0 -123
  100. package/src/components/base/form/form_input/form_input.spec.js +0 -130
  101. package/src/components/base/form/form_input/form_input.stories.js +0 -128
  102. package/src/components/base/form/form_input_group/form_input_group.spec.js +0 -121
  103. package/src/components/base/form/form_input_group/form_input_group.stories.js +0 -86
  104. package/src/components/base/form/form_radio/form_radio.spec.js +0 -116
  105. package/src/components/base/form/form_radio/form_radio.stories.js +0 -70
  106. package/src/components/base/form/form_radio_group/form_radio_group.spec.js +0 -86
  107. package/src/components/base/form/form_radio_group/form_radio_group.stories.js +0 -79
  108. package/src/components/base/form/form_select/form_select.spec.js +0 -69
  109. package/src/components/base/form/form_select/form_select.stories.js +0 -156
  110. package/src/components/base/form/form_text/form_text.stories.js +0 -27
  111. package/src/components/base/form/form_textarea/form_textarea.spec.js +0 -242
  112. package/src/components/base/form/form_textarea/form_textarea.stories.js +0 -68
  113. package/src/components/base/form/input_group_text/input_group_text.spec.js +0 -9
  114. package/src/components/base/form/input_group_text/input_group_text.stories.js +0 -30
  115. package/src/components/base/icon/__snapshots__/icon.spec.js.snap +0 -14
  116. package/src/components/base/icon/icon.spec.js +0 -92
  117. package/src/components/base/icon/icon.stories.js +0 -56
  118. package/src/components/base/infinite_scroll/infinite_scroll.spec.js +0 -182
  119. package/src/components/base/infinite_scroll/infinite_scroll.stories.js +0 -94
  120. package/src/components/base/keyset_pagination/keyset_pagination.spec.js +0 -313
  121. package/src/components/base/keyset_pagination/keyset_pagination.stories.js +0 -66
  122. package/src/components/base/label/label.spec.js +0 -257
  123. package/src/components/base/label/label.stories.js +0 -76
  124. package/src/components/base/link/link.spec.js +0 -88
  125. package/src/components/base/link/link.stories.js +0 -64
  126. package/src/components/base/loading_icon/loading_icon.spec.js +0 -109
  127. package/src/components/base/loading_icon/loading_icon.stories.js +0 -60
  128. package/src/components/base/markdown/markdown.spec.js +0 -24
  129. package/src/components/base/markdown/markdown.stories.js +0 -33
  130. package/src/components/base/modal/modal.spec.js +0 -265
  131. package/src/components/base/modal/modal.stories.js +0 -197
  132. package/src/components/base/nav/nav.spec.js +0 -19
  133. package/src/components/base/nav/nav.stories.js +0 -57
  134. package/src/components/base/nav/nav_item.spec.js +0 -16
  135. package/src/components/base/nav/nav_item_dropdown.spec.js +0 -58
  136. package/src/components/base/navbar/navbar.spec.js +0 -21
  137. package/src/components/base/navbar/navbar.stories.js +0 -28
  138. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.spec.js +0 -566
  139. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.spec.js +0 -452
  140. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.stories.js +0 -345
  141. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_group.spec.js +0 -84
  142. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown_item.spec.js +0 -200
  143. package/src/components/base/new_dropdowns/disclosure/utils.spec.js +0 -74
  144. package/src/components/base/new_dropdowns/listbox/listbox.spec.js +0 -950
  145. package/src/components/base/new_dropdowns/listbox/listbox.stories.js +0 -840
  146. package/src/components/base/new_dropdowns/listbox/listbox_group.spec.js +0 -61
  147. package/src/components/base/new_dropdowns/listbox/listbox_item.spec.js +0 -129
  148. package/src/components/base/new_dropdowns/listbox/listbox_search_input.spec.js +0 -62
  149. package/src/components/base/new_dropdowns/listbox/utils.spec.js +0 -58
  150. package/src/components/base/paginated_list/__snapshots__/paginated_list.spec.js.snap +0 -922
  151. package/src/components/base/paginated_list/paginated_list.spec.js +0 -212
  152. package/src/components/base/paginated_list/paginated_list.stories.js +0 -207
  153. package/src/components/base/pagination/pagination.spec.js +0 -401
  154. package/src/components/base/pagination/pagination.stories.js +0 -129
  155. package/src/components/base/path/__snapshots__/path.spec.js.snap +0 -586
  156. package/src/components/base/path/path.spec.js +0 -237
  157. package/src/components/base/path/path.stories.js +0 -84
  158. package/src/components/base/popover/popover.spec.js +0 -104
  159. package/src/components/base/popover/popover.stories.js +0 -109
  160. package/src/components/base/progress_bar/progress_bar.stories.js +0 -34
  161. package/src/components/base/search_box_by_click/search_box_by_click.spec.js +0 -209
  162. package/src/components/base/search_box_by_click/search_box_by_click.stories.js +0 -100
  163. package/src/components/base/search_box_by_type/search_box_by_type.spec.js +0 -164
  164. package/src/components/base/search_box_by_type/search_box_by_type.stories.js +0 -63
  165. package/src/components/base/segmented_control/segmented_control.spec.js +0 -135
  166. package/src/components/base/segmented_control/segmented_control.stories.js +0 -59
  167. package/src/components/base/skeleton_loader/skeleton_loader.spec.js +0 -151
  168. package/src/components/base/skeleton_loader/skeleton_loader.stories.js +0 -86
  169. package/src/components/base/sorting/sorting.spec.js +0 -170
  170. package/src/components/base/sorting/sorting.stories.js +0 -98
  171. package/src/components/base/table/table.spec.js +0 -192
  172. package/src/components/base/table/table.stories.js +0 -186
  173. package/src/components/base/table_lite/table_lite.spec.js +0 -40
  174. package/src/components/base/table_lite/table_lite.stories.js +0 -74
  175. package/src/components/base/tabs/tab/tab.spec.js +0 -34
  176. package/src/components/base/tabs/tabs/scrollable_tabs.spec.js +0 -260
  177. package/src/components/base/tabs/tabs/tabs.spec.js +0 -366
  178. package/src/components/base/tabs/tabs/tabs.stories.js +0 -209
  179. package/src/components/base/toast/toast.spec.js +0 -72
  180. package/src/components/base/toast/toast.stories.js +0 -88
  181. package/src/components/base/toggle/toggle.spec.js +0 -168
  182. package/src/components/base/toggle/toggle.stories.js +0 -106
  183. package/src/components/base/token/token.spec.js +0 -48
  184. package/src/components/base/token/token.stories.js +0 -58
  185. package/src/components/base/token_selector/helpers.spec.js +0 -40
  186. package/src/components/base/token_selector/token_container.spec.js +0 -306
  187. package/src/components/base/token_selector/token_selector.spec.js +0 -653
  188. package/src/components/base/token_selector/token_selector.stories.js +0 -114
  189. package/src/components/base/token_selector/token_selector_dropdown.spec.js +0 -347
  190. package/src/components/base/tooltip/tooltip.spec.js +0 -27
  191. package/src/components/base/tooltip/tooltip.stories.js +0 -70
  192. package/src/components/charts/area/area.spec.js +0 -286
  193. package/src/components/charts/area/area.stories.js +0 -208
  194. package/src/components/charts/bar/__snapshots__/bar.spec.js.snap +0 -82
  195. package/src/components/charts/bar/bar.spec.js +0 -92
  196. package/src/components/charts/bar/bar.stories.js +0 -72
  197. package/src/components/charts/chart/chart.spec.js +0 -167
  198. package/src/components/charts/chart/chart.stories.js +0 -111
  199. package/src/components/charts/column/__snapshots__/column_chart.spec.js.snap +0 -323
  200. package/src/components/charts/column/column.stories.js +0 -111
  201. package/src/components/charts/column/column_chart.spec.js +0 -223
  202. package/src/components/charts/discrete_scatter/discrete_scatter.spec.js +0 -173
  203. package/src/components/charts/discrete_scatter/discrete_scatter.stories.js +0 -64
  204. package/src/components/charts/gauge/gauge.spec.js +0 -280
  205. package/src/components/charts/gauge/gauge.stories.js +0 -97
  206. package/src/components/charts/heatmap/heatmap.spec.js +0 -103
  207. package/src/components/charts/heatmap/heatmap.stories.js +0 -78
  208. package/src/components/charts/legend/legend.spec.js +0 -274
  209. package/src/components/charts/legend/legend.stories.js +0 -174
  210. package/src/components/charts/line/line.spec.js +0 -278
  211. package/src/components/charts/line/line.stories.js +0 -238
  212. package/src/components/charts/series_label/series_label.stories.js +0 -78
  213. package/src/components/charts/single_stat/single_stat.spec.js +0 -217
  214. package/src/components/charts/single_stat/single_stat.stories.js +0 -103
  215. package/src/components/charts/sparkline/sparkline.spec.js +0 -220
  216. package/src/components/charts/sparkline/sparkline.stories.js +0 -85
  217. package/src/components/charts/stacked_column/__snapshots__/stacked_column.spec.js.snap +0 -905
  218. package/src/components/charts/stacked_column/stacked_column.spec.js +0 -194
  219. package/src/components/charts/stacked_column/stacked_column.stories.js +0 -130
  220. package/src/components/charts/tooltip/tooltip.spec.js +0 -282
  221. package/src/components/charts/tooltip/tooltip.stories.js +0 -90
  222. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.spec.js +0 -46
  223. package/src/components/experimental/duo/chat/components/duo_chat_conversation/duo_chat_conversation.stories.js +0 -62
  224. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.spec.js +0 -70
  225. package/src/components/experimental/duo/chat/components/duo_chat_loader/duo_chat_loader.stories.js +0 -31
  226. package/src/components/experimental/duo/chat/components/duo_chat_message/copy_code_element.spec.js +0 -64
  227. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.spec.js +0 -534
  228. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.stories.js +0 -55
  229. package/src/components/experimental/duo/chat/components/duo_chat_message/utils.spec.js +0 -24
  230. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.spec.js +0 -93
  231. package/src/components/experimental/duo/chat/components/duo_chat_message_sources/duo_chat_message_sources.stories.js +0 -32
  232. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.spec.js +0 -35
  233. package/src/components/experimental/duo/chat/components/duo_chat_predefined_prompts/duo_chat_predefined_prompts.stories.js +0 -36
  234. package/src/components/experimental/duo/chat/duo_chat.spec.js +0 -828
  235. package/src/components/experimental/duo/chat/duo_chat.stories.js +0 -240
  236. package/src/components/experimental/duo/chat/markdown_renderer.spec.js +0 -55
  237. package/src/components/experimental/duo/user_feedback/user_feedback.spec.js +0 -100
  238. package/src/components/experimental/duo/user_feedback/user_feedback.stories.js +0 -107
  239. package/src/components/experimental/duo/user_feedback/user_feedback_modal.spec.js +0 -134
  240. package/src/components/experimental/experiment_badge/experiment_badge.spec.js +0 -77
  241. package/src/components/experimental/experiment_badge/experiment_badge.stories.js +0 -58
  242. package/src/components/regions/dashboard_skeleton/dashboard_skeleton.stories.js +0 -29
  243. package/src/components/regions/empty_state/empty_state.spec.js +0 -293
  244. package/src/components/regions/empty_state/empty_state.stories.js +0 -160
  245. package/src/components/shared_components/charts/tooltip_default_format.spec.js +0 -69
  246. package/src/components/shared_components/clear_icon_button/__snapshots__/clear_icon_button.spec.js.snap +0 -15
  247. package/src/components/shared_components/clear_icon_button/clear_icon_button.spec.js +0 -23
  248. package/src/components/shared_components/close_button/__snapshots__/close_button.spec.js.snap +0 -12
  249. package/src/components/shared_components/close_button/close_button.spec.js +0 -22
  250. package/src/components/utilities/animated_number/animated_number.spec.js +0 -133
  251. package/src/components/utilities/animated_number/animated_number.stories.js +0 -63
  252. package/src/components/utilities/friendly_wrap/friendly_wrap.spec.js +0 -123
  253. package/src/components/utilities/friendly_wrap/friendly_wrap.stories.js +0 -56
  254. package/src/components/utilities/intersection_observer/intersection_observer.spec.js +0 -116
  255. package/src/components/utilities/intersection_observer/intersection_observer.stories.js +0 -162
  256. package/src/components/utilities/intersperse/intersperse.spec.js +0 -115
  257. package/src/components/utilities/intersperse/intersperse.stories.js +0 -53
  258. package/src/components/utilities/sprintf/sprintf.spec.js +0 -337
  259. package/src/components/utilities/sprintf/sprintf.stories.js +0 -104
  260. package/src/components/utilities/truncate/truncate.spec.js +0 -125
  261. package/src/components/utilities/truncate/truncate.stories.js +0 -50
  262. package/src/components/utilities/truncate_text/truncate_text.spec.js +0 -150
  263. package/src/components/utilities/truncate_text/truncate_text.stories.js +0 -45
  264. package/src/directives/hover_load/hover_load.spec.js +0 -64
  265. package/src/directives/hover_load/hover_load.stories.js +0 -51
  266. package/src/directives/outside/outside.spec.js +0 -338
  267. package/src/directives/outside/outside.stories.js +0 -35
  268. package/src/directives/resize_observer/resize_observer.spec.js +0 -125
  269. package/src/directives/resize_observer/resize_observer.stories.js +0 -76
  270. package/src/directives/safe_html/safe_html.spec.js +0 -149
  271. package/src/directives/safe_html/safe_html.stories.js +0 -60
  272. package/src/directives/safe_link/safe_link.spec.js +0 -135
  273. package/src/directives/safe_link/safe_link.stories.js +0 -39
  274. package/src/internal/color_contrast/color_contrast.spec.js +0 -34
  275. package/src/internal/color_contrast/color_contrast.stories.js +0 -41
  276. package/src/scss/functions.spec.scss +0 -54
  277. package/src/scss/mixins.spec.scss +0 -93
  278. package/src/scss/run_scss_tests.spec.js +0 -26
  279. package/src/scss/typescale/typescale.stories.js +0 -61
  280. package/src/tokens/color.constant.tokens.stories.js +0 -19
  281. package/src/tokens/color.dark.tokens.stories.js +0 -26
  282. package/src/tokens/color.data_viz.dark.tokens.stories.js +0 -19
  283. package/src/tokens/color.data_viz.tokens.stories.js +0 -19
  284. package/src/tokens/color.theme.dark.tokens.stories.js +0 -21
  285. package/src/tokens/color.theme.tokens.stories.js +0 -21
  286. package/src/tokens/color.tokens.stories.js +0 -26
  287. package/src/tokens/color.transparency.tokens.stories.js +0 -14
  288. package/src/tokens/text.dark.tokens.stories.js +0 -18
  289. package/src/tokens/text.tokens.stories.js +0 -17
  290. package/src/tokens/tokens.stories.js +0 -16
  291. package/src/utils/breakpoints.spec.js +0 -26
  292. package/src/utils/charts/config.spec.js +0 -478
  293. package/src/utils/charts/utils.spec.js +0 -106
  294. package/src/utils/datetime_utility.spec.js +0 -98
  295. package/src/utils/is_slot_empty.spec.js +0 -73
  296. package/src/utils/number_utils.spec.js +0 -110
  297. package/src/utils/stories_utils.spec.js +0 -18
  298. package/src/utils/string_utils.spec.js +0 -56
  299. package/src/utils/utils.spec.js +0 -156
@@ -1,162 +0,0 @@
1
- import GlIntersectionObserver from './intersection_observer.vue';
2
- import readme from './intersection_observer.md';
3
-
4
- const components = {
5
- GlIntersectionObserver,
6
- };
7
-
8
- const commonData = () => ({
9
- isInView: false,
10
- });
11
-
12
- const commonMethods = {
13
- appear() {
14
- this.isInView = true;
15
- },
16
- disappear() {
17
- this.isInView = false;
18
- },
19
- };
20
-
21
- const generateItems = (startingId = 0) => {
22
- const items = Array.from(Array(20).keys());
23
- return items.map((index) => {
24
- const id = index + startingId + 1;
25
-
26
- return {
27
- id,
28
- title: `Item ${id}`,
29
- };
30
- });
31
- };
32
-
33
- export const Default = () => ({
34
- components,
35
- data: commonData,
36
- methods: commonMethods,
37
- computed: {
38
- visibility() {
39
- return this.isInView ? 'The observer is in view' : 'The observer is not in view';
40
- },
41
- },
42
- template: `
43
- <div style="height: 200px; overflow-y: scroll;">
44
- <h1>{{ visibility }}</h1>
45
- <p>This one is a hard one to demonstrate as it's invisible by nature.</p>
46
- <p>Underneath this block of text is an invisible component, <code>&lt;gl-observer /&gt;</code> that has the power to tell the vue app when it's visible, and when it's not.</p>
47
- <p><strong>{{ visibility }}</strong> at the moment but if you scroll and arrange your window just right, this can be changed and will be reflected in the title.</p>
48
- <p :class="{'gl-text-green-600': isInView }">To make it even more clear, this line of text will be green when the element scrolls into view.</p>
49
- <p>This line appears just before the observer.</p>
50
- <gl-intersection-observer
51
- @appear="appear"
52
- @disappear="disappear"
53
- />
54
- <p>This line appears just after the observer.</p>
55
- </div>
56
- `,
57
- });
58
-
59
- export const BigTable = () => ({
60
- components,
61
- data() {
62
- return {
63
- values: Array(100)
64
- .fill(1)
65
- .map(() => Array(10).fill(0)),
66
- };
67
- },
68
- methods: {
69
- update(row, col, { intersectionRatio }) {
70
- this.$set(this.values[row], col, intersectionRatio);
71
- },
72
- disappear(row, col) {
73
- this.values[row][col] = 0;
74
- },
75
- },
76
- template: `
77
- <div style="height: 600px; overflow-y: scroll;">
78
- <table>
79
- <tr v-for="(cols, row) in values" :key="row">
80
- <td v-for="(value, col) in cols" :key="row + '_' + col">
81
- <gl-intersection-observer @update="update(row, col, $event)">
82
- <span :style="{ display: 'inline-block', width: '50px' }">{{ value.toString().substr(0, 3) }}</span>
83
- </gl-intersection-observer>
84
- </td>
85
- </tr>
86
- </table>
87
- </div>
88
- `,
89
- });
90
-
91
- export const LazyLoadedImage = () => ({
92
- components,
93
- data: commonData,
94
- methods: commonMethods,
95
- computed: {
96
- imageUrl() {
97
- // If the image is in view, return the high res one. If not return nothing, or a low res one
98
- return this.isInView
99
- ? '../../img/gitlab-summit-south-africa.jpg'
100
- : '../../img/gitlab-summit-south-africa-min.jpg';
101
- },
102
- },
103
- template: `
104
- <div>
105
- <p>The image below will load a low-res version until it appears on the poage, then it will switch out for a higher res version.</p>
106
- <p>It's also set up to switch back to the low res version when it disappears off the page. This is not what you would usually do for lazily loaded images, but it helps to demonstrate the effect in this example.</p>
107
- <gl-intersection-observer
108
- @appear="appear"
109
- @disappear="disappear"
110
- >
111
- <img :src="imageUrl" style="max-width: 100%; height: auto;"/>
112
- </gl-intersection-observer>
113
- </div>
114
- `,
115
- });
116
-
117
- export const InfiniteScrolling = () => ({
118
- components,
119
- data: () => ({
120
- items: generateItems(),
121
- }),
122
- computed: {
123
- lastItemId() {
124
- return this.items[this.items.length - 1].id;
125
- },
126
- endOfList() {
127
- return this.lastItemId >= 1000;
128
- },
129
- },
130
- methods: {
131
- fetchMoreItems() {
132
- if (!this.endOfList) {
133
- this.items.push(...generateItems(this.lastItemId));
134
- }
135
- },
136
- },
137
- template: `
138
- <div>
139
- <h2>Infinitely scrollable list</h2>
140
- <p>This data will procedurally generate 1000 items, 20 at a time</p>
141
- <ul>
142
- <li v-for="item in items" :key="item.id">{{ item.title }}</li>
143
- </ul>
144
- <gl-intersection-observer v-if="!endOfList" @appear="fetchMoreItems">
145
- <button @click="fetchMoreItems">Fetch more items</button>
146
- </gl-intersection-observer>
147
- </div>
148
- `,
149
- });
150
-
151
- export default {
152
- title: 'utilities/intersection-observer',
153
- component: GlIntersectionObserver,
154
- tags: ['skip-visual-test'],
155
- parameters: {
156
- docs: {
157
- description: {
158
- component: readme,
159
- },
160
- },
161
- },
162
- };
@@ -1,115 +0,0 @@
1
- import { shallowMount } from '@vue/test-utils';
2
- import Intersperse from './intersperse.vue';
3
-
4
- describe('Intersperse Component', () => {
5
- let wrapper;
6
-
7
- const createComponent = (defaultSlot = [], options = {}) => {
8
- wrapper = shallowMount(Intersperse, {
9
- slots: {
10
- default: defaultSlot,
11
- },
12
- ...options,
13
- });
14
- };
15
-
16
- it.each`
17
- defaultSlotContent | selectorsToCheck
18
- ${'<button>Foo</button>'} | ${['button']}
19
- ${'<a><span>Foo</span></a><small>Bar</small>'} | ${['a', 'a span', 'small']}
20
- `(
21
- 'contains all elements passed into the default slot',
22
- ({ defaultSlotContent, selectorsToCheck }) => {
23
- createComponent(defaultSlotContent);
24
-
25
- selectorsToCheck.forEach((selector) => {
26
- // eslint-disable-next-line unicorn/no-array-callback-reference
27
- expect(wrapper.find(selector).exists()).toBe(true);
28
- });
29
- }
30
- );
31
-
32
- it('renders an empty span if no children are given', () => {
33
- createComponent([]);
34
-
35
- expect(wrapper.find('span').exists()).toBe(true);
36
- expect(wrapper.findAll('span > *').length).toBe(0);
37
- });
38
-
39
- it('uses ", " as a default separator and lastSeparator', () => {
40
- const defaultSlotContent = '<i>Foo</i><i>Bar</i><i>Baz</i>';
41
- const expectedText = 'Foo, Bar, Baz';
42
-
43
- createComponent(defaultSlotContent);
44
-
45
- expect(wrapper.text()).toBe(expectedText);
46
- });
47
-
48
- it('adds class attribute when present', () => {
49
- const defaultSlotContent = '<i>Foo</i><i>Bar</i>';
50
-
51
- createComponent(defaultSlotContent, { attrs: { class: 'text-secondary' } });
52
-
53
- expect(wrapper.classes('text-secondary')).toBe(true);
54
- });
55
-
56
- it.each`
57
- defaultSlotContent | separator | expectedText
58
- ${'<i>Baz</i><i>Foo</i><i>Biz</i>'} | ${', '} | ${'Baz, Foo, Biz'}
59
- ${'<i>Bar</i><i>Baz</i><i>Biz</i>'} | ${'+'} | ${'Bar+Baz+Biz'}
60
- ${'<i>Bar</i><i>Baz</i><i>Biz</i>Quz'} | ${'-'} | ${'Bar-Baz-Biz-Quz'}
61
- `(
62
- 'intersperses each direct child with a given separator',
63
- ({ defaultSlotContent, separator, expectedText }) => {
64
- createComponent(defaultSlotContent, { propsData: { separator } });
65
-
66
- expect(wrapper.text()).toBe(expectedText);
67
- }
68
- );
69
-
70
- it.each`
71
- defaultSlotContent | separator | lastSeparator | expectedText
72
- ${'<i>Foo</i><i>Bar</i>'} | ${','} | ${' and '} | ${'Foo and Bar'}
73
- ${'<i>Foo</i><i>Bar</i><i>Baz</i>'} | ${','} | ${'+'} | ${'Foo,Bar,+Baz'}
74
- ${'<i>Foo</i><i>Bar</i><i>Baz</i>'} | ${','} | ${' and '} | ${'Foo,Bar, and Baz'}
75
- ${'<i>Foo</i><i>Bar</i><i>Baz</i>'} | ${'+'} | ${' and '} | ${'Foo+Bar+ and Baz'}
76
- `(
77
- 'adds a custom lastSeparator',
78
- ({ defaultSlotContent, separator, lastSeparator, expectedText }) => {
79
- createComponent(defaultSlotContent, { propsData: { separator, lastSeparator } });
80
-
81
- expect(wrapper.text()).toBe(expectedText);
82
- }
83
- );
84
-
85
- it.each`
86
- defaultSlotContent | expectedText
87
- ${'<i>Foo</i> <i>Bar</i>'} | ${'Foo, Bar'}
88
- ${'<i>Foo</i>\n<i>Bar</i>'} | ${'Foo, Bar'}
89
- ${'<i>Foo</i>\t<i>Bar</i>'} | ${'Foo, Bar'}
90
- ${'<i>Foo</i> <i>Bar</i>'} | ${'Foo, Bar'}
91
- ${'<i>Foo</i>&nbsp;<i>Bar</i>'} | ${'Foo, Bar'}
92
- ${'<i>Foo</i><i>Bar</i> '} | ${'Foo, Bar'}
93
- ${'<i>Foo</i><i>Bar</i>\n'} | ${'Foo, Bar'}
94
- `(
95
- 'strips whitespace elements that are direct children of the slot',
96
- ({ defaultSlotContent, expectedText }) => {
97
- createComponent(defaultSlotContent);
98
-
99
- expect(wrapper.text()).toBe(expectedText);
100
- }
101
- );
102
-
103
- it.each`
104
- defaultSlotContent | expectedText
105
- ${'<i>Foo Bar</i><i>Baz</i>'} | ${'Foo Bar, Baz'}
106
- ${'<i>Foo Bar</i><i>Baz Qaz</i><small>Qiz</small>'} | ${'Foo Bar, Baz Qaz, Qiz'}
107
- `(
108
- 'preserves whitespace elements that are not direct children of the slot',
109
- ({ defaultSlotContent, expectedText }) => {
110
- createComponent(defaultSlotContent);
111
-
112
- expect(wrapper.text()).toBe(expectedText);
113
- }
114
- );
115
- });
@@ -1,53 +0,0 @@
1
- import GlIntersperse from './intersperse.vue';
2
- import readme from './intersperse.md';
3
-
4
- const template = `
5
- <div>
6
- <gl-intersperse :separator="separator" :lastSeparator="lastSeparator">
7
- <span v-for="item in items">{{ item }}</span>
8
- </gl-intersperse>
9
- </div>
10
- `;
11
-
12
- const generateProps = ({
13
- separator = ', ',
14
- lastSeparator = '',
15
- items = ['Foo', 'Bar', 'Baz', 'Qaz'],
16
- } = {}) => ({
17
- separator,
18
- lastSeparator,
19
- items,
20
- });
21
-
22
- const Template = (args, { argTypes }) => ({
23
- components: {
24
- GlIntersperse,
25
- },
26
- props: Object.keys(argTypes),
27
- template,
28
- });
29
-
30
- export const Default = Template.bind({});
31
- Default.args = generateProps();
32
-
33
- export default {
34
- title: 'utilities/intersperse',
35
- component: GlIntersperse,
36
- parameters: {
37
- docs: {
38
- description: {
39
- component: readme,
40
- },
41
- },
42
- },
43
- };
44
-
45
- export const CustomSeparator = Template.bind({});
46
- CustomSeparator.args = generateProps({
47
- separator: '-',
48
- });
49
-
50
- export const CustomLastSeparator = Template.bind({});
51
- CustomLastSeparator.args = generateProps({
52
- lastSeparator: ' and ',
53
- });
@@ -1,337 +0,0 @@
1
- import { mount } from '@vue/test-utils';
2
- import sprintf from './sprintf.vue';
3
-
4
- describe('sprintf component', () => {
5
- let wrapper;
6
- const objectPrototypeNames = Object.getOwnPropertyNames(Object.prototype).filter((name) =>
7
- /^[a-z]/i.test(name)
8
- );
9
-
10
- const createComponent = (template = '', data = () => ({})) => {
11
- wrapper = mount({
12
- template: `<div class="wrapper">${template}</div>`,
13
- components: {
14
- sprintf,
15
- },
16
- data,
17
- });
18
- };
19
-
20
- describe('plain placeholders', () => {
21
- it.each`
22
- message
23
- ${''}
24
- ${'Foo'}
25
- ${'%{author}'}
26
- ${'Written by %{author}'}
27
- ${'Written by %{author-name}'}
28
- ${'Written by %{author1}'}
29
- ${'Written by %{author_name}'}
30
- `('should return message if slots have no data', ({ message }) => {
31
- createComponent(`<sprintf message="${message}"/>`);
32
-
33
- expect(wrapper.element.innerHTML).toBe(message);
34
- });
35
-
36
- it.each`
37
- message | html
38
- ${'%{author}'} | ${'<span>Author</span>'}
39
- ${'Written by %{author}'} | ${'Written by <span>Author</span>'}
40
- ${'Foo %{author} bar'} | ${'Foo <span>Author</span> bar'}
41
- ${' %{author} '} | ${' <span>Author</span> '}
42
- ${'%{author}%{author}'} | ${'<span>Author</span><span>Author</span>'}
43
- ${'%{author} known as %{author-name}'} | ${'<span>Author</span> known as <span>John Doe</span>'}
44
- ${'%{author1}'} | ${'<span>Author #1</span>'}
45
- ${'%{author_name}'} | ${'<span>Author Name</span>'}
46
- `('should replace placeholder with component', ({ message, html }) => {
47
- createComponent(
48
- `<sprintf message="${message}">
49
- <template #author>
50
- <span>Author</span>
51
- </template>
52
- <template #author-name>
53
- <span>John Doe</span>
54
- </template>
55
- <template #author1>
56
- <span>Author #1</span>
57
- </template>
58
- <template #author_name>
59
- <span>Author Name</span>
60
- </template>
61
- </sprintf>`
62
- );
63
-
64
- expect(wrapper.element.innerHTML).toBe(html);
65
- });
66
-
67
- it('should be able to re-use a placeholder multiple times', () => {
68
- createComponent(
69
- `<sprintf message="%{author} is an excellent %{author}">
70
- <template #author>
71
- <span>Author</span>
72
- </template>
73
- </sprintf>`
74
- );
75
-
76
- expect(wrapper.element.innerHTML).toBe(
77
- '<span>Author</span> is an excellent <span>Author</span>'
78
- );
79
- });
80
-
81
- it('should be able to use templates as slots', () => {
82
- createComponent(
83
- `<sprintf message="Written by %{author}">
84
- <template #author>Author</template>
85
- </sprintf>`
86
- );
87
-
88
- expect(wrapper.element.innerHTML).toBe('Written by Author');
89
- });
90
-
91
- it('should work with a default slot', () => {
92
- createComponent(`<sprintf message="Written by %{default}">Author</sprintf>`);
93
-
94
- expect(wrapper.element.innerHTML).toBe('Written by Author');
95
- });
96
-
97
- describe('Object prototype names', () => {
98
- it.each(objectPrototypeNames)(
99
- 'does not use Object.prototype.%s as slot if slot is not provided',
100
- (prototypeName) => {
101
- createComponent(`<sprintf message="%{${prototypeName}}"></sprintf>`);
102
-
103
- expect(wrapper.element.innerHTML).toBe(`%{${prototypeName}}`);
104
- }
105
- );
106
-
107
- it.each(objectPrototypeNames)('can use provided slot named "%s"', (prototypeName) => {
108
- createComponent(
109
- `<sprintf message="%{${prototypeName}}">
110
- <template #${prototypeName}>${prototypeName} OK!</template>
111
- </sprintf>`
112
- );
113
-
114
- expect(wrapper.element.innerHTML).toBe(`${prototypeName} OK!`);
115
- });
116
- });
117
- });
118
-
119
- describe('start/end placeholders', () => {
120
- it('should work', () => {
121
- createComponent(
122
- `<sprintf message="Click %{linkStart}here%{linkEnd}, please">
123
- <template #link="{ content }">
124
- <a href="#">{{ content }}</a>
125
- </template>
126
- </sprintf>`
127
- );
128
-
129
- expect(wrapper.element.innerHTML).toBe('Click <a href="#">here</a>, please');
130
- });
131
-
132
- it('should work with a default slot', () => {
133
- createComponent(
134
- `<sprintf message="Foo %{defaultStart}default%{defaultEnd} baz">
135
- <template #default="{ content }">{{ content }}</template>
136
- </sprintf>`
137
- );
138
-
139
- expect(wrapper.element.innerHTML).toBe('Foo default baz');
140
- });
141
-
142
- it('does not render start/end content if slot does not consume it', () => {
143
- createComponent(
144
- `<sprintf message="Click %{linkStart}here%{linkEnd}, please">
145
- <template #link>
146
- <a href="#">foo</a>
147
- </template>
148
- </sprintf>`
149
- );
150
-
151
- expect(wrapper.element.innerHTML).toBe('Click <a href="#">foo</a>, please');
152
- });
153
-
154
- it('can interpolate multiple start/end placeholders', () => {
155
- createComponent(
156
- `<sprintf message="Foo %{barStart}bar%{barEnd} %{quxStart}qux%{quxEnd} baz">
157
- <template #bar="{ content }">
158
- <a>{{ content }}</a>
159
- </template>
160
- <template #qux="{ content }">
161
- <b>{{ content }}</b>
162
- </template>
163
- </sprintf>`
164
- );
165
-
166
- expect(wrapper.element.innerHTML).toBe('Foo <a>bar</a> <b>qux</b> baz');
167
- });
168
-
169
- it('treats out-of-order start/end placeholders as plain slots', () => {
170
- createComponent(
171
- `<sprintf message="Foo %{barEnd}bar%{barStart} qux">
172
- <template #bar="{ content }">
173
- <a>{{ content }} fail if in output!</a>
174
- </template>
175
- <template #barStart>
176
- <b>barStart</b>
177
- </template>
178
- <template #barEnd>
179
- <i>barEnd</i>
180
- </template>
181
- </sprintf>`
182
- );
183
-
184
- expect(wrapper.element.innerHTML).toBe('Foo <i>barEnd</i>bar<b>barStart</b> qux');
185
- });
186
-
187
- it('should handle start/end placeholders at the beginning and end of the message', () => {
188
- createComponent(
189
- `<sprintf message="%{fooStart}bar%{fooEnd}">
190
- <template #foo="{ content }"><b>{{ content }}</b></template>
191
- </sprintf>`
192
- );
193
-
194
- expect(wrapper.element.innerHTML).toBe('<b>bar</b>');
195
- });
196
-
197
- it('treats a start placeholder without an end as a plain placeholder', () => {
198
- createComponent(
199
- `<sprintf message="foo %{barStart} baz">
200
- <template #barStart>start</template>
201
- </sprintf>`
202
- );
203
-
204
- expect(wrapper.element.innerHTML).toBe('foo start baz');
205
- });
206
-
207
- it('treats an end placeholder without a start as a plain placeholder', () => {
208
- createComponent(
209
- `<sprintf message="foo %{barEnd} baz">
210
- <template #barEnd>end</template>
211
- </sprintf>`
212
- );
213
-
214
- expect(wrapper.element.innerHTML).toBe('foo end baz');
215
- });
216
-
217
- it('should not interpolate more than one level deep, even if slots are provided', () => {
218
- createComponent(
219
- `<sprintf message="foo %{spanStart}foo %{baz} %{strongStart}strong%{strongEnd}%{spanEnd}">
220
- <template #span="{ content }"><span>{{ content }}</span></template>
221
- <template #baz>baz</template>
222
- <template #strong="{ content }"><strong>{{ content }}</strong></template>
223
- </sprintf>`
224
- );
225
-
226
- expect(wrapper.element.innerHTML).toBe(
227
- 'foo <span>foo %{baz} %{strongStart}strong%{strongEnd}</span>'
228
- );
229
- });
230
-
231
- it('works with no content between start/end placeholders', () => {
232
- createComponent(
233
- `<sprintf message="foo %{barStart}%{barEnd} baz">
234
- <template #bar="{ content }"><i>{{ content }}</i></template>
235
- </sprintf>`
236
- );
237
-
238
- expect(wrapper.element.innerHTML).toBe('foo <i></i> baz');
239
- });
240
-
241
- it('returns the message if slot is not provided', () => {
242
- createComponent(`<sprintf message="Click %{linkStart}here%{linkEnd}"></sprintf>`);
243
-
244
- expect(wrapper.element.innerHTML).toBe('Click %{linkStart}here%{linkEnd}');
245
- });
246
-
247
- it('works with the example in the documentation', () => {
248
- // From: https://gitlab.com/gitlab-org/gitlab/blob/v12.6.4-ee/doc/development/i18n/externalization.md#L300-303
249
- createComponent(
250
- `<sprintf message="Learn more about %{linkStart}zones%{linkEnd}">
251
- <template #link="{ content }">
252
- <a
253
- href="https://cloud.google.com/compute/docs/regions-zones/regions-zones"
254
- target="_blank"
255
- rel="noopener noreferrer"
256
- >{{ content }}</a>
257
- </template>
258
- </sprintf>`
259
- );
260
-
261
- expect(wrapper.element.innerHTML).toBe(
262
- 'Learn more about <a href="https://cloud.google.com/compute/docs/regions-zones/regions-zones" target="_blank" rel="noopener noreferrer">zones</a>'
263
- );
264
- });
265
-
266
- it('resists XSS attacks', () => {
267
- createComponent(
268
- `<sprintf message="Click %{linkStart}<script>alert('hello')</script>%{linkEnd}, please">
269
- <template #link="{ content }">
270
- <a href="#">{{ content }}</a>
271
- </template>
272
- </sprintf>`
273
- );
274
-
275
- expect(wrapper.element.innerHTML).toBe(
276
- 'Click <a href="#">&lt;script&gt;alert(\'hello\')&lt;/script&gt;</a>, please'
277
- );
278
- });
279
-
280
- describe('Object prototype names', () => {
281
- it.each(objectPrototypeNames)(
282
- 'does not use Object.prototype.%s as slot if slot is not provided',
283
- (prototypeName) => {
284
- createComponent(
285
- `<sprintf message="%{${prototypeName}Start} foo %{${prototypeName}End}"></sprintf>`
286
- );
287
-
288
- expect(wrapper.element.innerHTML).toBe(
289
- `%{${prototypeName}Start} foo %{${prototypeName}End}`
290
- );
291
- }
292
- );
293
-
294
- it.each(objectPrototypeNames)('can use provided slot named "%s"', (prototypeName) => {
295
- createComponent(
296
- `<sprintf message="%{${prototypeName}Start}foo%{${prototypeName}End}">
297
- <template #${prototypeName}="{ content }">{{ content }}</template>
298
- </sprintf>`
299
- );
300
-
301
- expect(wrapper.element.innerHTML).toBe('foo');
302
- });
303
- });
304
-
305
- describe('given custom placeholder start/end markers', () => {
306
- it.each`
307
- message | placeholders | expectedHtml
308
- ${'%{aStart}foo%{aEnd}'} | ${undefined} | ${'<a>foo</a>'}
309
- ${'%{aStart}foo%{aEnd}'} | ${{ a: ['aStart', 'aEnd'] }} | ${'<a>foo</a>'}
310
- ${'%{start}foo%{end}'} | ${{ a: ['start', 'end'] }} | ${'<a>foo</a>'}
311
- ${'%{bold}foo%{bold_end}'} | ${{ bold: ['bold', 'bold_end'] }} | ${'<b>foo</b>'}
312
- ${'%{link_start}foo%{link_end}, %{open_bold}bar%{close}'} | ${{ a: ['link_start', 'link_end'], bold: ['open_bold', 'close'] }} | ${'<a>foo</a>, <b>bar</b>'}
313
- ${'%{startLink}foo%{end}, %{startOtherLink}bar%{end}'} | ${{ a: ['startLink', 'end'], bold: ['startOtherLink', 'end'] }} | ${'<a>foo</a>, <b>bar</b>'}
314
- ${'%{start}foo %{icon}%{end}'} | ${{ a: ['start', 'end'] }} | ${'<a>foo %{icon}</a>'}
315
- ${'%{end}foo%{start}'} | ${{ a: ['start', 'end'] }} | ${'%{end}foo%{start}'}
316
- ${'%{start}foo'} | ${{ a: ['start', 'end'] }} | ${'%{start}foo'}
317
- ${'foo%{end}'} | ${{ a: ['start', 'end'] }} | ${'foo%{end}'}
318
- `(
319
- 'renders $message as $expectedHtml given $placeholders',
320
- ({ message, placeholders, expectedHtml }) => {
321
- createComponent(
322
- `<sprintf :message="message" :placeholders="placeholders">
323
- <template #a="{ content }"><a>{{ content }}</a></template>
324
- <template #bold="{ content }"><b>{{ content }}</b></template>
325
- </sprintf>`,
326
- () => ({
327
- message,
328
- placeholders,
329
- })
330
- );
331
-
332
- expect(wrapper.element.innerHTML).toBe(expectedHtml);
333
- }
334
- );
335
- });
336
- });
337
- });