@gitlab/ui 123.12.0 → 124.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.
- package/dist/components/base/alert/alert.js +8 -2
- package/dist/components/base/form/form_fields/form_fields.js +20 -5
- package/dist/components/base/form/form_fields/form_fields_loop.js +75 -0
- package/dist/components/base/pagination/pagination.js +3 -8
- package/dist/index.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/tokens/build/js/tokens.dark.js +17 -1
- package/dist/tokens/build/js/tokens.js +17 -1
- package/dist/tokens/css/tokens.css +20 -4
- package/dist/tokens/css/tokens.dark.css +20 -4
- package/dist/tokens/docs/tokens-tailwind-docs.dark.json +515 -3
- package/dist/tokens/docs/tokens-tailwind-docs.json +515 -3
- package/dist/tokens/figma/constants.tokens.json +203 -4
- package/dist/tokens/js/tokens.dark.js +20 -0
- package/dist/tokens/js/tokens.js +20 -0
- package/dist/tokens/json/tokens.dark.json +499 -3
- package/dist/tokens/json/tokens.json +499 -3
- package/dist/tokens/scss/_tokens.dark.scss +20 -4
- package/dist/tokens/scss/_tokens.scss +20 -4
- package/dist/tokens/scss/_tokens_custom_properties.scss +16 -0
- package/dist/tokens/tailwind/tokens.cjs +110 -531
- package/package.json +1 -1
- package/src/components/base/alert/alert.vue +10 -2
- package/src/components/base/form/form_fields/form_fields.vue +20 -5
- package/src/components/base/form/form_fields/form_fields_loop.vue +44 -0
- package/src/components/base/pagination/pagination.vue +0 -8
- package/src/tokens/build/css/tokens.css +20 -4
- package/src/tokens/build/css/tokens.dark.css +20 -4
- package/src/tokens/build/docs/tokens-tailwind-docs.dark.json +515 -3
- package/src/tokens/build/docs/tokens-tailwind-docs.json +515 -3
- package/src/tokens/build/figma/constants.tokens.json +203 -4
- package/src/tokens/build/js/tokens.dark.js +16 -0
- package/src/tokens/build/js/tokens.js +16 -0
- package/src/tokens/build/json/tokens.dark.json +499 -3
- package/src/tokens/build/json/tokens.json +499 -3
- package/src/tokens/build/scss/_tokens.dark.scss +20 -4
- package/src/tokens/build/scss/_tokens.scss +20 -4
- package/src/tokens/build/scss/_tokens_custom_properties.scss +16 -0
- package/src/tokens/build/tailwind/tokens.cjs +16 -0
- package/src/tokens/constant/font.tokens.json +203 -4
package/package.json
CHANGED
|
@@ -90,7 +90,13 @@ export default {
|
|
|
90
90
|
required: false,
|
|
91
91
|
default: false,
|
|
92
92
|
},
|
|
93
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Set the aria-live attribute on the alert.
|
|
95
|
+
*
|
|
96
|
+
* Only set to 'assertive' if alert requires immediate user action.
|
|
97
|
+
* Otherwise, rely on the default value.
|
|
98
|
+
*
|
|
99
|
+
*/
|
|
94
100
|
politeness: {
|
|
95
101
|
type: String,
|
|
96
102
|
required: false,
|
|
@@ -196,6 +202,8 @@ export default {
|
|
|
196
202
|
|
|
197
203
|
<template>
|
|
198
204
|
<div
|
|
205
|
+
:role="role"
|
|
206
|
+
:aria-live="politeness"
|
|
199
207
|
:class="[
|
|
200
208
|
'gl-alert',
|
|
201
209
|
{ 'gl-alert-sticky': sticky },
|
|
@@ -208,7 +216,7 @@ export default {
|
|
|
208
216
|
<div v-if="showIcon" class="gl-alert-icon-container">
|
|
209
217
|
<gl-icon :name="iconName" class="gl-alert-icon" />
|
|
210
218
|
</div>
|
|
211
|
-
<div class="gl-alert-content"
|
|
219
|
+
<div class="gl-alert-content">
|
|
212
220
|
<h2 v-if="title" class="gl-alert-title">{{ title }}</h2>
|
|
213
221
|
|
|
214
222
|
<div class="gl-alert-body">
|
|
@@ -6,6 +6,7 @@ import GlFormGroup from '../form_group/form_group.vue';
|
|
|
6
6
|
import GlFormInput from '../form_input/form_input.vue';
|
|
7
7
|
import { setObjectProperty } from '../../../../utils/set_utils';
|
|
8
8
|
import GlFormFieldValidator from './form_field_validator.vue';
|
|
9
|
+
import GlFormFieldsLoop from './form_fields_loop.vue';
|
|
9
10
|
|
|
10
11
|
export default {
|
|
11
12
|
name: 'GlFormFields',
|
|
@@ -13,6 +14,7 @@ export default {
|
|
|
13
14
|
GlFormGroup,
|
|
14
15
|
GlFormInput,
|
|
15
16
|
GlFormFieldValidator,
|
|
17
|
+
GlFormFieldsLoop,
|
|
16
18
|
},
|
|
17
19
|
model: {
|
|
18
20
|
prop: 'values',
|
|
@@ -67,6 +69,7 @@ export default {
|
|
|
67
69
|
return {
|
|
68
70
|
fieldDirtyStatuses: {},
|
|
69
71
|
fieldValidations: {},
|
|
72
|
+
fieldIds: {},
|
|
70
73
|
};
|
|
71
74
|
},
|
|
72
75
|
computed: {
|
|
@@ -98,7 +101,7 @@ export default {
|
|
|
98
101
|
},
|
|
99
102
|
fieldsToRender() {
|
|
100
103
|
return mapValues(this.fields, (field, fieldName) => {
|
|
101
|
-
const id =
|
|
104
|
+
const id = this.memoizeAndReturnFieldId(field, fieldName);
|
|
102
105
|
|
|
103
106
|
const inputSlotName = `input(${fieldName})`;
|
|
104
107
|
const groupPassthroughSlotName = `group(${fieldName})-`;
|
|
@@ -173,6 +176,18 @@ export default {
|
|
|
173
176
|
|
|
174
177
|
return val;
|
|
175
178
|
},
|
|
179
|
+
memoizeAndReturnFieldId(field, fieldName) {
|
|
180
|
+
const memoizedId = this.fieldIds[fieldName];
|
|
181
|
+
|
|
182
|
+
if (memoizedId) {
|
|
183
|
+
return memoizedId;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const id = field.id || uniqueId('gl-form-field-');
|
|
187
|
+
this.fieldIds[fieldName] = id;
|
|
188
|
+
|
|
189
|
+
return id;
|
|
190
|
+
},
|
|
176
191
|
onFieldValidationUpdate(fieldName, invalidFeedback) {
|
|
177
192
|
this.fieldValidations = setObjectProperty(this.fieldValidations, fieldName, invalidFeedback);
|
|
178
193
|
|
|
@@ -220,11 +235,11 @@ export default {
|
|
|
220
235
|
</script>
|
|
221
236
|
|
|
222
237
|
<template>
|
|
223
|
-
<
|
|
224
|
-
<template
|
|
225
|
-
<!-- eslint-disable-next-line vue/valid-v-for -->
|
|
238
|
+
<gl-form-fields-loop :fields="fieldsToRender">
|
|
239
|
+
<template #default="{ field, fieldName }">
|
|
226
240
|
<gl-form-group
|
|
227
241
|
v-bind="field.groupAttrs"
|
|
242
|
+
:key="field.id"
|
|
228
243
|
:label="field.label"
|
|
229
244
|
:label-for="field.id"
|
|
230
245
|
:invalid-feedback="fieldValidationProps[fieldName].invalidFeedback"
|
|
@@ -259,5 +274,5 @@ export default {
|
|
|
259
274
|
<!-- @slot Can be used to add content the form group of a field. The name of the slot is `after(<fieldName>)`.-->
|
|
260
275
|
<slot :name="field.afterSlotName"></slot>
|
|
261
276
|
</template>
|
|
262
|
-
</
|
|
277
|
+
</gl-form-fields-loop>
|
|
263
278
|
</template>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Vue from 'vue';
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
name: 'GlFormFieldsLoop',
|
|
6
|
+
props: {
|
|
7
|
+
fields: {
|
|
8
|
+
type: Object,
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
render(createElement) {
|
|
13
|
+
const { Fragment } = Vue;
|
|
14
|
+
|
|
15
|
+
// Vue 3, key goes on `Fragment` (<template> element)
|
|
16
|
+
if (Fragment) {
|
|
17
|
+
return createElement(
|
|
18
|
+
'div',
|
|
19
|
+
Object.entries(this.fields).map(([fieldName, field]) =>
|
|
20
|
+
createElement(
|
|
21
|
+
Fragment,
|
|
22
|
+
{ key: field.id },
|
|
23
|
+
this.$scopedSlots.default({
|
|
24
|
+
fieldName,
|
|
25
|
+
field,
|
|
26
|
+
}),
|
|
27
|
+
),
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Vue 2, key goes on element (rendered via default slot)
|
|
33
|
+
return createElement(
|
|
34
|
+
'div',
|
|
35
|
+
Object.entries(this.fields).map(([fieldName, field]) =>
|
|
36
|
+
this.$scopedSlots.default({
|
|
37
|
+
fieldName,
|
|
38
|
+
field,
|
|
39
|
+
}),
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
</script>
|
|
@@ -168,11 +168,6 @@ export default {
|
|
|
168
168
|
default: alignOptions.left,
|
|
169
169
|
validator: (value) => Object.keys(alignOptions).includes(value),
|
|
170
170
|
},
|
|
171
|
-
disabled: {
|
|
172
|
-
type: Boolean,
|
|
173
|
-
required: false,
|
|
174
|
-
default: false,
|
|
175
|
-
},
|
|
176
171
|
},
|
|
177
172
|
data() {
|
|
178
173
|
return {
|
|
@@ -312,7 +307,6 @@ export default {
|
|
|
312
307
|
},
|
|
313
308
|
pageIsDisabled(page) {
|
|
314
309
|
return (
|
|
315
|
-
this.disabled ||
|
|
316
310
|
page < 1 ||
|
|
317
311
|
(this.isCompactPagination && page > this.value && !this.nextPage) ||
|
|
318
312
|
(!this.isCompactPagination && page > this.totalPages)
|
|
@@ -399,7 +393,6 @@ export default {
|
|
|
399
393
|
<nav v-if="isVisible" class="gl-pagination" :aria-label="labelNav">
|
|
400
394
|
<ul :class="wrapperClasses">
|
|
401
395
|
<li
|
|
402
|
-
:aria-disabled="prevPageIsDisabled"
|
|
403
396
|
:aria-hidden="prevPageIsDisabled"
|
|
404
397
|
:class="{
|
|
405
398
|
disabled: prevPageIsDisabled,
|
|
@@ -465,7 +458,6 @@ export default {
|
|
|
465
458
|
</li>
|
|
466
459
|
|
|
467
460
|
<li
|
|
468
|
-
:aria-disabled="nextPageIsDisabled"
|
|
469
461
|
:aria-hidden="nextPageIsDisabled"
|
|
470
462
|
:class="{
|
|
471
463
|
disabled: nextPageIsDisabled,
|
|
@@ -232,10 +232,23 @@
|
|
|
232
232
|
--gl-color-brand-pink-01g: #ffb9c9;
|
|
233
233
|
--gl-font-family-regular: var(--default-regular-font, 'GitLab Sans'),-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Noto Sans',Ubuntu,Cantarell,'Helvetica Neue',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji';
|
|
234
234
|
--gl-font-family-monospace: var(--default-mono-font, 'GitLab Mono'),'JetBrains Mono',Menlo,'DejaVu Sans Mono','Liberation Mono',Consolas,'Ubuntu Mono','Courier New','andale mono','lucida console',monospace;
|
|
235
|
+
--gl-font-size-100: 0.75rem; /** Used for meta text and small labels. */
|
|
236
|
+
--gl-font-size-200: 0.8125rem; /** Used for level 6 headings. */
|
|
237
|
+
--gl-font-size-300: 0.875rem; /** Used for level 5 headings, body text, input labels, and help text. */
|
|
238
|
+
--gl-font-size-400: 1rem; /** Used for level 4 headings, large body text. */
|
|
239
|
+
--gl-font-size-500: clamp(1.125rem, 0.9027777778rem + 0.462962963vw, 1.25rem); /** Used for responsive level 3 headings. */
|
|
240
|
+
--gl-font-size-600: clamp(1.3125rem, 0.8680555556rem + 0.9259259259vw, 1.5625rem); /** Used for responsive level 2 headings. */
|
|
241
|
+
--gl-font-size-700: clamp(1.5rem, 0.8333333333rem + 1.3888888889vw, 1.875rem); /** Used for responsive level 1 headings */
|
|
242
|
+
--gl-font-size-800: clamp(1.75rem, 0.8611111111rem + 1.8518518519vw, 2.25rem); /** Used for a responsive display option that can be applied to a level 1 heading to increase its prominence. */
|
|
235
243
|
--gl-font-size-xs: 0.625rem;
|
|
236
|
-
--gl-font-size-
|
|
237
|
-
--gl-font-size-
|
|
238
|
-
--gl-font-size-
|
|
244
|
+
--gl-font-size-100-fixed: 0.75rem; /** Used for meta text and small labels. */
|
|
245
|
+
--gl-font-size-200-fixed: 0.8125rem; /** Used for level 6 headings. */
|
|
246
|
+
--gl-font-size-300-fixed: 0.875rem; /** Used for level 5 headings, body text, input labels, and help text. */
|
|
247
|
+
--gl-font-size-400-fixed: 1rem; /** Used for level 4 headings, large body text. */
|
|
248
|
+
--gl-font-size-500-fixed: 1.125rem; /** Used for level 3 headings. */
|
|
249
|
+
--gl-font-size-600-fixed: 1.3125rem; /** Used for level 2 headings. */
|
|
250
|
+
--gl-font-size-700-fixed: 1.5rem; /** Used for level 1 headings */
|
|
251
|
+
--gl-font-size-800-fixed: 1.75rem; /** Used for a display option that can be applied to a level 1 heading to increase its prominence. */
|
|
239
252
|
--gl-font-weight-100: 100;
|
|
240
253
|
--gl-font-weight-300: 300;
|
|
241
254
|
--gl-font-weight-normal: 400;
|
|
@@ -584,7 +597,9 @@
|
|
|
584
597
|
--gl-border-radius-xl: var(--gl-spacing-scale-4);
|
|
585
598
|
--gl-border-radius-2xl: var(--gl-spacing-scale-5);
|
|
586
599
|
--gl-border-radius-3xl: var(--gl-spacing-scale-6);
|
|
587
|
-
--gl-font-size-
|
|
600
|
+
--gl-font-size-sm: var(--gl-font-size-100);
|
|
601
|
+
--gl-font-size-md: var(--gl-font-size-300);
|
|
602
|
+
--gl-font-size-lg: var(--gl-font-size-400);
|
|
588
603
|
--gl-shadow-color-default: var(--gl-color-alpha-dark-16); /** Used for the default shadow color. */
|
|
589
604
|
--gl-alert-neutral-border-top-color: var(--gl-color-alpha-0); /** Used for the border center color of a neutral alert. */
|
|
590
605
|
--gl-alert-neutral-border-bottom-color: var(--gl-color-alpha-0); /** Used for the border bottom color of a neutral alert. */
|
|
@@ -938,6 +953,7 @@
|
|
|
938
953
|
--gl-text-color-disabled: var(--gl-color-neutral-400); /** Used for disabled text. */
|
|
939
954
|
--gl-border-color-section: var(--gl-border-color-default); /** Used for the border color that surrounds content or elements when they appear as a closed container or closed section of the page. */
|
|
940
955
|
--gl-border-radius-default: var(--gl-border-radius-md);
|
|
956
|
+
--gl-font-size-base: var(--gl-font-size-md);
|
|
941
957
|
--gl-shadow-sm: 0 0 2px var(--gl-shadow-color-default), 0 1px 4px var(--gl-shadow-color-default); /** Used for surfaces that need to indicate users can manually interact with them. For example, cards in issue board. */
|
|
942
958
|
--gl-shadow-md: 0 0 1px var(--gl-shadow-color-default), 0 0 2px var(--gl-shadow-color-default), 0 2px 8px var(--gl-shadow-color-default); /** Used for surfaces that need boundary definition and appear on hover. For example, popovers. */
|
|
943
959
|
--gl-shadow-lg: 0 0 2px var(--gl-shadow-color-default), 0 0 2px var(--gl-shadow-color-default), 0 4px 12px var(--gl-shadow-color-default); /** Used for large surfaces that present additional context to the user. */
|
|
@@ -232,10 +232,23 @@
|
|
|
232
232
|
--gl-color-brand-pink-01g: #ffb9c9;
|
|
233
233
|
--gl-font-family-regular: var(--default-regular-font, 'GitLab Sans'),-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Noto Sans',Ubuntu,Cantarell,'Helvetica Neue',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol','Noto Color Emoji';
|
|
234
234
|
--gl-font-family-monospace: var(--default-mono-font, 'GitLab Mono'),'JetBrains Mono',Menlo,'DejaVu Sans Mono','Liberation Mono',Consolas,'Ubuntu Mono','Courier New','andale mono','lucida console',monospace;
|
|
235
|
+
--gl-font-size-100: 0.75rem; /** Used for meta text and small labels. */
|
|
236
|
+
--gl-font-size-200: 0.8125rem; /** Used for level 6 headings. */
|
|
237
|
+
--gl-font-size-300: 0.875rem; /** Used for level 5 headings, body text, input labels, and help text. */
|
|
238
|
+
--gl-font-size-400: 1rem; /** Used for level 4 headings, large body text. */
|
|
239
|
+
--gl-font-size-500: clamp(1.125rem, 0.9027777778rem + 0.462962963vw, 1.25rem); /** Used for responsive level 3 headings. */
|
|
240
|
+
--gl-font-size-600: clamp(1.3125rem, 0.8680555556rem + 0.9259259259vw, 1.5625rem); /** Used for responsive level 2 headings. */
|
|
241
|
+
--gl-font-size-700: clamp(1.5rem, 0.8333333333rem + 1.3888888889vw, 1.875rem); /** Used for responsive level 1 headings */
|
|
242
|
+
--gl-font-size-800: clamp(1.75rem, 0.8611111111rem + 1.8518518519vw, 2.25rem); /** Used for a responsive display option that can be applied to a level 1 heading to increase its prominence. */
|
|
235
243
|
--gl-font-size-xs: 0.625rem;
|
|
236
|
-
--gl-font-size-
|
|
237
|
-
--gl-font-size-
|
|
238
|
-
--gl-font-size-
|
|
244
|
+
--gl-font-size-100-fixed: 0.75rem; /** Used for meta text and small labels. */
|
|
245
|
+
--gl-font-size-200-fixed: 0.8125rem; /** Used for level 6 headings. */
|
|
246
|
+
--gl-font-size-300-fixed: 0.875rem; /** Used for level 5 headings, body text, input labels, and help text. */
|
|
247
|
+
--gl-font-size-400-fixed: 1rem; /** Used for level 4 headings, large body text. */
|
|
248
|
+
--gl-font-size-500-fixed: 1.125rem; /** Used for level 3 headings. */
|
|
249
|
+
--gl-font-size-600-fixed: 1.3125rem; /** Used for level 2 headings. */
|
|
250
|
+
--gl-font-size-700-fixed: 1.5rem; /** Used for level 1 headings */
|
|
251
|
+
--gl-font-size-800-fixed: 1.75rem; /** Used for a display option that can be applied to a level 1 heading to increase its prominence. */
|
|
239
252
|
--gl-font-weight-100: 100;
|
|
240
253
|
--gl-font-weight-300: 300;
|
|
241
254
|
--gl-font-weight-normal: 400;
|
|
@@ -595,7 +608,9 @@
|
|
|
595
608
|
--gl-border-radius-xl: var(--gl-spacing-scale-4);
|
|
596
609
|
--gl-border-radius-2xl: var(--gl-spacing-scale-5);
|
|
597
610
|
--gl-border-radius-3xl: var(--gl-spacing-scale-6);
|
|
598
|
-
--gl-font-size-
|
|
611
|
+
--gl-font-size-sm: var(--gl-font-size-100);
|
|
612
|
+
--gl-font-size-md: var(--gl-font-size-300);
|
|
613
|
+
--gl-font-size-lg: var(--gl-font-size-400);
|
|
599
614
|
--gl-shadow-color-default: var(--gl-color-alpha-dark-40); /** Used for the default shadow color. */
|
|
600
615
|
--gl-alert-neutral-border-top-color: var(--gl-color-neutral-400); /** Used for the border center color of a neutral alert. */
|
|
601
616
|
--gl-alert-neutral-border-bottom-color: var(--gl-color-alpha-0); /** Used for the border bottom color of a neutral alert. */
|
|
@@ -955,6 +970,7 @@
|
|
|
955
970
|
--gl-text-color-disabled: var(--gl-color-neutral-400); /** Used for disabled text. */
|
|
956
971
|
--gl-border-color-section: var(--gl-background-color-default); /** Used for the border color that surrounds content or elements when they appear as a closed container or closed section of the page. */
|
|
957
972
|
--gl-border-radius-default: var(--gl-border-radius-md);
|
|
973
|
+
--gl-font-size-base: var(--gl-font-size-md);
|
|
958
974
|
--gl-shadow-sm: 0 0 2px var(--gl-shadow-color-default), 0 1px 4px var(--gl-shadow-color-default); /** Used for surfaces that need to indicate users can manually interact with them. For example, cards in issue board. */
|
|
959
975
|
--gl-shadow-md: 0 0 1px var(--gl-shadow-color-default), 0 0 2px var(--gl-shadow-color-default), 0 2px 8px var(--gl-shadow-color-default); /** Used for surfaces that need boundary definition and appear on hover. For example, popovers. */
|
|
960
976
|
--gl-shadow-lg: 0 0 2px var(--gl-shadow-color-default), 0 0 2px var(--gl-shadow-color-default), 0 4px 12px var(--gl-shadow-color-default); /** Used for large surfaces that present additional context to the user. */
|