@energie360/ui-library 0.1.0 → 0.1.1

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 (86) hide show
  1. package/base/abstracts/_mixins.scss +11 -5
  2. package/base/main-base.scss +1 -0
  3. package/components/icon-text-block/{icon-text-block.vue → u-icon-text-block.vue} +10 -6
  4. package/components/index.js +14 -0
  5. package/components/panel/panel.scss +70 -0
  6. package/components/panel/u-panel.vue +37 -0
  7. package/components/progress-bar/progress-bar.scss +37 -0
  8. package/components/progress-bar/u-progress-bar.vue +21 -0
  9. package/components/table/cell-ctas.scss +12 -0
  10. package/components/table/cell-icon-group.scss +12 -0
  11. package/components/table/cell-icon-text.scss +22 -0
  12. package/components/table/cell-progress-bar.scss +23 -0
  13. package/components/table/table-cell.mixins.scss +60 -0
  14. package/components/table/table-cell.scss +24 -0
  15. package/components/table/table-header.scss +5 -0
  16. package/components/table/table-heading.scss +8 -0
  17. package/components/table/table-row.scss +20 -0
  18. package/components/table/table.scss +12 -0
  19. package/components/table/table.type.ts +31 -0
  20. package/components/table/u-cell-ctas.vue +33 -0
  21. package/components/table/u-cell-icon-group.vue +31 -0
  22. package/components/table/u-cell-icon-text.vue +23 -0
  23. package/components/table/u-cell-progress-bar.vue +22 -0
  24. package/components/table/u-table-cell.vue +47 -0
  25. package/components/table/u-table-header.vue +9 -0
  26. package/components/table/u-table-heading.vue +24 -0
  27. package/components/table/u-table-row.vue +17 -0
  28. package/components/table/u-table.vue +11 -0
  29. package/components/tooltip/dom.js +167 -0
  30. package/components/tooltip/popover.js +200 -0
  31. package/components/tooltip/tooltip.scss +75 -0
  32. package/components/tooltip/u-tooltip.vue +92 -0
  33. package/components/tooltip/viewport.js +21 -0
  34. package/custom-elements.js +1 -0
  35. package/dist/base-style.css +1 -1
  36. package/dist/custom-elements.css +1 -0
  37. package/dist/{index.js → custom-elements.js} +1482 -1491
  38. package/dist/custom-elements.js.map +1 -0
  39. package/elements/button/_button-base.scss +1 -1
  40. package/elements/button/_button-filled-inverted.scss +3 -3
  41. package/elements/button/_button-filled.scss +3 -3
  42. package/elements/button/_button-outlined-inverted.scss +3 -3
  43. package/elements/button/_button-outlined.scss +3 -3
  44. package/elements/button/_button-plain.scss +3 -3
  45. package/elements/button/_button-secondary-outlined.scss +3 -3
  46. package/elements/button/button.js +2 -2
  47. package/elements/button/button.scss +1 -1
  48. package/elements/button/u-button.vue +44 -0
  49. package/elements/elements.js +35 -0
  50. package/elements/form-field/form-field-base.scss +142 -0
  51. package/elements/form-field/form-field-error.scss +20 -0
  52. package/elements/form-field/form-field-prefix-suffix.scss +80 -0
  53. package/elements/form-field/form-field-states.scss +59 -0
  54. package/elements/form-field/index.scss +4 -0
  55. package/elements/icon/icon.js +2 -2
  56. package/elements/icon/{icon.vue → u-icon.vue} +11 -15
  57. package/elements/icon-button/icon-button.js +2 -2
  58. package/elements/icon-button/{icon-button.vue → u-icon-button.vue} +14 -15
  59. package/elements/image/image.scss +3 -0
  60. package/elements/image/u-image.vue +17 -0
  61. package/elements/index.js +6 -31
  62. package/elements/loader/loader.js +2 -2
  63. package/elements/loader/{loader.vue → u-loader.vue} +6 -7
  64. package/elements/spectro/spectro.scss +13 -0
  65. package/elements/spectro/u-spectro.vue +11 -0
  66. package/elements/text-field/text-field.scss +30 -0
  67. package/elements/text-field/text-field.types.ts +6 -0
  68. package/elements/text-field/u-text-field.vue +164 -0
  69. package/elements/types.ts +12 -0
  70. package/env.d.ts +1 -0
  71. package/layout/grid/grid.scss +6 -7
  72. package/package.json +17 -7
  73. package/tsconfig.app.json +12 -0
  74. package/tsconfig.json +11 -0
  75. package/tsconfig.node.json +19 -0
  76. package/{vite.config.js → vite.config.ts} +1 -1
  77. package/wizard/index.js +4 -0
  78. package/wizard/wizard-intro/{wizard-intro.vue → u-wizard-intro.vue} +12 -9
  79. package/wizard/wizard-layout/{wizard-layout-block.vue → u-wizard-layout-block.vue} +6 -4
  80. package/dist/index.css +0 -1
  81. package/dist/index.js.map +0 -1
  82. package/elements/button/button.vue +0 -42
  83. package/index.js +0 -1
  84. /package/components/icon-text-block-group/{icon-text-block-group.vue → u-icon-text-block-group.vue} +0 -0
  85. /package/wizard/wizard-layout/{wizard-layout-element.vue → u-wizard-layout-element.vue} +0 -0
  86. /package/wizard/wizard-layout/{wizard-layout.vue → u-wizard-layout.vue} +0 -0
package/elements/index.js CHANGED
@@ -1,33 +1,8 @@
1
- import { ButtonElement as Button } from './button/button.js'
2
- import { IconButtonElement as IconButton } from './icon-button/icon-button.js'
3
- import { IconElement as Icon } from './icon/icon.js'
4
- import { LoaderElement as Loader } from './loader/loader.js'
5
-
6
1
  /**
7
- * These exports allow best tree-shaking behaviour.
8
- * Obviously you'll have to import 'manually' all the elements you need.
9
- *
10
- * @example
11
- * import { IconButton } from '@energie360/ui-library'
12
- * IconButton.register()
2
+ * It's not recommended to import components from this file, because tree-shaking won't work then.
3
+ * -> https://vite.dev/guide/performance#avoid-barrel-files
13
4
  */
14
- export { Button, IconButton, Icon, Loader }
15
-
16
- /**
17
- * With this export you get all the elements. Meaning all the elements will be inlcuded in your bundle, even if you register only one element.
18
- *
19
- * @example
20
- * import { Elements } from '@energie360/ui-library'
21
- * Elements.Button.register()
22
- */
23
-
24
- /**
25
- *
26
- * @type {{IconButton: {register: function(): void}, Button: {register: function(): void}, Loader: {register: function(): void}, Icon: {register: function(): void}}}
27
- */
28
- export const Elements = {
29
- Button,
30
- IconButton,
31
- Icon,
32
- Loader,
33
- }
5
+ export { default as UButton } from './button/u-button.vue'
6
+ export { default as UIcon } from './icon/u-icon.vue'
7
+ export { default as UIconButton } from './icon-button/u-icon-button.vue'
8
+ export { default as ULoader } from './loader/u-loader.vue'
@@ -1,5 +1,5 @@
1
1
  import { defineCustomElement } from 'vue'
2
- import Loader from './loader.vue'
2
+ import Loader from './u-loader.vue'
3
3
  import customElementBaseStyle from '../../base/custom-element-base.scss?inline'
4
4
  import ceStyles from './loader.ce.scss?inline'
5
5
  import styles from './loader.scss?inline'
@@ -8,6 +8,6 @@ Loader.styles = [customElementBaseStyle, ceStyles, styles]
8
8
 
9
9
  export const LoaderElement = {
10
10
  register: () => {
11
- customElements.define('e-loader', defineCustomElement(Loader))
11
+ customElements.define('u-loader', defineCustomElement(Loader))
12
12
  },
13
13
  }
@@ -1,10 +1,9 @@
1
- <script setup>
2
- defineProps({
3
- anim: {
4
- type: String,
5
- default: 'horizontal',
6
- },
7
- })
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ anim?: string
4
+ }
5
+
6
+ const { anim = 'horizontal' } = defineProps<Props>()
8
7
  </script>
9
8
 
10
9
  <template>
@@ -0,0 +1,13 @@
1
+ .spectro {
2
+ position: relative;
3
+ aspect-ratio: 1;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .inner {
8
+ position: absolute;
9
+ top: 0;
10
+ right: 0;
11
+ bottom: 0;
12
+ left: 0;
13
+ }
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <div class="spectro">
3
+ <div class="inner">
4
+ <img src="/static/ui-assets/images/spectro.svg" alt="" aria-hidden="true" />
5
+ </div>
6
+ </div>
7
+ </template>
8
+
9
+ <style scoped lang="scss">
10
+ @use './spectro.scss';
11
+ </style>
@@ -0,0 +1,30 @@
1
+ @use '../../base/abstracts' as a;
2
+ @use '../form-field' as f;
3
+
4
+ .text-field {
5
+ @include f.form-field-base(input);
6
+ @include f.form-field-states-all(input);
7
+ @include f.form-field-error;
8
+ @include f.form-field-suffix-icon;
9
+ @include f.form-field-prefix-icon;
10
+
11
+ .visually-hidden {
12
+ @include a.visually-hidden;
13
+ }
14
+
15
+ // Type: Password
16
+ .password-toggle {
17
+ display: block;
18
+ border-radius: var(--e-brd-radius-1);
19
+ color: var(--e-c-primary-01-500);
20
+ cursor: pointer;
21
+
22
+ &:hover {
23
+ color: var(--e-c-secondary-01-900);
24
+ }
25
+
26
+ &:active {
27
+ color: var(--e-c-secondary-01-700);
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,6 @@
1
+ export enum TextFieldTypes {
2
+ text = 'text',
3
+ number = 'number',
4
+ email = 'email',
5
+ password = 'password',
6
+ }
@@ -0,0 +1,164 @@
1
+ <script setup lang="ts">
2
+ import UIcon from '../icon/u-icon.vue'
3
+ import { TextFieldTypes } from './text-field.types'
4
+ import { computed, ref, useSlots, useTemplateRef, useId } from 'vue'
5
+ import { translate } from '../../utils/translations/translate'
6
+
7
+ interface Props {
8
+ label?: string
9
+ type: TextFieldTypes
10
+ required?: boolean
11
+ disabled?: boolean
12
+ readonly?: boolean
13
+ placeholder?: string
14
+ error?: boolean
15
+ unit?: string
16
+ helpText?: string
17
+ errorMessage?: string
18
+ }
19
+
20
+ let inputId = useId()
21
+
22
+ const {
23
+ disabled = false,
24
+ readonly = false,
25
+ required = false,
26
+ type = TextFieldTypes.text,
27
+ helpText = '',
28
+ errorMessage = '',
29
+ } = defineProps<Props>()
30
+
31
+ const slots = useSlots()
32
+
33
+ const input = useTemplateRef('input')
34
+
35
+ const isFocused = ref(false)
36
+ const isHovering = ref(false)
37
+ const hasValue = ref(false)
38
+ const forceFloatLabel = ref(false)
39
+
40
+ const spacer = '.&nbsp;'
41
+
42
+ // In some cases we need to change the input type within the component (for example for the password-show behaviour)
43
+ const _inputType = ref(type)
44
+
45
+ const onFocus = () => {
46
+ if (readonly || disabled) {
47
+ return
48
+ }
49
+
50
+ isFocused.value = true
51
+ }
52
+
53
+ const onBlur = () => {
54
+ isFocused.value = false
55
+ }
56
+
57
+ const onInput = () => {
58
+ hasValue.value = input.value.value !== ''
59
+ }
60
+
61
+ const onHover = () => {
62
+ if (readonly || disabled) {
63
+ return
64
+ }
65
+
66
+ isHovering.value = true
67
+ }
68
+
69
+ const onHoverOut = () => {
70
+ isHovering.value = false
71
+ }
72
+
73
+ const hasHelpText = computed(() => {
74
+ return !!helpText || !!slots.helpText || required
75
+ })
76
+
77
+ const needsHelpTextSpacer = computed(() => {
78
+ return !!helpText || !!slots.helpText
79
+ })
80
+
81
+ const onPasswordToggle = () => {
82
+ _inputType.value =
83
+ _inputType.value === TextFieldTypes.password
84
+ ? TextFieldTypes.text
85
+ : TextFieldTypes.password
86
+ }
87
+
88
+ const passwordIcon = computed(() => {
89
+ return _inputType.value === TextFieldTypes.password
90
+ ? 'password'
91
+ : 'password-show'
92
+ })
93
+ </script>
94
+
95
+ <template>
96
+ <div
97
+ :class="[
98
+ 'text-field',
99
+ {
100
+ required,
101
+ disabled,
102
+ readonly,
103
+ focus: isFocused,
104
+ hover: isHovering,
105
+ 'has-value': hasValue,
106
+ 'float-label': isFocused || hasValue || placeholder || forceFloatLabel,
107
+ 'has-error': error,
108
+ 'show-help-text': !required || hasHelpText,
109
+ },
110
+ ]"
111
+ @mouseenter="onHover"
112
+ @mouseleave="onHoverOut"
113
+ >
114
+ <div class="wrapper">
115
+ <div class="label">
116
+ <slot name="label"
117
+ ><label :for="inputId">{{ label }}</label></slot
118
+ >
119
+ </div>
120
+
121
+ <div class="control">
122
+ <slot
123
+ ><input
124
+ ref="input"
125
+ :id="inputId"
126
+ @input="onInput"
127
+ @focus="onFocus"
128
+ @blur="onBlur"
129
+ :type="_inputType"
130
+ :disabled
131
+ :readonly
132
+ :placeholder
133
+ :required
134
+ /></slot>
135
+
136
+ <div class="control-border"></div>
137
+ </div>
138
+
139
+ <!-- TYPE: PASSWORD -->
140
+ <span class="suffix-action" v-if="type === TextFieldTypes.password">
141
+ <button type="button" class="password-toggle" @click="onPasswordToggle">
142
+ <UIcon :name="passwordIcon"></UIcon>
143
+ </button>
144
+ </span>
145
+ </div>
146
+
147
+ <div class="help-text">
148
+ <span class="optional-text"
149
+ >{{ translate('common.optional')
150
+ }}<span v-if="needsHelpTextSpacer" v-html="spacer"></span></span
151
+ ><slot name="helpText">{{ helpText }}</slot>
152
+ </div>
153
+
154
+ <div class="error-messages-container">
155
+ <slot name="error-message"
156
+ ><span>{{ errorMessage }}</span></slot
157
+ >
158
+ </div>
159
+ </div>
160
+ </template>
161
+
162
+ <style scoped lang="scss">
163
+ @use './text-field.scss';
164
+ </style>
@@ -0,0 +1,12 @@
1
+ // TODO: @Dani if you have a better naming please update it.
2
+
3
+ export interface Cta {
4
+ label: string
5
+ href: string
6
+ target: string
7
+ }
8
+
9
+ export interface Image {
10
+ src: string
11
+ alt: string
12
+ }
package/env.d.ts ADDED
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -1,7 +1,6 @@
1
1
  @use 'sass:math';
2
2
  @use '../../base/abstracts' as a;
3
3
  @use 'grid.mixin' as *;
4
-
5
4
  @use 'grid-row';
6
5
 
7
6
  // These loops create column classes for the breakpoints 2xl, xl, lg, m and s.
@@ -14,7 +13,7 @@
14
13
  @include grid-col($i);
15
14
  }
16
15
 
17
- @if ($i < a.$grid-columns) {
16
+ @if $i < a.$grid-columns {
18
17
  .col-indent-#{$i} {
19
18
  @include grid-col-indent($i);
20
19
  }
@@ -28,7 +27,7 @@
28
27
  @include grid-col($i);
29
28
  }
30
29
 
31
- @if ($i < a.$grid-columns) {
30
+ @if $i < a.$grid-columns {
32
31
  .col-indent-2xl-#{$i} {
33
32
  @include grid-col-indent($i);
34
33
  }
@@ -48,7 +47,7 @@
48
47
  @include grid-col($i);
49
48
  }
50
49
 
51
- @if ($i < a.$grid-columns) {
50
+ @if $i < a.$grid-columns {
52
51
  .col-indent-xl-#{$i} {
53
52
  @include grid-col-indent($i);
54
53
  }
@@ -68,7 +67,7 @@
68
67
  @include grid-col($i);
69
68
  }
70
69
 
71
- @if ($i < a.$grid-columns) {
70
+ @if $i < a.$grid-columns {
72
71
  .col-indent-lg-#{$i} {
73
72
  @include grid-col-indent($i);
74
73
  }
@@ -88,7 +87,7 @@
88
87
  @include grid-col($i);
89
88
  }
90
89
 
91
- @if ($i < a.$grid-columns) {
90
+ @if $i < a.$grid-columns {
92
91
  .col-indent-m-#{$i} {
93
92
  @include grid-col-indent($i);
94
93
  }
@@ -108,7 +107,7 @@
108
107
  @include grid-col($i);
109
108
  }
110
109
 
111
- @if ($i < a.$grid-columns) {
110
+ @if $i < a.$grid-columns {
112
111
  .col-indent-s-#{$i} {
113
112
  @include grid-col-indent($i);
114
113
  }
package/package.json CHANGED
@@ -1,25 +1,34 @@
1
1
  {
2
2
  "name": "@energie360/ui-library",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
7
- ".": "./dist/index.js",
7
+ ".": "./dist/custom-elements.js",
8
+ "./package.json": "./package.json",
8
9
  "./base-style.css": "./dist/base-style.css",
10
+ "./elements": "./elements/index.js",
9
11
  "./elements/*": "./elements/*",
12
+ "./components": "./components/index.js",
10
13
  "./components/*": "./components/*",
14
+ "./wizard": "./wizard/index.js",
11
15
  "./wizard/*": "./wizard/*"
12
16
  },
13
17
  "keywords": [],
14
18
  "author": "",
15
19
  "license": "MIT",
16
20
  "devDependencies": {
21
+ "@tsconfig/node22": "^22.0.0",
22
+ "@types/node": "^22.13.4",
17
23
  "@vitejs/plugin-vue": "^5.2.1",
24
+ "@vue/tsconfig": "^0.7.0",
18
25
  "autoprefixer": "^10.4.20",
19
- "postcss": "^8.5.1",
20
- "sass": "^1.83.4",
21
- "vite": "^6.0.7",
22
- "vue": "^3.5.13"
26
+ "postcss": "^8.5.2",
27
+ "sass": "^1.85.0",
28
+ "typescript": "^5.7.3",
29
+ "vite": "^6.1.0",
30
+ "vue": "^3.5.13",
31
+ "vue-tsc": "^2.2.2"
23
32
  },
24
33
  "dependencies": {
25
34
  "@energie360/design-tokens": "^1.1.0"
@@ -27,6 +36,7 @@
27
36
  "scripts": {
28
37
  "dev": "NODE_ENV=development vite build --watch --mode developement",
29
38
  "build": "vite build",
30
- "prepublish": "npm run build"
39
+ "prepublish": "npm run build",
40
+ "type-check": "vue-tsc --build"
31
41
  }
32
42
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "@vue/tsconfig/tsconfig.dom.json",
3
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
4
+ "exclude": ["src/**/__tests__/*"],
5
+ "compilerOptions": {
6
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
7
+
8
+ "paths": {
9
+ "@/*": ["./src/*"]
10
+ }
11
+ }
12
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "files": [],
3
+ "references": [
4
+ {
5
+ "path": "./tsconfig.node.json"
6
+ },
7
+ {
8
+ "path": "./tsconfig.app.json"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "@tsconfig/node22/tsconfig.json",
3
+ "include": [
4
+ "vite.config.*",
5
+ "vitest.config.*",
6
+ "cypress.config.*",
7
+ "nightwatch.conf.*",
8
+ "playwright.config.*",
9
+ "eslint.config.*"
10
+ ],
11
+ "compilerOptions": {
12
+ "noEmit": true,
13
+ "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
14
+
15
+ "module": "ESNext",
16
+ "moduleResolution": "Bundler",
17
+ "types": ["node"]
18
+ }
19
+ }
@@ -10,7 +10,7 @@ export default defineConfig({
10
10
  sourcemap: true,
11
11
  lib: {
12
12
  entry: [
13
- resolve(__dirname, 'index.js'),
13
+ resolve(__dirname, 'custom-elements.js'),
14
14
  resolve(__dirname, 'base-style.js'),
15
15
  ],
16
16
  name: '@energie360/ui-library',
@@ -0,0 +1,4 @@
1
+ export { default as UWizardIntro } from './wizard-intro/u-wizard-intro.vue'
2
+ export { default as UWizardLayout } from './wizard-layout/u-wizard-layout.vue'
3
+ export { default as UWizardLayoutBlock } from './wizard-layout/u-wizard-layout-block.vue'
4
+ export { default as UWizardLayoutElement } from './wizard-layout/u-wizard-layout-element.vue'
@@ -1,9 +1,10 @@
1
- <script setup>
2
- defineProps({
3
- title: String,
4
- description: String,
5
- ctaText: String
6
- })
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ title?: string
4
+ description?: string
5
+ }
6
+
7
+ defineProps<Props>()
7
8
  </script>
8
9
 
9
10
  <template>
@@ -11,12 +12,14 @@ defineProps({
11
12
  <div class="left-col">
12
13
  <div>
13
14
  <div class="title-slot">
14
- <slot name="title"><h1>{{ title }}</h1></slot>
15
+ <slot name="title"
16
+ ><h1>{{ title }}</h1></slot
17
+ >
15
18
  </div>
16
19
 
17
20
  <div class="description-slot">
18
21
  <slot name="description">
19
- <p v-html="description"/>
22
+ <p v-html="description" />
20
23
  </slot>
21
24
  </div>
22
25
 
@@ -27,7 +30,7 @@ defineProps({
27
30
  </div>
28
31
 
29
32
  <div class="right-col">
30
- <slot name="content-right"></slot>
33
+ <slot name="contentRight"></slot>
31
34
  </div>
32
35
  </div>
33
36
  </template>
@@ -1,7 +1,9 @@
1
- <script setup>
2
- defineProps({
3
- columns: [Number, String],
4
- })
1
+ <script setup lang="ts">
2
+ interface Props {
3
+ columns: string | number
4
+ }
5
+
6
+ defineProps<Props>()
5
7
  </script>
6
8
 
7
9
  <template>
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- .icon[data-v-7772a60e]{display:block;fill:var(--icon-fill-color, currentColor);width:var(--icon-width, 24px);height:var(--icon-height, 24px);transition:var(--icon-transition, none)}.icon.icon--custom-size[data-v-7772a60e]{width:100%;height:100%}.icon.icon--inline[data-v-7772a60e]{display:inline-block;vertical-align:baseline}@keyframes horizontal-a2f9c45c{0%{transform:translate(0)}20%{transform:translate(0);opacity:1;width:8px}50%{transform:translate(24px);opacity:.7;width:16px}80%{transform:translate(56px);opacity:1;width:8px}to{transform:translate(56px)}}@keyframes vertical-a2f9c45c{0%{transform:translateY(0)}50%{transform:translateY(0);opacity:1;height:8px}55%{transform:translateY(-12px);opacity:.7;height:16px}60%{transform:translateY(0);opacity:1;height:8px}70%{transform:translateY(-4px)}to{transform:translateY(0)}}.loader[data-v-a2f9c45c]{position:relative;display:inline-flex;--dot-color: var(--e-c-mono-900)}.loader>span[data-v-a2f9c45c]{display:block;width:8px;height:8px;border-radius:4px;background-color:var(--dot-color)}.loader.horizontal[data-v-a2f9c45c]{width:64px}.loader.horizontal>span[data-v-a2f9c45c]{transform:translate(0);animation-name:horizontal-a2f9c45c;animation-duration:1s;animation-direction:alternate;animation-timing-function:cubic-bezier(.4,.61,.61,.4);animation-iteration-count:infinite}.loader.vertical[data-v-a2f9c45c]{height:8px;width:8px}.loader.vertical>span[data-v-a2f9c45c]{transform:translateY(0);animation-name:vertical-a2f9c45c;animation-duration:2s;animation-timing-function:cubic-bezier(.47,.52,.165,1.005);animation-iteration-count:infinite}button[data-v-9f038231]{padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;font-family:inherit;font-size:inherit;background:none}.button[data-v-9f038231]{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:.625rem 1.875rem;grid-gap:var(--e-space-2);border-radius:24px;transition:background-color var(--e-trs-duration-faster) var(--e-trs-easing-default),box-shadow var(--e-trs-duration-faster) var(--e-trs-easing-default),color var(--e-trs-duration-faster) var(--e-trs-easing-default),border var(--e-trs-duration-faster) var(--e-trs-easing-default);border-width:2px;border-style:solid;text-decoration:none;vertical-align:middle;text-align:center;cursor:pointer;font-size:var(--e-type-size-200);line-height:var(--e-type-line-height-200);letter-spacing:.00625rem;font-weight:var(--e-type-weight-strong);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.button .icon[data-v-9f038231],.button e-icon[data-v-9f038231]{width:24px;height:24px}@media print{.button[data-v-9f038231]{font-size:calc(var(--e-type-size-200) * .75);line-height:calc(var(--e-type-line-height-200) * .75)}}.button .button__loader[data-v-9f038231]{position:absolute;top:0;left:0;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.button.disabled[data-v-9f038231],.button[data-v-9f038231]:disabled{pointer-events:none}.button[loading][data-v-9f038231]{cursor:default}.button .icon[data-v-9f038231],.button e-icon[data-v-9f038231]{--icon-transition: fill var(--e-trs-duration-faster) var(--e-trs-easing-default)}.button[data-v-9f038231]{background-color:var(--e-c-primary-01-700);color:var(--e-c-mono-00);border-color:var(--e-c-primary-01-700)}.button .icon[data-v-9f038231],.button e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-00)}.button .loader[data-v-9f038231],.button e-loader[data-v-9f038231]{--dot-color: var(--e-c-mono-00)}.button[data-v-9f038231]:hover{background-color:var(--e-c-secondary-01-900);border-color:var(--e-c-secondary-01-900)}.button[data-v-9f038231]:active,.button[loading][data-v-9f038231]{background-color:var(--e-c-secondary-01-700);border-color:var(--e-c-secondary-01-700)}.button.disabled[data-v-9f038231]:not([loading]),.button[data-v-9f038231]:disabled:not([loading]){background-color:var(--e-c-mono-500);border-color:var(--e-c-mono-500)}.button.outlined[data-v-9f038231]{background-color:transparent;color:var(--e-c-primary-01-700);border:2px solid var(--e-c-primary-01-700)}.button.outlined .icon[data-v-9f038231],.button.outlined e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-primary-01-700)}.button.outlined .loader[data-v-9f038231],.button.outlined e-loader[data-v-9f038231]{--dot-color: var(--e-c-primary-01-500)}.button.outlined[data-v-9f038231]:hover{background-color:var(--e-c-primary-01-50);border-color:var(--e-c-primary-01-200)}.button.outlined[data-v-9f038231]:active,.button.outlined[loading][data-v-9f038231]{background-color:transparent;border-color:var(--e-c-primary-01-500)}.button.outlined.disabled[data-v-9f038231]:not([loading]),.button.outlined[data-v-9f038231]:disabled:not([loading]){border-color:var(--e-c-mono-500);background-color:transparent;color:var(--e-c-mono-500)}.button.outlined.disabled:not([loading]) .icon[data-v-9f038231],.button.outlined.disabled:not([loading]) e-icon[data-v-9f038231],.button.outlined:disabled:not([loading]) .icon[data-v-9f038231],.button.outlined:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}.button.plain[data-v-9f038231]{padding:var(--e-space-2) var(--e-space-3);color:var(--e-c-primary-01-700);background:none;border:0;text-decoration:none;grid-gap:var(--e-space-1)}.button.plain .icon[data-v-9f038231],.button.plain e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-primary-01-700)}.button.plain[data-v-9f038231]:hover{color:var(--e-c-secondary-01-900)}.button.plain:hover .icon[data-v-9f038231],.button.plain:hover e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-01-900)}.button.plain[data-v-9f038231]:active{color:var(--e-c-secondary-01-700)}.button.plain:active .icon[data-v-9f038231],.button.plain:active e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-01-700)}.button.plain.disabled[data-v-9f038231]:not([loading]),.button.plain[data-v-9f038231]:disabled:not([loading]){background:none;color:var(--e-c-mono-500)}.button.plain.disabled:not([loading]) .icon[data-v-9f038231],.button.plain.disabled:not([loading]) e-icon[data-v-9f038231],.button.plain:disabled:not([loading]) .icon[data-v-9f038231],.button.plain:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}.button.plain[loading] .loader[data-v-9f038231],.button.plain[loading] e-loader[data-v-9f038231]{--dot-color: var(--e-c-secondary-01-700)}.button.plain-small[data-v-9f038231]{padding:var(--e-space-2) var(--e-space-3);color:var(--e-c-primary-01-700);background:none;border:0;text-decoration:none;grid-gap:var(--e-space-1);font-size:var(--e-type-size-100);line-height:var(--e-type-line-height-100);letter-spacing:.025rem;font-weight:var(--e-type-weight-strong);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.button.plain-small .icon[data-v-9f038231],.button.plain-small e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-primary-01-700)}.button.plain-small[data-v-9f038231]:hover{color:var(--e-c-secondary-01-900)}.button.plain-small:hover .icon[data-v-9f038231],.button.plain-small:hover e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-01-900)}.button.plain-small[data-v-9f038231]:active{color:var(--e-c-secondary-01-700)}.button.plain-small:active .icon[data-v-9f038231],.button.plain-small:active e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-01-700)}.button.plain-small.disabled[data-v-9f038231]:not([loading]),.button.plain-small[data-v-9f038231]:disabled:not([loading]){background:none;color:var(--e-c-mono-500)}.button.plain-small.disabled:not([loading]) .icon[data-v-9f038231],.button.plain-small.disabled:not([loading]) e-icon[data-v-9f038231],.button.plain-small:disabled:not([loading]) .icon[data-v-9f038231],.button.plain-small:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}.button.plain-small[loading] .loader[data-v-9f038231],.button.plain-small[loading] e-loader[data-v-9f038231]{--dot-color: var(--e-c-secondary-01-700)}@media print{.button.plain-small[data-v-9f038231]{font-size:calc(var(--e-type-size-100) * .75);line-height:calc(var(--e-type-line-height-100) * .75)}}.button.filled-inverted[data-v-9f038231]{background-color:var(--e-c-mono-00);border-color:var(--e-c-mono-00);color:var(--e-c-primary-01-700)}.button.filled-inverted e-loader[data-v-9f038231]{--dot-color: var(--e-c-secondary-01-900)}.button.filled-inverted .icon[data-v-9f038231],.button.filled-inverted e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-primary-01-700)}.button.filled-inverted[data-v-9f038231]:hover{background-color:var(--e-c-primary-01-100);border-color:var(--e-c-primary-01-100);color:var(--e-c-secondary-01-700)}.button.filled-inverted:hover .icon[data-v-9f038231],.button.filled-inverted:hover e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-01-700)}.button.filled-inverted[data-v-9f038231]:active,.button.filled-inverted[loading][data-v-9f038231]{background-color:var(--e-c-primary-01-200);border-color:var(--e-c-primary-01-200)}.button.filled-inverted.disabled[data-v-9f038231]:not([loading]),.button.filled-inverted[data-v-9f038231]:disabled:not([loading]){color:var(--e-c-mono-700)}.button.filled-inverted.disabled:not([loading]) .icon[data-v-9f038231],.button.filled-inverted.disabled:not([loading]) e-icon[data-v-9f038231],.button.filled-inverted:disabled:not([loading]) .icon[data-v-9f038231],.button.filled-inverted:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-700)}.button.outlined-inverted[data-v-9f038231]{background-color:transparent;border-color:var(--e-c-mono-00);color:var(--e-c-mono-00)}.button.outlined-inverted .icon[data-v-9f038231],.button.outlined-inverted e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-00)}.button.outlined-inverted .loader[data-v-9f038231],.button.outlined-inverted e-loader[data-v-9f038231]{--dot-color: var(--e-c-mono-00)}.button.outlined-inverted[data-v-9f038231]:hover{background-color:rgba(var(--e-c-primary-01-900-rgb),.7);border-color:var(--e-c-primary-01-200)}.button.outlined-inverted[data-v-9f038231]:active,.button.outlined-inverted[loading][data-v-9f038231]{background-color:transparent;border-color:var(--e-c-primary-01-500)}.button.outlined-inverted.disabled[data-v-9f038231]:not([loading]),.button.outlined-inverted[data-v-9f038231]:disabled:not([loading]){color:var(--e-c-mono-500);border:2px solid var(--e-c-mono-500);background-color:transparent}.button.outlined-inverted.disabled:not([loading]) .icon[data-v-9f038231],.button.outlined-inverted.disabled:not([loading]) e-icon[data-v-9f038231],.button.outlined-inverted:disabled:not([loading]) .icon[data-v-9f038231],.button.outlined-inverted:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}.button.secondary-outlined[data-v-9f038231]{background-color:transparent;color:var(--e-c-secondary-02-500);border:2px solid var(--e-c-secondary-02-500)}.button.secondary-outlined .icon[data-v-9f038231],.button.secondary-outlined e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-02-500)}.button.secondary-outlined .loader[data-v-9f038231],.button.secondary-outlined e-loader[data-v-9f038231]{--dot-color: var(--e-c-secondary-02-500)}.button.secondary-outlined[data-v-9f038231]:hover{background-color:var(--e-c-secondary-02-50);border-color:var(--e-c-secondary-02-200)}.button.secondary-outlined[data-v-9f038231]:active,.button.secondary-outlined[loading][data-v-9f038231]{background-color:transparent;border-color:var(--e-c-secondary-02-200)}.button.secondary-outlined.disabled[data-v-9f038231]:not([loading]),.button.secondary-outlined[data-v-9f038231]:disabled:not([loading]){border-color:var(--e-c-mono-500);background-color:transparent;color:var(--e-c-mono-500)}.button.secondary-outlined.disabled:not([loading]) .icon[data-v-9f038231],.button.secondary-outlined.disabled:not([loading]) e-icon[data-v-9f038231],.button.secondary-outlined:disabled:not([loading]) .icon[data-v-9f038231],.button.secondary-outlined:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}.button.secondary-outlined-small[data-v-9f038231]{padding:var(--e-space-2_5) var(--e-space-6);background-color:transparent;color:var(--e-c-secondary-02-500);border:2px solid var(--e-c-secondary-02-500);font-size:var(--e-type-size-100);line-height:var(--e-type-line-height-100);letter-spacing:.025rem;font-weight:var(--e-type-weight-strong);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.button.secondary-outlined-small .icon[data-v-9f038231],.button.secondary-outlined-small e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-secondary-02-500)}.button.secondary-outlined-small .loader[data-v-9f038231],.button.secondary-outlined-small e-loader[data-v-9f038231]{--dot-color: var(--e-c-secondary-02-500)}.button.secondary-outlined-small[data-v-9f038231]:hover{background-color:var(--e-c-secondary-02-50);border-color:var(--e-c-secondary-02-200)}.button.secondary-outlined-small[data-v-9f038231]:active,.button.secondary-outlined-small[loading][data-v-9f038231]{background-color:transparent;border-color:var(--e-c-secondary-02-200)}.button.secondary-outlined-small.disabled[data-v-9f038231]:not([loading]),.button.secondary-outlined-small[data-v-9f038231]:disabled:not([loading]){border-color:var(--e-c-mono-500);background-color:transparent;color:var(--e-c-mono-500)}.button.secondary-outlined-small.disabled:not([loading]) .icon[data-v-9f038231],.button.secondary-outlined-small.disabled:not([loading]) e-icon[data-v-9f038231],.button.secondary-outlined-small:disabled:not([loading]) .icon[data-v-9f038231],.button.secondary-outlined-small:disabled:not([loading]) e-icon[data-v-9f038231]{--icon-fill-color: var(--e-c-mono-500)}@media print{.button.secondary-outlined-small[data-v-9f038231]{font-size:calc(var(--e-type-size-100) * .75);line-height:calc(var(--e-type-line-height-100) * .75)}}.button[loading][data-v-9f038231]{color:transparent}.button[loading] .icon[data-v-9f038231],.button[loading] e-icon[data-v-9f038231]{--icon-fill-color: transparent}[data-v-c55bae2c]:host{font-family:var(--e-type-font-body),var(--e-type-font-fallback);font-size:var(--e-type-size-300);font-weight:var(--e-type-weight-weak);line-height:var(--e-type-line-height-300);color:var(--e-c-mono-900);box-sizing:border-box}[data-v-c55bae2c],[data-v-c55bae2c]:after,[data-v-c55bae2c]:before{box-sizing:inherit}[data-v-c55bae2c]{outline:none}[data-v-c55bae2c]:focus-visible{outline-style:solid;outline-offset:4px;outline-color:#b3b3b3cc}[data-whatintent=mouse][data-v-c55bae2c] *:focus{outline:none}body[data-v-c55bae2c]{margin:0;min-height:100vh}h1[data-v-c55bae2c],h2[data-v-c55bae2c],h3[data-v-c55bae2c],h4[data-v-c55bae2c],h5[data-v-c55bae2c],h6[data-v-c55bae2c]{margin:0;text-wrap:balance;font-size:unset;font-weight:unset}p[data-v-c55bae2c],figure[data-v-c55bae2c],blockquote[data-v-c55bae2c]{margin:0}button[data-v-c55bae2c]{padding:0;margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:0;font-family:inherit;font-size:inherit;background:none}ul[data-v-c55bae2c],ol[data-v-c55bae2c]{list-style:none;padding:0;margin:0}dl[data-v-c55bae2c],dt[data-v-c55bae2c],dd[data-v-c55bae2c]{margin:0}address[data-v-c55bae2c]{font-style:normal}img[data-v-c55bae2c],picture[data-v-c55bae2c]{max-width:100%;display:block}fieldset[data-v-c55bae2c]{padding:0;margin:0;border:0}.visually-hidden[data-v-c55bae2c]{position:absolute;display:block;width:1px;height:1px;margin:-1px;padding:0;border:0;clip:rect(0,0,0,0);overflow:hidden;white-space:nowrap}.icon-button[data-v-c55bae2c]{position:relative;display:inline-flex;align-items:center;justify-content:center;width:3rem;height:3rem;border-radius:100%;color:transparent;cursor:pointer}.icon-button .icon[data-v-c55bae2c],.icon-button e-icon[data-v-c55bae2c]{width:1.5rem;height:1.5rem}.icon-button .icon[data-v-c55bae2c],.icon-button e-icon[data-v-c55bae2c]{position:relative}.icon-button[data-v-c55bae2c]:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;border-radius:100%;border-width:2px;border-style:solid;transition:background-color var(--e-trs-duration-faster) var(--e-trs-easing-default),border-color var(--e-trs-duration-faster) var(--e-trs-easing-default),transform var(--e-trs-duration-faster) var(--e-trs-easing-default)}.icon-button[data-v-c55bae2c]:hover:not(:disabled):before{transform:scale(1.05)}.icon-button[data-v-c55bae2c]:active:before{transform:scale(1)}.icon-button[data-v-c55bae2c]:disabled{cursor:default}.icon-button[data-v-c55bae2c]:before{background-color:var(--e-c-primary-01-700);border-color:var(--e-c-primary-01-700)}.icon-button .icon[data-v-c55bae2c],.icon-button e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-00)}.icon-button[data-v-c55bae2c]:hover:before{background-color:var(--e-c-secondary-01-900);border-color:var(--e-c-secondary-01-900)}.icon-button[data-v-c55bae2c]:active:before{background-color:var(--e-c-secondary-01-700);border-color:var(--e-c-secondary-01-700)}.icon-button[data-v-c55bae2c]:disabled:before{background-color:var(--e-c-mono-500);border-color:var(--e-c-mono-500)}.icon-button.outlined[data-v-c55bae2c]:before{background-color:transparent;border-color:var(--e-c-mono-500)}.icon-button.outlined .icon[data-v-c55bae2c],.icon-button.outlined e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-900)}.icon-button.outlined[data-v-c55bae2c]:hover:before{border-color:var(--e-c-primary-01-200)}.icon-button.outlined[data-v-c55bae2c]:active:before{border-color:var(--e-c-primary-01-500)}.icon-button.outlined[data-v-c55bae2c]:disabled:before{border-color:var(--e-c-mono-500)}.icon-button.outlined:disabled .icon[data-v-c55bae2c],.icon-button.outlined:disabled e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-500)}.icon-button.plain[data-v-c55bae2c]:before{background-color:transparent;border-color:transparent}.icon-button.plain .icon[data-v-c55bae2c],.icon-button.plain e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-primary-01-700)}.icon-button.plain[data-v-c55bae2c]:hover:before{background-color:var(--e-c-primary-01-50);border-color:var(--e-c-primary-01-50)}.icon-button.plain[data-v-c55bae2c]:active:before{background-color:var(--e-c-primary-01-100);border-color:var(--e-c-primary-01-100)}.icon-button.plain:disabled .icon[data-v-c55bae2c],.icon-button.plain:disabled e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-500)}.icon-button.filled-inverted[data-v-c55bae2c]:before{background-color:var(--e-c-mono-00);border-color:var(--e-c-mono-00)}.icon-button.filled-inverted .icon[data-v-c55bae2c],.icon-button.filled-inverted e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-primary-01-700)}.icon-button.filled-inverted[data-v-c55bae2c]:hover:before{background-color:var(--e-c-primary-01-100);border-color:var(--e-c-primary-01-100)}.icon-button.filled-inverted:hover .icon[data-v-c55bae2c],.icon-button.filled-inverted:hover e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-secondary-01-700)}.icon-button.filled-inverted[data-v-c55bae2c]:active:before{background-color:var(--e-c-primary-01-200);border-color:var(--e-c-primary-01-200)}.icon-button.filled-inverted[data-v-c55bae2c]:disabled:before{background-color:var(--e-c-mono-500);border-color:var(--e-c-mono-500)}.icon-button.filled-inverted:disabled .icon[data-v-c55bae2c],.icon-button.filled-inverted:disabled e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-700)}.icon-button.outlined-inverted[data-v-c55bae2c]:before{background-color:transparent;border-color:var(--e-c-mono-00)}.icon-button.outlined-inverted .icon[data-v-c55bae2c],.icon-button.outlined-inverted e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-00)}.icon-button.outlined-inverted[data-v-c55bae2c]:hover:before{border-color:var(--e-c-primary-01-200)}.icon-button.outlined-inverted[data-v-c55bae2c]:active:before{border-color:var(--e-c-primary-01-500)}.icon-button.outlined-inverted[data-v-c55bae2c]:disabled:before{border-color:var(--e-c-mono-500)}.icon-button.outlined-inverted:disabled .icon[data-v-c55bae2c],.icon-button.outlined-inverted:disabled e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-500)}.icon-button.plain-inverted[data-v-c55bae2c]:before{background-color:transparent;border-color:transparent}.icon-button.plain-inverted .icon[data-v-c55bae2c],.icon-button.plain-inverted e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-00)}.icon-button.plain-inverted[data-v-c55bae2c]:hover:before{background-color:var(--e-c-secondary-01-700);border-color:var(--e-c-secondary-01-700)}.icon-button.plain-inverted[data-v-c55bae2c]:active:before{background-color:var(--e-c-secondary-01-900);border-color:var(--e-c-secondary-01-900)}.icon-button.plain-inverted:disabled .icon[data-v-c55bae2c],.icon-button.plain-inverted:disabled e-icon[data-v-c55bae2c]{--icon-fill-color: var(--e-c-mono-500)}