@energie360/ui-library 0.1.13 → 0.1.15
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/base/abstracts/_layers.scss +1 -0
- package/base/abstracts/_resets.scss +1 -0
- package/components/card-header/card-header.scss +32 -32
- package/components/context-menu/context-menu.scss +1 -0
- package/components/hint/hint.scss +126 -0
- package/components/hint/u-hint.vue +54 -0
- package/components/index.js +2 -0
- package/components/inline-edit/u-inline-edit.vue +3 -1
- package/components/navigation-panel-tile/navigation-panel-tile.scss +105 -0
- package/components/navigation-panel-tile/u-navigation-panel-tile.vue +78 -0
- package/components/navigation-toolbar-link/navigation-toolbar-link.scss +23 -11
- package/components/navigation-toolbar-link/u-navigation-toolbar-link.vue +1 -1
- package/components/richtext/richtext.scss +24 -3
- package/components/richtext/u-richtext.vue +1 -3
- package/components/welcome/welcome.scss +1 -0
- package/dist/base-style.css +1 -0
- package/dist/base-style.css.map +1 -1
- package/elements/form/form.scss +3 -2
- package/elements/form-field/form-field-prefix-suffix.scss +1 -2
- package/elements/icon/u-icon.vue +34 -24
- package/elements/select/u-select.vue +5 -5
- package/elements/text-field/text-field.types.ts +1 -0
- package/elements/text-field/u-text-field.vue +19 -13
- package/modules/index.js +1 -0
- package/modules/navigation-panel/navigation-panel.scss +64 -0
- package/modules/navigation-panel/u-navigation-panel.vue +22 -0
- package/modules/navigation-toolbar-side/navigation-toolbar-side.scss +1 -1
- package/modules/navigation-toolbar-top/navigation-toolbar-top.scss +1 -0
- package/package.json +1 -1
- package/utils/translations/translate.js +0 -10
- package/elements/button/button.js +0 -12
- package/elements/elements.js +0 -35
- package/elements/icon/icon.js +0 -13
- package/elements/icon-button/icon-button.js +0 -12
- package/elements/loader/loader.js +0 -13
- package/modules/feedback/index.js +0 -1
- package/modules/inline-edit-group/index.js +0 -1
|
@@ -9,6 +9,38 @@ $image-col-width-small: 100px;
|
|
|
9
9
|
display: flex;
|
|
10
10
|
column-gap: var(--e-space-2);
|
|
11
11
|
|
|
12
|
+
.image-background {
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
width: 100%;
|
|
17
|
+
aspect-ratio: 1;
|
|
18
|
+
background-color: var(--e-c-primary-01-100);
|
|
19
|
+
border-radius: 100%;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.badge {
|
|
23
|
+
@include a.type(100, strong);
|
|
24
|
+
|
|
25
|
+
position: absolute;
|
|
26
|
+
padding: a.rem(6) a.rem(8) a.rem(4);
|
|
27
|
+
color: var(--e-c-mono-00);
|
|
28
|
+
background-color: var(--e-c-secondary-05-500);
|
|
29
|
+
border-radius: var(--e-brd-radius-1);
|
|
30
|
+
top: a.rem(-16);
|
|
31
|
+
right: a.rem(-16);
|
|
32
|
+
|
|
33
|
+
@include a.bp(m) {
|
|
34
|
+
top: a.rem(-12);
|
|
35
|
+
right: a.rem(-12);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@include a.bp(s) {
|
|
39
|
+
top: a.rem(-10);
|
|
40
|
+
right: a.rem(-10);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
12
44
|
@container (max-width: 260px) {
|
|
13
45
|
flex-direction: column-reverse;
|
|
14
46
|
}
|
|
@@ -64,35 +96,3 @@ $image-col-width-small: 100px;
|
|
|
64
96
|
flex-basis: a.rem($image-col-width-small);
|
|
65
97
|
}
|
|
66
98
|
}
|
|
67
|
-
|
|
68
|
-
.image-background {
|
|
69
|
-
display: flex;
|
|
70
|
-
align-items: center;
|
|
71
|
-
justify-content: center;
|
|
72
|
-
width: 100%;
|
|
73
|
-
aspect-ratio: 1;
|
|
74
|
-
background-color: var(--e-c-primary-01-100);
|
|
75
|
-
border-radius: 100%;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.badge {
|
|
79
|
-
@include a.type(100, strong);
|
|
80
|
-
|
|
81
|
-
position: absolute;
|
|
82
|
-
padding: a.rem(6) a.rem(8) a.rem(4);
|
|
83
|
-
color: var(--e-c-mono-00);
|
|
84
|
-
background-color: var(--e-c-secondary-05-500);
|
|
85
|
-
border-radius: var(--e-brd-radius-1);
|
|
86
|
-
top: a.rem(-16);
|
|
87
|
-
right: a.rem(-16);
|
|
88
|
-
|
|
89
|
-
@include a.bp(m) {
|
|
90
|
-
top: a.rem(-12);
|
|
91
|
-
right: a.rem(-12);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
@include a.bp(s) {
|
|
95
|
-
top: a.rem(-10);
|
|
96
|
-
right: a.rem(-10);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
@use '../../base/abstracts' as a;
|
|
2
|
+
@use '../../elements/text-link/text-link.scss' as t;
|
|
3
|
+
|
|
4
|
+
.hint {
|
|
5
|
+
@mixin type-neutral {
|
|
6
|
+
background-color: var(--e-c-secondary-05-100);
|
|
7
|
+
color: var(--e-c-secondary-05-900);
|
|
8
|
+
|
|
9
|
+
&::before {
|
|
10
|
+
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2Zm0 15c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1s1 .45 1 1v4c0 .55-.45 1-1 1Zm1-8h-2V7h2v2Z' fill='%230096DC'/%3E%3C/svg%3E");
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// override some richtext styles.
|
|
14
|
+
.richtext {
|
|
15
|
+
a {
|
|
16
|
+
font-size: 100px;
|
|
17
|
+
color: inherit;
|
|
18
|
+
|
|
19
|
+
&:active,
|
|
20
|
+
&:hover {
|
|
21
|
+
text-decoration-color: var(--e-c-secondary-05-200);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@mixin type-warning {
|
|
28
|
+
background-color: var(--e-c-signal-02-100);
|
|
29
|
+
color: var(--e-c-signal-02-900);
|
|
30
|
+
|
|
31
|
+
&::before {
|
|
32
|
+
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 21 12 2l11 19H1Zm11-3c.283 0 .52-.096.713-.288A.968.968 0 0 0 13 17a.968.968 0 0 0-.287-.712A.968.968 0 0 0 12 16a.968.968 0 0 0-.713.288A.968.968 0 0 0 11 17c0 .283.096.52.287.712.192.192.43.288.713.288Zm-1-3h2v-5h-2v5Z' fill='%23FF9800'/%3E%3C/svg%3E");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// override some richtext styles.
|
|
36
|
+
.richtext {
|
|
37
|
+
a {
|
|
38
|
+
color: inherit;
|
|
39
|
+
|
|
40
|
+
&:active,
|
|
41
|
+
&:hover {
|
|
42
|
+
text-decoration-color: var(--e-c-signal-02-100);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@mixin type-legal {
|
|
49
|
+
background-color: var(--e-c-mono-00);
|
|
50
|
+
border: 1px solid var(--e-c-mono-500);
|
|
51
|
+
border-left-width: 4px;
|
|
52
|
+
border-left-color: var(--e-c-mono-700);
|
|
53
|
+
color: var(--e-c-mono-900);
|
|
54
|
+
|
|
55
|
+
&::before {
|
|
56
|
+
background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m12.86 3.404-.81.81 3.352 3.352.81-.81-3.353-3.352Zm.707-1.697a1 1 0 0 0-1.415 0l-1.8 1.8a1 1 0 0 0-.01 1.404L6.952 8.303a1 1 0 0 0-1.404.01l-1.84 1.84a1 1 0 0 0 0 1.414l4.342 4.342a1 1 0 0 0 1.414 0l1.84-1.84a1 1 0 0 0 0-1.414l-.092-.092.93-.93L20.6 20l1.4-1.4-8.46-8.366 1.063-1.062.091.091a1 1 0 0 0 1.415 0l1.8-1.8a1 1 0 0 0 0-1.414l-4.342-4.342ZM6.253 10.01l-.85.85 3.352 3.352.85-.85-3.352-3.352Zm1.975-.581 3.235-3.235L13.32 8.05l-3.235 3.235L8.23 9.429ZM16 21H4v-2h12v2Z' fill='%236B6B6B'/%3E%3C/svg%3E");
|
|
57
|
+
top: 0;
|
|
58
|
+
left: calc(
|
|
59
|
+
-24px - 12px - 4px
|
|
60
|
+
); // 24px: icon width, 12px: distance to box, 4px: additonal border-width
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
> p,
|
|
64
|
+
.richtext {
|
|
65
|
+
margin-left: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@include a.bp(lg) {
|
|
69
|
+
margin-top: calc(4px + 4px + 24px);
|
|
70
|
+
border: 1px solid var(--e-c-mono-500);
|
|
71
|
+
border-top-width: 4px;
|
|
72
|
+
border-top-color: var(--e-c-mono-700);
|
|
73
|
+
|
|
74
|
+
&::before {
|
|
75
|
+
left: 0;
|
|
76
|
+
top: calc(
|
|
77
|
+
-24px - 4px - 4px
|
|
78
|
+
); // 24px: icon height, 12px: distance to box, 4px: additonal border-width
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Default type
|
|
84
|
+
@include type-neutral;
|
|
85
|
+
|
|
86
|
+
position: relative;
|
|
87
|
+
padding: var(--e-space-5) var(--e-space-4);
|
|
88
|
+
border-radius: var(--e-brd-radius-1);
|
|
89
|
+
|
|
90
|
+
&::before {
|
|
91
|
+
content: '';
|
|
92
|
+
position: absolute;
|
|
93
|
+
top: var(--e-space-5);
|
|
94
|
+
left: var(--e-space-4);
|
|
95
|
+
width: a.rem(24);
|
|
96
|
+
height: a.rem(24);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
> p,
|
|
100
|
+
.richtext {
|
|
101
|
+
margin-left: var(--e-space-9);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
> p {
|
|
105
|
+
@include a.type(200, strong);
|
|
106
|
+
|
|
107
|
+
margin-bottom: var(--e-space-1);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@include a.bp(lg) {
|
|
111
|
+
padding: var(--e-space-4);
|
|
112
|
+
|
|
113
|
+
&::before {
|
|
114
|
+
top: var(--e-space-4);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Modifiers
|
|
119
|
+
&.hint--warning {
|
|
120
|
+
@include type-warning;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
&.hint--legal {
|
|
124
|
+
@include type-legal;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { URichtext } from '../'
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
type?: 'neutral' | 'warning' | 'legal'
|
|
6
|
+
label?: string
|
|
7
|
+
text?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { type = 'neutral' } = defineProps<Props>()
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<template>
|
|
14
|
+
<div :class="['hint', `hint--${type}`]">
|
|
15
|
+
<p class="hint__label">
|
|
16
|
+
<slot name="label">{{ label }}</slot>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<URichtext class="hint__richtext" small :text><slot></slot></URichtext>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
|
|
23
|
+
<style scoped lang="scss" src="./hint.scss"></style>
|
|
24
|
+
|
|
25
|
+
<style lang="scss">
|
|
26
|
+
.hint__richtext {
|
|
27
|
+
a {
|
|
28
|
+
color: inherit;
|
|
29
|
+
|
|
30
|
+
&:active,
|
|
31
|
+
&:hover {
|
|
32
|
+
text-decoration-color: var(--e-c-secondary-05-200);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.hint--warning {
|
|
38
|
+
.hint__richtext a {
|
|
39
|
+
&:active,
|
|
40
|
+
&:hover {
|
|
41
|
+
text-decoration-color: var(--e-c-signal-02-100);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.hint--legal {
|
|
47
|
+
.hint__richtext a {
|
|
48
|
+
&:active,
|
|
49
|
+
&:hover {
|
|
50
|
+
text-decoration-color: var(--e-c-mono-100);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
</style>
|
package/components/index.js
CHANGED
|
@@ -49,3 +49,5 @@ export { default as UContextMenuDivider } from './context-menu-divider/u-context
|
|
|
49
49
|
export { default as UCircularProgress } from './circular-progress/u-circular-progress.vue'
|
|
50
50
|
export { default as UProgressAvatar } from './progress-avatar/u-progress-avatar.vue'
|
|
51
51
|
export { default as UWelcome } from './welcome/u-welcome.vue'
|
|
52
|
+
export { default as UHint } from './hint/u-hint.vue'
|
|
53
|
+
export { default as UNavigationPanelTile } from './navigation-panel-tile/u-navigation-panel-tile.vue'
|
|
@@ -74,7 +74,9 @@ defineExpose({ collapse })
|
|
|
74
74
|
<div class="inline-edit__heading-col">
|
|
75
75
|
<p :id="headingId" class="inline-edit__title">{{ title }}</p>
|
|
76
76
|
|
|
77
|
-
<p class="inline-edit__summary"
|
|
77
|
+
<p class="inline-edit__summary">
|
|
78
|
+
<slot name="summary">{{ summary }}</slot>
|
|
79
|
+
</p>
|
|
78
80
|
<p class="inline-edit__description" v-html="description"></p>
|
|
79
81
|
</div>
|
|
80
82
|
<div class="inline-edit__heading-cta-col">
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
@use '../../base/abstracts/' as a;
|
|
2
|
+
|
|
3
|
+
.navigation-panel-tile {
|
|
4
|
+
display: flex;
|
|
5
|
+
column-gap: var(--e-space-2);
|
|
6
|
+
align-items: flex-start;
|
|
7
|
+
border: 2px solid var(--e-c-secondary-01-100);
|
|
8
|
+
border-radius: var(--e-brd-radius-2);
|
|
9
|
+
padding: var(--e-space-4);
|
|
10
|
+
transition: background-color a.$trs-ease-out;
|
|
11
|
+
background-color: var(--e-c-mono-00);
|
|
12
|
+
|
|
13
|
+
&.active:not(.disabled) {
|
|
14
|
+
background-color: var(--e-c-secondary-01-1000);
|
|
15
|
+
border-color: var(--e-c-secondary-01-1000);
|
|
16
|
+
|
|
17
|
+
.navigation-panel-tile__title,
|
|
18
|
+
.navigation-panel-tile__description,
|
|
19
|
+
.navigation-panel-tile__icon-wrapper {
|
|
20
|
+
color: var(--e-c-mono-00);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
&.greyed:not(.disabled):not(:hover):not(.active) {
|
|
25
|
+
background-color: var(--e-c-mono-50);
|
|
26
|
+
border-color: var(--e-c-mono-200);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&.disabled {
|
|
30
|
+
pointer-events: none;
|
|
31
|
+
border-color: var(--e-c-mono-200);
|
|
32
|
+
|
|
33
|
+
.navigation-panel-tile__title,
|
|
34
|
+
.navigation-panel-tile__description,
|
|
35
|
+
.navigation-panel-tile__icon-wrapper {
|
|
36
|
+
color: var(--e-c-mono-500);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
&:hover {
|
|
41
|
+
background-color: var(--e-c-primary-01-50);
|
|
42
|
+
|
|
43
|
+
.navigation-panel-tile__title,
|
|
44
|
+
.navigation-panel-tile__description {
|
|
45
|
+
color: var(--e-c-primary-01-700);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&:active {
|
|
50
|
+
background-color: var(--e-c-primary-01-100);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@include a.bp(lg) {
|
|
54
|
+
height: a.rem(82);
|
|
55
|
+
width: a.rem(260);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.navigation-panel-tile__title {
|
|
60
|
+
@include a.type(200, strong);
|
|
61
|
+
|
|
62
|
+
transition: color a.$trs-ease-out;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.navigation-panel-tile__icon-wrapper {
|
|
66
|
+
position: relative;
|
|
67
|
+
transition: color a.$trs-ease-out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.navigation-panel-tile__description {
|
|
71
|
+
@include a.type(100);
|
|
72
|
+
|
|
73
|
+
color: var(--e-c-mono-700);
|
|
74
|
+
transition: color a.$trs-ease-out;
|
|
75
|
+
|
|
76
|
+
@include a.bp(lg) {
|
|
77
|
+
width: a.rem(192);
|
|
78
|
+
height: a.rem(22);
|
|
79
|
+
white-space: nowrap;
|
|
80
|
+
overflow: hidden;
|
|
81
|
+
text-overflow: ellipsis;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.badge {
|
|
86
|
+
position: absolute;
|
|
87
|
+
top: -2px;
|
|
88
|
+
right: -2px;
|
|
89
|
+
width: a.rem(13);
|
|
90
|
+
height: a.rem(13);
|
|
91
|
+
background-color: var(--e-c-mono-900);
|
|
92
|
+
border-radius: 100%;
|
|
93
|
+
|
|
94
|
+
&.inactive {
|
|
95
|
+
background-image: url("data:image/svg+xml,%3Csvg width='13' height='13' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='6.5' cy='6.5' r='6.5' fill='%23333'/%3E%3Cpath d='m4.414 3 2.12 2.121L8.658 3l1.414 1.414-2.122 2.122 2.122 2.121-1.414 1.414-2.122-2.12-2.12 2.12L3 8.656l2.12-2.12L3 4.412 4.414 3Z' fill='%23fff'/%3E%3C/svg%3E");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.navigation-panel-tile__text-column {
|
|
100
|
+
flex: 1 1 auto;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.badge + .icon {
|
|
104
|
+
color: var(--e-c-mono-500);
|
|
105
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed } from 'vue'
|
|
3
|
+
import { UIcon } from '../../elements'
|
|
4
|
+
|
|
5
|
+
enum IconBadge {
|
|
6
|
+
Inactive = 'inactive',
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
title: string
|
|
11
|
+
description: string
|
|
12
|
+
icon: string
|
|
13
|
+
iconBadge?: IconBadge
|
|
14
|
+
href?: string
|
|
15
|
+
target?: string
|
|
16
|
+
active?: boolean
|
|
17
|
+
greyed?: boolean
|
|
18
|
+
disabled?: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const {
|
|
22
|
+
href = '',
|
|
23
|
+
target = '_self',
|
|
24
|
+
active = false,
|
|
25
|
+
disabled = false,
|
|
26
|
+
greyed = false,
|
|
27
|
+
} = defineProps<Props>()
|
|
28
|
+
|
|
29
|
+
const tag = computed(() => (href ? 'a' : 'div'))
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
<template>
|
|
33
|
+
<component
|
|
34
|
+
:is="tag"
|
|
35
|
+
:href="tag === 'a' ? href : null"
|
|
36
|
+
:target="tag === 'a' ? target : null"
|
|
37
|
+
:class="['navigation-panel-tile', { active, disabled, greyed }]"
|
|
38
|
+
>
|
|
39
|
+
<div class="navigation-panel-tile__text-column">
|
|
40
|
+
<div class="navigation-panel-tile__title">
|
|
41
|
+
{{ title }}
|
|
42
|
+
</div>
|
|
43
|
+
<div class="navigation-panel-tile__description" v-html="description" />
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="navigation-panel-tile__icon-column">
|
|
47
|
+
<div class="navigation-panel-tile__icon-wrapper">
|
|
48
|
+
<span v-if="iconBadge" :class="['badge', iconBadge]" />
|
|
49
|
+
|
|
50
|
+
<UIcon :name="icon" />
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</component>
|
|
54
|
+
</template>
|
|
55
|
+
|
|
56
|
+
<style lang="scss" scoped src="./navigation-panel-tile.scss"></style>
|
|
57
|
+
<style lang="scss">
|
|
58
|
+
@use '../../base/abstracts/' as a;
|
|
59
|
+
|
|
60
|
+
.navigation-panel-tile__description {
|
|
61
|
+
@include a.bp(lg) {
|
|
62
|
+
p {
|
|
63
|
+
width: a.rem(192);
|
|
64
|
+
white-space: nowrap;
|
|
65
|
+
overflow: hidden;
|
|
66
|
+
text-overflow: ellipsis;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
br {
|
|
70
|
+
content: '';
|
|
71
|
+
|
|
72
|
+
&::after {
|
|
73
|
+
content: ' ';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
</style>
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
// TODO: How to handle text overflow?
|
|
2
|
-
|
|
3
1
|
@use '../../base/abstracts/' as a;
|
|
4
2
|
|
|
5
|
-
@keyframes
|
|
3
|
+
@keyframes fade-in-label {
|
|
6
4
|
0% {
|
|
7
5
|
opacity: 0;
|
|
8
6
|
transform: translateX(calc(100% + #{a.rem(8)}));
|
|
@@ -14,7 +12,7 @@
|
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
@keyframes
|
|
15
|
+
@keyframes fade-out-label {
|
|
18
16
|
0% {
|
|
19
17
|
opacity: 1;
|
|
20
18
|
transform: translateX(100%);
|
|
@@ -36,7 +34,7 @@
|
|
|
36
34
|
0% {
|
|
37
35
|
overflow: hidden;
|
|
38
36
|
padding: var(--e-space-1_5) var(--e-space-3);
|
|
39
|
-
width:
|
|
37
|
+
width: var(--nav-toolbar-link-width);
|
|
40
38
|
}
|
|
41
39
|
|
|
42
40
|
100% {
|
|
@@ -56,11 +54,13 @@
|
|
|
56
54
|
100% {
|
|
57
55
|
overflow: hidden;
|
|
58
56
|
padding: var(--e-space-1_5) var(--e-space-3);
|
|
59
|
-
width:
|
|
57
|
+
width: var(--nav-toolbar-link-width);
|
|
60
58
|
}
|
|
61
59
|
}
|
|
62
60
|
|
|
63
61
|
.navigation-toolbar-link {
|
|
62
|
+
// We assume that the width of the link is fixed.
|
|
63
|
+
--nav-toolbar-link-width: #{a.rem(232)};
|
|
64
64
|
--transition-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); /* easeOutCubic */
|
|
65
65
|
|
|
66
66
|
position: relative;
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
align-items: center;
|
|
72
72
|
flex-wrap: nowrap;
|
|
73
73
|
white-space: nowrap;
|
|
74
|
-
width:
|
|
74
|
+
width: var(--nav-toolbar-link-width);
|
|
75
75
|
column-gap: var(--e-space-2);
|
|
76
76
|
background-color: var(--e-c-secondary-01-1000);
|
|
77
77
|
color: var(--e-c-mono-00);
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
&.hover-out:not(.is-expanding, .is-collapsing, .label-hidden) {
|
|
125
125
|
.navigation-toolbar-link__label {
|
|
126
126
|
// TODO: Maybe just use transitions instead of keyframe animations
|
|
127
|
-
animation-name:
|
|
127
|
+
animation-name: fade-out-label;
|
|
128
128
|
animation-duration: var(--e-trs-duration-faster);
|
|
129
129
|
animation-timing-function: ease-out;
|
|
130
130
|
}
|
|
@@ -132,10 +132,9 @@
|
|
|
132
132
|
|
|
133
133
|
&:hover:not(.is-expanding, .is-collapsing, .label-hidden) {
|
|
134
134
|
.navigation-toolbar-link__label {
|
|
135
|
-
animation-name:
|
|
135
|
+
animation-name: fade-in-label;
|
|
136
136
|
animation-duration: var(--e-trs-duration-faster);
|
|
137
137
|
animation-timing-function: ease-out;
|
|
138
|
-
|
|
139
138
|
padding: var(--e-space-1_5) var(--e-space-2);
|
|
140
139
|
transform: translateX(100%);
|
|
141
140
|
width: auto;
|
|
@@ -146,16 +145,29 @@
|
|
|
146
145
|
}
|
|
147
146
|
}
|
|
148
147
|
|
|
148
|
+
.navigation-toolbar-link__label {
|
|
149
|
+
// internal CSS variable
|
|
150
|
+
--label-width: calc(
|
|
151
|
+
var(--nav-toolbar-link-width) - var(--e-space-2) - 24px - 2 * var(--e-space-3)
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
width: var(--label-width);
|
|
155
|
+
text-overflow: ellipsis;
|
|
156
|
+
overflow: hidden;
|
|
157
|
+
}
|
|
158
|
+
|
|
149
159
|
// Animation
|
|
150
160
|
.navigation-toolbar-link {
|
|
151
161
|
&.is-collapsing,
|
|
152
162
|
&.is-expanding {
|
|
153
163
|
animation-duration: var(--e-trs-duration-faster);
|
|
154
164
|
|
|
165
|
+
// animation-duration: 5s;
|
|
166
|
+
|
|
155
167
|
.navigation-toolbar-link__label {
|
|
156
168
|
animation: none;
|
|
157
169
|
position: static;
|
|
158
|
-
width:
|
|
170
|
+
width: var(--label-width);
|
|
159
171
|
height: auto;
|
|
160
172
|
opacity: 1;
|
|
161
173
|
background-color: transparent;
|
|
@@ -99,7 +99,7 @@ const tag = computed(() => {
|
|
|
99
99
|
@mouseleave="onHoverOut"
|
|
100
100
|
>
|
|
101
101
|
<UIcon :name="icon" />
|
|
102
|
-
<span ref="label" class="navigation-toolbar-link__label">
|
|
102
|
+
<span ref="label" class="navigation-toolbar-link__label" :title="label">
|
|
103
103
|
<slot>{{ label }}</slot>
|
|
104
104
|
</span>
|
|
105
105
|
</component>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
@use '../../base/abstracts/' as a;
|
|
2
|
-
@use '../../elements/text-link/text-link.scss' as t;
|
|
3
2
|
|
|
4
3
|
.richtext {
|
|
5
4
|
// Spacing rules
|
|
@@ -74,7 +73,21 @@
|
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
a {
|
|
77
|
-
|
|
76
|
+
font-weight: var(--e-type-weight-strong);
|
|
77
|
+
color: var(--e-c-primary-01-700);
|
|
78
|
+
text-decoration: underline;
|
|
79
|
+
text-underline-offset: 0.3em;
|
|
80
|
+
transition:
|
|
81
|
+
text-decoration-color a.$trs-default,
|
|
82
|
+
color a.$trs-default;
|
|
83
|
+
|
|
84
|
+
&:hover {
|
|
85
|
+
text-decoration-color: var(--e-c-primary-01-50);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&:active {
|
|
89
|
+
text-decoration-color: var(--e-c-primary-01-700);
|
|
90
|
+
}
|
|
78
91
|
}
|
|
79
92
|
|
|
80
93
|
ul,
|
|
@@ -168,7 +181,15 @@
|
|
|
168
181
|
}
|
|
169
182
|
|
|
170
183
|
a {
|
|
171
|
-
|
|
184
|
+
color: var(--e-c-primary-01-50);
|
|
185
|
+
|
|
186
|
+
&:hover {
|
|
187
|
+
text-decoration-color: var(--e-c-primary-01-200);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
&:active {
|
|
191
|
+
text-decoration-color: var(--e-c-primary-01-50);
|
|
192
|
+
}
|
|
172
193
|
}
|
|
173
194
|
|
|
174
195
|
ul > li::before {
|
|
@@ -16,6 +16,4 @@ const classes = ['richtext', { 'richtext--small': small, 'richtext--inverted': i
|
|
|
16
16
|
<div v-else :class="classes"><slot></slot></div>
|
|
17
17
|
</template>
|
|
18
18
|
|
|
19
|
-
<style lang="scss">
|
|
20
|
-
@use './richtext.scss';
|
|
21
|
-
</style>
|
|
19
|
+
<style lang="scss" src="./richtext.scss"></style>
|
package/dist/base-style.css
CHANGED
package/dist/base-style.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../base/main-base.scss","../node_modules/@energie360/design-tokens/dist/fonts/fonts.css","../base/_resets.scss","../base/abstracts/_resets.scss","../base/abstracts/_variables.scss","../base/abstracts/_functions.scss","../base/_input-resets.scss","../base/abstracts/_mixins.scss","../base/_html.scss","../base/_body.scss","../base/_focus-handling.scss","../node_modules/@energie360/design-tokens/dist/css/design-tokens.css"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AACQ;ACpBR;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AC1BA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../base/main-base.scss","../node_modules/@energie360/design-tokens/dist/fonts/fonts.css","../base/_resets.scss","../base/abstracts/_resets.scss","../base/abstracts/_variables.scss","../base/abstracts/_functions.scss","../base/_input-resets.scss","../base/abstracts/_mixins.scss","../base/_html.scss","../base/_body.scss","../base/_focus-handling.scss","../node_modules/@energie360/design-tokens/dist/css/design-tokens.css"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AACQ;ACpBR;EACE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AC1BA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ADuBJ;AAAA;EAEE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;;;AErB+E;AChCjF;ACHA;AAAA;AAAA;EAGE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;EC8BE;EACA;EAKE;;;AD7BF;EACE;;AAGF;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;;AAIA;EACE;;;AAIJ;EACE;;;AAIA;EAEE;EACA;;;AEpDJ;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;ACTF;EACE;EACA;EACA;EACA;EACA;;;ACAF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;ATQF;AACA;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AU3CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA;EAEA;AAAA;EAEA;AAAA;EAEA;AAAA;EAEA;;;AX7MA;AAAA;AAAA;AAAA;EACE","file":"base-style.css"}
|
package/elements/form/form.scss
CHANGED
package/elements/icon/u-icon.vue
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
/**
|
|
3
|
+
* This object will hold all icon fetch promises. Should minimize unnecesary requests. It's just a cache.
|
|
4
|
+
*/
|
|
5
|
+
const fetchPromises = {}
|
|
6
|
+
</script>
|
|
7
|
+
|
|
1
8
|
<script setup lang="ts">
|
|
2
9
|
import { ref } from 'vue'
|
|
3
10
|
import { assetsPath } from '../../globals.js'
|
|
@@ -14,11 +21,6 @@ interface Props {
|
|
|
14
21
|
*/
|
|
15
22
|
const iconPath = assetsPath + 'icons/'
|
|
16
23
|
|
|
17
|
-
/**
|
|
18
|
-
* This map will hold all fetched icons. Should minimize unnecesary requests. It's just a cache.
|
|
19
|
-
*/
|
|
20
|
-
const iconMap = new Map()
|
|
21
|
-
|
|
22
24
|
/**
|
|
23
25
|
* A simple (non-visible) placeholder, which is used when an error happened or the icon couldn't be found.
|
|
24
26
|
*/
|
|
@@ -29,31 +31,39 @@ const svgPlaceholder = `
|
|
|
29
31
|
const svgContent = ref(svgPlaceholder)
|
|
30
32
|
|
|
31
33
|
/**
|
|
32
|
-
* Fetches an icon from the assets folder. Or if already
|
|
34
|
+
* Fetches an icon from the assets folder. Or if already fetched gets it from `iconMap`.
|
|
33
35
|
*/
|
|
34
36
|
const getIcon = (name: string): string => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if (Object.hasOwn(fetchPromises, name)) {
|
|
38
|
+
// Prevents fetching the same icon multiple times when multiple UIcon instances are loaded at the same time.
|
|
39
|
+
fetchPromises[name].then((data) => {
|
|
40
|
+
svgContent.value = data
|
|
41
|
+
})
|
|
42
|
+
|
|
38
43
|
return svgContent.value
|
|
39
44
|
}
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
fetchPromises[name] = new Promise((resolve, reject) => {
|
|
47
|
+
fetch(`${iconPath}${name}.svg`)
|
|
48
|
+
.then((response) => {
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
throw new Error('Something went wrong when fetching the icon.')
|
|
51
|
+
}
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
return response.text()
|
|
54
|
+
})
|
|
55
|
+
.then((text) => {
|
|
56
|
+
resolve(text)
|
|
57
|
+
})
|
|
58
|
+
.catch((err) => {
|
|
59
|
+
console.error(err)
|
|
60
|
+
resolve(svgPlaceholder)
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
fetchPromises[name].then((data) => {
|
|
65
|
+
svgContent.value = data
|
|
66
|
+
})
|
|
57
67
|
|
|
58
68
|
return svgContent.value
|
|
59
69
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { FormFieldBase } from '../form-field/form-field.types'
|
|
3
3
|
import { computed, ref, useId, useSlots } from 'vue'
|
|
4
4
|
import { SelectOption } from '../types'
|
|
5
|
-
import {
|
|
5
|
+
import { getTranslation } from '../../utils/translations/translate'
|
|
6
6
|
|
|
7
7
|
interface Props extends FormFieldBase {
|
|
8
8
|
name: string
|
|
@@ -112,15 +112,15 @@ const needsHelpTextSpacer = computed(() => {
|
|
|
112
112
|
|
|
113
113
|
<div class="help-text">
|
|
114
114
|
<span class="optional-text"
|
|
115
|
-
>{{
|
|
115
|
+
>{{ getTranslation('optional')
|
|
116
116
|
}}<span v-if="needsHelpTextSpacer" v-html="spacer"></span></span
|
|
117
117
|
><slot name="helpText">{{ helpText }}</slot>
|
|
118
118
|
</div>
|
|
119
119
|
|
|
120
120
|
<div class="error-messages-container">
|
|
121
|
-
<slot name="error-message"
|
|
122
|
-
|
|
123
|
-
>
|
|
121
|
+
<slot name="error-message">
|
|
122
|
+
<span>{{ errorMessage }}</span>
|
|
123
|
+
</slot>
|
|
124
124
|
</div>
|
|
125
125
|
</div>
|
|
126
126
|
</template>
|
|
@@ -128,14 +128,14 @@ watch(
|
|
|
128
128
|
>
|
|
129
129
|
<div class="wrapper">
|
|
130
130
|
<div class="label">
|
|
131
|
-
<slot name="label"
|
|
132
|
-
|
|
133
|
-
>
|
|
131
|
+
<slot name="label">
|
|
132
|
+
<label :for="inputId">{{ label }}</label>
|
|
133
|
+
</slot>
|
|
134
134
|
</div>
|
|
135
135
|
|
|
136
136
|
<div class="control">
|
|
137
|
-
<slot
|
|
138
|
-
|
|
137
|
+
<slot>
|
|
138
|
+
<input
|
|
139
139
|
:id="inputId"
|
|
140
140
|
ref="input"
|
|
141
141
|
v-model="model"
|
|
@@ -149,7 +149,8 @@ watch(
|
|
|
149
149
|
@focus="onFocus"
|
|
150
150
|
@focusout="$emit('focusout', $event.target)"
|
|
151
151
|
@blur="onBlur"
|
|
152
|
-
|
|
152
|
+
/>
|
|
153
|
+
</slot>
|
|
153
154
|
|
|
154
155
|
<div class="control-border"></div>
|
|
155
156
|
</div>
|
|
@@ -166,19 +167,24 @@ watch(
|
|
|
166
167
|
<span v-if="unit" class="suffix-text">
|
|
167
168
|
{{ unit }}
|
|
168
169
|
</span>
|
|
170
|
+
|
|
171
|
+
<!-- DATE -->
|
|
172
|
+
<span v-if="type === TextFieldTypes.date" class="suffix-icon">
|
|
173
|
+
<UIcon name="calendar"></UIcon>
|
|
174
|
+
</span>
|
|
169
175
|
</div>
|
|
170
176
|
|
|
171
177
|
<div class="help-text">
|
|
172
|
-
<span class="optional-text"
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
178
|
+
<span class="optional-text">
|
|
179
|
+
{{ getTranslation('optional') }}<span v-if="needsHelpTextSpacer" v-html="spacer"></span>
|
|
180
|
+
</span>
|
|
181
|
+
<slot name="helpText">{{ helpText }}</slot>
|
|
176
182
|
</div>
|
|
177
183
|
|
|
178
184
|
<div class="error-messages-container">
|
|
179
|
-
<slot name="error-message"
|
|
180
|
-
|
|
181
|
-
>
|
|
185
|
+
<slot name="error-message">
|
|
186
|
+
<span>{{ errorMessage }}</span>
|
|
187
|
+
</slot>
|
|
182
188
|
</div>
|
|
183
189
|
</div>
|
|
184
190
|
</template>
|
package/modules/index.js
CHANGED
|
@@ -3,3 +3,4 @@ export { default as UFooter } from './footer/u-footer.vue'
|
|
|
3
3
|
export { default as UInlineEditGroup } from './inline-edit-group/u-inline-edit-group.vue'
|
|
4
4
|
export { default as UNavigationToolbarTop } from './navigation-toolbar-top/u-navigation-toolbar-top.vue'
|
|
5
5
|
export { default as UNavigationToolbarSide } from './navigation-toolbar-side/u-navigation-toolbar-side.vue'
|
|
6
|
+
export { default as UNavigationPanel } from './navigation-panel/u-navigation-panel.vue'
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
@use '../../base/abstracts/' as a;
|
|
2
|
+
|
|
3
|
+
.navigation-panel {
|
|
4
|
+
overflow: auto;
|
|
5
|
+
padding: var(--e-space-6);
|
|
6
|
+
background-color: var(--e-c-mono-50);
|
|
7
|
+
border-right: 1px solid var(--e-c-mono-200);
|
|
8
|
+
width: a.rem(300);
|
|
9
|
+
height: 100vh;
|
|
10
|
+
|
|
11
|
+
@include a.bp(lg) {
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: auto;
|
|
14
|
+
padding: var(--e-space-4) var(--e-space-5) 0;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.navigation-panel__tiles {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
row-gap: var(--e-space-3);
|
|
22
|
+
|
|
23
|
+
@include a.bp(lg) {
|
|
24
|
+
overflow: auto;
|
|
25
|
+
flex-direction: row;
|
|
26
|
+
flex-wrap: nowrap;
|
|
27
|
+
column-gap: var(--e-space-3);
|
|
28
|
+
margin-left: calc(var(--e-space-5) * -1);
|
|
29
|
+
margin-right: calc(var(--e-space-5) * -1);
|
|
30
|
+
padding-left: var(--e-space-5);
|
|
31
|
+
padding-right: var(--e-space-5);
|
|
32
|
+
padding-bottom: var(--e-space-5); // This makes scrollbar not run appear over the tiles
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.navigation-panel__label-tiles,
|
|
37
|
+
.navigation-panel__label-info {
|
|
38
|
+
@include a.type(50, strong);
|
|
39
|
+
|
|
40
|
+
color: var(--e-c-mono-700);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.navigation-panel__label-info {
|
|
44
|
+
margin-bottom: var(--e-space-1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.navigation-panel__label-tiles {
|
|
48
|
+
margin-bottom: var(--e-space-2);
|
|
49
|
+
|
|
50
|
+
@include a.bp(lg) {
|
|
51
|
+
@include a.visually-hidden;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.navigation-panel__info {
|
|
56
|
+
@include a.type(300, strong);
|
|
57
|
+
|
|
58
|
+
margin-bottom: var(--e-space-6);
|
|
59
|
+
|
|
60
|
+
@include a.bp(lg) {
|
|
61
|
+
@include a.type(200, strong);
|
|
62
|
+
margin-bottom: var(--e-space-4);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
interface Props {
|
|
3
|
+
infoLabel: string
|
|
4
|
+
tilesLabel: string
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
defineProps<Props>()
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<template>
|
|
11
|
+
<div class="navigation-panel">
|
|
12
|
+
<p class="navigation-panel__label-info">{{ infoLabel }}</p>
|
|
13
|
+
<div class="navigation-panel__info"><slot name="info"></slot></div>
|
|
14
|
+
|
|
15
|
+
<p class="navigation-panel__label-tiles">{{ tilesLabel }}</p>
|
|
16
|
+
<div class="navigation-panel__tiles">
|
|
17
|
+
<slot></slot>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</template>
|
|
21
|
+
|
|
22
|
+
<style scoped lang="scss" src="./navigation-panel.scss"></style>
|
package/package.json
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
import { deepGetByPath } from '../object/deep-get.js'
|
|
2
1
|
import translations from '../../i18n/i18n.ts'
|
|
3
2
|
|
|
4
3
|
const DEFAULT_LANGUAGE = 'DE'
|
|
5
4
|
|
|
6
|
-
/**
|
|
7
|
-
*
|
|
8
|
-
* @param {string} translationKeyPath
|
|
9
|
-
* @param {string} defaultValue
|
|
10
|
-
* @returns {string}
|
|
11
|
-
*/
|
|
12
|
-
export const translate = (translationKeyPath, defaultValue = '') =>
|
|
13
|
-
deepGetByPath(window._EC.translations, translationKeyPath) || defaultValue
|
|
14
|
-
|
|
15
5
|
const getLanguage = () => {
|
|
16
6
|
const langAttr = document.documentElement.lang.split('-')[0].toUpperCase()
|
|
17
7
|
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement } from 'vue'
|
|
2
|
-
import Button from './u-button.vue'
|
|
3
|
-
import customElementBaseStyle from '../../base/custom-element-base.scss?inline'
|
|
4
|
-
import styles from './button.scss?inline'
|
|
5
|
-
|
|
6
|
-
Button.styles = [customElementBaseStyle, styles]
|
|
7
|
-
|
|
8
|
-
export const ButtonElement = {
|
|
9
|
-
register: () => {
|
|
10
|
-
customElements.define('u-button', defineCustomElement(Button))
|
|
11
|
-
},
|
|
12
|
-
}
|
package/elements/elements.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// All `elements` Custom Elements. Needs some refactoring.
|
|
2
|
-
|
|
3
|
-
import { ButtonElement as Button } from './button/button.js'
|
|
4
|
-
import { IconButtonElement as IconButton } from './icon-button/icon-button.js'
|
|
5
|
-
import { IconElement as Icon } from './icon/icon.js'
|
|
6
|
-
import { LoaderElement as Loader } from './loader/loader.js'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* These exports allow best tree-shaking behaviour.
|
|
10
|
-
* Obviously you'll have to import 'manually' all the elements you need.
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* import { IconButton } from '@energie360/ui-library'
|
|
14
|
-
* IconButton.register()
|
|
15
|
-
*/
|
|
16
|
-
export { Button, IconButton, Icon, Loader }
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* With this export you get all the elements. Meaning all the elements will be inlcuded in your bundle, even if you register only one element.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* import { Elements } from '@energie360/ui-library'
|
|
23
|
-
* Elements.Button.register()
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
28
|
-
* @type {{IconButton: {register: function(): void}, Button: {register: function(): void}, Loader: {register: function(): void}, Icon: {register: function(): void}}}
|
|
29
|
-
*/
|
|
30
|
-
export const Elements = {
|
|
31
|
-
Button,
|
|
32
|
-
IconButton,
|
|
33
|
-
Icon,
|
|
34
|
-
Loader,
|
|
35
|
-
}
|
package/elements/icon/icon.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement } from 'vue'
|
|
2
|
-
import Icon from './u-icon.vue'
|
|
3
|
-
import customElementBaseStyle from '../../base/custom-element-base.scss?inline'
|
|
4
|
-
import ceStyles from './icon.ce.scss?inline'
|
|
5
|
-
import styles from './icon.scss?inline'
|
|
6
|
-
|
|
7
|
-
Icon.styles = [customElementBaseStyle, ceStyles, styles]
|
|
8
|
-
|
|
9
|
-
export const IconElement = {
|
|
10
|
-
register: () => {
|
|
11
|
-
customElements.define('u-icon', defineCustomElement(Icon))
|
|
12
|
-
},
|
|
13
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement } from 'vue'
|
|
2
|
-
import IconButton from './u-icon-button.vue'
|
|
3
|
-
import customElementBaseStyle from '../../base/custom-element-base.scss?inline'
|
|
4
|
-
import styles from './icon-button.scss?inline'
|
|
5
|
-
|
|
6
|
-
IconButton.styles = [customElementBaseStyle, styles]
|
|
7
|
-
|
|
8
|
-
export const IconButtonElement = {
|
|
9
|
-
register: () => {
|
|
10
|
-
customElements.define('u-icon-button', defineCustomElement(IconButton))
|
|
11
|
-
},
|
|
12
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { defineCustomElement } from 'vue'
|
|
2
|
-
import Loader from './u-loader.vue'
|
|
3
|
-
import customElementBaseStyle from '../../base/custom-element-base.scss?inline'
|
|
4
|
-
import ceStyles from './loader.ce.scss?inline'
|
|
5
|
-
import styles from './loader.scss?inline'
|
|
6
|
-
|
|
7
|
-
Loader.styles = [customElementBaseStyle, ceStyles, styles]
|
|
8
|
-
|
|
9
|
-
export const LoaderElement = {
|
|
10
|
-
register: () => {
|
|
11
|
-
customElements.define('u-loader', defineCustomElement(Loader))
|
|
12
|
-
},
|
|
13
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as UFeedback } from './u-feedback.vue'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default as UInlineEditGroup } from './u-inline-edit-group.vue'
|