design-system-dashboard-devmunity 0.1.0 → 0.2.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/CHANGELOG.md +9 -0
- package/app/assets/css/themes/components/modal.js +14 -0
- package/app/assets/css/themes/index.js +1 -0
- package/app/components/a/a-button-back.vue +3 -3
- package/app/components/b/card/b-card-header.vue +2 -13
- package/app/components/b/modal/b-modal.vue +47 -68
- package/app/components/c/modal/c-modal-danger.vue +67 -0
- package/app/components/d/d-action-buttons.vue +99 -0
- package/app/pages/test.vue +64 -8
- package/commitlint.config.js +8 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
# [0.2.0](https://github.com/vicventum/design-system-dashboard-devmunity/compare/v0.1.0...v0.2.0) (2025-11-14)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **components:** :sparkles: Crea componente BModal ([6218f3a](https://github.com/vicventum/design-system-dashboard-devmunity/commit/6218f3aeeeb0695b05c00c64da6c3212b07afa08))
|
|
7
|
+
* **components:** :sparkles: Crea componente CModalDanger ([1e3f7bb](https://github.com/vicventum/design-system-dashboard-devmunity/commit/1e3f7bb8778f970268b08043d70fef0fb0e7b10e))
|
|
8
|
+
* **components:** :sparkles: Crea componente DActionButtons ([f7725cb](https://github.com/vicventum/design-system-dashboard-devmunity/commit/f7725cb5812b77628981abfb351b64e086e190c4))
|
|
9
|
+
|
|
1
10
|
# [0.1.0](https://github.com/vicventum/design-system-dashboard-devmunity/compare/v0.0.6...v0.1.0) (2025-11-12)
|
|
2
11
|
|
|
3
12
|
|
|
@@ -10,10 +10,10 @@ const props = defineProps({
|
|
|
10
10
|
default: '',
|
|
11
11
|
required: false,
|
|
12
12
|
},
|
|
13
|
-
|
|
13
|
+
hasBackAction: {
|
|
14
14
|
type: Boolean,
|
|
15
15
|
default: false,
|
|
16
|
-
required:
|
|
16
|
+
required: false,
|
|
17
17
|
},
|
|
18
18
|
})
|
|
19
19
|
|
|
@@ -22,7 +22,7 @@ const router = useRouter()
|
|
|
22
22
|
|
|
23
23
|
function handleClickLeftButtonIcon() {
|
|
24
24
|
emit('on-click')
|
|
25
|
-
if (props.
|
|
25
|
+
if (props.hasBackAction && !props.to && props.icon.includes('arrow-left')) {
|
|
26
26
|
router.back()
|
|
27
27
|
}
|
|
28
28
|
}
|
|
@@ -12,21 +12,11 @@ const props = defineProps({
|
|
|
12
12
|
default: '',
|
|
13
13
|
required: false,
|
|
14
14
|
},
|
|
15
|
-
hasBorder: {
|
|
16
|
-
type: Boolean,
|
|
17
|
-
default: false,
|
|
18
|
-
required: false,
|
|
19
|
-
},
|
|
20
15
|
variant: {
|
|
21
16
|
type: String,
|
|
22
17
|
default: 'main', // main, secondary
|
|
23
18
|
required: false,
|
|
24
19
|
},
|
|
25
|
-
variantSubtitle: {
|
|
26
|
-
type: String,
|
|
27
|
-
default: 'main',
|
|
28
|
-
required: false,
|
|
29
|
-
},
|
|
30
20
|
hasLeftButtonIcon: {
|
|
31
21
|
type: Boolean,
|
|
32
22
|
default: false,
|
|
@@ -68,8 +58,7 @@ function handleClickLeftButtonIcon() {
|
|
|
68
58
|
<BCardInner
|
|
69
59
|
:class="[
|
|
70
60
|
'flex items-center justify-between',
|
|
71
|
-
{ 'bg-neutral-
|
|
72
|
-
{ 'border-y border-neutral-200': hasBorder && variant === 'secondary' },
|
|
61
|
+
{ 'bg-muted border-y border-neutral-200': variant === 'secondary' },
|
|
73
62
|
]"
|
|
74
63
|
>
|
|
75
64
|
<div class="space-y-1">
|
|
@@ -99,7 +88,7 @@ function handleClickLeftButtonIcon() {
|
|
|
99
88
|
v-if="subtitle"
|
|
100
89
|
class="text-sm font-medium"
|
|
101
90
|
:class="{
|
|
102
|
-
'text-
|
|
91
|
+
'text-dimmed': variant === 'secondary',
|
|
103
92
|
}"
|
|
104
93
|
>
|
|
105
94
|
{{ subtitle }}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script lang="
|
|
1
|
+
<script lang="jsx" setup>
|
|
2
2
|
import { resolveComponent } from 'vue'
|
|
3
3
|
import { twMerge } from 'tailwind-merge'
|
|
4
4
|
|
|
@@ -20,6 +20,11 @@ const props = defineProps({
|
|
|
20
20
|
default: '',
|
|
21
21
|
required: true,
|
|
22
22
|
},
|
|
23
|
+
description: {
|
|
24
|
+
type: String,
|
|
25
|
+
default: '',
|
|
26
|
+
required: true,
|
|
27
|
+
},
|
|
23
28
|
text: {
|
|
24
29
|
type: String,
|
|
25
30
|
default: '',
|
|
@@ -32,7 +37,7 @@ const props = defineProps({
|
|
|
32
37
|
},
|
|
33
38
|
primaryButtonColor: {
|
|
34
39
|
type: String,
|
|
35
|
-
default: '
|
|
40
|
+
default: 'primary',
|
|
36
41
|
required: true,
|
|
37
42
|
},
|
|
38
43
|
secondaryButtonText: {
|
|
@@ -45,34 +50,19 @@ const props = defineProps({
|
|
|
45
50
|
default: true,
|
|
46
51
|
required: false,
|
|
47
52
|
},
|
|
48
|
-
width: {
|
|
49
|
-
type: String,
|
|
50
|
-
default: '',
|
|
51
|
-
required: false,
|
|
52
|
-
},
|
|
53
|
-
widthButtons: {
|
|
54
|
-
type: String,
|
|
55
|
-
default: 'w-40',
|
|
56
|
-
required: false,
|
|
57
|
-
},
|
|
58
53
|
isPrimaryButtonDisabled: {
|
|
59
54
|
type: Boolean,
|
|
60
55
|
default: false,
|
|
61
56
|
required: false,
|
|
62
57
|
},
|
|
63
|
-
|
|
58
|
+
hasButtonsBlock: {
|
|
64
59
|
type: Boolean,
|
|
65
60
|
default: false,
|
|
66
61
|
required: false,
|
|
67
62
|
},
|
|
68
|
-
|
|
63
|
+
classButtons: {
|
|
69
64
|
type: String,
|
|
70
|
-
default: '
|
|
71
|
-
required: false,
|
|
72
|
-
},
|
|
73
|
-
hasBodyExpanded: {
|
|
74
|
-
type: Boolean,
|
|
75
|
-
default: false,
|
|
65
|
+
default: '',
|
|
76
66
|
required: false,
|
|
77
67
|
},
|
|
78
68
|
})
|
|
@@ -92,11 +82,18 @@ const formRef = defineModel('formRef', {
|
|
|
92
82
|
required: false,
|
|
93
83
|
})
|
|
94
84
|
|
|
95
|
-
//
|
|
85
|
+
// Computed
|
|
96
86
|
|
|
97
|
-
const uiStyles =
|
|
87
|
+
// const uiStyles = computed(() => {
|
|
88
|
+
// const baseStyles = {}
|
|
98
89
|
|
|
99
|
-
//
|
|
90
|
+
// // Apply width styles
|
|
91
|
+
// if (props.width) {
|
|
92
|
+
// baseStyles.width = `${props.width}`
|
|
93
|
+
// }
|
|
94
|
+
|
|
95
|
+
// return baseStyles
|
|
96
|
+
// })
|
|
100
97
|
|
|
101
98
|
const formProps = computed(() => {
|
|
102
99
|
// return props.data ? { ref: 'form', state: props.data, onSubmit: handleSubmit } : {}
|
|
@@ -115,55 +112,37 @@ function handleClickSecondaryButton() {
|
|
|
115
112
|
isOpen.value = false
|
|
116
113
|
emit('on-click-secondary-button')
|
|
117
114
|
}
|
|
118
|
-
|
|
119
|
-
// Watch
|
|
120
|
-
|
|
121
|
-
watch(
|
|
122
|
-
() => props.width,
|
|
123
|
-
(width) => {
|
|
124
|
-
if (!width) return null
|
|
125
|
-
|
|
126
|
-
Object.assign(uiStyles, { width: `${props.width}` })
|
|
127
|
-
},
|
|
128
|
-
{ immediate: true }
|
|
129
|
-
)
|
|
130
115
|
</script>
|
|
131
116
|
|
|
132
117
|
<template>
|
|
133
|
-
<UModal v-model="isOpen" :
|
|
134
|
-
<
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
</template>
|
|
142
|
-
</BCardHeader>
|
|
143
|
-
</template>
|
|
144
|
-
|
|
145
|
-
<BCardInner v-if="text" class="p-6">
|
|
118
|
+
<UModal v-model:open="isOpen" :title="title" :description="description">
|
|
119
|
+
<template #header>
|
|
120
|
+
<slot v-if="$slots.header" name="header" />
|
|
121
|
+
</template>
|
|
122
|
+
|
|
123
|
+
<template #body>
|
|
124
|
+
<component :is="state ? UForm : 'section'" v-bind="formProps" @submit="handleSubmit">
|
|
125
|
+
<p v-if="text">
|
|
146
126
|
{{ text }}
|
|
147
|
-
</
|
|
127
|
+
</p>
|
|
148
128
|
<slot v-else />
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
</component>
|
|
129
|
+
</component>
|
|
130
|
+
</template>
|
|
131
|
+
|
|
132
|
+
<template v-if="hasFooter" #footer>
|
|
133
|
+
<slot v-if="$slots.footer" name="footer" />
|
|
134
|
+
<DActionButtons
|
|
135
|
+
v-else
|
|
136
|
+
:primary-button-color="primaryButtonColor"
|
|
137
|
+
:primary-button-text="primaryButtonText"
|
|
138
|
+
:secondary-button-text="secondaryButtonText"
|
|
139
|
+
:is-buttons-block="hasButtonsBlock"
|
|
140
|
+
:is-primary-button-disabled="isPrimaryButtonDisabled"
|
|
141
|
+
:class="twMerge('flex w-full justify-end gap-x-2', classButtons)"
|
|
142
|
+
class-buttons="w-40"
|
|
143
|
+
@on-click-primary-button="handleClickPrimaryButton"
|
|
144
|
+
@on-click-secondary-button="handleClickSecondaryButton"
|
|
145
|
+
/>
|
|
146
|
+
</template>
|
|
168
147
|
</UModal>
|
|
169
148
|
</template>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<script lang="jsx" setup>
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
state: {
|
|
4
|
+
type: Object,
|
|
5
|
+
default: null,
|
|
6
|
+
required: false,
|
|
7
|
+
},
|
|
8
|
+
schema: {
|
|
9
|
+
type: Object,
|
|
10
|
+
default: null,
|
|
11
|
+
required: false,
|
|
12
|
+
},
|
|
13
|
+
title: {
|
|
14
|
+
type: String,
|
|
15
|
+
default: '',
|
|
16
|
+
required: true,
|
|
17
|
+
},
|
|
18
|
+
description: {
|
|
19
|
+
type: String,
|
|
20
|
+
default: '',
|
|
21
|
+
required: true,
|
|
22
|
+
},
|
|
23
|
+
text: {
|
|
24
|
+
type: String,
|
|
25
|
+
default: '',
|
|
26
|
+
required: false,
|
|
27
|
+
},
|
|
28
|
+
primaryButtonText: {
|
|
29
|
+
type: String,
|
|
30
|
+
default: 'Eliminar',
|
|
31
|
+
required: false,
|
|
32
|
+
},
|
|
33
|
+
secondaryButtonText: {
|
|
34
|
+
type: String,
|
|
35
|
+
default: 'Cancelar',
|
|
36
|
+
required: false,
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const emit = defineEmits(['on-click-primary-button', 'on-click-secondary-button'])
|
|
41
|
+
|
|
42
|
+
// Model
|
|
43
|
+
|
|
44
|
+
const isOpen = defineModel({
|
|
45
|
+
type: Boolean,
|
|
46
|
+
default: false,
|
|
47
|
+
required: true,
|
|
48
|
+
})
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<template>
|
|
52
|
+
<BModal
|
|
53
|
+
v-model="isOpen"
|
|
54
|
+
:title="title"
|
|
55
|
+
:text="text"
|
|
56
|
+
:primary-button-text="primaryButtonText"
|
|
57
|
+
:secondary-button-text="secondaryButtonText"
|
|
58
|
+
:state="state"
|
|
59
|
+
:schema="schema"
|
|
60
|
+
primary-button-color="error"
|
|
61
|
+
is-block-buttons
|
|
62
|
+
@on-click-primary-button="emit('on-click-primary-button')"
|
|
63
|
+
@on-click-secondary-button="emit('on-click-secondary-button')"
|
|
64
|
+
>
|
|
65
|
+
<slot v-if="!text" />
|
|
66
|
+
</BModal>
|
|
67
|
+
</template>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<script lang="jsx" setup>
|
|
2
|
+
import { twMerge } from 'tailwind-merge'
|
|
3
|
+
|
|
4
|
+
const props = defineProps({
|
|
5
|
+
class: {
|
|
6
|
+
type: [String, Object, Array],
|
|
7
|
+
default: () => '',
|
|
8
|
+
required: false,
|
|
9
|
+
},
|
|
10
|
+
classButtons: {
|
|
11
|
+
type: [String, Object, Array],
|
|
12
|
+
default: () => '',
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
primaryButtonText: {
|
|
16
|
+
type: String,
|
|
17
|
+
default: '',
|
|
18
|
+
required: false,
|
|
19
|
+
},
|
|
20
|
+
primaryButtonIcon: {
|
|
21
|
+
type: String,
|
|
22
|
+
default: '',
|
|
23
|
+
required: false,
|
|
24
|
+
},
|
|
25
|
+
primaryButtonTo: {
|
|
26
|
+
type: String,
|
|
27
|
+
default: '',
|
|
28
|
+
required: false,
|
|
29
|
+
},
|
|
30
|
+
primaryButtonColor: {
|
|
31
|
+
type: String,
|
|
32
|
+
default: 'primary',
|
|
33
|
+
required: false,
|
|
34
|
+
},
|
|
35
|
+
secondaryButtonText: {
|
|
36
|
+
type: String,
|
|
37
|
+
default: '',
|
|
38
|
+
required: false,
|
|
39
|
+
},
|
|
40
|
+
secondaryButtonTo: {
|
|
41
|
+
type: String,
|
|
42
|
+
default: '',
|
|
43
|
+
required: false,
|
|
44
|
+
},
|
|
45
|
+
hasButtonsBlock: {
|
|
46
|
+
type: Boolean,
|
|
47
|
+
default: false,
|
|
48
|
+
required: false,
|
|
49
|
+
},
|
|
50
|
+
isReverse: {
|
|
51
|
+
type: Boolean,
|
|
52
|
+
default: false,
|
|
53
|
+
required: false,
|
|
54
|
+
},
|
|
55
|
+
isPrimaryButtonDisabled: {
|
|
56
|
+
type: Boolean,
|
|
57
|
+
default: false,
|
|
58
|
+
required: false,
|
|
59
|
+
},
|
|
60
|
+
isSecondaryButtonDisabled: {
|
|
61
|
+
type: Boolean,
|
|
62
|
+
default: false,
|
|
63
|
+
required: false,
|
|
64
|
+
},
|
|
65
|
+
})
|
|
66
|
+
const emit = defineEmits(['on-click-primary-button', 'on-click-secondary-button'])
|
|
67
|
+
|
|
68
|
+
const classCard = computed(() => twMerge('flex gap-x-4', props.class, props.isReverse && 'flex-row-reverse'))
|
|
69
|
+
const classButtonsComputed = computed(() =>
|
|
70
|
+
twMerge('justify-center w-[150px]', props.hasButtonsBlock && 'flex-auto', props.classButtons)
|
|
71
|
+
)
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<template>
|
|
75
|
+
<footer :class="classCard">
|
|
76
|
+
<UButton
|
|
77
|
+
v-if="secondaryButtonText"
|
|
78
|
+
:to="secondaryButtonTo"
|
|
79
|
+
:label="secondaryButtonText"
|
|
80
|
+
:disabled="isSecondaryButtonDisabled"
|
|
81
|
+
:class="classButtonsComputed"
|
|
82
|
+
variant="outline"
|
|
83
|
+
color="neutral"
|
|
84
|
+
@click="$emit('on-click-secondary-button')"
|
|
85
|
+
/>
|
|
86
|
+
<UButton
|
|
87
|
+
v-if="primaryButtonText"
|
|
88
|
+
:label="primaryButtonText"
|
|
89
|
+
:to="primaryButtonTo"
|
|
90
|
+
:icon="primaryButtonIcon"
|
|
91
|
+
:color="primaryButtonColor"
|
|
92
|
+
:disabled="isPrimaryButtonDisabled"
|
|
93
|
+
:class="classButtonsComputed"
|
|
94
|
+
type="submit"
|
|
95
|
+
trailing
|
|
96
|
+
@click="$emit('on-click-primary-button')"
|
|
97
|
+
/>
|
|
98
|
+
</footer>
|
|
99
|
+
</template>
|
package/app/pages/test.vue
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
<script lang="
|
|
1
|
+
<script lang="jsx" setup>
|
|
2
|
+
import { CModalDanger } from '#components'
|
|
3
|
+
|
|
4
|
+
const modelIsOpenModal = ref(false)
|
|
5
|
+
const overlay = useOverlay()
|
|
6
|
+
|
|
7
|
+
// Abriendo modal de forma programática (mientras no sea necesario pasar slots)
|
|
8
|
+
const modalDanger = overlay.create(CModalDanger)
|
|
9
|
+
</script>
|
|
2
10
|
|
|
3
11
|
<template>
|
|
4
12
|
<div class="h-screen">
|
|
@@ -23,7 +31,12 @@
|
|
|
23
31
|
<template #header>
|
|
24
32
|
<BCardHeader title="Crear una nueva actividad" subtitle="Subtitle" has-left-button-icon>
|
|
25
33
|
<template #actions>
|
|
26
|
-
<
|
|
34
|
+
<DActionButtons
|
|
35
|
+
primary-button-text="Guardar"
|
|
36
|
+
secondary-button-text="Cancelar"
|
|
37
|
+
secondary-button-icon="heroicons:pencil"
|
|
38
|
+
is-block-buttons
|
|
39
|
+
/>
|
|
27
40
|
</template>
|
|
28
41
|
</BCardHeader>
|
|
29
42
|
</template>
|
|
@@ -38,22 +51,65 @@
|
|
|
38
51
|
title="Crear una nueva actividad"
|
|
39
52
|
subtitle="Subtitle"
|
|
40
53
|
variant="secondary"
|
|
41
|
-
variant-subtitle="secondary"
|
|
42
54
|
class="my-6"
|
|
43
55
|
class-title=""
|
|
44
|
-
has-border
|
|
45
56
|
>
|
|
46
57
|
<template #actions>
|
|
47
58
|
<UButton label="Action" />
|
|
48
59
|
</template>
|
|
49
60
|
</BCardHeader>
|
|
50
61
|
|
|
51
|
-
<BCardInner>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
<BCardInner class="space-y-2">
|
|
63
|
+
<p>
|
|
64
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Adipisci eos perspiciatis
|
|
65
|
+
asperiores suscipit voluptate magni excepturi. Doloribus in fugit quam voluptatibus,
|
|
66
|
+
molestiae maxime illum explicabo ut corrupti, distinctio atque dolor.
|
|
67
|
+
</p>
|
|
68
|
+
|
|
69
|
+
<DActionButtons
|
|
70
|
+
primary-button-text="Guardar"
|
|
71
|
+
secondary-button-text="Cancelar"
|
|
72
|
+
secondary-button-icon="heroicons:pencil"
|
|
73
|
+
class-buttons="w-[200px]"
|
|
74
|
+
has-buttons-block
|
|
75
|
+
/>
|
|
55
76
|
</BCardInner>
|
|
56
77
|
</BCard>
|
|
78
|
+
|
|
79
|
+
<hr class="my-6" />
|
|
80
|
+
|
|
81
|
+
<UButton label="Open modal" @click="modelIsOpenModal = !modelIsOpenModal" />
|
|
82
|
+
<!-- <UButton label="Open modal danger" @click="modelIsOpenModalDanger = !modelIsOpenModalDanger" /> -->
|
|
83
|
+
<UButton
|
|
84
|
+
label="Open modal danger"
|
|
85
|
+
color="error"
|
|
86
|
+
@click="
|
|
87
|
+
modalDanger.open({
|
|
88
|
+
title: 'Title Danger',
|
|
89
|
+
text: 'Lorem ipsum, dolor sit amet consectetur adipisicing elit. Qui aut exercitationem necessitatibus, perspiciatis vel suscipit nam. Facilis, placeat! Dicta quo eveniet rerum officiis quibusdam laborum error necessitatibus sequi itaque praesentium.',
|
|
90
|
+
onOnClickSecondaryButton: () => {
|
|
91
|
+
modalDanger.close()
|
|
92
|
+
},
|
|
93
|
+
})
|
|
94
|
+
"
|
|
95
|
+
/>
|
|
96
|
+
|
|
97
|
+
<BModal
|
|
98
|
+
v-model="modelIsOpenModal"
|
|
99
|
+
title="Marcar como completada"
|
|
100
|
+
class-button="justify-end"
|
|
101
|
+
class="w-[700px]"
|
|
102
|
+
>
|
|
103
|
+
<!-- <template #header> header </template> -->
|
|
104
|
+
|
|
105
|
+
<p class="h-screen">
|
|
106
|
+
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam pariatur, suscipit
|
|
107
|
+
veritatis delectus architecto hic non quidem ducimus, cum ex alias obcaecati enim maiores
|
|
108
|
+
animi nesciunt, perferendis commodi in quae.
|
|
109
|
+
</p>
|
|
110
|
+
|
|
111
|
+
<!-- <template #footer> footer </template> -->
|
|
112
|
+
</BModal>
|
|
57
113
|
</UContainer>
|
|
58
114
|
</div>
|
|
59
115
|
</template>
|
package/commitlint.config.js
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
export default {
|
|
1
|
+
export default {
|
|
2
|
+
extends: ['@commitlint/config-conventional'],
|
|
3
|
+
rules: {
|
|
4
|
+
// 'body-max-line-length': [0],
|
|
5
|
+
'body-max-line-length': [2, 'always', 500],
|
|
6
|
+
'header-max-length': [2, 'always', 120],
|
|
7
|
+
},
|
|
8
|
+
}
|