@energie360/ui-library 0.1.4 → 0.1.5

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 (48) hide show
  1. package/components/card/card.scss +2 -25
  2. package/components/card-footer/card-footer.scss +5 -0
  3. package/components/card-footer/u-card-footer.vue +52 -0
  4. package/components/card-group/card-group.scss +29 -0
  5. package/components/card-group/u-card-group.vue +66 -0
  6. package/components/card-header/card-header.scss +1 -5
  7. package/components/card-section/card-section.scss +13 -0
  8. package/components/card-section/u-card-section.vue +7 -0
  9. package/components/tabs/tabs.scss +88 -0
  10. package/components/tabs/u-tabs.vue +140 -0
  11. package/dist/layout/split.css +6 -0
  12. package/dist/layout/split.css.map +1 -1
  13. package/elements/button/_button-base.scss +1 -1
  14. package/elements/form-field/form-field-base.scss +1 -1
  15. package/elements/icon-button/_icon-button-base.scss +1 -4
  16. package/elements/radio/index.js +1 -0
  17. package/elements/radio/radio.scss +7 -0
  18. package/elements/radio/u-radio.vue +33 -0
  19. package/elements/radio-group/index.js +1 -0
  20. package/elements/radio-group/radio-group-composables.ts +38 -0
  21. package/elements/radio-group/radio-group.scss +3 -0
  22. package/elements/radio-group/u-radio-group.vue +15 -0
  23. package/elements/select-chip/u-select-chip.vue +15 -21
  24. package/elements/select-chips/u-select-chips.vue +5 -8
  25. package/i18n/i18n.ts +5 -0
  26. package/layout/split/split.scss +5 -0
  27. package/modules/feedback/feedback-animations.scss +32 -0
  28. package/modules/feedback/feedback-form.scss +12 -0
  29. package/modules/feedback/feedback-vote-buttons.scss +73 -0
  30. package/modules/feedback/feedback.scss +31 -0
  31. package/modules/feedback/types/feedback.type.ts +33 -0
  32. package/modules/feedback/u-feedback-close.vue +32 -0
  33. package/modules/feedback/u-feedback-finish-view.vue +31 -0
  34. package/modules/feedback/u-feedback-form.vue +16 -0
  35. package/modules/feedback/u-feedback-vote-buttons.vue +59 -0
  36. package/modules/feedback/u-feedback.vue +58 -0
  37. package/modules/footer/footer.scss +13 -16
  38. package/modules/footer/u-footer.vue +4 -10
  39. package/package.json +3 -2
  40. package/utils/dom/dom.js +167 -0
  41. package/utils/functions/breakpoint.js +11 -0
  42. package/utils/functions/debounce.js +25 -0
  43. package/base-style.js +0 -1
  44. package/components/icon-teaser/icon-teaser.scss +0 -58
  45. package/components/icon-teaser/u-icon-teaser.vue +0 -35
  46. package/components/icon-teaser-group/icon-teaser-group.scss +0 -10
  47. package/components/icon-teaser-group/u-icon-teaser-group.vue +0 -19
  48. package/utility/utility-text.js +0 -1
@@ -1,14 +1,11 @@
1
1
  <script setup lang="ts">
2
- import { provide, ref } from 'vue'
2
+ import { useRadioGroup } from '../radio-group/radio-group-composables'
3
3
 
4
- const activeSelectChip = ref(null)
5
- const updateActiveSelectChip = (id: string): void => {
6
- activeSelectChip.value = id
7
- }
4
+ const model = defineModel<string>()
8
5
 
9
- provide('select-chip-group', {
10
- activeSelectChip,
11
- updateActiveSelectChip,
6
+ useRadioGroup({
7
+ model,
8
+ provideKey: 'select-chip-group',
12
9
  })
13
10
  </script>
14
11
 
package/i18n/i18n.ts CHANGED
@@ -1,3 +1,4 @@
1
+ // TODO: translate this, dude!!
1
2
  const translations = {
2
3
  DE: {
3
4
  yes: 'Ja',
@@ -7,6 +8,7 @@ const translations = {
7
8
  decreaseValue: 'Wert vermindern',
8
9
  showPassword: 'Passwort anzeigen',
9
10
  hidePassword: 'Passwort verbergen',
11
+ close: 'Schliessen',
10
12
  },
11
13
  FR: {
12
14
  yes: 'Ja',
@@ -16,6 +18,7 @@ const translations = {
16
18
  decreaseValue: 'Wert vermindern',
17
19
  showPassword: 'Passwort anzeigen',
18
20
  hidePassword: 'Passwort verbergen',
21
+ close: 'Fermer',
19
22
  },
20
23
  IT: {
21
24
  yes: 'Ja',
@@ -25,6 +28,7 @@ const translations = {
25
28
  decreaseValue: 'Wert vermindern',
26
29
  showPassword: 'Passwort anzeigen',
27
30
  hidePassword: 'Passwort verbergen',
31
+ close: 'Chiudere',
28
32
  },
29
33
  EN: {
30
34
  yes: 'Ja',
@@ -34,6 +38,7 @@ const translations = {
34
38
  decreaseValue: 'Wert vermindern',
35
39
  showPassword: 'Passwort anzeigen',
36
40
  hidePassword: 'Passwort verbergen',
41
+ close: 'Close',
37
42
  },
38
43
  }
39
44
 
@@ -6,7 +6,10 @@ $split-top-bar-height-mobile: 72px;
6
6
 
7
7
  .split {
8
8
  position: relative;
9
+ display: flex;
10
+ flex-direction: column;
9
11
  padding-left: 50%;
12
+ min-height: 100vh;
10
13
 
11
14
  @include a.bp(lg) {
12
15
  display: grid;
@@ -86,6 +89,8 @@ $split-top-bar-height-mobile: 72px;
86
89
  }
87
90
 
88
91
  .split__footer {
92
+ margin-top: auto;
93
+
89
94
  @include a.bp(lg) {
90
95
  grid-area: footer;
91
96
  }
@@ -0,0 +1,32 @@
1
+ .fade-in {
2
+ animation: fadeIn var(--e-trs-duration-fast) var(--e-trs-easing-default);
3
+ }
4
+
5
+ /* stylelint-disable keyframes-name-pattern */
6
+ @keyframes fadeIn {
7
+ 0% {
8
+ opacity: 0;
9
+ transform: translateY(20px);
10
+ }
11
+
12
+ 100% {
13
+ opacity: 1;
14
+ transform: translateY(0);
15
+ }
16
+ }
17
+
18
+ /* Fade (in) Feedback Transition for Feedback Form & Vote Buttons */
19
+ .fade-move,
20
+ .fade-enter-active,
21
+ .fade-leave-active {
22
+ transition: all var(--e-trs-duration-fast) var(--e-trs-easing-default);
23
+ }
24
+
25
+ .fade-enter-from,
26
+ .fade-leave-to {
27
+ opacity: 0;
28
+ }
29
+
30
+ .fade-leave-active {
31
+ position: absolute;
32
+ }
@@ -0,0 +1,12 @@
1
+ .feedback-form {
2
+ background-color: var(--e-c-mono-00);
3
+ border-radius: var(--e-brd-radius-2);
4
+ border: 1px solid var(--e-c-mono-100);
5
+ bottom: var(--e-space-10);
6
+ box-shadow: var(--e-elevation-xl);
7
+ padding-top: var(--e-space-3);
8
+ }
9
+
10
+ .sections-container {
11
+ position: relative;
12
+ }
@@ -0,0 +1,73 @@
1
+ @use '../../base/abstracts' as a;
2
+ @use './feedback-animations';
3
+
4
+ .vote-buttons-wrapper {
5
+ transition: all var(--e-trs-duration-faster) var(--e-trs-easing-default);
6
+ background-color: var(--e-c-primary-01-700);
7
+ border-radius: var(--e-brd-radius-2);
8
+ box-shadow: var(--e-elevation-xl);
9
+ color: var(--e-c-mono-00);
10
+ padding: var(--e-space-8);
11
+ position: relative;
12
+
13
+ --fill-color: var(--e-c-mono-00);
14
+
15
+ // Overlay effect
16
+ margin-bottom: calc(var(--e-space-3) * -1);
17
+ transform: translateZ(0);
18
+
19
+ &.feedback-finished {
20
+ padding-top: var(--e-space-10);
21
+ }
22
+
23
+ @include a.bp(m) {
24
+ padding: var(--e-space-6);
25
+ padding-bottom: var(--e-space-8);
26
+ }
27
+ }
28
+
29
+ .feedback-title {
30
+ @include a.type(300, strong);
31
+
32
+ @include a.bp(m) {
33
+ width: calc(100% - var(--e-space-7));
34
+ }
35
+ }
36
+
37
+ .finish-text {
38
+ @include a.type(300, strong);
39
+
40
+ margin-top: var(--e-space-6);
41
+ }
42
+
43
+ .feedback-buttons {
44
+ display: flex;
45
+ justify-content: space-between;
46
+ margin-top: var(--e-space-6);
47
+ padding-bottom: var(--e-space-2);
48
+ }
49
+
50
+ .feedback-button {
51
+ align-items: center;
52
+ background-color: var(--e-c-mono-200);
53
+ border-radius: var(--e-space-12);
54
+ color: var(--e-c-primary-01-700);
55
+ display: flex;
56
+ height: var(--e-space-12);
57
+ justify-content: center;
58
+ width: var(--e-space-12);
59
+ opacity: 0.5;
60
+
61
+ &:hover {
62
+ background-color: var(--e-c-mono-00);
63
+ }
64
+
65
+ &.filled {
66
+ opacity: 1;
67
+ background-color: var(--e-c-mono-00);
68
+ }
69
+ }
70
+
71
+ .vote-buttons-wrapper:has(.finish-text) .feedback-buttons {
72
+ margin-top: var(--e-space-2);
73
+ }
@@ -0,0 +1,31 @@
1
+ @use '../../base/abstracts' as a;
2
+ @use './feedback-animations';
3
+
4
+ .feedback-wrapper {
5
+ position: fixed;
6
+
7
+ // There is no space-13...
8
+ bottom: calc(var(--e-space-10) + var(--e-space-3));
9
+ right: var(--e-space-10);
10
+ width: 440px;
11
+
12
+ @include a.bp(m) {
13
+ width: calc(100% - var(--e-space-10));
14
+ bottom: var(--e-space-8);
15
+ right: var(--e-space-5);
16
+ }
17
+ }
18
+
19
+ /* Close Feedback / Fade out Transition */
20
+ .fade-out-move,
21
+ .fade-out-enter-active,
22
+ .fade-out-leave-active {
23
+ transition: all var(--e-trs-duration-faster) var(--e-trs-easing-default);
24
+ opacity: 0;
25
+ transform: translateY(20px);
26
+ }
27
+
28
+ .fade-out-leave-active {
29
+ position: absolute;
30
+ width: 100%;
31
+ }
@@ -0,0 +1,33 @@
1
+ export interface FeedbackData {
2
+ title: string
3
+ voteButtons: FeedbackFormVoteButton[]
4
+ voteFinishText: string
5
+ finishedViewText?: string
6
+ }
7
+
8
+ export interface FeedbackFormVoteData {
9
+ title: string
10
+ finishText: string
11
+ hasForm: boolean
12
+ voteButtons: FeedbackFormVoteButton[]
13
+ }
14
+
15
+ export interface FeedbackFormVoteButton {
16
+ label: string
17
+ rating: number
18
+ icon: string
19
+ }
20
+
21
+ export interface FeedbackFormSections {
22
+ title: string
23
+ references: string[]
24
+ }
25
+
26
+ export interface FeedbackPayloadKeys {
27
+ feature: string
28
+ path: string
29
+ reference: string
30
+ }
31
+ export interface FeedbackPayload {
32
+ rating: number
33
+ }
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue'
3
+ import UIcon from '../../elements/icon/u-icon.vue'
4
+ import { getTranslation } from '../../utils/translations/translate'
5
+
6
+ const { color = 'primary-01-700' } = defineProps<{ color?: string }>()
7
+ defineEmits<{ close: [] }>()
8
+
9
+ const closeColor = computed(() => `var(--e-c-${color})`)
10
+ </script>
11
+
12
+ <template>
13
+ <div class="feedback-close-wrapper">
14
+ <button type="button" :aria-label="getTranslation('close')" @click="$emit('close')">
15
+ <UIcon name="close" />
16
+ </button>
17
+ </div>
18
+ </template>
19
+
20
+ <style lang="scss" scoped>
21
+ .feedback-close-wrapper {
22
+ position: absolute;
23
+ padding: var(--e-space-2);
24
+ right: var(--e-space-2);
25
+ top: var(--e-space-2);
26
+
27
+ button {
28
+ cursor: pointer;
29
+ color: v-bind('closeColor');
30
+ }
31
+ }
32
+ </style>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import UFeedbackClose from './u-feedback-close.vue'
3
+ defineProps<{ text: string }>()
4
+ defineEmits<{ close: [] }>()
5
+ </script>
6
+
7
+ <template>
8
+ <div class="finish-text-wrapper">
9
+ <UFeedbackClose color="mono-00" @close="$emit('close')" />
10
+ <h3 class="finish-text-title">
11
+ {{ text }}
12
+ </h3>
13
+ </div>
14
+ </template>
15
+
16
+ <style lang="scss" scoped>
17
+ @use '../../base/abstracts' as a;
18
+
19
+ .finish-text-wrapper {
20
+ border-radius: var(--e-brd-radius-2);
21
+ box-shadow: var(--e-elevation-xl);
22
+ padding: var(--e-space-6);
23
+ background-color: var(--e-c-primary-01-700);
24
+ color: var(--e-c-mono-00);
25
+ --fill-color: var(--e-c-mono-00);
26
+ }
27
+
28
+ .finish-text-title {
29
+ @include a.type(300, strong);
30
+ }
31
+ </style>
@@ -0,0 +1,16 @@
1
+ <script setup lang="ts">
2
+ import UFeedbackClose from './u-feedback-close.vue'
3
+
4
+ defineEmits<{ close: [] }>()
5
+ </script>
6
+
7
+ <template>
8
+ <div class="feedback-form">
9
+ <div class="sections-container">
10
+ <slot />
11
+ <UFeedbackClose @close="$emit('close')" />
12
+ </div>
13
+ </div>
14
+ </template>
15
+
16
+ <style lang="scss" scoped src="./feedback-form.scss" />
@@ -0,0 +1,59 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref } from 'vue'
3
+ import UIconButton from '../../elements/icon-button/u-icon-button.vue'
4
+ import UFeedbackClose from './u-feedback-close.vue'
5
+ import type { FeedbackPayload, FeedbackFormVoteData } from './types/feedback.type'
6
+
7
+ const { hasForm, finishText } = defineProps<FeedbackFormVoteData>()
8
+ const emits = defineEmits<{
9
+ 'send-feedback': [value: FeedbackPayload['rating']]
10
+ close: []
11
+ 'animation-finished': []
12
+ }>()
13
+
14
+ const selectedVote = ref<FeedbackPayload['rating'] | null>(null)
15
+ const showCloseButton = computed(() => (!hasForm ? true : !finishText))
16
+
17
+ function onSendFeedback(value: FeedbackPayload['rating']) {
18
+ selectedVote.value = value
19
+ emits('send-feedback', value)
20
+ }
21
+
22
+ function setFilledClass(value: FeedbackPayload['rating']) {
23
+ return selectedVote.value === null || selectedVote.value === value
24
+ }
25
+ </script>
26
+
27
+ <template>
28
+ <TransitionGroup
29
+ tag="div"
30
+ name="fade"
31
+ :class="['vote-buttons-wrapper', { 'feedback-finished': showCloseButton }]"
32
+ @after-leave="$emit('animation-finished')"
33
+ >
34
+ <UFeedbackClose v-if="showCloseButton" key="close" color="mono-00" @close="$emit('close')" />
35
+
36
+ <h3 v-if="!finishText" key="title" class="feedback-title">
37
+ {{ title }}
38
+ </h3>
39
+
40
+ <div key="voteButtons" class="feedback-buttons">
41
+ <UIconButton
42
+ v-for="{ label, rating, icon } in voteButtons"
43
+ :key="rating"
44
+ variant="filled-inverted"
45
+ :label
46
+ :icon
47
+ class="feedback-button"
48
+ :class="{ filled: setFilledClass(rating) }"
49
+ @click="onSendFeedback(rating)"
50
+ />
51
+ </div>
52
+
53
+ <h3 v-if="finishText" key="finishText" class="finish-text">
54
+ {{ finishText }}
55
+ </h3>
56
+ </TransitionGroup>
57
+ </template>
58
+
59
+ <style lang="scss" scoped src="./feedback-vote-buttons.scss" />
@@ -0,0 +1,58 @@
1
+ <script setup lang="ts">
2
+ import { computed, ref, useSlots } from 'vue'
3
+ import UFeedbackForm from './u-feedback-form.vue'
4
+ import FeedbackFinishedView from './u-feedback-finish-view.vue'
5
+ import FeedbackVoteButtons from './u-feedback-vote-buttons.vue'
6
+ import type { FeedbackData, FeedbackPayload } from './types/feedback.type'
7
+
8
+ const { voteFinishText, finishedViewText = '' } = defineProps<FeedbackData>()
9
+ const emits = defineEmits<{ close: []; 'send-feedback': [value: FeedbackPayload['rating']] }>()
10
+
11
+ const showForm = ref(false)
12
+ const isFormSlotted = computed(() => useSlots().default !== undefined)
13
+ const showFeedbackForm = computed(() => showForm.value && isFormSlotted.value)
14
+
15
+ // Fire animation and when it's done, emit close event
16
+ const isFeedbackHidden = ref(false)
17
+ function onCloseEvent() {
18
+ isFeedbackHidden.value = true
19
+ }
20
+
21
+ const showFeedback = ref(true)
22
+ function closeFeedback() {
23
+ emits('close')
24
+ showFeedback.value = false
25
+ }
26
+ </script>
27
+
28
+ <template>
29
+ <Teleport to="body">
30
+ <TransitionGroup
31
+ v-if="showFeedback"
32
+ tag="div"
33
+ :name="isFeedbackHidden ? 'fade-out' : 'fade'"
34
+ :class="['feedback-wrapper', 'fade-in']"
35
+ @after-leave="closeFeedback"
36
+ >
37
+ <div :key="`${isFeedbackHidden}`">
38
+ <div v-if="!finishedViewText">
39
+ <FeedbackVoteButtons
40
+ :finish-text="voteFinishText"
41
+ :title
42
+ :has-form="isFormSlotted"
43
+ :vote-buttons="voteButtons"
44
+ @animation-finished="showForm = true"
45
+ @close="onCloseEvent"
46
+ @send-feedback="$emit('send-feedback', $event)"
47
+ />
48
+ <UFeedbackForm v-if="showFeedbackForm" @close="onCloseEvent">
49
+ <slot />
50
+ </UFeedbackForm>
51
+ </div>
52
+ <FeedbackFinishedView v-else :text="finishedViewText" @close="onCloseEvent" />
53
+ </div>
54
+ </TransitionGroup>
55
+ </Teleport>
56
+ </template>
57
+
58
+ <style lang="scss" scoped src="./feedback.scss" />
@@ -44,34 +44,31 @@
44
44
  grid-gap: var(--e-space-12);
45
45
  }
46
46
 
47
- .footer__top-column {
48
- white-space: nowrap;
49
-
50
- &:nth-child(3) {
51
- margin-right: auto;
52
- }
53
-
54
- &.service {
55
- white-space: wrap;
47
+ .footer__addresses-column {
48
+ margin-right: auto;
49
+ }
56
50
 
57
- @include a.bp(lg) {
58
- a {
59
- display: block;
60
- }
61
- }
62
- }
51
+ .footer__addresses {
52
+ display: flex;
53
+ column-gap: var(--e-space-12);
63
54
 
64
55
  @include a.type(200);
65
56
 
66
57
  a {
67
58
  @include t.text-link--secondary;
68
59
 
60
+ white-space: nowrap;
69
61
  font-weight: var(--e-type-weight-strong);
70
62
  -webkit-font-smoothing: antialiased; // This is an exception. Usually we only use this for large heading text.
71
63
  }
72
64
 
65
+ @include a.bp(lg) {
66
+ @include a.type(100);
67
+ }
68
+
73
69
  @include a.bp(m) {
74
- flex: 1 0 100%;
70
+ flex-direction: column;
71
+ row-gap: var(--e-space-6);
75
72
  }
76
73
  }
77
74
 
@@ -11,16 +11,10 @@ const { variant = 'normal' } = defineProps<Props>()
11
11
  <div class="footer__top">
12
12
  <div class="footer__container">
13
13
  <div class="footer__top-row">
14
- <div class="footer__top-column">
15
- <slot name="address"></slot>
16
- </div>
17
-
18
- <div class="footer__top-column">
19
- <slot name="contact"></slot>
20
- </div>
21
-
22
- <div class="footer__top-column service">
23
- <slot name="service"></slot>
14
+ <div class="footer__addresses-column">
15
+ <div class="footer__addresses">
16
+ <slot name="addressColumns"></slot>
17
+ </div>
24
18
  </div>
25
19
 
26
20
  <div class="footer__top-right-column">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@energie360/ui-library",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,7 +17,8 @@
17
17
  "./wizard": "./wizard/index.js",
18
18
  "./wizard/*": "./wizard/*",
19
19
  "./utility/elements/*": "./dist/elements/*",
20
- "./utility/layout/*": "./dist/layout/*"
20
+ "./utility/layout/*": "./dist/layout/*",
21
+ "./abstracts": "./base/abstracts/index.scss"
21
22
  },
22
23
  "keywords": [],
23
24
  "author": "",