@gitlab/ui 32.62.0 → 32.65.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 (39) 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 +1 -1
  8. package/src/components/base/paginated_list/paginated_list.documentation.js +0 -2
  9. package/src/components/base/paginated_list/paginated_list.md +0 -2
  10. package/src/components/base/paginated_list/paginated_list.stories.js +162 -154
  11. package/src/components/base/toast/toast.documentation.js +0 -2
  12. package/src/components/base/toast/toast.md +0 -11
  13. package/src/components/base/toast/toast.stories.js +66 -50
  14. package/src/scss/utilities.scss +42 -2
  15. package/src/scss/utility-mixins/flex.scss +6 -0
  16. package/src/scss/utility-mixins/opacity.scss +8 -0
  17. package/src/scss/utility-mixins/spacing.scss +9 -1
  18. package/dist/components/base/paginated_list/examples/index.js +0 -49
  19. package/dist/components/base/paginated_list/examples/paginated_list.basic.example.js +0 -51
  20. package/dist/components/base/paginated_list/examples/paginated_list.no_filter.example.js +0 -51
  21. package/dist/components/base/paginated_list/examples/paginated_list.with_empty_list.example.js +0 -38
  22. package/dist/components/base/paginated_list/examples/paginated_list.with_filter_function.example.js +0 -51
  23. package/dist/components/base/paginated_list/examples/paginated_list.with_header_slot.example.js +0 -51
  24. package/dist/components/base/paginated_list/examples/paginated_list.with_row_slot.example.js +0 -53
  25. package/dist/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.js +0 -51
  26. package/dist/components/base/toast/examples/index.js +0 -19
  27. package/dist/components/base/toast/examples/toast.action.example.js +0 -40
  28. package/dist/components/base/toast/examples/toast.default.example.js +0 -38
  29. package/src/components/base/paginated_list/examples/index.js +0 -57
  30. package/src/components/base/paginated_list/examples/paginated_list.basic.example.vue +0 -19
  31. package/src/components/base/paginated_list/examples/paginated_list.no_filter.example.vue +0 -20
  32. package/src/components/base/paginated_list/examples/paginated_list.with_empty_list.example.vue +0 -3
  33. package/src/components/base/paginated_list/examples/paginated_list.with_filter_function.example.vue +0 -20
  34. package/src/components/base/paginated_list/examples/paginated_list.with_header_slot.example.vue +0 -23
  35. package/src/components/base/paginated_list/examples/paginated_list.with_row_slot.example.vue +0 -25
  36. package/src/components/base/paginated_list/examples/paginated_list.with_subheader_slot.example.vue +0 -23
  37. package/src/components/base/toast/examples/index.js +0 -22
  38. package/src/components/base/toast/examples/toast.action.example.vue +0 -11
  39. 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.62.0",
3
+ "version": "32.65.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -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;
@@ -3344,6 +3356,22 @@
3344
3356
  opacity: 0.5 !important
3345
3357
  }
3346
3358
 
3359
+ .gl-opacity-6 {
3360
+ opacity: 0.6
3361
+ }
3362
+
3363
+ .gl-opacity-6\! {
3364
+ opacity: 0.6 !important
3365
+ }
3366
+
3367
+ .gl-opacity-7 {
3368
+ opacity: 0.7
3369
+ }
3370
+
3371
+ .gl-opacity-7\! {
3372
+ opacity: 0.7 !important
3373
+ }
3374
+
3347
3375
  .gl-opacity-10 {
3348
3376
  opacity: 1
3349
3377
  }
@@ -4666,6 +4694,12 @@
4666
4694
  .gl-pr-9\! {
4667
4695
  padding-right: $gl-spacing-scale-9 !important;
4668
4696
  }
4697
+ .gl-pr-10 {
4698
+ padding-right: $gl-spacing-scale-10;
4699
+ }
4700
+ .gl-pr-10\! {
4701
+ padding-right: $gl-spacing-scale-10 !important;
4702
+ }
4669
4703
  .gl-pl-0 {
4670
4704
  padding-left: 0;
4671
4705
  }
@@ -4726,6 +4760,12 @@
4726
4760
  .gl-pl-9\! {
4727
4761
  padding-left: $gl-spacing-scale-9 !important;
4728
4762
  }
4763
+ .gl-pl-10 {
4764
+ padding-left: $gl-spacing-scale-10;
4765
+ }
4766
+ .gl-pl-10\! {
4767
+ padding-left: $gl-spacing-scale-10 !important;
4768
+ }
4729
4769
  .gl-pl-11 {
4730
4770
  padding-left: $gl-spacing-scale-11;
4731
4771
  }
@@ -5567,12 +5607,12 @@
5567
5607
  margin-right: -#{$gl-spacing-scale-6} !important;
5568
5608
  }
5569
5609
  .gl-gap-x-3 {
5570
- * + * {
5610
+ > * + * {
5571
5611
  margin-left: #{$gl-spacing-scale-3};
5572
5612
  }
5573
5613
  }
5574
5614
  .gl-gap-x-3\! {
5575
- * + * {
5615
+ > * + * {
5576
5616
  margin-left: #{$gl-spacing-scale-3} !important;
5577
5617
  }
5578
5618
  }
@@ -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;
@@ -19,6 +19,14 @@
19
19
  opacity: 0.5;
20
20
  }
21
21
 
22
+ @mixin gl-opacity-6 {
23
+ opacity: 0.6;
24
+ }
25
+
26
+ @mixin gl-opacity-7 {
27
+ opacity: 0.7;
28
+ }
29
+
22
30
  @mixin gl-opacity-10 {
23
31
  opacity: 1;
24
32
  }
@@ -134,6 +134,10 @@
134
134
  padding-right: $gl-spacing-scale-9;
135
135
  }
136
136
 
137
+ @mixin gl-pr-10 {
138
+ padding-right: $gl-spacing-scale-10;
139
+ }
140
+
137
141
  @mixin gl-pl-0 {
138
142
  padding-left: 0;
139
143
  }
@@ -174,6 +178,10 @@
174
178
  padding-left: $gl-spacing-scale-9;
175
179
  }
176
180
 
181
+ @mixin gl-pl-10 {
182
+ padding-left: $gl-spacing-scale-10;
183
+ }
184
+
177
185
  @mixin gl-pl-11 {
178
186
  padding-left: $gl-spacing-scale-11;
179
187
  }
@@ -742,7 +750,7 @@
742
750
  */
743
751
 
744
752
  @mixin gl-gap-x-3 {
745
- * + * {
753
+ > * + * {
746
754
  margin-left: #{$gl-spacing-scale-3};
747
755
  }
748
756
  }