@energie360/ui-library 0.1.16 → 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 (102) 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-info/card-info.scss +40 -0
  15. package/components/card-info/u-card-info.vue +35 -0
  16. package/components/card-price-list/card-price-list.scss +39 -0
  17. package/components/card-price-list/u-card-price-list.vue +37 -0
  18. package/components/card-section/card-section.scss +21 -1
  19. package/components/card-section/u-card-section.vue +9 -1
  20. package/components/data-card/data-card.scss +34 -0
  21. package/components/data-card/u-data-card.vue +49 -0
  22. package/components/data-card-group/data-card-group.scss +12 -0
  23. package/components/data-card-group/u-data-card-group.vue +7 -0
  24. package/components/download-list/download-list.scss +58 -0
  25. package/components/download-list/u-download-list.vue +44 -0
  26. package/components/download-list-item/download-list-item.scss +267 -0
  27. package/components/download-list-item/u-download-list-item.vue +65 -0
  28. package/components/file-upload/file-list.scss +68 -0
  29. package/components/file-upload/file-upload.scss +119 -0
  30. package/components/file-upload/u-file-list.vue +55 -0
  31. package/components/file-upload/u-file-upload.vue +220 -0
  32. package/components/hint/hint.scss +67 -6
  33. package/components/hint/u-hint.vue +11 -1
  34. package/components/index.js +13 -0
  35. package/components/inline-edit/inline-edit.scss +5 -1
  36. package/components/inline-edit/u-inline-edit.vue +21 -12
  37. package/components/progress-avatar/u-progress-avatar.vue +27 -3
  38. package/components/richtext/richtext.scss +9 -2
  39. package/components/richtext/u-richtext.vue +3 -1
  40. package/components/search-group/search-group.scss +59 -0
  41. package/components/search-group/u-search-group.vue +32 -0
  42. package/components/skeleton-loader/skeleton-loader.scss +39 -0
  43. package/components/skeleton-loader/u-skeleton-loader.vue +28 -0
  44. package/components/table/cell-ctas.scss +1 -7
  45. package/components/table/cell-icon-text.scss +15 -4
  46. package/components/table/table-cell.mixins.scss +3 -2
  47. package/components/table/table-cell.scss +5 -0
  48. package/components/table/table-heading.scss +7 -0
  49. package/components/table/u-cell-ctas.vue +15 -6
  50. package/components/table/u-cell-icon-text.vue +13 -5
  51. package/components/table/u-table-cell.vue +3 -1
  52. package/components/table/u-table-heading.vue +2 -1
  53. package/components/tabs/tabs.scss +10 -1
  54. package/components/tabs/u-tabs.vue +64 -25
  55. package/dist/elements/form.css +170 -0
  56. package/dist/elements/form.css.map +1 -0
  57. package/dist/layout/form-grid.css +184 -0
  58. package/dist/layout/form-grid.css.map +1 -0
  59. package/dist/layout/split.css.map +1 -1
  60. package/elements/button/_button-plain-small-spaceless.scss +10 -0
  61. package/elements/button/button.scss +32 -0
  62. package/elements/button/u-button.vue +47 -4
  63. package/elements/form/form.scss +1 -1
  64. package/elements/form-field/form-field-base.scss +4 -0
  65. package/elements/form-field/form-field-prefix-suffix.scss +5 -0
  66. package/elements/select/u-select.vue +6 -6
  67. package/elements/text-field/text-field.scss +15 -0
  68. package/elements/text-field/text-field.types.ts +1 -0
  69. package/elements/text-field/u-text-field.vue +44 -8
  70. package/elements/toggle-switch/toggle-switch-small.scss +10 -0
  71. package/elements/toggle-switch/toggle-switch.scss +25 -21
  72. package/elements/toggle-switch/u-toggle-switch.vue +22 -12
  73. package/i18n/i18n.ts +32 -0
  74. package/layout/container/container.scss +18 -0
  75. package/layout/index.js +4 -0
  76. package/layout/portal/portal.scss +63 -0
  77. package/layout/portal/u-portal.vue +51 -0
  78. package/layout/settings/settings.scss +33 -0
  79. package/layout/settings/u-settings-layout.vue +19 -0
  80. package/layout/tile-grid/tile-grid.scss +13 -0
  81. package/layout/tile-grid/tile-item.scss +31 -0
  82. package/layout/tile-grid/u-tile-grid.vue +7 -0
  83. package/layout/tile-grid/u-tile-item.vue +15 -0
  84. package/modules/content-title/content-title.scss +43 -0
  85. package/modules/content-title/u-content-title.vue +19 -0
  86. package/modules/dialog/_animations.scss +49 -0
  87. package/modules/dialog/dialog.scss +172 -0
  88. package/modules/dialog/u-dialog.vue +139 -0
  89. package/modules/footer/footer.scss +8 -1
  90. package/modules/footer/u-footer.vue +1 -1
  91. package/modules/index.js +3 -0
  92. package/modules/inline-edit-group/u-inline-edit-group.vue +2 -0
  93. package/modules/search-filter/search-filter.scss +106 -0
  94. package/modules/search-filter/u-search-filter.vue +54 -0
  95. package/package.json +3 -1
  96. package/utility/elements/form.scss +1 -0
  97. package/utility/layout/form-grid.scss +1 -0
  98. package/utils/array/intersect.js +7 -0
  99. package/utils/functions/breakpoint.js +4 -9
  100. package/utils/functions/format-bytes.js +17 -0
  101. package/utils/global/mime-types.js +8 -0
  102. package/utils/translations/translate.js +10 -2
@@ -11,6 +11,10 @@
11
11
  align-items: center;
12
12
  width: 100%;
13
13
  gap: var(--e-space-4);
14
+
15
+ input {
16
+ width: var(--width);
17
+ }
14
18
  }
15
19
 
16
20
  .toggle-switch__handle {
@@ -37,4 +41,10 @@
37
41
  margin-right: auto;
38
42
  }
39
43
  }
44
+
45
+ .toggle-switch__additional-label {
46
+ display: inline;
47
+
48
+ @include a.type(200);
49
+ }
40
50
  }
@@ -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
  }
@@ -0,0 +1,4 @@
1
+ export { default as USettingsLayout } from './settings/u-settings-layout.vue'
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'
@@ -0,0 +1,63 @@
1
+ @use '../../base/abstracts' as a;
2
+ @use '../../layout/container/container' as c;
3
+
4
+ .portal {
5
+ --side-nav-width: 80px;
6
+ }
7
+
8
+ .portal__side-navigation {
9
+ position: fixed;
10
+ height: 100vh;
11
+ display: flex;
12
+ }
13
+
14
+ .portal__top-navigation {
15
+ display: none;
16
+ }
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
+
25
+ .portal__main {
26
+ display: flex;
27
+ flex-direction: column;
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
+ }
45
+ }
46
+
47
+ .portal__footer {
48
+ margin-top: auto;
49
+ }
50
+
51
+ @include a.bp(lg) {
52
+ .portal__top-navigation {
53
+ display: block;
54
+ }
55
+
56
+ .portal__side-navigation {
57
+ display: none;
58
+ }
59
+
60
+ .portal__sub-navigation {
61
+ background-color: var(--e-c-mono-50);
62
+ }
63
+ }
@@ -0,0 +1,51 @@
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
+
20
+ <template>
21
+ <div
22
+ class="portal"
23
+ :style="{
24
+ '--side-nav-width': `${sideNavWidth}px`,
25
+ }"
26
+ >
27
+ <div ref="sideNavigation" class="portal__side-navigation">
28
+ <slot name="side-navigation"></slot>
29
+ </div>
30
+
31
+ <div class="portal__top-navigation">
32
+ <slot name="top-navigation"></slot>
33
+ </div>
34
+
35
+ <div class="portal__main">
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>
43
+
44
+ <div class="portal__footer">
45
+ <slot name="footer"></slot>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ </template>
50
+
51
+ <style scoped lang="scss" src="./portal.scss"></style>
@@ -0,0 +1,33 @@
1
+ @use '../../base/abstracts' as a;
2
+
3
+ .settings-layout {
4
+ display: grid;
5
+ grid-template-columns: auto a.rem(320);
6
+ grid-template-rows: repeat(2, auto);
7
+ grid-column-gap: var(--e-space-24);
8
+ grid-row-gap: var(--e-space-12);
9
+ padding: var(--e-space-10) 0;
10
+
11
+ @include a.bp(lg) {
12
+ display: flex;
13
+ flex-direction: column;
14
+ row-gap: var(--e-space-6);
15
+ padding: var(--e-space-6) 0 var(--e-space-10);
16
+ }
17
+ }
18
+
19
+ .settings-layout__header {
20
+ grid-area: 1 / 1 / 2 / 3;
21
+ }
22
+
23
+ .settings-layout__main {
24
+ grid-area: 2 / 1 / 3 / 2;
25
+ }
26
+
27
+ .settings-layout__aside {
28
+ grid-area: 2 / 2 / 3 / 3;
29
+ }
30
+
31
+ .settings-layout__title {
32
+ @include a.type(500, strong);
33
+ }
@@ -0,0 +1,19 @@
1
+ <template>
2
+ <div class="settings-layout">
3
+ <div class="settings-layout__header">
4
+ <h1 class="settings-layout__title">
5
+ <slot name="title"></slot>
6
+ </h1>
7
+ </div>
8
+
9
+ <div class="settings-layout__main">
10
+ <slot name="main"></slot>
11
+ </div>
12
+
13
+ <aside class="settings-layout__aside">
14
+ <slot name="aside"></slot>
15
+ </aside>
16
+ </div>
17
+ </template>
18
+
19
+ <style scoped lang="scss" src="./settings.scss"></style>
@@ -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>
@@ -0,0 +1,49 @@
1
+ @keyframes fade-in {
2
+ 0% {
3
+ opacity: 0;
4
+ display: none;
5
+ }
6
+
7
+ 100% {
8
+ opacity: 1;
9
+ display: flex;
10
+ }
11
+ }
12
+
13
+ @keyframes fade-in-backdrop {
14
+ 0% {
15
+ background-color: transparent;
16
+ }
17
+
18
+ 100% {
19
+ background-color: var(--e-c-mono-900);
20
+ }
21
+ }
22
+
23
+ @keyframes slide-in {
24
+ 0% {
25
+ opacity: 1;
26
+ transform: translateY(100%);
27
+ display: none;
28
+ }
29
+
30
+ 100% {
31
+ opacity: 1;
32
+ transform: translateY(0);
33
+ display: flex;
34
+ }
35
+ }
36
+
37
+ @keyframes slide-out {
38
+ 0% {
39
+ opacity: 1;
40
+ transform: translateY(0);
41
+ display: flex;
42
+ }
43
+
44
+ 100% {
45
+ opacity: 1;
46
+ transform: translateY(100%);
47
+ display: none;
48
+ }
49
+ }