@energie360/ui-library 0.1.33 → 0.1.34

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/_resets.scss CHANGED
@@ -58,3 +58,7 @@ fieldset {
58
58
  margin: 0;
59
59
  border: 0;
60
60
  }
61
+
62
+ legend {
63
+ padding: 0;
64
+ }
@@ -0,0 +1,12 @@
1
+ // TODO: Check with Design if spacings are ok.
2
+ .button-group {
3
+ display: flex;
4
+ flex-wrap: wrap;
5
+ column-gap: var(--e-space-2);
6
+ row-gap: var(--e-space-4);
7
+ }
8
+
9
+ .button-group.stacked {
10
+ flex-direction: column;
11
+ align-items: flex-start;
12
+ }
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ type?: 'inline' | 'stacked'
4
+ }
5
+
6
+ const { type = 'inline' } = defineProps<Props>()
7
+ </script>
8
+
9
+ <template>
10
+ <div :class="['button-group', type]">
11
+ <slot />
12
+ </div>
13
+ </template>
14
+
15
+ <style scoped lang="scss" src="./button-group.scss"></style>
@@ -24,6 +24,11 @@
24
24
 
25
25
  .data-card__value {
26
26
  @include a.type(100);
27
+
28
+ &:has(.data-card__dot) {
29
+ display: flex;
30
+ column-gap: var(--e-space-2);
31
+ }
27
32
  }
28
33
 
29
34
  .data-card__ctas {
@@ -32,3 +37,13 @@
32
37
  margin-top: var(--e-space-4);
33
38
  line-height: 0;
34
39
  }
40
+
41
+ .data-card__dot {
42
+ align-self: center;
43
+ flex: 0 0 auto;
44
+ display: block;
45
+ width: 8px;
46
+ height: 8px;
47
+ border-radius: 100%;
48
+ background-color: transparent;
49
+ }
@@ -3,6 +3,7 @@
3
3
  interface dataItem {
4
4
  heading: string
5
5
  value: string
6
+ dotColor?: string
6
7
  }
7
8
 
8
9
  interface Props {
@@ -23,7 +24,11 @@ defineProps<Props>()
23
24
  <slot>
24
25
  <div v-for="(item, idx) in data" :key="idx">
25
26
  <dt class="data-card__heading">{{ item.heading }}</dt>
26
- <dd class="data-card__value" v-html="item.value"></dd>
27
+ <dd v-if="item.dotColor" class="data-card__value">
28
+ <span class="data-card__dot" :style="{ backgroundColor: item.dotColor }"></span>
29
+ <span class="data-card__value" v-html="item.value" />
30
+ </dd>
31
+ <dd v-else class="data-card__value" v-html="item.value"></dd>
27
32
  </div>
28
33
  </slot>
29
34
  </dl>
@@ -74,3 +74,4 @@ export { default as UDefinitionList } from './definition-list/u-definition-list.
74
74
  export { default as UDefinitionListItem } from './definition-list-item/u-definition-list-item.vue'
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
+ export { default as UButtonGroup } from './button-group/u-button-group.vue'
@@ -83,6 +83,7 @@
83
83
  }
84
84
 
85
85
  .notification-item__dot {
86
+ flex: 0 0 auto;
86
87
  display: block;
87
88
  width: 8px;
88
89
  height: 8px;
@@ -30,6 +30,7 @@
30
30
 
31
31
  .table-cell__dot {
32
32
  align-self: center;
33
+ flex: 0 0 auto;
33
34
  display: block;
34
35
  width: 8px;
35
36
  height: 8px;
@@ -0,0 +1,9 @@
1
+ [
2
+ [0,0],
3
+ [202, 0],
4
+ [404, 0],
5
+ [606, 0],
6
+ [808, 0],
7
+ [1010, 0],
8
+ [1212, 0]
9
+ ]
@@ -1,15 +1,66 @@
1
1
  <script setup lang="ts">
2
+ import USpriteAnimation from '../sprite-animation/u-sprite-animation.vue'
2
3
  import { Image } from '../../elements/types'
4
+ import butterflySpritePositions from './butterfly-sprite.json'
5
+ import butterflySprite from './butterfly-sprite.png'
6
+ import { gsap } from 'gsap'
7
+ import { ref, useTemplateRef } from 'vue'
3
8
 
4
9
  interface Props {
5
10
  text?: string
6
11
  image?: Image
7
12
  }
8
13
  defineProps<Props>()
14
+
15
+ const butterfly = useTemplateRef('butterfly')
16
+ const container = useTemplateRef('container')
17
+ const butterflyWrapper = useTemplateRef('butterflyWrapper')
18
+ const mouseRightSide = ref(true)
19
+ const xOffset = -300
20
+
21
+ const onMouseleave = () => {
22
+ mouseRightSide.value = Number(gsap.getProperty(butterflyWrapper.value, 'x')) < 0
23
+
24
+ gsap.to(butterflyWrapper.value, {
25
+ x: 0,
26
+ y: 0,
27
+ ease: 'power2',
28
+ duration: 4,
29
+ overwrite: true,
30
+ })
31
+ }
32
+
33
+ const onMousemove = (e: MouseEvent) => {
34
+ const { left, top, width, height } = container.value.getBoundingClientRect()
35
+
36
+ const halfW = width / 2
37
+ const halfH = height / 2
38
+ const mouseX = e.x - left
39
+ const mouseY = e.y - top
40
+
41
+ const x = gsap.utils.interpolate(-halfW, halfW, mouseX / width)
42
+ const y = gsap.utils.interpolate(-halfH, halfH, mouseY / height)
43
+
44
+ gsap.to(butterflyWrapper.value, {
45
+ x: x + xOffset,
46
+ y: y,
47
+ duration: 10,
48
+ ease: 'power1',
49
+ overwrite: true,
50
+ onUpdate() {
51
+ mouseRightSide.value =
52
+ Number(gsap.getProperty(butterflyWrapper.value, 'x')) < mouseX + xOffset - width / 2
53
+ },
54
+ })
55
+ }
56
+
57
+ const onSpriteReady = () => {
58
+ butterfly.value.playLoop()
59
+ }
9
60
  </script>
10
61
 
11
62
  <template>
12
- <div class="welcome">
63
+ <div ref="container" class="welcome" @mousemove="onMousemove" @mouseleave="onMouseleave">
13
64
  <div class="welcome__content">
14
65
  <h2>
15
66
  <slot>{{ text }}</slot>
@@ -21,6 +72,23 @@ defineProps<Props>()
21
72
  <img :src="image.src" :alt="image.alt" />
22
73
  </slot>
23
74
  </div>
75
+
76
+ <div ref="butterflyWrapper" class="welcome__sprite-animation">
77
+ <USpriteAnimation
78
+ ref="butterfly"
79
+ :style="{
80
+ transform: mouseRightSide ? 'scaleX(1)' : 'scaleX(-1)',
81
+ }"
82
+ :spritesheet-path="butterflySprite"
83
+ :frame-positions="butterflySpritePositions"
84
+ :frame-width="202"
85
+ :frame-height="300"
86
+ :width="32"
87
+ :height="47"
88
+ :duration="1000"
89
+ @ready="onSpriteReady"
90
+ />
91
+ </div>
24
92
  </div>
25
93
  </template>
26
94
 
@@ -18,6 +18,7 @@
18
18
  min-height: a.rem(86);
19
19
  height: auto;
20
20
  padding: var(--e-space-3) var(--e-space-4);
21
+ pointer-events: none;
21
22
  }
22
23
  }
23
24
 
@@ -46,3 +47,12 @@
46
47
  display: none;
47
48
  }
48
49
  }
50
+
51
+ .welcome__sprite-animation {
52
+ position: absolute;
53
+ right: 290px;
54
+
55
+ @include a.bp(lg) {
56
+ right: 32px;
57
+ }
58
+ }
@@ -71,6 +71,10 @@ fieldset {
71
71
  border: 0;
72
72
  }
73
73
 
74
+ legend {
75
+ padding: 0;
76
+ }
77
+
74
78
  /* easeOutCubic */
75
79
  /* prettier-ignore */
76
80
  input,
@@ -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;;;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;;;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;;;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"}
@@ -67,7 +67,7 @@
67
67
  }
68
68
  .form .form__cta-group {
69
69
  display: flex;
70
- grid-gap: var(--e-space-5);
70
+ gap: var(--e-space-5);
71
71
  }
72
72
  @media (max-width: 740px) {
73
73
  .form .form__cta-group {
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../base/abstracts/_variables.scss","../../base/abstracts/_functions.scss","../../layout/grid/grid.mixin.scss","../../layout/form-grid/form-grid.scss","../../base/abstracts/_mixins.scss"],"names":[],"mappings":"AAqCiF;AChCjF;ACFA;AAAA;AAAA;AAAA;AA0BA;AAAA;;AAAA;AAAA;AAAA;ACzBA;EACE;;;AAGF;EDIE;EACA;EACA,KFgBgB;;AIThB;EDbF;IDSI,KFca;;;AIVf;EDbF;IDaI,KFWY;;;AIXd;EDbF;IDiBI,KFQY;;;AGtBd;ED2BA;EACA,WAHY;;AEfZ;EDVA;IDiCE;IACA,WAHW;;;AErBb;EDVA;IDwCE;IACA,WAHU;;;AE5BZ;EDVA;ID+CE;IACA,WAHU;;;ACxCZ;EDsBA;EACA,WAHY;;AEfZ;EDLA;ID4BE;IACA,WAHW;;;AErBb;EDLA;IDmCE;IACA,WAHU;;;AE5BZ;EDLA;ID0CE;IACA,WAHU;;;ACpCZ;EDkBA;EACA,WAHY;;AEfZ;EDDA;IDwBE;IACA,WAHW;;;AErBb;EDDA;ID+BE;IACA,WAHU;;;AE5BZ;EDDA;IDsCE;IACA,WAHU;;;AC/BZ;EDaA;EACA,WAHY;;AEfZ;EDIA;IDmBE;IACA,WAHW;;;AErBb;EDIA;ID0BE;IACA,WAHU;;;AE5BZ;EDIA;IDiCE;IACA,WAHU;;;AC3BZ;EDSA;EACA,WAHY;;AEfZ;EDQA;IDeE;IACA,WAHW;;;AErBb;EDQA;IDsBE;IACA,WAHU;;;AE5BZ;EDQA;ID6BE;IACA,WAHU;;;AEnCZ;EDYA;AAAA;AAAA;AAAA;IDKA;IACA,WAHY;;;AEfZ;EDYA;AAAA;AAAA;AAAA;IDWE;IACA,WAHW;;;AErBb;EDYA;AAAA;AAAA;AAAA;IDkBE;IACA,WAHU;;;AE5BZ;EDYA;AAAA;AAAA;AAAA;IDyBE;IACA,WAHU;;;ACdZ;EACE","file":"form-grid.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../../base/abstracts/_variables.scss","../../base/abstracts/_functions.scss","../../layout/grid/grid.mixin.scss","../../layout/form-grid/form-grid.scss","../../base/abstracts/_mixins.scss"],"names":[],"mappings":"AAqCiF;AChCjF;ACFA;AAAA;AAAA;AAAA;AA0BA;AAAA;;AAAA;AAAA;AAAA;ACvBA;EACE;;;AAGF;EDEE;EACA;EACA,KFgBgB;;AIThB;EDXF;IDOI,KFca;;;AIVf;EDXF;IDWI,KFWY;;;AIXd;EDXF;IDeI,KFQY;;;AGpBd;EDyBA;EACA,WAHY;;AEfZ;EDRA;ID+BE;IACA,WAHW;;;AErBb;EDRA;IDsCE;IACA,WAHU;;;AE5BZ;EDRA;ID6CE;IACA,WAHU;;;ACtCZ;EDoBA;EACA,WAHY;;AEfZ;EDHA;ID0BE;IACA,WAHW;;;AErBb;EDHA;IDiCE;IACA,WAHU;;;AE5BZ;EDHA;IDwCE;IACA,WAHU;;;AClCZ;EDgBA;EACA,WAHY;;AEfZ;EDCA;IDsBE;IACA,WAHW;;;AErBb;EDCA;ID6BE;IACA,WAHU;;;AE5BZ;EDCA;IDoCE;IACA,WAHU;;;AC7BZ;EDWA;EACA,WAHY;;AEfZ;EDMA;IDiBE;IACA,WAHW;;;AErBb;EDMA;IDwBE;IACA,WAHU;;;AE5BZ;EDMA;ID+BE;IACA,WAHU;;;ACzBZ;EDOA;EACA,WAHY;;AEfZ;EDUA;IDaE;IACA,WAHW;;;AErBb;EDUA;IDoBE;IACA,WAHU;;;AE5BZ;EDUA;ID2BE;IACA,WAHU;;;AEnCZ;EDcA;AAAA;AAAA;AAAA;IDGA;IACA,WAHY;;;AEfZ;EDcA;AAAA;AAAA;AAAA;IDSE;IACA,WAHW;;;AErBb;EDcA;AAAA;AAAA;AAAA;IDgBE;IACA,WAHU;;;AE5BZ;EDcA;AAAA;AAAA;AAAA;IDuBE;IACA,WAHU;;;ACZZ;EACE","file":"form-grid.css"}
@@ -55,7 +55,7 @@
55
55
 
56
56
  .form__cta-group {
57
57
  display: flex;
58
- grid-gap: var(--e-space-5);
58
+ gap: var(--e-space-5);
59
59
 
60
60
  @include a.bp(m) {
61
61
  flex-direction: column;
package/i18n/i18n.ts CHANGED
@@ -1,3 +1,5 @@
1
+ // TODO: Update translations
2
+
1
3
  const translations = {
2
4
  DE: {
3
5
  yes: 'Ja',
@@ -26,13 +28,13 @@ const translations = {
26
28
  removeNotification: 'Benachrichtigung entfernen',
27
29
  },
28
30
  FR: {
29
- yes: 'Ja',
30
- no: 'Nein',
31
- optional: 'Optional',
32
- increaseValue: 'Wert erhöhen',
33
- decreaseValue: 'Wert vermindern',
34
- showPassword: 'Passwort anzeigen',
35
- hidePassword: 'Passwort verbergen',
31
+ yes: 'Oui',
32
+ no: 'Non',
33
+ optional: 'Facultatif',
34
+ increaseValue: 'Augmenter la valeur',
35
+ decreaseValue: 'Diminuer la valeur',
36
+ showPassword: 'Afficher le mot de passe',
37
+ hidePassword: 'Masquer le mot de passe',
36
38
  close: 'Fermer',
37
39
  passwordRequirements: 'Exigences relatives au mot de passe',
38
40
  edit: 'Modifier',
@@ -52,13 +54,13 @@ const translations = {
52
54
  removeNotification: 'supprimer la notification',
53
55
  },
54
56
  IT: {
55
- yes: 'Ja',
56
- no: 'Nein',
57
- optional: 'Optional',
58
- increaseValue: 'Wert erhöhen',
59
- decreaseValue: 'Wert vermindern',
60
- showPassword: 'Passwort anzeigen',
61
- hidePassword: 'Passwort verbergen',
57
+ yes: '',
58
+ no: 'No',
59
+ optional: 'Opzionale',
60
+ increaseValue: 'Aumentare il valore',
61
+ decreaseValue: 'Diminuire il valore',
62
+ showPassword: 'Mostra password',
63
+ hidePassword: 'Nascondi password',
62
64
  close: 'Chiudere',
63
65
  passwordRequirements: 'Requisiti per la password',
64
66
  edit: 'modificare',
@@ -78,13 +80,13 @@ const translations = {
78
80
  removeNotification: 'rimuovere la notifica',
79
81
  },
80
82
  EN: {
81
- yes: 'Ja',
82
- no: 'Nein',
83
+ yes: 'Yes',
84
+ no: 'No',
83
85
  optional: 'Optional',
84
- increaseValue: 'Wert erhöhen',
85
- decreaseValue: 'Wert vermindern',
86
- showPassword: 'Passwort anzeigen',
87
- hidePassword: 'Passwort verbergen',
86
+ increaseValue: 'Increase value',
87
+ decreaseValue: 'Decrease value',
88
+ showPassword: 'Show password',
89
+ hidePassword: 'Hide Password',
88
90
  close: 'Close',
89
91
  passwordRequirements: 'Password requirements',
90
92
  edit: 'Edit',
@@ -1,6 +1,8 @@
1
1
  @use '../grid/grid.mixin' as g;
2
2
  @use '../../base/abstracts' as a;
3
3
 
4
+ // TODO: Refactor form-grid. Implement styles from `elements/form/form.scss` here.
5
+
4
6
  // TODO: This class doesn't seem to be necessary. Check first then remove it.
5
7
  .form-grid {
6
8
  width: 100%;
@@ -7,7 +7,7 @@ const { col = '2/4' } = defineProps<Props>()
7
7
  </script>
8
8
 
9
9
  <template>
10
- <div :class="[`form-col-${col}`]">
10
+ <div :class="['form__input-col', `form-col-${col}`]">
11
11
  <slot />
12
12
  </div>
13
13
  </template>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <fieldset class="form-fieldset">
3
+ <legend v-if="$slots.legend" class="form-fieldset__legend">
4
+ <slot name="legend" />
5
+ </legend>
6
+
7
+ <p v-if="$slots.text" class="form-fieldset__text">
8
+ <slot name="text" />
9
+ </p>
10
+
11
+ <slot />
12
+ </fieldset>
13
+ </template>
14
+
15
+ <style scoped lang="scss" src="./form-grid.scss"></style>
16
+ <style scoped lang="scss">
17
+ @use '../../base/abstracts' as a;
18
+
19
+ .form-fieldset + .form-fieldset {
20
+ margin-top: var(--e-space-10);
21
+ }
22
+
23
+ .form-fieldset__legend {
24
+ @include a.type(300, strong);
25
+
26
+ &:not(:has(+ .form-fieldset__text)) {
27
+ margin-bottom: var(--e-space-6);
28
+ }
29
+ }
30
+
31
+ .form-fieldset__text {
32
+ @include a.type(300);
33
+
34
+ margin-bottom: var(--e-space-6);
35
+ }
36
+ </style>
@@ -1,7 +1,33 @@
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ type?: 'input' | 'cta'
4
+ }
5
+
6
+ const { type = 'input' } = defineProps<Props>()
7
+ </script>
8
+
1
9
  <template>
2
- <div class="form-row">
3
- <slot />
4
- </div>
10
+ <div :class="['form-row', `form__${type}-row`]"><slot /></div>
5
11
  </template>
6
12
 
7
13
  <style lang="scss" scoped src="./form-grid.scss"></style>
14
+
15
+ <style scoped lang="scss">
16
+ @use '../../base/abstracts' as a;
17
+
18
+ .form-row {
19
+ :slotted(.form__input-col + .form__input-col) {
20
+ @include a.bp(lg) {
21
+ margin-top: var(--e-space-6);
22
+ }
23
+ }
24
+ }
25
+
26
+ .form__input-row + .form__input-row {
27
+ margin-top: var(--e-space-6);
28
+ }
29
+
30
+ *:not(legend) + .form-row.form__cta-row {
31
+ margin-top: var(--e-space-10);
32
+ }
33
+ </style>
@@ -0,0 +1,7 @@
1
+ <template>
2
+ <div class="form form-grid">
3
+ <slot></slot>
4
+ </div>
5
+ </template>
6
+
7
+ <style scoped lang="scss" src="./form-grid.scss"></style>
package/layout/index.js CHANGED
@@ -8,3 +8,5 @@ export { default as UPortalBlock } from './portal-block/u-portal-block.vue'
8
8
  export { default as USplitLayout } from './split/u-split-layout.vue'
9
9
  export { default as UFormRow } from './form-grid/u-form-row.vue'
10
10
  export { default as UFormCol } from './form-grid/u-form-col.vue'
11
+ export { default as UFormWrapper } from './form-grid/u-form-wrapper.vue'
12
+ export { default as UFormFieldset } from './form-grid/u-form-fieldset.vue'
@@ -125,7 +125,12 @@
125
125
  left: 0;
126
126
  width: 100%;
127
127
  height: var(--overflow-gradient-height);
128
- background-image: linear-gradient(0deg, rgb(255 255 255 / 100%) 0%, rgb(255 255 255 / 0%) 100%);
128
+ background-image: linear-gradient(
129
+ 0deg,
130
+ rgb(255 255 255 / 100%) 0%,
131
+ rgb(255 255 255 / 80%) 50%,
132
+ rgb(255 255 255 / 0%) 100%
133
+ );
129
134
  }
130
135
 
131
136
  &.cta-inline {
@@ -28,9 +28,35 @@
28
28
  }
29
29
 
30
30
  &.portal {
31
+ container-type: inline-size;
32
+
31
33
  .footer__container {
32
34
  @include l.portal-content-container;
33
35
  }
36
+
37
+ @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
+ }
59
+ }
34
60
  }
35
61
  }
36
62
 
@@ -48,7 +74,7 @@
48
74
  .footer__top-row {
49
75
  display: flex;
50
76
  flex-wrap: wrap;
51
- grid-gap: var(--e-space-12);
77
+ gap: var(--e-space-12);
52
78
  }
53
79
 
54
80
  .footer__addresses-column {
@@ -87,7 +113,7 @@
87
113
 
88
114
  .footer__social-links {
89
115
  display: flex;
90
- grid-gap: var(--e-space-6);
116
+ gap: var(--e-space-6);
91
117
  }
92
118
 
93
119
  .footer__bottom {
@@ -126,7 +152,7 @@
126
152
  @include a.type(100);
127
153
 
128
154
  display: flex;
129
- grid-gap: var(--e-space-6);
155
+ gap: var(--e-space-6);
130
156
  margin-bottom: var(--e-space-3);
131
157
 
132
158
  a {
@@ -139,7 +165,7 @@
139
165
 
140
166
  @include a.bp(m) {
141
167
  flex-direction: column;
142
- grid-gap: var(--e-space-4);
168
+ gap: var(--e-space-4);
143
169
  margin-bottom: var(--e-space-8);
144
170
  }
145
171
  }
@@ -27,6 +27,7 @@ $sprite-height-mobile: 59px;
27
27
  position: relative;
28
28
  max-width: 680px;
29
29
  margin: 0 60px;
30
+ padding: 5%;
30
31
 
31
32
  img {
32
33
  user-select: none;
@@ -59,7 +60,4 @@ $sprite-height-mobile: 59px;
59
60
  width: $sprite-width-mobile;
60
61
  height: $sprite-height-mobile;
61
62
  }
62
-
63
- &.flip {
64
- }
65
63
  }
@@ -15,6 +15,8 @@ const onSpriteReady = () => {
15
15
  }
16
16
 
17
17
  const onMouseleave = () => {
18
+ mouseRightSide.value = Number(gsap.getProperty(butterflyWrapper.value, 'x')) < 0
19
+
18
20
  gsap.to(butterflyWrapper.value, {
19
21
  x: 0,
20
22
  y: 0,
@@ -24,7 +26,7 @@ const onMouseleave = () => {
24
26
  })
25
27
  }
26
28
 
27
- const onMousemove = (e) => {
29
+ const onMousemove = (e: MouseEvent) => {
28
30
  const { left, top, width, height } = container.value.getBoundingClientRect()
29
31
 
30
32
  const halfW = width / 2
@@ -32,17 +34,19 @@ const onMousemove = (e) => {
32
34
  const mouseX = e.x - left
33
35
  const mouseY = e.y - top
34
36
 
35
- mouseRightSide.value = mouseX > halfW
36
-
37
37
  const x = gsap.utils.interpolate(-halfW, halfW, mouseX / width)
38
38
  const y = gsap.utils.interpolate(-halfH, halfH, mouseY / height)
39
39
 
40
40
  gsap.to(butterflyWrapper.value, {
41
41
  x: x,
42
42
  y: y,
43
- duration: 4,
43
+ duration: 3.5,
44
44
  ease: 'power1',
45
45
  overwrite: true,
46
+ onUpdate() {
47
+ mouseRightSide.value =
48
+ Number(gsap.getProperty(butterflyWrapper.value, 'x')) < mouseX - width / 2
49
+ },
46
50
  })
47
51
  }
48
52
  </script>
@@ -50,7 +54,7 @@ const onMousemove = (e) => {
50
54
  <template>
51
55
  <div ref="container" class="login-animation" @mousemove="onMousemove" @mouseleave="onMouseleave">
52
56
  <div class="login-animation__image">
53
- <div ref="butterflyWrapper" :class="['login-animation__sprite', { flip: !mouseRightSide }]">
57
+ <div ref="butterflyWrapper" class="login-animation__sprite">
54
58
  <USpriteAnimation
55
59
  ref="butterfly"
56
60
  :style="{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energie360/ui-library",
3
- "version": "0.1.33",
3
+ "version": "0.1.34",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,18 +24,18 @@
24
24
  "author": "",
25
25
  "license": "MIT",
26
26
  "devDependencies": {
27
- "@lottiefiles/dotlottie-web": "^0.60.0",
28
27
  "@tsconfig/node22": "^22.0.5",
29
- "@types/node": "^25.0.3",
28
+ "@types/node": "^25.0.10",
30
29
  "@vue/tsconfig": "^0.8.1",
31
30
  "autoprefixer": "^10.4.23",
32
31
  "chokidar": "^5.0.0",
33
32
  "postcss": "^8.5.6",
34
- "sass": "^1.97.1",
33
+ "sass": "^1.97.3",
35
34
  "typescript": "^5.9.3"
36
35
  },
37
36
  "dependencies": {
38
- "@lottiefiles/dotlottie-vue": "^0.10.12",
37
+ "@lottiefiles/dotlottie-vue": "^0.10.13",
38
+ "@lottiefiles/dotlottie-web": "^0.61.0",
39
39
  "@lottiefiles/lottie-player": "^2.0.12",
40
40
  "gsap": "^3.14.2",
41
41
  "@energie360/design-tokens": "^1.3.0"