@energie360/ui-library 0.1.38 → 0.1.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/base/abstracts/_resets.scss +2 -0
  2. package/components/card-contact/card-contact.scss +5 -5
  3. package/components/card-contact/u-card-contact.vue +5 -5
  4. package/components/context-menu/u-context-menu.vue +1 -1
  5. package/components/data-card/data-card.scss +13 -1
  6. package/components/data-card/u-data-card.vue +13 -0
  7. package/components/index.js +1 -0
  8. package/components/navigation-toolbar-link/navigation-toolbar-link.scss +1 -1
  9. package/components/portal-logo/portal-logo.scss +65 -0
  10. package/components/portal-logo/u-portal-logo.vue +32 -0
  11. package/components/progress-avatar/u-progress-avatar.vue +4 -11
  12. package/components/skeleton-loader/skeleton-loader.scss +33 -8
  13. package/components/table/cell-icon-group.scss +1 -0
  14. package/components/table/table-cell.mixins.scss +2 -1
  15. package/components/table/table-heading.scss +27 -0
  16. package/components/table/table-row.mixins.scss +14 -0
  17. package/components/table/table-row.scss +2 -6
  18. package/components/table/table.type.ts +6 -0
  19. package/components/table/u-table-header.vue +11 -2
  20. package/components/table/u-table-heading.vue +88 -4
  21. package/components/table/u-table-row.vue +11 -18
  22. package/components/tabs/tabs.scss +17 -1
  23. package/components/tabs/u-tabs.vue +3 -2
  24. package/dist/base-style.css +2 -0
  25. package/dist/base-style.css.map +1 -1
  26. package/dist/layout/split.css +8 -1
  27. package/dist/layout/split.css.map +1 -1
  28. package/elements/icon-button/_icon-button-plain.scss +5 -0
  29. package/layout/portal-block/portal-block.scss +12 -0
  30. package/layout/portal-block/u-portal-block.vue +15 -4
  31. package/layout/portal-main/portal-main.scss +3 -0
  32. package/layout/portal-main/u-portal-main.vue +8 -0
  33. package/layout/split/split.scss +6 -2
  34. package/layout/split/u-split-layout.vue +3 -1
  35. package/modules/footer/footer.scss +44 -23
  36. package/modules/footer/footer.types.ts +5 -0
  37. package/modules/footer/u-footer.vue +5 -5
  38. package/modules/navigation-panel/navigation-panel.scss +1 -0
  39. package/modules/navigation-toolbar-side/u-navigation-toolbar-side.vue +26 -6
  40. package/modules/navigation-toolbar-top/navigation-toolbar-top.scss +4 -2
  41. package/modules/navigation-toolbar-top/u-navigation-toolbar-top.vue +16 -16
  42. package/package.json +1 -1
@@ -5,7 +5,9 @@
5
5
  appearance: none;
6
6
  border: 0;
7
7
  font-family: inherit;
8
+ font-weight: inherit;
8
9
  font-size: inherit;
10
+ color: inherit;
9
11
  background: none;
10
12
  text-align: left;
11
13
  }
@@ -13,17 +13,17 @@
13
13
  flex-direction: column;
14
14
  }
15
15
 
16
- .card-contact__name {
17
- @include a.type(700, strong);
18
- }
19
-
20
16
  .card-contact__role {
21
17
  @include a.type(200);
18
+ }
19
+
20
+ .card-contact__name {
21
+ @include a.type(700, strong);
22
22
 
23
23
  margin-top: var(--e-space-1);
24
24
 
25
25
  &:has(+ .card-contact__contacts) {
26
- margin-bottom: var(--e-space-4);
26
+ margin-bottom: var(--e-space-2);
27
27
  }
28
28
  }
29
29
 
@@ -21,16 +21,16 @@ defineSlots<{
21
21
  <template>
22
22
  <div class="card-contact">
23
23
  <div class="card-contact__left-column">
24
- <p class="card-contact__name">
25
- <slot name="name">{{ name }}</slot>
26
- </p>
27
-
28
24
  <p class="card-contact__role">
29
25
  <slot name="role">{{ role }}</slot>
30
26
  </p>
31
27
 
28
+ <p class="card-contact__name">
29
+ <slot name="name">{{ name }}</slot>
30
+ </p>
31
+
32
32
  <div v-if="$slots.contacts || contacts" class="card-contact__contacts">
33
- <URichtext>
33
+ <URichtext small>
34
34
  <slot name="contacts">
35
35
  <div v-html="contacts"></div>
36
36
  </slot>
@@ -99,7 +99,7 @@ watch([() => placement, () => offset, () => viewportPadding], () => {
99
99
  <template>
100
100
  <div class="context-menu" :class="{ 'is-open': isOpen, 'is-closed': !isOpen }">
101
101
  <div ref="trigger" class="context-menu__trigger" @click="onToggleMenu">
102
- <slot name="trigger"></slot>
102
+ <slot name="trigger" :is-open="isOpen"></slot>
103
103
  </div>
104
104
 
105
105
  <Transition name="menu" @enter="onEnter" @after-leave="onAfterLeave">
@@ -2,8 +2,20 @@
2
2
 
3
3
  .data-card {
4
4
  padding: var(--e-space-4);
5
- border: 1px solid var(--e-c-mono-200);
5
+ position: relative;
6
6
  border-radius: var(--e-brd-radius-2);
7
+
8
+ &::before {
9
+ content: '';
10
+ position: absolute;
11
+ top: 0;
12
+ left: 0;
13
+ width: 100%;
14
+ height: 100%;
15
+ border: 1px solid var(--e-c-mono-200);
16
+ border-radius: var(--e-brd-radius-2);
17
+ transition: border var(--e-trs-duration-faster) var(--e-trs-easing-default);
18
+ }
7
19
  }
8
20
 
9
21
  .data-card__aside-column {
@@ -52,3 +52,16 @@ defineProps<Props>()
52
52
  @include a.type(100);
53
53
  }
54
54
  </style>
55
+
56
+ <style lang="scss">
57
+ .data-card-linked {
58
+ display: block;
59
+ border-radius: var(--e-brd-radius-1);
60
+
61
+ &:hover {
62
+ .data-card::before {
63
+ border: 3px solid var(--e-c-primary-01-200);
64
+ }
65
+ }
66
+ }
67
+ </style>
@@ -75,3 +75,4 @@ export { default as UDefinitionListItem } from './definition-list-item/u-definit
75
75
  export { default as UCardStatistic } from './card-statistic/u-card-statistic.vue'
76
76
  export { default as UEmpty } from './empty/u-empty.vue'
77
77
  export { default as UButtonGroup } from './button-group/u-button-group.vue'
78
+ export { default as UPortalLogo } from './portal-logo/u-portal-logo.vue'
@@ -92,7 +92,7 @@
92
92
  }
93
93
 
94
94
  &:active,
95
- &:hover:not(.is-collapsing, .is-expanding) {
95
+ &:hover:not(.is-collapsing, .is-expanding, .active) {
96
96
  background-color: var(--e-c-secondary-01-950);
97
97
  color: var(--e-c-primary-01-100);
98
98
  }
@@ -0,0 +1,65 @@
1
+ @use '../../base/abstracts' as a;
2
+
3
+ .portal-logo {
4
+ --duration: var(--e-trs-duration-faster);
5
+
6
+ position: relative;
7
+ width: a.rem(196);
8
+ height: a.rem(40);
9
+
10
+ .mini {
11
+ position: absolute;
12
+ top: 0;
13
+ opacity: 0;
14
+ }
15
+
16
+ // Modifiers
17
+ &.fit-height {
18
+ height: 100%;
19
+
20
+ .large {
21
+ aspect-ratio: 49 / 10;
22
+ height: 100%;
23
+ }
24
+
25
+ .mini {
26
+ aspect-ratio: 1;
27
+ height: 100%;
28
+ }
29
+ }
30
+
31
+ // States
32
+ &.minified {
33
+ .mini {
34
+ opacity: 1;
35
+ }
36
+
37
+ .large {
38
+ opacity: 0;
39
+ }
40
+ }
41
+
42
+ &.minifying {
43
+ .mini {
44
+ opacity: 1;
45
+ transition: opacity var(--duration) var(--transition-ease-out);
46
+ }
47
+
48
+ .large {
49
+ opacity: 0;
50
+ transition: opacity var(--duration) var(--transition-ease-out);
51
+ }
52
+ }
53
+
54
+ &.expanding {
55
+ .mini {
56
+ opacity: 0;
57
+ transition: opacity var(--duration) var(--transition-ease-out);
58
+ }
59
+
60
+ .large {
61
+ opacity: 1;
62
+ transition: opacity var(--duration) var(--transition-ease-out);
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ import { Image } from '../../elements/types'
3
+
4
+ interface Props {
5
+ logoImage?: Image
6
+ logoMinifiedImage?: Image
7
+ minified?: boolean
8
+ minifying?: boolean
9
+ expanding?: boolean
10
+ fitHeight?: boolean
11
+ }
12
+
13
+ const {
14
+ logoImage = {
15
+ src: '/static/ui-assets/images/logo-white.svg',
16
+ alt: 'Logo Energie 360°',
17
+ },
18
+ logoMinifiedImage = {
19
+ src: '/static/ui-assets/images/logo-mini.svg',
20
+ alt: 'Logo Energie 360°',
21
+ },
22
+ } = defineProps<Props>()
23
+ </script>
24
+
25
+ <template>
26
+ <div :class="['portal-logo', { minified, minifying, expanding, 'fit-height': fitHeight }]">
27
+ <img v-bind="logoImage" class="large" />
28
+ <img v-bind="logoMinifiedImage" class="mini" />
29
+ </div>
30
+ </template>
31
+
32
+ <style scoped lang="scss" src="./portal-logo.scss"></style>
@@ -22,7 +22,6 @@ const el = useTemplateRef('el')
22
22
  const _progress = ref(0)
23
23
  const lottiePlayer = ref(null)
24
24
  let lottiePlayerInstance = null
25
- const lottiePlayerSegment = ref([0, 0])
26
25
 
27
26
  const DotLottieVue = defineAsyncComponent(async () => {
28
27
  const { DotLottieVue } = await import('@lottiefiles/dotlottie-vue')
@@ -35,6 +34,8 @@ const observer = new IntersectionObserver(
35
34
  observer.disconnect()
36
35
 
37
36
  setTimeout(() => {
37
+ _progress.value = progress
38
+
38
39
  // dotLottie Player stuff
39
40
  if (lottiePlayer.value) {
40
41
  lottiePlayerInstance = lottiePlayer.value.getDotLottieInstance()
@@ -46,12 +47,9 @@ const observer = new IntersectionObserver(
46
47
  autoplay: false,
47
48
  loop: false,
48
49
  speed: 3,
50
+ segment: [0, scaleValue(_progress.value, 0, 100, 0, dotLottieFrames)],
49
51
  })
50
- lottiePlayerSegment.value = [0, scaleValue(_progress.value, 0, 100, 0, dotLottieFrames)]
51
52
  }
52
-
53
- // Start progress animation
54
- _progress.value = progress
55
53
  }, 200)
56
54
  }
57
55
  },
@@ -77,12 +75,7 @@ onMounted(() => {
77
75
  <img v-bind="image" />
78
76
  </slot>
79
77
 
80
- <DotLottieVue
81
- v-else
82
- ref="lottiePlayer"
83
- style="height: 100%; width: 100%"
84
- :segment="lottiePlayerSegment"
85
- ></DotLottieVue>
78
+ <DotLottieVue v-else ref="lottiePlayer" style="height: 100%; width: 100%" />
86
79
  </div>
87
80
  </div>
88
81
  </template>
@@ -1,25 +1,50 @@
1
1
  @use '../../base/abstracts' as a;
2
2
 
3
- @keyframes skeleton-animation {
3
+ @keyframes loading-anim {
4
4
  0% {
5
- background-color: var(--e-c-primary-01-50);
5
+ transform: translateX(-100%);
6
+ }
7
+
8
+ 50% {
9
+ transform: translateX(0%);
6
10
  }
7
11
 
8
12
  100% {
9
- background-color: var(--e-c-primary-01-100);
13
+ transform: translateX(140%);
10
14
  }
11
15
  }
12
16
 
13
17
  @mixin skeleton-base {
18
+ position: relative;
14
19
  background-color: var(--e-c-primary-01-50);
15
20
  border-radius: var(--e-brd-radius-2);
21
+ overflow: hidden;
16
22
  width: 100%;
17
23
  height: 100%;
18
- animation-name: skeleton-animation;
19
- animation-duration: var(--e-trs-duration-slower);
20
- animation-direction: alternate;
21
- animation-timing-function: ease-in-out;
22
- animation-iteration-count: infinite;
24
+
25
+ &::after {
26
+ display: block;
27
+ content: '';
28
+ position: absolute;
29
+ width: 100%;
30
+ height: 100%;
31
+ animation-name: loading-anim;
32
+ animation-duration: 2s;
33
+ animation-iteration-count: infinite;
34
+ animation-timing-function: linear;
35
+ background: linear-gradient(
36
+ 100deg,
37
+ transparent 10%,
38
+ var(--e-c-primary-01-100) 50%,
39
+ transparent 90%
40
+ );
41
+ bottom: 0;
42
+ left: 0;
43
+ right: 0;
44
+ top: 0;
45
+ transform: translateX(-100%);
46
+ z-index: 1;
47
+ }
23
48
  }
24
49
 
25
50
  .skeleton-loader.fit {
@@ -3,6 +3,7 @@
3
3
  .cell-icon-group {
4
4
  display: flex;
5
5
  column-gap: var(--e-space-2);
6
+ line-height: 1;
6
7
 
7
8
  @each $name, $color-var in c.$table-cell-icon-colors {
8
9
  .icon-color-#{$name} {
@@ -3,7 +3,7 @@
3
3
  @mixin table-cell-base {
4
4
  display: table-cell;
5
5
  padding: var(--e-space-4);
6
- height: a.rem(56);
6
+ min-height: a.rem(56);
7
7
  line-height: 0;
8
8
 
9
9
  @include a.bp(m) {
@@ -21,6 +21,7 @@
21
21
 
22
22
  display: inline-flex;
23
23
  column-gap: var(--e-space-2);
24
+ min-height: a.rem(24);
24
25
  }
25
26
 
26
27
  // Horizontal align options
@@ -5,6 +5,33 @@
5
5
  font-weight: var(--e-type-weight-strong);
6
6
 
7
7
  @include c.table-cell-base;
8
+
9
+ &.sortable {
10
+ .cell-content {
11
+ cursor: pointer;
12
+ }
13
+
14
+ .cell-content:hover {
15
+ color: var(--e-c-primary-01-700);
16
+
17
+ .table-heading__sort-icon {
18
+ opacity: 1;
19
+ }
20
+ }
21
+ }
22
+
23
+ &.is-sorted {
24
+ color: var(--e-c-primary-01-700);
25
+
26
+ .table-heading__sort-icon {
27
+ opacity: 1;
28
+ }
29
+ }
30
+ }
31
+
32
+ .table-heading__sort-icon {
33
+ align-self: center;
34
+ opacity: 0;
8
35
  }
9
36
 
10
37
  .cell-content {
@@ -0,0 +1,14 @@
1
+ @mixin table-row {
2
+ display: table-row;
3
+ position: relative;
4
+
5
+ &::before {
6
+ content: '';
7
+ position: absolute;
8
+ bottom: 0;
9
+ left: 0;
10
+ background-color: var(--e-c-mono-100);
11
+ width: 100%;
12
+ height: 1px;
13
+ }
14
+ }
@@ -1,12 +1,8 @@
1
1
  @use '../../base/abstracts' as a;
2
-
3
- @mixin table-row {
4
- display: table-row;
5
- border-bottom: 1px solid var(--e-c-mono-100);
6
- }
2
+ @use './table-row.mixins' as tr;
7
3
 
8
4
  .table-row {
9
- @include table-row;
5
+ @include tr.table-row;
10
6
 
11
7
  &.highlight {
12
8
  background-color: var(--e-c-mono-50);
@@ -29,3 +29,9 @@ export enum TableCellTextStyle {
29
29
  normal = 'normal',
30
30
  bold = 'bold',
31
31
  }
32
+
33
+ export enum TableHeadingSortOrder {
34
+ ASC = 'ascending',
35
+ DESC = 'descending',
36
+ None = 'none',
37
+ }
@@ -1,9 +1,18 @@
1
+ <script setup lang="ts"></script>
1
2
  <template>
2
3
  <div class="table-header">
3
4
  <slot></slot>
4
5
  </div>
5
6
  </template>
6
7
 
7
- <style scoped lang="scss">
8
- @use './table-header.scss';
8
+ <style scoped lang="scss" src="./table-header.scss"></style>
9
+
10
+ <style lang="scss">
11
+ .table-header {
12
+ &:has(+ .table-row-linked:hover) {
13
+ .table-row::before {
14
+ background-color: var(--e-c-primary-01-100);
15
+ }
16
+ }
17
+ }
9
18
  </style>
@@ -1,19 +1,103 @@
1
1
  <script setup lang="ts">
2
+ import { TableHeadingSortOrder } from './table.type'
3
+ import UIcon from '../../elements/icon/u-icon.vue'
4
+ import { computed, nextTick, ref, useId } from 'vue'
5
+
2
6
  interface Props {
3
7
  text?: string
4
8
  hAlign?: 'left' | 'center' | 'right'
5
9
  vAlign?: 'top' | 'center' | 'bottom'
6
10
  nowrap?: boolean
11
+ sortable?: boolean
12
+ sortColumnId?: string
7
13
  }
8
14
 
9
- const { text = '', hAlign = 'left', vAlign = 'top' } = defineProps<Props>()
15
+ const {
16
+ text = '',
17
+ hAlign = 'left',
18
+ vAlign = 'top',
19
+ sortable = false,
20
+ sortColumnId = useId(),
21
+ } = defineProps<Props>()
22
+
23
+ const emits = defineEmits(['sort'])
24
+
25
+ const sortOrder = defineModel<string>({ default: TableHeadingSortOrder.None })
26
+
27
+ const sortIcon = computed(() => {
28
+ let icon = ''
29
+
30
+ if (
31
+ currentSortOrder.value === TableHeadingSortOrder.None ||
32
+ currentSortOrder.value === TableHeadingSortOrder.ASC
33
+ ) {
34
+ icon = 'arrow-up-small'
35
+ }
36
+
37
+ if (currentSortOrder.value === TableHeadingSortOrder.DESC) {
38
+ icon = 'arrow-down-small'
39
+ }
40
+
41
+ return icon
42
+ })
43
+
44
+ const currentSortOrder = ref(sortOrder)
45
+
46
+ const isSorted = computed(() => currentSortOrder.value !== TableHeadingSortOrder.None)
47
+
48
+ const toggleSortOrder = () => {
49
+ if (currentSortOrder.value === TableHeadingSortOrder.ASC) {
50
+ currentSortOrder.value = TableHeadingSortOrder.DESC
51
+ } else {
52
+ currentSortOrder.value = TableHeadingSortOrder.ASC
53
+ }
54
+ }
55
+
56
+ const onSort = async () => {
57
+ if (!sortable) {
58
+ return
59
+ }
60
+
61
+ if (currentSortOrder.value === TableHeadingSortOrder.None) {
62
+ currentSortOrder.value = TableHeadingSortOrder.ASC
63
+ } else {
64
+ toggleSortOrder()
65
+ }
66
+
67
+ await nextTick()
68
+
69
+ emits('sort', { sortColumnId, sortOrder: currentSortOrder.value })
70
+ }
10
71
  </script>
11
72
 
12
73
  <template>
13
- <div role="cell" :class="['table-heading', `h-align-${hAlign}`, `v-align-${vAlign}`]">
14
- <div :class="['cell-content', { nowrap }]">
74
+ <div
75
+ :data-sort-id="sortable ? sortColumnId : null"
76
+ role="columnheader"
77
+ :class="[
78
+ 'table-heading',
79
+ `h-align-${hAlign}`,
80
+ `v-align-${vAlign}`,
81
+ { sortable, 'is-sorted': isSorted },
82
+ ]"
83
+ >
84
+ <component
85
+ :is="sortable ? 'button' : 'div'"
86
+ :class="['cell-content', { nowrap }]"
87
+ @click="onSort"
88
+ >
15
89
  <slot>{{ text }}</slot>
16
- </div>
90
+
91
+ <span class="table-heading__sort-icon">
92
+ <UIcon
93
+ :name="sortIcon"
94
+ :style="{
95
+ '--icon-width': '16px',
96
+ '--icon-height': '16px',
97
+ }"
98
+ />
99
+ </span>
100
+ </component>
17
101
  </div>
18
102
  </template>
19
103
 
@@ -13,35 +13,28 @@ defineProps<Props>()
13
13
  </div>
14
14
  </template>
15
15
 
16
- <style scoped lang="scss">
17
- @use './table-row.scss';
18
- </style>
16
+ <style scoped lang="scss" src="./table-row.scss"></style>
19
17
 
20
18
  <style lang="scss">
21
- @use './table-row.scss' as tr;
19
+ @use './table-row.mixins.scss' as tr;
20
+
21
+ .table-row-linked {
22
+ &:has(+ .table-row-linked:hover) {
23
+ &::before {
24
+ background-color: var(--e-c-primary-01-100);
25
+ }
26
+ }
27
+ }
22
28
 
23
29
  .table-row-linked {
24
30
  @include tr.table-row;
25
31
 
26
32
  transition: background var(--e-trs-duration-faster) var(--e-trs-easing-default);
27
33
 
28
- &::after {
29
- content: '';
30
- position: absolute;
31
- top: 0;
32
- left: 0;
33
- height: 1px;
34
- width: 100%;
35
- background-color: transparent;
36
- transition: background var(--e-trs-duration-faster) var(--e-trs-easing-default);
37
- }
38
-
39
34
  &:hover {
40
- position: relative;
41
35
  background-color: var(--e-c-primary-01-50);
42
- border-bottom: 1px solid var(--e-c-primary-01-100);
43
36
 
44
- &::after {
37
+ &::before {
45
38
  background-color: var(--e-c-primary-01-100);
46
39
  }
47
40
  }
@@ -3,6 +3,8 @@
3
3
  .tabs {
4
4
  $scroll-space: 18px;
5
5
 
6
+ --tabs-gradient-color: #fff;
7
+
6
8
  position: relative;
7
9
 
8
10
  &::before {
@@ -28,7 +30,11 @@
28
30
  right: 0;
29
31
  width: 30px;
30
32
  height: calc(100% - #{$scroll-space} - 1px);
31
- background: linear-gradient(270deg, #fff 0%, rgb(255 255 255 / 0%) 100%);
33
+ background: linear-gradient(
34
+ 270deg,
35
+ var(--tabs-gradient-color) 0%,
36
+ rgb(255 255 255 / 0%) 100%
37
+ );
32
38
  }
33
39
  }
34
40
 
@@ -95,3 +101,13 @@
95
101
  }
96
102
  }
97
103
  }
104
+
105
+ .tabs.portal {
106
+ .tabs__row {
107
+ padding-left: var(--e-space-2);
108
+
109
+ @include a.bp(lg) {
110
+ padding-left: var(--e-space-5);
111
+ }
112
+ }
113
+ }
@@ -13,9 +13,10 @@ interface Props {
13
13
  activation?: 'manual' | 'automatic'
14
14
  items?: Tab[]
15
15
  noGradient?: boolean
16
+ variant: 'default' | 'portal'
16
17
  }
17
18
 
18
- const { items = [], activation = 'manual' } = defineProps<Props>()
19
+ const { items = [], activation = 'manual', variant = 'portal' } = defineProps<Props>()
19
20
  const emit = defineEmits<{ (e: 'tabFocus', id: string): void }>()
20
21
 
21
22
  const model = defineModel<string>()
@@ -122,7 +123,7 @@ onResize()
122
123
  </script>
123
124
 
124
125
  <template>
125
- <div :class="['tabs', { 'no-gradient': noGradient }]">
126
+ <div :class="['tabs', variant, { 'no-gradient': noGradient }]">
126
127
  <div class="tabs__row">
127
128
  <div class="tabs__col">
128
129
  <div class="tabs__wrapper">
@@ -37,7 +37,9 @@ button {
37
37
  appearance: none;
38
38
  border: 0;
39
39
  font-family: inherit;
40
+ font-weight: inherit;
40
41
  font-size: inherit;
42
+ color: inherit;
41
43
  background: none;
42
44
  text-align: left;
43
45
  }
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../base/main-base.scss","../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/fonts/fonts.css","../node_modules/@energie360/design-tokens/dist/css/design-tokens.css"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;ACEA;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;;;AAGF;EACE;;;AEzB+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;;;AAGF;EAEE;;AAEA;EAEE;EACA;;;AEvDJ;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;ACTF;EACE;EACA;EACA;EACA;EACA;;;ACAF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AChBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AAEA;AAEA;AAEA;AAEA;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AC/CJ;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"}
1
+ {"version":3,"sourceRoot":"","sources":["../base/main-base.scss","../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/fonts/fonts.css","../node_modules/@energie360/design-tokens/dist/css/design-tokens.css"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;ACEA;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;EACA;EACA;;;ADqBJ;AAAA;EAEE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AEzB+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;;;AAGF;EAEE;;AAEA;EAEE;EACA;;;AEvDJ;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;EAGE;;;ACTF;EACE;EACA;EACA;EACA;EACA;;;ACAF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AChBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBA;AAEA;AAEA;AAEA;AAEA;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AAIJ;AACA;EACE;EACA;EACA;EACA;EACA,KACE;;AC/CJ;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"}
@@ -68,6 +68,9 @@
68
68
  }
69
69
  }
70
70
 
71
+ .split__top-bar {
72
+ flex: 0 0 auto;
73
+ }
71
74
  @media (max-width: 1020px) {
72
75
  .split__top-bar {
73
76
  grid-area: content;
@@ -81,10 +84,13 @@
81
84
  }
82
85
 
83
86
  .split__content {
87
+ display: flex;
88
+ align-items: center;
84
89
  padding-top: var(--e-space-20);
85
90
  padding-bottom: var(--e-space-20);
86
91
  margin: 0 auto;
87
92
  width: 25rem;
93
+ flex: 1 0 auto;
88
94
  }
89
95
  @media (max-width: 1020px) {
90
96
  .split__content {
@@ -95,6 +101,7 @@
95
101
  }
96
102
  @media (max-width: 740px) {
97
103
  .split__content {
104
+ align-items: flex-start;
98
105
  order: 2;
99
106
  width: auto;
100
107
  margin-top: 0;
@@ -112,7 +119,7 @@
112
119
  }
113
120
 
114
121
  .split__footer {
115
- margin-top: auto;
122
+ flex: 0 0 auto;
116
123
  }
117
124
  @media (max-width: 1020px) {
118
125
  .split__footer {
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../base/abstracts/_variables.scss","../../base/abstracts/_functions.scss","../../layout/container/container.scss","../../base/abstracts/_mixins.scss","../../layout/split/split.scss"],"names":[],"mappings":"AAqCiF;AChCjF;ACwCA;EAxCE;EACA;EACA;EACA;EACA;;ACYA;EDwBF;IAjCI;IACA;;;ACQF;EDwBF;IA5BI;IACA;;;ACGF;EDwBF;IAvBI;IACA;;;;AEjBJ;EACE;EACA;EACA;EACA;EACA;;ADUA;ECfF;IAQI;IACA;IACA;IACA;IACA;IACA,qBACE;;;ADCJ;ECfF;IAmBI;IACA;;;;AAIJ;EACE;EACA;;ADXA;ECSF;IAKI;IACA;;;ADfF;ECSF;IAUI;IACA;IACA;;;;ADrBF;ECyBF;IAII;IACA;;;AD9BF;ECyBF;IASI;;;;AAIJ;EACE;EACA;EACA;EACA;;AD1CA;ECsCF;IAOI;IAIA;IACA;;;ADlDF;ECsCF;IAgBI;IACA;IACA;IACA;IACA;IACA;;;AD3DF;ECsCF;IAyBI;IACA;IACA;;;;AAIJ;EACE;;ADtEA;ECqEF;IAII;;;ADzEF;ECqEF;IAQI","file":"split.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../base/abstracts/_variables.scss","../../base/abstracts/_functions.scss","../../layout/container/container.scss","../../base/abstracts/_mixins.scss","../../layout/split/split.scss"],"names":[],"mappings":"AAqCiF;AChCjF;ACwCA;EAxCE;EACA;EACA;EACA;EACA;;ACYA;EDwBF;IAjCI;IACA;;;ACQF;EDwBF;IA5BI;IACA;;;ACGF;EDwBF;IAvBI;IACA;;;;AEjBJ;EACE;EACA;EACA;EACA;EACA;;ADUA;ECfF;IAQI;IACA;IACA;IACA;IACA;IACA,qBACE;;;ADCJ;ECfF;IAmBI;IACA;;;;AAIJ;EACE;EACA;;ADXA;ECSF;IAKI;IACA;;;ADfF;ECSF;IAUI;IACA;IACA;;;;AAIJ;EACE;;AD1BA;ECyBF;IAII;IACA;;;AD9BF;ECyBF;IASI;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AD7CA;ECsCF;IAUI;IAIA;IACA;;;ADrDF;ECsCF;IAmBI;IACA;IACA;IACA;IACA;IACA;IACA;;;AD/DF;ECsCF;IA6BI;IACA;IACA;;;;AAIJ;EACE;;AD1EA;ECyEF;IAII;;;AD7EF;ECyEF;IAQI","file":"split.css"}
@@ -24,6 +24,11 @@
24
24
  }
25
25
 
26
26
  &:disabled {
27
+ &::before {
28
+ background-color: transparent;
29
+ border-color: transparent;
30
+ }
31
+
27
32
  .icon,
28
33
  e-icon {
29
34
  --icon-fill-color: var(--e-c-mono-500);
@@ -42,4 +42,16 @@
42
42
  &:last-child {
43
43
  margin-bottom: 0;
44
44
  }
45
+
46
+ // Modifiers
47
+ &.fill-centered {
48
+ flex: 1 0 auto;
49
+ display: flex;
50
+ width: 100%;
51
+ align-items: center;
52
+
53
+ .portal-block__inner {
54
+ width: 100%;
55
+ }
56
+ }
45
57
  }
@@ -2,20 +2,31 @@
2
2
  /*
3
3
  Preferably only use `bottom-space`.
4
4
  `top-space` can make sense for last portal-block for example.
5
- This works because parent container is `display: block`, meaning that the vertical margins will collapse.
5
+ IMPORTANT: Because when the parent container (e.g., `.portal-main__content`) is flexbox, the vertical margins won't collapse.
6
+ Also, `fill-centered` will only work with a flexbox parent.
6
7
  */
7
8
  interface Props {
8
9
  big?: boolean
9
10
  bottomSpace?: '0' | '100' | '300' | '500' | '700'
10
11
  topSpace?: '0' | '100' | '300' | '500' | '700'
12
+ fillCentered?: boolean
11
13
  }
12
14
 
13
- const { bottomSpace = '100', topSpace = '0' } = defineProps<Props>()
15
+ const { bottomSpace = '100', topSpace = '0', fillCentered = false } = defineProps<Props>()
14
16
  </script>
15
17
 
16
18
  <template>
17
- <div :class="['portal-block', `bottom-space-${bottomSpace}`, `top-space-${topSpace}`]">
18
- <slot />
19
+ <div
20
+ :class="[
21
+ 'portal-block',
22
+ `bottom-space-${bottomSpace}`,
23
+ `top-space-${topSpace}`,
24
+ { 'fill-centered': fillCentered },
25
+ ]"
26
+ >
27
+ <div class="portal-block__inner">
28
+ <slot />
29
+ </div>
19
30
  </div>
20
31
  </template>
21
32
 
@@ -82,6 +82,9 @@
82
82
  padding-top: var(--e-space-10);
83
83
  padding-bottom: var(--e-space-10);
84
84
  flex: 1 1 100%;
85
+ display: flex;
86
+ flex-direction: column;
87
+ flex-wrap: nowrap;
85
88
 
86
89
  @include c.portal-content-container;
87
90
 
@@ -35,3 +35,11 @@ const portalFooterSlot = inject('portal-footer-slot')
35
35
  </template>
36
36
 
37
37
  <style scoped lang="scss" src="./portal-main.scss"></style>
38
+
39
+ <style scoped lang="scss">
40
+ .portal-main__sub-navigation {
41
+ :slotted(.tabs) {
42
+ --tabs-gradient-color: var(--e-c-mono-50);
43
+ }
44
+ }
45
+ </style>
@@ -45,7 +45,7 @@ $split-top-bar-height-mobile: 72px;
45
45
  }
46
46
 
47
47
  .split__top-bar {
48
- // height: a.rem($split-top-bar-height);
48
+ flex: 0 0 auto;
49
49
 
50
50
  @include a.bp(lg) {
51
51
  grid-area: content;
@@ -58,10 +58,13 @@ $split-top-bar-height-mobile: 72px;
58
58
  }
59
59
 
60
60
  .split__content {
61
+ display: flex;
62
+ align-items: center;
61
63
  padding-top: var(--e-space-20);
62
64
  padding-bottom: var(--e-space-20);
63
65
  margin: 0 auto;
64
66
  width: a.rem(400);
67
+ flex: 1 0 auto;
65
68
 
66
69
  @include a.bp(lg) {
67
70
  margin-top: a.rem(
@@ -73,6 +76,7 @@ $split-top-bar-height-mobile: 72px;
73
76
  }
74
77
 
75
78
  @include a.bp(m) {
79
+ align-items: flex-start;
76
80
  order: 2;
77
81
  width: auto;
78
82
  margin-top: 0;
@@ -89,7 +93,7 @@ $split-top-bar-height-mobile: 72px;
89
93
  }
90
94
 
91
95
  .split__footer {
92
- margin-top: auto;
96
+ flex: 0 0 auto;
93
97
 
94
98
  @include a.bp(lg) {
95
99
  grid-area: footer;
@@ -9,7 +9,9 @@
9
9
  </div>
10
10
 
11
11
  <div class="split__content">
12
- <slot name="content"></slot>
12
+ <div class="split__content-inner">
13
+ <slot name="content"></slot>
14
+ </div>
13
15
  </div>
14
16
 
15
17
  <div class="split__footer">
@@ -2,9 +2,35 @@
2
2
  @use '../../elements/text-link/text-link.scss' as t;
3
3
  @use '../../layout/container/container.scss' as l;
4
4
 
5
+ @mixin mobile-layout {
6
+ .footer__bottom-row {
7
+ flex-direction: column;
8
+ align-items: flex-start;
9
+ }
10
+
11
+ .footer__meta-navigation {
12
+ flex-direction: column;
13
+ gap: var(--e-space-4);
14
+ margin-bottom: var(--e-space-8);
15
+ }
16
+
17
+ .footer__copyright {
18
+ position: absolute;
19
+ left: 0;
20
+ bottom: 0;
21
+ }
22
+
23
+ .footer__language-nav {
24
+ position: relative;
25
+ margin-bottom: calc(var(--e-space-8) + #{a.rem(18)});
26
+ }
27
+ }
28
+
5
29
  .footer {
6
30
  &.portal,
7
31
  &.reduced {
32
+ container-type: inline-size;
33
+
8
34
  .footer__top {
9
35
  display: none;
10
36
  }
@@ -20,42 +46,37 @@
20
46
 
21
47
  .footer__meta-navigation {
22
48
  order: 2;
49
+ margin-bottom: 0;
23
50
  }
24
51
 
25
52
  .footer__language-nav {
26
53
  position: static;
27
54
  }
55
+
56
+ .footer__bottom {
57
+ background-color: var(--e-c-mono-50);
58
+ padding-bottom: var(--e-space-8);
59
+ }
60
+
61
+ .footer__bottom-row {
62
+ min-height: a.rem(30);
63
+ align-items: center;
64
+ }
28
65
  }
29
66
 
30
- &.portal {
31
- container-type: inline-size;
67
+ &.reduced {
68
+ @container (width < 900px) {
69
+ @include mobile-layout;
70
+ }
71
+ }
32
72
 
73
+ &.portal {
33
74
  .footer__container {
34
75
  @include l.portal-content-container;
35
76
  }
36
77
 
37
78
  @container (width < 820px) {
38
- // Mobile Layout
39
- .footer__bottom-row {
40
- flex-direction: column;
41
- }
42
-
43
- .footer__meta-navigation {
44
- flex-direction: column;
45
- gap: var(--e-space-4);
46
- margin-bottom: var(--e-space-8);
47
- }
48
-
49
- .footer__copyright {
50
- position: absolute;
51
- left: 0;
52
- bottom: 0;
53
- }
54
-
55
- .footer__language-nav {
56
- position: relative;
57
- margin-bottom: calc(var(--e-space-8) + #{a.rem(18)});
58
- }
79
+ @include mobile-layout;
59
80
  }
60
81
  }
61
82
  }
@@ -0,0 +1,5 @@
1
+ export enum FooterVariant {
2
+ normal = 'normal',
3
+ reduced = 'reduced',
4
+ portal = 'portal',
5
+ }
@@ -1,9 +1,11 @@
1
1
  <script setup lang="ts">
2
+ import { FooterVariant } from './footer.types'
3
+
2
4
  interface Props {
3
- variant?: 'normal' | 'reduced' | 'portal'
5
+ variant?: FooterVariant
4
6
  }
5
7
 
6
- const { variant = 'normal' } = defineProps<Props>()
8
+ const { variant = FooterVariant.normal } = defineProps<Props>()
7
9
  </script>
8
10
 
9
11
  <template>
@@ -48,6 +50,4 @@ const { variant = 'normal' } = defineProps<Props>()
48
50
  </div>
49
51
  </template>
50
52
 
51
- <style lang="scss">
52
- @use './footer.scss';
53
- </style>
53
+ <style lang="scss" src="./footer.scss"></style>
@@ -12,6 +12,7 @@
12
12
  width: 100%;
13
13
  height: auto;
14
14
  padding: var(--e-space-4) var(--e-space-5) 0;
15
+ border-right: 0;
15
16
  }
16
17
  }
17
18
 
@@ -3,6 +3,7 @@ import { UNavigationToolbarLink } from '../../components'
3
3
  import { UContextMenu } from '../../components'
4
4
  import { Image } from '../../elements/types'
5
5
  import { ref, watch, useTemplateRef } from 'vue'
6
+ import { hasSlotContent } from '../../utils/vue/helpers'
6
7
 
7
8
  interface MenuButton {
8
9
  icon: string
@@ -10,17 +11,31 @@ interface MenuButton {
10
11
  }
11
12
 
12
13
  interface Props {
13
- logoLink: {
14
+ logoLink?: {
14
15
  href: string
15
16
  target: string
16
17
  }
17
18
  menuButton: MenuButton
18
19
  collapsed?: boolean
19
- logoImage: Image
20
- logoMinifiedImage: Image
20
+ logoImage?: Image
21
+ logoMinifiedImage?: Image
21
22
  }
22
23
 
23
- const { collapsed = false } = defineProps<Props>()
24
+ const {
25
+ collapsed = false,
26
+ logoImage = {
27
+ src: '/static/ui-assets/images/logo-white.svg',
28
+ alt: 'Logo Energie 360°',
29
+ },
30
+ logoMinifiedImage = {
31
+ src: '/static/ui-assets/images/logo-mini.svg',
32
+ alt: 'Logo Energie 360°',
33
+ },
34
+ logoLink = {
35
+ href: '',
36
+ target: '_self',
37
+ },
38
+ } = defineProps<Props>()
24
39
 
25
40
  const el = useTemplateRef('el')
26
41
  const isCollapsed = ref(collapsed)
@@ -61,7 +76,12 @@ watch(
61
76
  },
62
77
  ]"
63
78
  >
79
+ <div v-if="hasSlotContent($slots.logo)" style="margin-bottom: var(--e-space-12)">
80
+ <slot name="logo" :is-collapsing="isCollapsing" :is-expanding="isExpanding" />
81
+ </div>
82
+
64
83
  <a
84
+ v-else
65
85
  :class="[
66
86
  'navigation-toolbar-side__logo',
67
87
  { 'is-collapsing': isCollapsing, 'is-expanding': isExpanding },
@@ -81,9 +101,9 @@ watch(
81
101
 
82
102
  <div class="navigation-toolbar-side__menu-ctas">
83
103
  <UContextMenu placement="right-bottom">
84
- <template #trigger>
104
+ <template #trigger="{ isOpen }">
85
105
  <button class="navigation-toolbar-side__menu-cta" type="button">
86
- <UNavigationToolbarLink v-bind="menuButton" :collapsed />
106
+ <UNavigationToolbarLink v-bind="menuButton" :collapsed :active="isOpen" />
87
107
  </button>
88
108
  </template>
89
109
 
@@ -1,4 +1,4 @@
1
- @use '../../base/abstracts/' as a;
1
+ @use '../../base/abstracts' as a;
2
2
 
3
3
  .navigation-toolbar-top {
4
4
  --transition-ease-out: cubic-bezier(0.215, 0.61, 0.355, 1); /* easeOutCubic */
@@ -74,8 +74,10 @@
74
74
  }
75
75
 
76
76
  .navigation-toolbar-top__top-bar-logo {
77
+ height: a.rem(24);
78
+
77
79
  img {
78
- height: a.rem(24);
80
+ height: 100%;
79
81
  }
80
82
  }
81
83
 
@@ -93,18 +93,18 @@ watch(model, (newV) => {
93
93
  ]"
94
94
  >
95
95
  <div class="navigation-toolbar-top__top-bar">
96
- <a
97
- class="navigation-toolbar-top__top-bar-logo"
98
- :href="logoLink.href"
99
- :target="logoLink.target"
100
- >
101
- <img :src="logoImage.src" :alt="logoImage.alt" />
102
- </a>
96
+ <div class="navigation-toolbar-top__top-bar-logo">
97
+ <slot name="logo">
98
+ <a :href="logoLink.href" :target="logoLink.target">
99
+ <img :src="logoImage.src" :alt="logoImage.alt" />
100
+ </a>
101
+ </slot>
102
+ </div>
103
103
 
104
104
  <div class="navigation-toolbar-top__top-bar-ctas">
105
105
  <UContextMenu placement="bottom-full">
106
- <template #trigger>
107
- <UNavigationToolbarLink v-bind="menuButton" collapsed label-hidden />
106
+ <template #trigger="{ isOpen }">
107
+ <UNavigationToolbarLink v-bind="menuButton" collapsed label-hidden :active="isOpen" />
108
108
  </template>
109
109
 
110
110
  <slot name="contextMenuLinks"></slot>
@@ -125,13 +125,13 @@ watch(model, (newV) => {
125
125
  class="navigation-toolbar-top__nav-panel"
126
126
  :class="{ 'is-opening': isMobilePanelOpening, 'is-closing': isMobilePanelClosing }"
127
127
  >
128
- <a
129
- class="navigation-toolbar-top__nav-panel-logo"
130
- :href="logoLink.href"
131
- :target="logoLink.target"
132
- >
133
- <img :src="logoImage.src" :alt="logoImage.alt" />
134
- </a>
128
+ <div class="navigation-toolbar-top__nav-panel-logo">
129
+ <slot name="panelLogo">
130
+ <a :href="logoLink.href" :target="logoLink.target">
131
+ <img :src="logoImage.src" :alt="logoImage.alt" />
132
+ </a>
133
+ </slot>
134
+ </div>
135
135
 
136
136
  <div class="navigation-toolbar-top__nav-panel-close">
137
137
  <UIconButton
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energie360/ui-library",
3
- "version": "0.1.38",
3
+ "version": "0.1.40",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",