@energie360/ui-library 0.1.17 → 0.1.18

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