@energie360/ui-library 0.1.16 → 0.1.18
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/components/badge/badge.scss +56 -0
- package/components/badge/u-badge.vue +47 -0
- package/components/card-contact/card-contact.scss +39 -0
- package/components/card-contact/u-card-contact.vue +44 -0
- package/components/card-cta-bar/card-cta-bar.scss +4 -0
- package/components/card-cta-bar/u-card-cta-bar.vue +24 -0
- package/components/card-cta-header/u-card-cta-header.vue +10 -7
- package/components/card-footer/u-card-footer.vue +5 -3
- package/components/card-group/u-card-group.vue +1 -1
- package/components/card-header/card-header.scss +29 -4
- package/components/card-header/u-card-header.vue +22 -3
- package/components/card-highlight/card-highlight.scss +70 -0
- package/components/card-highlight/u-card-highlight.vue +41 -0
- package/components/card-info/card-info.scss +40 -0
- package/components/card-info/u-card-info.vue +35 -0
- package/components/card-price-list/card-price-list.scss +39 -0
- package/components/card-price-list/u-card-price-list.vue +37 -0
- package/components/card-section/card-section.scss +21 -1
- package/components/card-section/u-card-section.vue +9 -1
- package/components/data-card/data-card.scss +34 -0
- package/components/data-card/u-data-card.vue +49 -0
- package/components/data-card-group/data-card-group.scss +12 -0
- package/components/data-card-group/u-data-card-group.vue +7 -0
- package/components/download-list/download-list.scss +58 -0
- package/components/download-list/u-download-list.vue +44 -0
- package/components/download-list-item/download-list-item.scss +267 -0
- package/components/download-list-item/u-download-list-item.vue +65 -0
- package/components/file-upload/file-list.scss +68 -0
- package/components/file-upload/file-upload.scss +119 -0
- package/components/file-upload/u-file-list.vue +55 -0
- package/components/file-upload/u-file-upload.vue +220 -0
- package/components/hint/hint.scss +67 -6
- package/components/hint/u-hint.vue +11 -1
- package/components/index.js +13 -0
- package/components/inline-edit/inline-edit.scss +5 -1
- package/components/inline-edit/u-inline-edit.vue +21 -12
- package/components/progress-avatar/u-progress-avatar.vue +27 -3
- package/components/richtext/richtext.scss +9 -2
- package/components/richtext/u-richtext.vue +3 -1
- package/components/search-group/search-group.scss +59 -0
- package/components/search-group/u-search-group.vue +32 -0
- package/components/skeleton-loader/skeleton-loader.scss +39 -0
- package/components/skeleton-loader/u-skeleton-loader.vue +28 -0
- package/components/table/cell-ctas.scss +1 -7
- package/components/table/cell-icon-text.scss +15 -4
- package/components/table/table-cell.mixins.scss +3 -2
- package/components/table/table-cell.scss +5 -0
- package/components/table/table-heading.scss +7 -0
- package/components/table/u-cell-ctas.vue +15 -6
- package/components/table/u-cell-icon-text.vue +13 -5
- package/components/table/u-table-cell.vue +3 -1
- package/components/table/u-table-heading.vue +2 -1
- package/components/tabs/tabs.scss +10 -1
- package/components/tabs/u-tabs.vue +64 -25
- package/dist/elements/form.css +170 -0
- package/dist/elements/form.css.map +1 -0
- package/dist/layout/form-grid.css +184 -0
- package/dist/layout/form-grid.css.map +1 -0
- package/dist/layout/split.css.map +1 -1
- package/elements/button/_button-plain-small-spaceless.scss +10 -0
- package/elements/button/button.scss +32 -0
- package/elements/button/u-button.vue +47 -4
- package/elements/form/form.scss +1 -1
- package/elements/form-field/form-field-base.scss +4 -0
- package/elements/form-field/form-field-prefix-suffix.scss +5 -0
- package/elements/select/u-select.vue +6 -6
- package/elements/text-field/text-field.scss +15 -0
- package/elements/text-field/text-field.types.ts +1 -0
- package/elements/text-field/u-text-field.vue +44 -8
- package/elements/toggle-switch/toggle-switch-small.scss +10 -0
- package/elements/toggle-switch/toggle-switch.scss +25 -21
- package/elements/toggle-switch/u-toggle-switch.vue +22 -12
- package/i18n/i18n.ts +32 -0
- package/layout/container/container.scss +18 -0
- package/layout/index.js +4 -0
- package/layout/portal/portal.scss +63 -0
- package/layout/portal/u-portal.vue +51 -0
- package/layout/settings/settings.scss +33 -0
- package/layout/settings/u-settings-layout.vue +19 -0
- package/layout/tile-grid/tile-grid.scss +13 -0
- package/layout/tile-grid/tile-item.scss +31 -0
- package/layout/tile-grid/u-tile-grid.vue +7 -0
- package/layout/tile-grid/u-tile-item.vue +15 -0
- package/modules/content-title/content-title.scss +43 -0
- package/modules/content-title/u-content-title.vue +19 -0
- package/modules/dialog/_animations.scss +49 -0
- package/modules/dialog/dialog.scss +172 -0
- package/modules/dialog/u-dialog.vue +139 -0
- package/modules/footer/footer.scss +8 -1
- package/modules/footer/u-footer.vue +1 -1
- package/modules/index.js +3 -0
- package/modules/inline-edit-group/u-inline-edit-group.vue +2 -0
- package/modules/search-filter/search-filter.scss +106 -0
- package/modules/search-filter/u-search-filter.vue +54 -0
- package/package.json +3 -1
- package/utility/elements/form.scss +1 -0
- package/utility/layout/form-grid.scss +1 -0
- package/utils/array/intersect.js +7 -0
- package/utils/functions/breakpoint.js +4 -9
- package/utils/functions/format-bytes.js +17 -0
- package/utils/global/mime-types.js +8 -0
- package/utils/translations/translate.js +10 -2
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
align-items: center;
|
|
12
12
|
width: 100%;
|
|
13
13
|
gap: var(--e-space-4);
|
|
14
|
+
|
|
15
|
+
input {
|
|
16
|
+
width: var(--width);
|
|
17
|
+
}
|
|
14
18
|
}
|
|
15
19
|
|
|
16
20
|
.toggle-switch__handle {
|
|
@@ -37,4 +41,10 @@
|
|
|
37
41
|
margin-right: auto;
|
|
38
42
|
}
|
|
39
43
|
}
|
|
44
|
+
|
|
45
|
+
.toggle-switch__additional-label {
|
|
46
|
+
display: inline;
|
|
47
|
+
|
|
48
|
+
@include a.type(200);
|
|
49
|
+
}
|
|
40
50
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
@use '../../base/abstracts
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
2
|
@use './toggle-switch-small';
|
|
3
3
|
|
|
4
4
|
.toggle-switch {
|
|
@@ -31,6 +31,18 @@
|
|
|
31
31
|
background-color: var(--e-c-mono-200);
|
|
32
32
|
border-radius: calc(var(--height) * 0.5);
|
|
33
33
|
transition: background-color var(--e-trs-duration-faster) var(--e-trs-easing-default);
|
|
34
|
+
|
|
35
|
+
&:hover {
|
|
36
|
+
background-color: var(--e-c-mono-500);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&:active {
|
|
40
|
+
background-color: var(--e-c-mono-700);
|
|
41
|
+
|
|
42
|
+
.toggle-switch__text {
|
|
43
|
+
color: var(--e-c-mono-00);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
34
46
|
}
|
|
35
47
|
|
|
36
48
|
.toggle-switch__handle {
|
|
@@ -71,22 +83,6 @@
|
|
|
71
83
|
}
|
|
72
84
|
}
|
|
73
85
|
|
|
74
|
-
&:hover {
|
|
75
|
-
.toggle-switch__toggle {
|
|
76
|
-
background-color: var(--e-c-mono-500);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
&:active {
|
|
81
|
-
.toggle-switch__toggle {
|
|
82
|
-
background-color: var(--e-c-mono-700);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.toggle-switch__text {
|
|
86
|
-
color: var(--e-c-mono-00);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
86
|
// States
|
|
91
87
|
&.error {
|
|
92
88
|
.toggle-switch__error-text {
|
|
@@ -97,11 +93,19 @@
|
|
|
97
93
|
&.checked {
|
|
98
94
|
.toggle-switch__toggle {
|
|
99
95
|
background-color: var(--e-c-primary-01-900);
|
|
96
|
+
|
|
97
|
+
&:hover {
|
|
98
|
+
background-color: var(--e-c-secondary-01-900);
|
|
99
|
+
}
|
|
100
100
|
}
|
|
101
101
|
|
|
102
102
|
.toggle-switch__handle {
|
|
103
103
|
transform: translateX(calc(var(--width) - var(--handle-size) - var(--inner-padding) * 2));
|
|
104
104
|
color: var(--e-c-primary-01-900);
|
|
105
|
+
|
|
106
|
+
&:hover {
|
|
107
|
+
color: var(--e-c-secondary-01-900);
|
|
108
|
+
}
|
|
105
109
|
}
|
|
106
110
|
|
|
107
111
|
.toggle-switch__text {
|
|
@@ -117,10 +121,6 @@
|
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
&:hover {
|
|
120
|
-
.toggle-switch__toggle {
|
|
121
|
-
background-color: var(--e-c-secondary-01-900);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
124
|
.toggle-switch__handle {
|
|
125
125
|
color: var(--e-c-secondary-01-900);
|
|
126
126
|
}
|
|
@@ -157,3 +157,7 @@
|
|
|
157
157
|
margin-top: var(--e-space-1);
|
|
158
158
|
color: var(--e-c-signal-03-700);
|
|
159
159
|
}
|
|
160
|
+
|
|
161
|
+
.toggle-switch__additional-label {
|
|
162
|
+
display: none;
|
|
163
|
+
}
|
|
@@ -7,9 +7,9 @@ export interface ToggleSwitch {
|
|
|
7
7
|
name: string
|
|
8
8
|
label?: string
|
|
9
9
|
disabled?: boolean
|
|
10
|
-
error
|
|
10
|
+
error?: boolean
|
|
11
11
|
errorMessage?: string
|
|
12
|
-
variant?: '
|
|
12
|
+
variant?: 'big' | 'small'
|
|
13
13
|
labelPosition?: 'left' | 'right'
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@ const {
|
|
|
18
18
|
labelPosition = 'right',
|
|
19
19
|
disabled = false,
|
|
20
20
|
errorMessage = '',
|
|
21
|
-
error,
|
|
21
|
+
error = false,
|
|
22
22
|
} = defineProps<ToggleSwitch>()
|
|
23
23
|
|
|
24
24
|
const model = defineModel<boolean>({ default: false })
|
|
@@ -42,8 +42,12 @@ const classes = computed(() => ({
|
|
|
42
42
|
|
|
43
43
|
<template>
|
|
44
44
|
<div :class="['toggle-switch', classes]">
|
|
45
|
-
<
|
|
46
|
-
<
|
|
45
|
+
<div class="toggle-switch__wrapper">
|
|
46
|
+
<label class="toggle-switch__toggle">
|
|
47
|
+
<slot name="input">
|
|
48
|
+
<input v-model="model" type="checkbox" :name :disabled v-bind="$attrs" />
|
|
49
|
+
</slot>
|
|
50
|
+
|
|
47
51
|
<span class="toggle-switch__text yes" :aria-hidden="model ? 'false' : 'true'">
|
|
48
52
|
{{ getTranslation('yes') }}
|
|
49
53
|
</span>
|
|
@@ -53,14 +57,12 @@ const classes = computed(() => ({
|
|
|
53
57
|
<span class="toggle-switch__handle">
|
|
54
58
|
<UIcon :name="model ? checkIcon : uncheckIcon" custom-size />
|
|
55
59
|
</span>
|
|
56
|
-
</
|
|
57
|
-
|
|
58
|
-
<slot name="label">{{ label }}</slot>
|
|
60
|
+
</label>
|
|
59
61
|
|
|
60
|
-
<
|
|
61
|
-
<
|
|
62
|
-
</
|
|
63
|
-
</
|
|
62
|
+
<span class="toggle-switch__additional-label">
|
|
63
|
+
<slot name="label"><span v-html="label"></span></slot>
|
|
64
|
+
</span>
|
|
65
|
+
</div>
|
|
64
66
|
|
|
65
67
|
<div class="toggle-switch__error-text">
|
|
66
68
|
<slot name="error-message">{{ errorMessage }}</slot>
|
|
@@ -69,3 +71,11 @@ const classes = computed(() => ({
|
|
|
69
71
|
</template>
|
|
70
72
|
|
|
71
73
|
<style scoped lang="scss" src="./toggle-switch.scss"></style>
|
|
74
|
+
<style lang="scss">
|
|
75
|
+
@use '../../elements/text-link/text-link' as t;
|
|
76
|
+
.toggle-switch__wrapper {
|
|
77
|
+
a {
|
|
78
|
+
@include t.text-link;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
</style>
|
package/i18n/i18n.ts
CHANGED
|
@@ -13,6 +13,14 @@ const translations = {
|
|
|
13
13
|
cancel: 'Abbrechen',
|
|
14
14
|
openMenu: 'Menu öffnen',
|
|
15
15
|
closeMenu: 'Menu schliessen',
|
|
16
|
+
dragFileHereOr: 'Datei hierher ziehen oder',
|
|
17
|
+
chooseFile: 'Datei wählen',
|
|
18
|
+
maxSizePerFile: 'Max. $SIZE pro Datei',
|
|
19
|
+
incorrectFileFormat: 'Dateiformat ist nicht zugelassen.',
|
|
20
|
+
fileTooLarge: 'Datei zu gross.',
|
|
21
|
+
maxFileCountAllowed: 'Maximal $COUNT Dateien erlaubt.',
|
|
22
|
+
cancelSearch: 'Suche abbrechen',
|
|
23
|
+
download: 'Herunterladen',
|
|
16
24
|
},
|
|
17
25
|
FR: {
|
|
18
26
|
yes: 'Ja',
|
|
@@ -28,6 +36,14 @@ const translations = {
|
|
|
28
36
|
cancel: 'Annuler',
|
|
29
37
|
openMenu: 'Ouvrir le menu',
|
|
30
38
|
closeMenu: 'Fermer le menu',
|
|
39
|
+
dragFileHereOr: 'Faites glisser le fichier ici ou',
|
|
40
|
+
chooseFile: 'Choisir un fichier',
|
|
41
|
+
maxSizePerFile: 'Max. $SIZE par fichier',
|
|
42
|
+
incorrectFileFormat: "Le format de fichier n'est pas autorisé.",
|
|
43
|
+
fileTooLarge: 'Fichier trop volumineux',
|
|
44
|
+
maxFileCountAllowed: 'Maximum de $COUNT fichiers autorisés',
|
|
45
|
+
cancelSearch: 'Annuler la recherche',
|
|
46
|
+
download: 'Télécharger',
|
|
31
47
|
},
|
|
32
48
|
IT: {
|
|
33
49
|
yes: 'Ja',
|
|
@@ -43,6 +59,14 @@ const translations = {
|
|
|
43
59
|
cancel: 'cancellare',
|
|
44
60
|
openMenu: 'Apri il menu',
|
|
45
61
|
closeMenu: 'Chiudi menù',
|
|
62
|
+
dragFileHereOr: 'Trascina il file qui o',
|
|
63
|
+
chooseFile: 'scegli il file',
|
|
64
|
+
maxSizePerFile: 'Max. $SIZE per file',
|
|
65
|
+
incorrectFileFormat: 'Formato file non consentito.',
|
|
66
|
+
fileTooLarge: 'File troppo grande',
|
|
67
|
+
maxFileCountAllowed: 'Sono consentiti al massimo $COUNT file',
|
|
68
|
+
cancelSearch: 'annullare la ricerca',
|
|
69
|
+
download: 'scaricamento',
|
|
46
70
|
},
|
|
47
71
|
EN: {
|
|
48
72
|
yes: 'Ja',
|
|
@@ -58,6 +82,14 @@ const translations = {
|
|
|
58
82
|
cancel: 'Cancel',
|
|
59
83
|
openMenu: 'Open menu',
|
|
60
84
|
closeMenu: 'Close menu',
|
|
85
|
+
dragFileHereOr: 'Drag file here or',
|
|
86
|
+
chooseFile: 'Choose file',
|
|
87
|
+
maxSizePerFile: 'Max. $SIZE per file',
|
|
88
|
+
incorrectFileFormat: 'File format is not allowed.',
|
|
89
|
+
fileTooLarge: 'File too large',
|
|
90
|
+
maxFileCountAllowed: 'Maximum $COUNT files allowed',
|
|
91
|
+
cancelSearch: 'Cancel search',
|
|
92
|
+
download: 'Download',
|
|
61
93
|
},
|
|
62
94
|
}
|
|
63
95
|
|
|
@@ -25,6 +25,24 @@
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
+
@mixin portal-content-container {
|
|
29
|
+
margin: 0 auto;
|
|
30
|
+
max-width: a.rem(1282);
|
|
31
|
+
width: 100%;
|
|
32
|
+
padding-left: var(--e-space-10);
|
|
33
|
+
padding-right: var(--e-space-10);
|
|
34
|
+
|
|
35
|
+
@include a.bp(lg) {
|
|
36
|
+
padding-left: var(--e-space-8);
|
|
37
|
+
padding-right: var(--e-space-8);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@include a.bp(m) {
|
|
41
|
+
padding-left: var(--e-space-5);
|
|
42
|
+
padding-right: var(--e-space-5);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
28
46
|
.container {
|
|
29
47
|
@include grid-container;
|
|
30
48
|
}
|
package/layout/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { default as USettingsLayout } from './settings/u-settings-layout.vue'
|
|
2
|
+
export { default as UPortalLayout } from './portal/u-portal.vue'
|
|
3
|
+
export { default as UTileGrid } from './tile-grid/u-tile-grid.vue'
|
|
4
|
+
export { default as UTileItem } from './tile-grid/u-tile-item.vue'
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
|
+
@use '../../layout/container/container' as c;
|
|
3
|
+
|
|
4
|
+
.portal {
|
|
5
|
+
--side-nav-width: 80px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.portal__side-navigation {
|
|
9
|
+
position: fixed;
|
|
10
|
+
height: 100vh;
|
|
11
|
+
display: flex;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.portal__top-navigation {
|
|
15
|
+
display: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.portal__sub-navigation {
|
|
19
|
+
position: sticky;
|
|
20
|
+
top: 0;
|
|
21
|
+
z-index: 10;
|
|
22
|
+
background-color: var(--e-c-mono-00);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.portal__main {
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
padding-left: var(--side-nav-width);
|
|
29
|
+
min-height: 100vh;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.portal__content-container {
|
|
33
|
+
@include c.portal-content-container;
|
|
34
|
+
|
|
35
|
+
padding-top: var(--e-space-10);
|
|
36
|
+
padding-bottom: var(--e-space-10);
|
|
37
|
+
|
|
38
|
+
@include a.bp(lg) {
|
|
39
|
+
padding-top: var(--e-space-8);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@include a.bp(m) {
|
|
43
|
+
padding-top: var(--e-space-6);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.portal__footer {
|
|
48
|
+
margin-top: auto;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@include a.bp(lg) {
|
|
52
|
+
.portal__top-navigation {
|
|
53
|
+
display: block;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.portal__side-navigation {
|
|
57
|
+
display: none;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.portal__sub-navigation {
|
|
61
|
+
background-color: var(--e-c-mono-50);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { useTemplateRef, onMounted, ref } from 'vue'
|
|
3
|
+
|
|
4
|
+
const sideNavObserver = new ResizeObserver((entries) => {
|
|
5
|
+
for (const entry of entries) {
|
|
6
|
+
if (entry.target === sideNavEl.value) {
|
|
7
|
+
sideNavWidth.value = entry.contentBoxSize[0].inlineSize
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
const sideNavEl = useTemplateRef('sideNavigation')
|
|
13
|
+
const sideNavWidth = ref(0)
|
|
14
|
+
|
|
15
|
+
onMounted(() => {
|
|
16
|
+
sideNavObserver.observe(sideNavEl.value)
|
|
17
|
+
})
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<template>
|
|
21
|
+
<div
|
|
22
|
+
class="portal"
|
|
23
|
+
:style="{
|
|
24
|
+
'--side-nav-width': `${sideNavWidth}px`,
|
|
25
|
+
}"
|
|
26
|
+
>
|
|
27
|
+
<div ref="sideNavigation" class="portal__side-navigation">
|
|
28
|
+
<slot name="side-navigation"></slot>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="portal__top-navigation">
|
|
32
|
+
<slot name="top-navigation"></slot>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="portal__main">
|
|
36
|
+
<div class="portal__sub-navigation">
|
|
37
|
+
<slot name="sub-navigation"></slot>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<div class="portal__content-container">
|
|
41
|
+
<slot></slot>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div class="portal__footer">
|
|
45
|
+
<slot name="footer"></slot>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</template>
|
|
50
|
+
|
|
51
|
+
<style scoped lang="scss" src="./portal.scss"></style>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
|
+
|
|
3
|
+
.settings-layout {
|
|
4
|
+
display: grid;
|
|
5
|
+
grid-template-columns: auto a.rem(320);
|
|
6
|
+
grid-template-rows: repeat(2, auto);
|
|
7
|
+
grid-column-gap: var(--e-space-24);
|
|
8
|
+
grid-row-gap: var(--e-space-12);
|
|
9
|
+
padding: var(--e-space-10) 0;
|
|
10
|
+
|
|
11
|
+
@include a.bp(lg) {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
row-gap: var(--e-space-6);
|
|
15
|
+
padding: var(--e-space-6) 0 var(--e-space-10);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.settings-layout__header {
|
|
20
|
+
grid-area: 1 / 1 / 2 / 3;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.settings-layout__main {
|
|
24
|
+
grid-area: 2 / 1 / 3 / 2;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.settings-layout__aside {
|
|
28
|
+
grid-area: 2 / 2 / 3 / 3;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.settings-layout__title {
|
|
32
|
+
@include a.type(500, strong);
|
|
33
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="settings-layout">
|
|
3
|
+
<div class="settings-layout__header">
|
|
4
|
+
<h1 class="settings-layout__title">
|
|
5
|
+
<slot name="title"></slot>
|
|
6
|
+
</h1>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="settings-layout__main">
|
|
10
|
+
<slot name="main"></slot>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<aside class="settings-layout__aside">
|
|
14
|
+
<slot name="aside"></slot>
|
|
15
|
+
</aside>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<style scoped lang="scss" src="./settings.scss"></style>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
|
+
|
|
3
|
+
.tile-item {
|
|
4
|
+
grid-column: span 12;
|
|
5
|
+
|
|
6
|
+
&[data-width='1'] {
|
|
7
|
+
grid-column: span 12;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
&[data-width='1/2'] {
|
|
11
|
+
grid-column: span 6;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
&[data-width='1/3'] {
|
|
15
|
+
grid-column: span 4;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
&[data-width='2/3'] {
|
|
19
|
+
grid-column: span 8;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@container tile-grid (width < 920px) {
|
|
24
|
+
.tile-item {
|
|
25
|
+
&[data-width='1/2'],
|
|
26
|
+
&[data-width='1/3'],
|
|
27
|
+
&[data-width='2/3'] {
|
|
28
|
+
grid-column: span 12;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
width?: '1' | '1/2' | '1/3' | '2/3'
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const { width = '1' } = defineProps<Props>()
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<div class="tile-item" :data-width="width">
|
|
11
|
+
<slot />
|
|
12
|
+
</div>
|
|
13
|
+
</template>
|
|
14
|
+
|
|
15
|
+
<style scoped lang="scss" src="./tile-item.scss"></style>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
|
+
|
|
3
|
+
.content-title {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: var(--e-space-8);
|
|
7
|
+
justify-content: flex-end;
|
|
8
|
+
|
|
9
|
+
@include a.bp(xl) {
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@include a.bp(m) {
|
|
14
|
+
row-gap: var(--e-space-6);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.content-title__content {
|
|
19
|
+
margin-right: auto;
|
|
20
|
+
|
|
21
|
+
@include a.bp(xl) {
|
|
22
|
+
width: 100%;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.content-title__title {
|
|
27
|
+
@include a.type(500, strong);
|
|
28
|
+
|
|
29
|
+
min-width: max-content;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.content-title__text {
|
|
33
|
+
@include a.type(100);
|
|
34
|
+
|
|
35
|
+
margin-top: var(--e-space-2);
|
|
36
|
+
color: var(--e-c-mono-700);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.content-title__custom-content {
|
|
40
|
+
@include a.bp(xl) {
|
|
41
|
+
width: 100%;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="content-title">
|
|
3
|
+
<div class="content-title__content">
|
|
4
|
+
<h1 class="content-title__title">
|
|
5
|
+
<slot />
|
|
6
|
+
</h1>
|
|
7
|
+
|
|
8
|
+
<p v-if="$slots.text" class="content-title__text">
|
|
9
|
+
<slot name="text" />
|
|
10
|
+
</p>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div v-if="$slots['custom']" class="content-title__custom-content">
|
|
14
|
+
<slot name="custom"></slot>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</template>
|
|
18
|
+
|
|
19
|
+
<style scoped lang="scss" src="./content-title.scss"></style>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@keyframes fade-in {
|
|
2
|
+
0% {
|
|
3
|
+
opacity: 0;
|
|
4
|
+
display: none;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
100% {
|
|
8
|
+
opacity: 1;
|
|
9
|
+
display: flex;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@keyframes fade-in-backdrop {
|
|
14
|
+
0% {
|
|
15
|
+
background-color: transparent;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
100% {
|
|
19
|
+
background-color: var(--e-c-mono-900);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@keyframes slide-in {
|
|
24
|
+
0% {
|
|
25
|
+
opacity: 1;
|
|
26
|
+
transform: translateY(100%);
|
|
27
|
+
display: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
100% {
|
|
31
|
+
opacity: 1;
|
|
32
|
+
transform: translateY(0);
|
|
33
|
+
display: flex;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@keyframes slide-out {
|
|
38
|
+
0% {
|
|
39
|
+
opacity: 1;
|
|
40
|
+
transform: translateY(0);
|
|
41
|
+
display: flex;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
100% {
|
|
45
|
+
opacity: 1;
|
|
46
|
+
transform: translateY(100%);
|
|
47
|
+
display: none;
|
|
48
|
+
}
|
|
49
|
+
}
|