@gitlab/ui 32.61.0 → 32.64.1

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 (42) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/components/base/paginated_list/paginated_list.documentation.js +2 -5
  3. package/dist/components/base/toast/toast.documentation.js +2 -5
  4. package/dist/utility_classes.css +1 -1
  5. package/dist/utility_classes.css.map +1 -1
  6. package/documentation/documented_stories.js +2 -0
  7. package/package.json +9 -9
  8. package/scss_to_js/scss_variables.js +1 -0
  9. package/scss_to_js/scss_variables.json +5 -0
  10. package/src/components/base/paginated_list/paginated_list.documentation.js +0 -2
  11. package/src/components/base/paginated_list/paginated_list.md +0 -2
  12. package/src/components/base/paginated_list/paginated_list.stories.js +162 -154
  13. package/src/components/base/toast/toast.documentation.js +0 -2
  14. package/src/components/base/toast/toast.md +0 -11
  15. package/src/components/base/toast/toast.stories.js +66 -50
  16. package/src/scss/utilities.scss +34 -2
  17. package/src/scss/utility-mixins/flex.scss +6 -0
  18. package/src/scss/utility-mixins/spacing.scss +9 -1
  19. package/src/scss/utility-mixins/typography.scss +4 -0
  20. package/src/scss/variables.scss +1 -0
  21. package/dist/components/base/paginated_list/examples/index.js +0 -49
  22. package/dist/components/base/paginated_list/examples/paginated_list.basic.example.js +0 -51
  23. package/dist/components/base/paginated_list/examples/paginated_list.no_filter.example.js +0 -51
  24. package/dist/components/base/paginated_list/examples/paginated_list.with_empty_list.example.js +0 -38
  25. package/dist/components/base/paginated_list/examples/paginated_list.with_filter_function.example.js +0 -51
  26. package/dist/components/base/paginated_list/examples/paginated_list.with_header_slot.example.js +0 -51
  27. package/dist/components/base/paginated_list/examples/paginated_list.with_row_slot.example.js +0 -53
  28. package/dist/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.js +0 -51
  29. package/dist/components/base/toast/examples/index.js +0 -19
  30. package/dist/components/base/toast/examples/toast.action.example.js +0 -40
  31. package/dist/components/base/toast/examples/toast.default.example.js +0 -38
  32. package/src/components/base/paginated_list/examples/index.js +0 -57
  33. package/src/components/base/paginated_list/examples/paginated_list.basic.example.vue +0 -19
  34. package/src/components/base/paginated_list/examples/paginated_list.no_filter.example.vue +0 -20
  35. package/src/components/base/paginated_list/examples/paginated_list.with_empty_list.example.vue +0 -3
  36. package/src/components/base/paginated_list/examples/paginated_list.with_filter_function.example.vue +0 -20
  37. package/src/components/base/paginated_list/examples/paginated_list.with_header_slot.example.vue +0 -23
  38. package/src/components/base/paginated_list/examples/paginated_list.with_row_slot.example.vue +0 -25
  39. package/src/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.vue +0 -23
  40. package/src/components/base/toast/examples/index.js +0 -22
  41. package/src/components/base/toast/examples/toast.action.example.vue +0 -11
  42. package/src/components/base/toast/examples/toast.default.example.vue +0 -3
@@ -117,6 +117,8 @@ export const setupStorybookReadme = () =>
117
117
  'GlKeysetPagination',
118
118
  'GlForm',
119
119
  'GlTable',
120
+ 'GlToast',
121
+ 'GlPaginatedList',
120
122
  ],
121
123
  components: {
122
124
  GlComponentDocumentation,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "32.61.0",
3
+ "version": "32.64.1",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -90,15 +90,15 @@
90
90
  "@rollup/plugin-commonjs": "^11.1.0",
91
91
  "@rollup/plugin-node-resolve": "^7.1.3",
92
92
  "@rollup/plugin-replace": "^2.3.2",
93
- "@storybook/addon-a11y": "6.4.10",
94
- "@storybook/addon-docs": "6.4.10",
95
- "@storybook/addon-essentials": "6.4.10",
93
+ "@storybook/addon-a11y": "6.4.13",
94
+ "@storybook/addon-docs": "6.4.13",
95
+ "@storybook/addon-essentials": "6.4.13",
96
96
  "@storybook/addon-knobs": "6.4.0",
97
- "@storybook/addon-storyshots": "6.4.10",
98
- "@storybook/addon-storyshots-puppeteer": "6.4.10",
99
- "@storybook/addon-viewport": "6.4.10",
100
- "@storybook/theming": "6.4.10",
101
- "@storybook/vue": "6.4.10",
97
+ "@storybook/addon-storyshots": "6.4.13",
98
+ "@storybook/addon-storyshots-puppeteer": "6.4.13",
99
+ "@storybook/addon-viewport": "6.4.13",
100
+ "@storybook/theming": "6.4.13",
101
+ "@storybook/vue": "6.4.13",
102
102
  "@vue/test-utils": "1.3.0",
103
103
  "autoprefixer": "^9.7.6",
104
104
  "babel-jest": "^26.6.3",
@@ -240,6 +240,7 @@ export const glLineHeight24 = '1.5rem'
240
240
  export const glLineHeight28 = '1.75rem'
241
241
  export const glLineHeight32 = '2rem'
242
242
  export const glLineHeight36 = '2.25rem'
243
+ export const glLineHeight42 = '2.625rem'
243
244
  export const glLineHeight44 = '2.75rem'
244
245
  export const glLineHeight52 = '3.25rem'
245
246
  export const glFontSize = '0.875rem'
@@ -1249,6 +1249,11 @@
1249
1249
  "value": "px-to-rem(36px)",
1250
1250
  "compiledValue": "2.25rem"
1251
1251
  },
1252
+ {
1253
+ "name": "$gl-line-height-42",
1254
+ "value": "px-to-rem(42px)",
1255
+ "compiledValue": "2.625rem"
1256
+ },
1252
1257
  {
1253
1258
  "name": "$gl-line-height-44",
1254
1259
  "value": "px-to-rem(44px)",
@@ -1,7 +1,5 @@
1
- import examples from './examples';
2
1
  import description from './paginated_list.md';
3
2
 
4
3
  export default {
5
4
  description,
6
- examples,
7
5
  };
@@ -1,3 +1 @@
1
- ### Paginated list
2
-
3
1
  The paginated list component allows the easy creation of list with pagination and client side sorting.
@@ -1,14 +1,7 @@
1
- import { withKnobs, object, array, boolean, number, text } from '@storybook/addon-knobs';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
1
  import { GlPaginatedList, GlButton } from '../../../../index';
4
2
  import readme from './paginated_list.md';
5
3
 
6
- const components = {
7
- GlPaginatedList,
8
- GlButton,
9
- };
10
-
11
- const list = [
4
+ const sampleList = [
12
5
  { id: 'foo' },
13
6
  { id: 'bar' },
14
7
  { id: 'baz' },
@@ -33,167 +26,182 @@ const template = `
33
26
  :page="page"
34
27
  :filterable="filterable"
35
28
  :filter="filter"
29
+ :item-key="itemKey"
36
30
  :emptyMessage="emptyMessage"
37
31
  :emptySearchMessage="emptySearchMessage"
38
32
  />
39
33
  `;
40
34
 
41
- const templateWithSubheader = `
42
- <gl-paginated-list
43
- :list="list"
44
- :perPage="perPage"
45
- :page="page"
46
- :filterable="filterable"
47
- :filter="filter"
48
- :emptyMessage="emptyMessage"
49
- :emptySearchMessage="emptySearchMessage"
50
- >
35
+ const generateProps = ({
36
+ list = [...sampleList],
37
+ perPage = 10,
38
+ page = 1,
39
+ filterable = true,
40
+ filter = 'id',
41
+ itemKey = 'id',
42
+ emptyMessage = 'There are currently no items in this list.',
43
+ emptySearchMessage = 'Sorry, your filter produced no results.',
44
+ } = {}) => ({
45
+ list,
46
+ perPage,
47
+ page,
48
+ filterable,
49
+ filter,
50
+ itemKey,
51
+ emptyMessage,
52
+ emptySearchMessage,
53
+ });
51
54
 
52
- <template #subheader>
53
- Dropdown content can go here when like when an action button is clicked
54
- </template>
55
-
56
- </gl-paginated-list>
57
- `;
55
+ const Template = (args, { argTypes }) => ({
56
+ components: {
57
+ GlPaginatedList,
58
+ GlButton,
59
+ },
60
+ props: Object.keys(argTypes),
61
+ template,
62
+ });
58
63
 
59
- const templateWithHeader = `
60
- <gl-paginated-list
61
- :list="list"
62
- :perPage="perPage"
63
- :page="page"
64
- :filterable="filterable"
65
- :filter="filter"
66
- :emptyMessage="emptyMessage"
67
- :emptySearchMessage="emptySearchMessage"
68
- >
64
+ export const Default = Template.bind({});
65
+ Default.args = generateProps();
69
66
 
70
- <template #header>
71
- <gl-button
72
- variant="success"
73
- class="order-1"
74
- @click="alert"
75
- >
76
- Foo Button
77
- </gl-button>
78
- </template>
79
-
80
- </gl-paginated-list>
81
- `;
67
+ export const NoFilter = (args, { argTypes }) => ({
68
+ components: {
69
+ GlPaginatedList,
70
+ GlButton,
71
+ },
72
+ props: Object.keys(argTypes),
73
+ template,
74
+ });
75
+ NoFilter.args = generateProps({
76
+ filterable: false,
77
+ });
82
78
 
83
- const templateWithRow = `
84
- <gl-paginated-list
85
- :list="list"
86
- :perPage="perPage"
87
- :page="page"
88
- :filterable="filterable"
89
- :filter="filter"
90
- :emptyMessage="emptyMessage"
91
- :emptySearchMessage="emptySearchMessage"
92
- >
79
+ export const WithEmptyList = (args, { argTypes }) => ({
80
+ components: {
81
+ GlPaginatedList,
82
+ GlButton,
83
+ },
84
+ props: Object.keys(argTypes),
85
+ template,
86
+ });
87
+ WithEmptyList.args = generateProps({
88
+ list: emptyList,
89
+ });
93
90
 
94
- <template slot-scope="{ listItem }" >
95
- <gl-button
96
- variant="success"
97
- class="order-1"
98
- @click="alert"
91
+ export const WithHeaderSlot = (args, { argTypes }) => ({
92
+ components: {
93
+ GlPaginatedList,
94
+ GlButton,
95
+ },
96
+ props: Object.keys(argTypes),
97
+ template: `
98
+ <gl-paginated-list
99
+ :list="list"
100
+ :perPage="perPage"
101
+ :page="page"
102
+ :filterable="filterable"
103
+ :filter="filter"
104
+ :item-key="itemKey"
105
+ :emptyMessage="emptyMessage"
106
+ :emptySearchMessage="emptySearchMessage"
99
107
  >
100
- {{ listItem.id }}
101
- </gl-button>
102
- </template>
103
108
 
104
- </gl-paginated-list>
105
- `;
109
+ <template #header>
110
+ <gl-button
111
+ variant="success"
112
+ class="order-1"
113
+ @click="alert"
114
+ >
115
+ Foo Button
116
+ </gl-button>
117
+ </template>
106
118
 
107
- function generateProps() {
108
- return {
109
- list: {
110
- type: Array,
111
- default: object('list', list),
112
- },
113
- perPage: {
114
- type: Number,
115
- default: number('perPage', 10),
116
- },
117
- page: {
118
- type: Number,
119
- default: number('page', 1),
120
- },
121
- filterable: {
122
- type: Boolean,
123
- default: boolean('filterable', true),
124
- },
125
- filter: {
126
- type: String,
127
- default: text('filter', 'id'),
128
- },
129
- itemKey: {
130
- type: String,
131
- default: text('itemKey', 'id'),
119
+ </gl-paginated-list>
120
+ `,
121
+ methods: {
122
+ alert() {
123
+ // eslint-disable-next-line no-alert
124
+ window.alert('clicked');
132
125
  },
133
- emptyMessage: {
134
- type: String,
135
- default: text('emptyMessage', 'There are currently no items in this list.'),
136
- },
137
- emptySearchMessage: {
138
- type: String,
139
- default: text('emptySearchMessage', 'Sorry, your filter produced no results.'),
140
- },
141
- };
142
- }
126
+ },
127
+ });
128
+ WithHeaderSlot.args = generateProps();
143
129
 
144
- documentedStoriesOf('base/paginated-list', readme)
145
- .addDecorator(withKnobs)
146
- .add('default', () => ({
147
- props: generateProps(),
148
- components,
149
- template,
150
- }))
151
- .add('no filter', () => ({
152
- props: {
153
- ...generateProps(),
154
- filterable: {
155
- type: Boolean,
156
- default: false,
157
- },
158
- },
159
- components,
160
- template,
161
- }))
162
- .add('with empty list', () => ({
163
- props: {
164
- ...generateProps(),
165
- list: {
166
- type: Array,
167
- default: array('list', emptyList),
168
- },
169
- },
170
- components,
171
- template,
172
- }))
173
- .add('with header slot', () => ({
174
- props: generateProps(),
175
- components,
176
- template: templateWithHeader,
177
- methods: {
178
- alert() {
179
- // eslint-disable-next-line no-alert
180
- window.alert('clicked');
181
- },
130
+ export const WithSubheaderSlot = (args, { argTypes }) => ({
131
+ components: {
132
+ GlPaginatedList,
133
+ GlButton,
134
+ },
135
+ props: Object.keys(argTypes),
136
+ template: `
137
+ <gl-paginated-list
138
+ :list="list"
139
+ :perPage="perPage"
140
+ :page="page"
141
+ :filterable="filterable"
142
+ :filter="filter"
143
+ :item-key="itemKey"
144
+ :emptyMessage="emptyMessage"
145
+ :emptySearchMessage="emptySearchMessage"
146
+ >
147
+
148
+ <template #subheader>
149
+ Dropdown content can go here when like when an action button is clicked
150
+ </template>
151
+
152
+ </gl-paginated-list>
153
+ `,
154
+ });
155
+ WithSubheaderSlot.args = generateProps();
156
+
157
+ export const WithRowSlot = (args, { argTypes }) => ({
158
+ components: {
159
+ GlPaginatedList,
160
+ GlButton,
161
+ },
162
+ props: Object.keys(argTypes),
163
+ template: `
164
+ <gl-paginated-list
165
+ :list="list"
166
+ :perPage="perPage"
167
+ :page="page"
168
+ :filterable="filterable"
169
+ :filter="filter"
170
+ :item-key="itemKey"
171
+ :emptyMessage="emptyMessage"
172
+ :emptySearchMessage="emptySearchMessage"
173
+ >
174
+
175
+ <template slot-scope="{ listItem }" >
176
+ <gl-button
177
+ variant="success"
178
+ class="order-1"
179
+ @click="alert"
180
+ >
181
+ {{ listItem.id }}
182
+ </gl-button>
183
+ </template>
184
+
185
+ </gl-paginated-list>
186
+ `,
187
+ methods: {
188
+ alert() {
189
+ // eslint-disable-next-line no-alert
190
+ window.alert('clicked');
182
191
  },
183
- }))
184
- .add('with subheader slot', () => ({
185
- props: generateProps(),
186
- components,
187
- template: templateWithSubheader,
188
- }))
189
- .add('with row slot', () => ({
190
- props: generateProps(),
191
- components,
192
- template: templateWithRow,
193
- methods: {
194
- alert() {
195
- // eslint-disable-next-line no-alert
196
- window.alert('clicked');
192
+ },
193
+ });
194
+ WithRowSlot.args = generateProps();
195
+
196
+ export default {
197
+ title: 'base/paginated-list',
198
+ component: GlPaginatedList,
199
+ parameters: {
200
+ knobs: { disable: true },
201
+ docs: {
202
+ description: {
203
+ component: readme,
197
204
  },
198
205
  },
199
- }));
206
+ },
207
+ };
@@ -1,8 +1,6 @@
1
- import examples from './examples';
2
1
  import description from './toast.md';
3
2
 
4
3
  export default {
5
4
  followsDesignSystem: true,
6
5
  description,
7
- examples,
8
6
  };
@@ -1,8 +1,3 @@
1
- # Toast
2
-
3
- <!-- STORY -->
4
-
5
- ## Usage
6
1
 
7
2
  Toasts are used to display system messages. The messages are short and straightforward. It may
8
3
  contain a dismiss button, and an action button depending on the situation.
@@ -51,9 +46,3 @@ Below are the options you can pass to create a toast
51
46
  | action | Object | close | Add single actions to toast |
52
47
  | toastClass | String, Array | 'gl-toast' | Custom css class name of the toast |
53
48
  | onComplete | Function | null | Trigger when toast is completed |
54
-
55
- ## Under the hood
56
-
57
- Toast uses [`BToast`] internally. So please take a look at their extensive documentation for more information.
58
-
59
- [`btoast`]: https://bootstrap-vue.org/docs/components/toast
@@ -1,66 +1,82 @@
1
1
  import Vue from 'vue';
2
- import { documentedStoriesOf } from '../../../../documentation/documented_stories';
3
2
  import { GlToast } from '../../../../index';
4
3
  import readme from './toast.md';
5
4
 
6
5
  Vue.use(GlToast);
7
6
 
8
- function generateDefault() {
9
- return () => ({
10
- template: `<gl-button @click="showToast()">Show default toast</gl-button>`,
11
- methods: {
12
- showToast() {
13
- this.$toast.show('This is the default toast.');
14
- },
7
+ const Template = () => ({
8
+ components: { GlToast },
9
+ template: `
10
+ <gl-button @click="showToast()">
11
+ Show default toast
12
+ </gl-button>`,
13
+ methods: {
14
+ showToast() {
15
+ this.$toast.show('This is the default toast.');
15
16
  },
16
- mounted() {
17
- this.showToast();
17
+ },
18
+ mounted() {
19
+ this.showToast();
20
+ },
21
+ });
22
+
23
+ export const Default = Template.bind({});
24
+
25
+ export const WithActions = () => ({
26
+ components: { GlToast },
27
+ template: `
28
+ <gl-button @click="showToast()">
29
+ Show toast with actions
30
+ </gl-button>`,
31
+ methods: {
32
+ showToast() {
33
+ this.$toast.show('This is a toast with an action.', {
34
+ action: {
35
+ text: 'Undo',
36
+ onClick: () => {},
37
+ },
38
+ });
18
39
  },
19
- });
20
- }
40
+ },
41
+ mounted() {
42
+ this.showToast();
43
+ },
44
+ });
21
45
 
22
- function generateWithActions() {
23
- return () => ({
24
- template: `<gl-button @click="showToast()">Show toast with actions</gl-button>`,
25
- methods: {
26
- showToast() {
27
- this.$toast.show('This is a toast with an action.', {
46
+ export const WithLongContent = () => ({
47
+ components: { GlToast },
48
+ template: `
49
+ <gl-button @click="showToast()">
50
+ Show toast with a long content
51
+ </gl-button>`,
52
+ methods: {
53
+ showToast() {
54
+ this.$toast.show(
55
+ 'This is a toast with a long content and an action. Notice how the text wraps to multiple lines when the max-width is reached.',
56
+ {
28
57
  action: {
29
- text: 'Undo',
58
+ text: 'Undo action',
30
59
  onClick: () => {},
31
60
  },
32
- });
33
- },
61
+ }
62
+ );
34
63
  },
35
- mounted() {
36
- this.showToast();
37
- },
38
- });
39
- }
64
+ },
65
+ mounted() {
66
+ this.showToast();
67
+ },
68
+ });
40
69
 
41
- function generateLong() {
42
- return () => ({
43
- template: `<gl-button @click="showToast()">Show toast with a long content</gl-button>`,
44
- methods: {
45
- showToast() {
46
- this.$toast.show(
47
- 'This is a toast with a long content and an action. Notice how the text wraps to multiple lines when the max-width is reached.',
48
- {
49
- action: {
50
- text: 'Undo action',
51
- onClick: () => {},
52
- },
53
- }
54
- );
70
+ export default {
71
+ title: 'base/toast',
72
+ component: GlToast,
73
+ parameters: {
74
+ bootstrapComponent: 'toast',
75
+ knobs: { disable: true },
76
+ docs: {
77
+ description: {
78
+ component: readme,
55
79
  },
56
80
  },
57
- mounted() {
58
- this.showToast();
59
- },
60
- });
61
- }
62
-
63
- documentedStoriesOf('base/toast', readme)
64
- .add('default', generateDefault())
65
- .add('with actions', generateWithActions())
66
- .add('with long content', generateLong());
81
+ },
82
+ };
@@ -2940,6 +2940,18 @@
2940
2940
  }
2941
2941
  }
2942
2942
 
2943
+ .gl-md-flex-direction-column {
2944
+ @include gl-media-breakpoint-up(md) {
2945
+ @include gl-flex-direction-column;
2946
+ }
2947
+ }
2948
+
2949
+ .gl-md-flex-direction-column\! {
2950
+ @include gl-media-breakpoint-up(md) {
2951
+ @include gl-flex-direction-column;
2952
+ }
2953
+ }
2954
+
2943
2955
  .gl-xs-flex-direction-column {
2944
2956
  @include gl-media-breakpoint-down(sm) {
2945
2957
  flex-direction: column;
@@ -4666,6 +4678,12 @@
4666
4678
  .gl-pr-9\! {
4667
4679
  padding-right: $gl-spacing-scale-9 !important;
4668
4680
  }
4681
+ .gl-pr-10 {
4682
+ padding-right: $gl-spacing-scale-10;
4683
+ }
4684
+ .gl-pr-10\! {
4685
+ padding-right: $gl-spacing-scale-10 !important;
4686
+ }
4669
4687
  .gl-pl-0 {
4670
4688
  padding-left: 0;
4671
4689
  }
@@ -4726,6 +4744,12 @@
4726
4744
  .gl-pl-9\! {
4727
4745
  padding-left: $gl-spacing-scale-9 !important;
4728
4746
  }
4747
+ .gl-pl-10 {
4748
+ padding-left: $gl-spacing-scale-10;
4749
+ }
4750
+ .gl-pl-10\! {
4751
+ padding-left: $gl-spacing-scale-10 !important;
4752
+ }
4729
4753
  .gl-pl-11 {
4730
4754
  padding-left: $gl-spacing-scale-11;
4731
4755
  }
@@ -5567,12 +5591,12 @@
5567
5591
  margin-right: -#{$gl-spacing-scale-6} !important;
5568
5592
  }
5569
5593
  .gl-gap-x-3 {
5570
- * + * {
5594
+ > * + * {
5571
5595
  margin-left: #{$gl-spacing-scale-3};
5572
5596
  }
5573
5597
  }
5574
5598
  .gl-gap-x-3\! {
5575
- * + * {
5599
+ > * + * {
5576
5600
  margin-left: #{$gl-spacing-scale-3} !important;
5577
5601
  }
5578
5602
  }
@@ -7307,6 +7331,14 @@
7307
7331
  line-height: $gl-line-height-36 !important;
7308
7332
  }
7309
7333
 
7334
+ .gl-line-height-42 {
7335
+ line-height: $gl-line-height-42;
7336
+ }
7337
+
7338
+ .gl-line-height-42\! {
7339
+ line-height: $gl-line-height-42 !important;
7340
+ }
7341
+
7310
7342
  .gl-line-height-52 {
7311
7343
  line-height: $gl-line-height-52;
7312
7344
  }
@@ -96,6 +96,12 @@
96
96
  }
97
97
  }
98
98
 
99
+ @mixin gl-md-flex-direction-column {
100
+ @include gl-media-breakpoint-up(md) {
101
+ @include gl-flex-direction-column;
102
+ }
103
+ }
104
+
99
105
  @mixin gl-xs-flex-direction-column {
100
106
  @include gl-media-breakpoint-down(sm) {
101
107
  flex-direction: column;