@mirweb/mir-web-components 1.15.3 → 2.0.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 (184) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/index-Cl4fzBs2.js +17 -0
  3. package/dist/assets/scss/globals.scss +231 -0
  4. package/dist/assets/scss/index.scss +4 -0
  5. package/dist/assets/scss/normalize.scss +393 -0
  6. package/dist/assets/scss/reset.scss +102 -0
  7. package/dist/assets/scss/variables.scss +95 -0
  8. package/dist/components/atoms/button/button.vue +81 -0
  9. package/dist/components/atoms/checkbox/checkbox.vue +125 -0
  10. package/dist/components/atoms/chip/chip.vue +55 -0
  11. package/dist/components/atoms/dropdown/dropdown.vue +490 -0
  12. package/dist/components/atoms/image/image.vue +42 -0
  13. package/dist/components/atoms/label/label.vue +52 -0
  14. package/dist/components/atoms/link/link.vue +166 -0
  15. package/dist/components/atoms/radio-button/radio-button.vue +110 -0
  16. package/dist/components/atoms/select/select.vue +116 -0
  17. package/dist/components/atoms/select-multiple/select-multiple.vue +210 -0
  18. package/dist/components/atoms/slider/slider.vue +322 -0
  19. package/dist/components/atoms/text-field/text-field.vue +273 -0
  20. package/dist/components/atoms/textarea/textarea.vue +179 -0
  21. package/dist/components/atoms/video/video.vue +98 -0
  22. package/dist/components/blocks/accordion/accordion.vue +222 -0
  23. package/dist/components/blocks/card-display/card-display.vue +125 -0
  24. package/dist/components/blocks/column-grid/column-grid.vue +201 -0
  25. package/dist/components/blocks/facts/facts.vue +156 -0
  26. package/dist/components/blocks/features/features.vue +176 -0
  27. package/dist/components/blocks/flashcards/flashcards.vue +212 -0
  28. package/dist/components/blocks/form-script/form-script.vue +172 -0
  29. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue +214 -0
  30. package/dist/components/blocks/headline/headline.vue +93 -0
  31. package/dist/components/blocks/hero/hero.vue +173 -0
  32. package/dist/components/blocks/image/image.vue +93 -0
  33. package/dist/components/blocks/image-gallery/image-gallery.vue +289 -0
  34. package/dist/components/blocks/logo-wall/logo-wall.vue +125 -0
  35. package/dist/components/blocks/micro-stories/micro-stories.vue +316 -0
  36. package/dist/components/blocks/pallet-jack/pallet-jack.vue +440 -0
  37. package/dist/components/blocks/policy/policy.vue +106 -0
  38. package/dist/components/blocks/product-hero/product-hero.vue +140 -0
  39. package/dist/components/blocks/promo/promo.vue +403 -0
  40. package/dist/components/blocks/quote/quote.vue +127 -0
  41. package/dist/components/blocks/rich-text/rich-text-columns.vue +159 -0
  42. package/dist/components/blocks/rich-text/rich-text.vue +296 -0
  43. package/dist/components/blocks/timeline/timeline.vue +232 -0
  44. package/dist/components/blocks/vimeo/vimeo.vue +52 -0
  45. package/dist/components/index.ts +51 -0
  46. package/dist/components/molecules/address/address.vue +123 -0
  47. package/dist/components/molecules/bullet-list/bullet-list.vue +99 -0
  48. package/dist/components/molecules/card/card.vue +302 -0
  49. package/dist/components/molecules/column-card/column-card.vue +178 -0
  50. package/dist/components/molecules/event-card/event-card.vue +111 -0
  51. package/dist/components/molecules/flashcard/flashcard.vue +293 -0
  52. package/dist/components/molecules/modal/modal.vue +113 -0
  53. package/dist/components/molecules/text-card/text-card.vue +74 -0
  54. package/dist/components/organisms/404/404.vue +79 -0
  55. package/dist/components/organisms/filter/filter.vue +89 -0
  56. package/dist/components/organisms/footer/footer.vue +356 -0
  57. package/dist/components/organisms/header/header.vue +754 -0
  58. package/dist/components/organisms/language-switcher/language-switcher.vue +68 -0
  59. package/dist/components/organisms/pagination/pagination.vue +85 -0
  60. package/dist/components/organisms/search/search.vue +153 -0
  61. package/dist/components/templates/404-error-page.vue +0 -0
  62. package/dist/directives/clickOutside.ts +15 -0
  63. package/dist/fonts/OpenSans-Light.woff2 +0 -0
  64. package/dist/fonts/OpenSans-Medium.woff2 +0 -0
  65. package/dist/fonts/OpenSans-Regular.woff2 +0 -0
  66. package/dist/fonts/OpenSans-SemiBold.woff2 +0 -0
  67. package/dist/fonts/Oscine_Bd.woff2 +0 -0
  68. package/dist/fonts/Oscine_Lt.woff2 +0 -0
  69. package/dist/fonts/Oscine_Rg.woff2 +0 -0
  70. package/dist/index.html +12 -0
  71. package/dist/main.css +1 -0
  72. package/package.json +8 -10
  73. package/dist/components/atoms/button/button.vue.d.ts +0 -5
  74. package/dist/components/atoms/button/button.vue.d.ts.map +0 -1
  75. package/dist/components/atoms/checkbox/checkbox.vue.d.ts +0 -5
  76. package/dist/components/atoms/checkbox/checkbox.vue.d.ts.map +0 -1
  77. package/dist/components/atoms/chip/chip.vue.d.ts +0 -5
  78. package/dist/components/atoms/chip/chip.vue.d.ts.map +0 -1
  79. package/dist/components/atoms/dropdown/dropdown.vue.d.ts +0 -5
  80. package/dist/components/atoms/dropdown/dropdown.vue.d.ts.map +0 -1
  81. package/dist/components/atoms/image/image.vue.d.ts +0 -5
  82. package/dist/components/atoms/image/image.vue.d.ts.map +0 -1
  83. package/dist/components/atoms/label/label.vue.d.ts +0 -5
  84. package/dist/components/atoms/label/label.vue.d.ts.map +0 -1
  85. package/dist/components/atoms/link/link.vue.d.ts +0 -5
  86. package/dist/components/atoms/link/link.vue.d.ts.map +0 -1
  87. package/dist/components/atoms/radio-button/radio-button.vue.d.ts +0 -5
  88. package/dist/components/atoms/radio-button/radio-button.vue.d.ts.map +0 -1
  89. package/dist/components/atoms/select/select.vue.d.ts +0 -5
  90. package/dist/components/atoms/select/select.vue.d.ts.map +0 -1
  91. package/dist/components/atoms/select-multiple/select-multiple.vue.d.ts +0 -5
  92. package/dist/components/atoms/select-multiple/select-multiple.vue.d.ts.map +0 -1
  93. package/dist/components/atoms/slider/slider.vue.d.ts +0 -5
  94. package/dist/components/atoms/slider/slider.vue.d.ts.map +0 -1
  95. package/dist/components/atoms/text-field/text-field.vue.d.ts +0 -5
  96. package/dist/components/atoms/text-field/text-field.vue.d.ts.map +0 -1
  97. package/dist/components/atoms/textarea/textarea.vue.d.ts +0 -5
  98. package/dist/components/atoms/textarea/textarea.vue.d.ts.map +0 -1
  99. package/dist/components/atoms/video/video.vue.d.ts +0 -5
  100. package/dist/components/atoms/video/video.vue.d.ts.map +0 -1
  101. package/dist/components/blocks/accordion/accordion.vue.d.ts +0 -5
  102. package/dist/components/blocks/accordion/accordion.vue.d.ts.map +0 -1
  103. package/dist/components/blocks/card-display/card-display.vue.d.ts +0 -6
  104. package/dist/components/blocks/card-display/card-display.vue.d.ts.map +0 -1
  105. package/dist/components/blocks/column-grid/column-grid.vue.d.ts +0 -5
  106. package/dist/components/blocks/column-grid/column-grid.vue.d.ts.map +0 -1
  107. package/dist/components/blocks/facts/facts.vue.d.ts +0 -5
  108. package/dist/components/blocks/facts/facts.vue.d.ts.map +0 -1
  109. package/dist/components/blocks/features/features.vue.d.ts +0 -5
  110. package/dist/components/blocks/features/features.vue.d.ts.map +0 -1
  111. package/dist/components/blocks/flashcards/flashcards.vue.d.ts +0 -5
  112. package/dist/components/blocks/flashcards/flashcards.vue.d.ts.map +0 -1
  113. package/dist/components/blocks/form-script/form-script.vue.d.ts +0 -5
  114. package/dist/components/blocks/form-script/form-script.vue.d.ts.map +0 -1
  115. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue.d.ts +0 -5
  116. package/dist/components/blocks/frontpage-hero/frontpage-hero.vue.d.ts.map +0 -1
  117. package/dist/components/blocks/headline/headline.vue.d.ts +0 -5
  118. package/dist/components/blocks/headline/headline.vue.d.ts.map +0 -1
  119. package/dist/components/blocks/hero/hero.vue.d.ts +0 -5
  120. package/dist/components/blocks/hero/hero.vue.d.ts.map +0 -1
  121. package/dist/components/blocks/image/image.vue.d.ts +0 -5
  122. package/dist/components/blocks/image/image.vue.d.ts.map +0 -1
  123. package/dist/components/blocks/image-gallery/image-gallery.vue.d.ts +0 -5
  124. package/dist/components/blocks/image-gallery/image-gallery.vue.d.ts.map +0 -1
  125. package/dist/components/blocks/logo-wall/logo-wall.vue.d.ts +0 -5
  126. package/dist/components/blocks/logo-wall/logo-wall.vue.d.ts.map +0 -1
  127. package/dist/components/blocks/micro-stories/micro-stories.vue.d.ts +0 -5
  128. package/dist/components/blocks/micro-stories/micro-stories.vue.d.ts.map +0 -1
  129. package/dist/components/blocks/pallet-jack/pallet-jack.vue.d.ts +0 -5
  130. package/dist/components/blocks/pallet-jack/pallet-jack.vue.d.ts.map +0 -1
  131. package/dist/components/blocks/policy/policy.vue.d.ts +0 -4
  132. package/dist/components/blocks/policy/policy.vue.d.ts.map +0 -1
  133. package/dist/components/blocks/product-hero/product-hero.vue.d.ts +0 -5
  134. package/dist/components/blocks/product-hero/product-hero.vue.d.ts.map +0 -1
  135. package/dist/components/blocks/promo/promo.vue.d.ts +0 -5
  136. package/dist/components/blocks/promo/promo.vue.d.ts.map +0 -1
  137. package/dist/components/blocks/quote/quote.vue.d.ts +0 -5
  138. package/dist/components/blocks/quote/quote.vue.d.ts.map +0 -1
  139. package/dist/components/blocks/rich-text/rich-text-columns.vue.d.ts +0 -4
  140. package/dist/components/blocks/rich-text/rich-text-columns.vue.d.ts.map +0 -1
  141. package/dist/components/blocks/rich-text/rich-text.vue.d.ts +0 -5
  142. package/dist/components/blocks/rich-text/rich-text.vue.d.ts.map +0 -1
  143. package/dist/components/blocks/timeline/timeline.vue.d.ts +0 -5
  144. package/dist/components/blocks/timeline/timeline.vue.d.ts.map +0 -1
  145. package/dist/components/blocks/vimeo/vimeo.vue.d.ts +0 -5
  146. package/dist/components/blocks/vimeo/vimeo.vue.d.ts.map +0 -1
  147. package/dist/components/index.d.ts +0 -51
  148. package/dist/components/main.d.ts +0 -59
  149. package/dist/components/molecules/address/address.vue.d.ts +0 -5
  150. package/dist/components/molecules/address/address.vue.d.ts.map +0 -1
  151. package/dist/components/molecules/bullet-list/bullet-list.vue.d.ts +0 -5
  152. package/dist/components/molecules/bullet-list/bullet-list.vue.d.ts.map +0 -1
  153. package/dist/components/molecules/card/card.vue.d.ts +0 -5
  154. package/dist/components/molecules/card/card.vue.d.ts.map +0 -1
  155. package/dist/components/molecules/column-card/column-card.vue.d.ts +0 -5
  156. package/dist/components/molecules/column-card/column-card.vue.d.ts.map +0 -1
  157. package/dist/components/molecules/event-card/event-card.vue.d.ts +0 -5
  158. package/dist/components/molecules/event-card/event-card.vue.d.ts.map +0 -1
  159. package/dist/components/molecules/flashcard/flashcard.vue.d.ts +0 -5
  160. package/dist/components/molecules/flashcard/flashcard.vue.d.ts.map +0 -1
  161. package/dist/components/molecules/modal/modal.vue.d.ts +0 -5
  162. package/dist/components/molecules/modal/modal.vue.d.ts.map +0 -1
  163. package/dist/components/molecules/text-card/text-card.vue.d.ts +0 -5
  164. package/dist/components/molecules/text-card/text-card.vue.d.ts.map +0 -1
  165. package/dist/components/organisms/404/404.vue.d.ts +0 -5
  166. package/dist/components/organisms/404/404.vue.d.ts.map +0 -1
  167. package/dist/components/organisms/filter/filter.vue.d.ts +0 -5
  168. package/dist/components/organisms/filter/filter.vue.d.ts.map +0 -1
  169. package/dist/components/organisms/footer/footer.vue.d.ts +0 -5
  170. package/dist/components/organisms/footer/footer.vue.d.ts.map +0 -1
  171. package/dist/components/organisms/header/header.vue.d.ts +0 -6
  172. package/dist/components/organisms/header/header.vue.d.ts.map +0 -1
  173. package/dist/components/organisms/language-switcher/language-switcher.vue.d.ts +0 -5
  174. package/dist/components/organisms/language-switcher/language-switcher.vue.d.ts.map +0 -1
  175. package/dist/components/organisms/pagination/pagination.vue.d.ts +0 -5
  176. package/dist/components/organisms/pagination/pagination.vue.d.ts.map +0 -1
  177. package/dist/components/organisms/search/search.vue.d.ts +0 -4
  178. package/dist/components/organisms/search/search.vue.d.ts.map +0 -1
  179. package/dist/directives/clickOutside.d.ts +0 -3
  180. package/dist/main.d.ts +0 -1
  181. package/dist/mir-web-components.cjs.js +0 -1
  182. package/dist/mir-web-components.css +0 -1
  183. package/dist/mir-web-components.es.js +0 -3187
  184. package/dist/mir-web-components.umd.js +0 -2
@@ -0,0 +1,754 @@
1
+ <template>
2
+ <div class="header__wrapper">
3
+ <nav>
4
+ <!-- Main nav -->
5
+ <div class="nav-wrapper">
6
+ <div class="mir-link-logo">
7
+ <slot name="link-logo"></slot>
8
+ </div>
9
+ <ul class="main-nav-items">
10
+ <slot name="main-nav-items"></slot>
11
+ </ul>
12
+ <div class="secondary-nav-items">
13
+ <!-- dropdown menu -->
14
+ <div v-if="useDropdown" id="menu-dropdown" ref="dropdownDiv">
15
+ <button
16
+ class="nav-dropdown-btn"
17
+ aria-label="Toggle Dropdown"
18
+ @click="toggleDropDown"
19
+ >
20
+ <slot name="dropdown-title"></slot>
21
+ <img
22
+ v-if="showDropDown === false"
23
+ src="https://a.storyblok.com/f/230581/9x6/8cecdca15f/arrow-down.svg?cv=1695125714195"
24
+ alt="dropdown arrow"
25
+ />
26
+ <img
27
+ v-else
28
+ src="https://a.storyblok.com/f/230581/9x6/8cecdca15f/arrow-down.svg?cv=1695125714195"
29
+ alt="dropdown arrow"
30
+ style="transform: rotate(180deg)"
31
+ />
32
+ </button>
33
+ <div v-show="showDropDown" class="dropdown-content">
34
+ <slot name="dropdown-links"></slot>
35
+ </div>
36
+ </div>
37
+
38
+ <!-- nav search -->
39
+ <div v-if="search" class="nav-search-wrapper">
40
+ <button
41
+ ref="navSearchButton"
42
+ class="search-icon"
43
+ aria-label="Toggle search"
44
+ @click="$emit('clickSearch'), navSearchButton?.blur()"
45
+ >
46
+ <img
47
+ :src="
48
+ burgerState === true
49
+ ? 'https://a.storyblok.com/f/230581/21x21/13f4ac189d/search-icon-white.svg?cv=1695125826080'
50
+ : 'https://a.storyblok.com/f/230581/21x21/ebbdca38d3/search-icon.svg?cv=1695125825901'
51
+ "
52
+ alt="search icon"
53
+ width="20"
54
+ height="20"
55
+ />
56
+ </button>
57
+ </div>
58
+
59
+ <!-- Portal switcher -->
60
+ <div
61
+ v-if="usePortalSwitcher"
62
+ id="menu-portal-switcher"
63
+ class="portal-switcher-wrapper"
64
+ >
65
+ <button
66
+ class="nav-portal-switcher-btn"
67
+ aria-label="Toggle Portal"
68
+ @click="togglePortalSwitcher"
69
+ >
70
+ <img
71
+ src="https://a.storyblok.com/f/230581/14x12/1b00a4a551/portal-switcher.svg?cv=1712916615032"
72
+ alt="portal switcher icon"
73
+ width="20"
74
+ height="20"
75
+ />
76
+ </button>
77
+ <div
78
+ v-show="showPortalSwitcherDropDown"
79
+ class="portal-switcher-content"
80
+ >
81
+ <ul class="portal-switcher-links">
82
+ <li
83
+ v-for="(link, index) in portals"
84
+ :key="index"
85
+ class="portal-switcher-link"
86
+ >
87
+ <atom-link link-type="regular">
88
+ <a :href="link.link" @click="showDropDown = false">
89
+ <img :src="link.icon" />
90
+ <div>{{ link.name }}</div></a
91
+ >
92
+ </atom-link>
93
+ </li>
94
+ </ul>
95
+ </div>
96
+ </div>
97
+
98
+ <!-- profile dropdown -->
99
+ <div
100
+ v-if="useProfileDropdown"
101
+ id="menu-profile-dropdown"
102
+ class="profile-dropdown-wrapper"
103
+ >
104
+ <div v-if="!isAuthenticated" class="profile-dropdown-sign-in">
105
+ <slot name="profile-dropdown-sign-in"></slot>
106
+ </div>
107
+ <button
108
+ v-if="isAuthenticated"
109
+ aria-label="Toggle Profile"
110
+ class="nav-profile-dropdown-btn"
111
+ @click="toggleProfileDropdown"
112
+ >
113
+ <img
114
+ src="https://a.storyblok.com/f/230581/15x14/3b3253dd12/icon-user.svg?cv=1712916615014"
115
+ alt="profile dropdown icon"
116
+ width="20"
117
+ height="20"
118
+ />
119
+ </button>
120
+ <div v-show="showProfileDropDown" class="profile-dropdown-content">
121
+ <slot name="profile-dropdown-links"></slot>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ </div>
126
+ <!-- Mobile nav -->
127
+ <div
128
+ class="mobile-nav-wrapper"
129
+ :class="burgerState === true ? 'mirsaic-mobile-bg mirsaic--dark' : ''"
130
+ >
131
+ <div class="mobile-logo-search-burger-wrapper">
132
+ <div class="mobile-mir-link-logo">
133
+ <slot name="link-logo"></slot>
134
+ </div>
135
+
136
+ <div v-if="search" class="mobile-search-wrapper">
137
+ <button
138
+ ref="mobileSearchButton"
139
+ class="search-icon"
140
+ aria-label="Toggle search"
141
+ @click="$emit('clickSearch'), mobileSearchButton?.blur()"
142
+ >
143
+ <img
144
+ :src="
145
+ burgerState === true
146
+ ? 'https://a.storyblok.com/f/230581/21x21/13f4ac189d/search-icon-white.svg?cv=1695125826080'
147
+ : 'https://a.storyblok.com/f/230581/21x21/ebbdca38d3/search-icon.svg?cv=1695125825901'
148
+ "
149
+ alt="search icon"
150
+ width="20"
151
+ height="20"
152
+ />
153
+ </button>
154
+ </div>
155
+ <!-- Mobile Portal switcher -->
156
+ <div
157
+ v-if="usePortalSwitcher"
158
+ id="menu-portal-switcher"
159
+ class="menu-portal-switcher-wrapper"
160
+ >
161
+ <button
162
+ :class="{
163
+ 'menu-portal-switcher-btn': true,
164
+ 'is-active': showPortalSwitcherDropDown,
165
+ }"
166
+ :style="{
167
+ backgroundColor:
168
+ showPortalSwitcherDropDown && burgerState === true
169
+ ? '#1a76bc'
170
+ : showPortalSwitcherDropDown
171
+ ? '#cbeefa'
172
+ : 'transparent',
173
+ }"
174
+ @click.prevent="togglePortalSwitcher"
175
+ >
176
+ <img
177
+ :src="
178
+ burgerState === true
179
+ ? 'https://a.storyblok.com/f/230581/14x12/84ff5537cb/portal-switcher-white.svg'
180
+ : 'https://a.storyblok.com/f/230581/14x12/1b00a4a551/portal-switcher.svg'
181
+ "
182
+ alt="portalswitchericon"
183
+ width="20"
184
+ height="20"
185
+ />
186
+ </button>
187
+ <div
188
+ v-show="showPortalSwitcherDropDown"
189
+ class="portal-switcher-content"
190
+ >
191
+ <ul class="portal-switcher-links">
192
+ <li
193
+ v-for="(link, index) in portals"
194
+ :key="index"
195
+ class="portal-switcher-link"
196
+ >
197
+ <atom-link link-type="regular">
198
+ <a :href="link.link" @click="showDropDown = false">
199
+ <img :src="link.icon" />
200
+ <div>{{ link.name }}</div></a
201
+ >
202
+ </atom-link>
203
+ </li>
204
+ </ul>
205
+ </div>
206
+ </div>
207
+ <button
208
+ class="mobile-burger-wrapper"
209
+ aria-label="Toggle menu"
210
+ @click.prevent="toggleBurger"
211
+ >
212
+ <img
213
+ width="20"
214
+ height="20"
215
+ :src="
216
+ burgerState === true
217
+ ? 'https://a.storyblok.com/f/230581/17x18/20e9329e46/close-white.svg'
218
+ : 'https://a.storyblok.com/f/230581/23x14/739e917bca/burger-menu-line.svg'
219
+ "
220
+ alt="burger menu icon"
221
+ />
222
+ </button>
223
+ </div>
224
+ <div v-show="burgerState" class="mobile-menu-content-wrapper">
225
+ <ul>
226
+ <slot name="mobile-main-nav-items"></slot>
227
+ </ul>
228
+ <ul class="mobile-dropdown-content">
229
+ <slot name="mobile-dropdown-title"></slot>
230
+ <slot name="mobile-dropdown-links"></slot>
231
+ </ul>
232
+ </div>
233
+ </div>
234
+ </nav>
235
+ </div>
236
+ </template>
237
+
238
+ <script setup lang="ts">
239
+ import { ref, onMounted, onUnmounted, watch } from "vue";
240
+ import AtomLink from "../../atoms/link/link.vue";
241
+
242
+ let clickEventListener: ((e: MouseEvent) => void) | null = null;
243
+ const props = defineProps({
244
+ burgerState: {
245
+ type: Boolean,
246
+ default: false,
247
+ },
248
+ search: {
249
+ type: Boolean,
250
+ default: true,
251
+ },
252
+ showDropDown: {
253
+ type: Boolean,
254
+ default: false,
255
+ },
256
+ useDropdown: {
257
+ type: Boolean,
258
+ default: false,
259
+ },
260
+ showPortalSwitcherDropDown: {
261
+ type: Boolean,
262
+ default: false,
263
+ },
264
+ usePortalSwitcher: {
265
+ type: Boolean,
266
+ default: false,
267
+ },
268
+ portals: {
269
+ type: Array as () => Array<{ name: string; icon: string; link: string }>,
270
+ default: () => [],
271
+ },
272
+ showProfileDropDown: {
273
+ type: Boolean,
274
+ default: false,
275
+ },
276
+ isAuthenticated: {
277
+ type: Boolean,
278
+ default: false,
279
+ },
280
+ useProfileDropdown: {
281
+ type: Boolean,
282
+ default: false,
283
+ },
284
+ });
285
+ let burgerState = ref(props.burgerState);
286
+ let search = ref(props.search);
287
+ let showDropDown = ref(props.showDropDown);
288
+ let showPortalSwitcherDropDown = ref(props.showPortalSwitcherDropDown);
289
+ let showProfileDropDown = ref(props.showProfileDropDown);
290
+ let isAuthenticated = ref(props.isAuthenticated);
291
+
292
+ // Watch for changes in props and update local refs
293
+ watch(
294
+ () => props.burgerState,
295
+ (newVal) => (burgerState.value = newVal),
296
+ );
297
+ watch(
298
+ () => props.search,
299
+ (newVal) => (search.value = newVal),
300
+ );
301
+ watch(
302
+ () => props.showDropDown,
303
+ (newVal) => (showDropDown.value = newVal),
304
+ );
305
+ watch(
306
+ () => props.showPortalSwitcherDropDown,
307
+ (newVal) => (showPortalSwitcherDropDown.value = newVal),
308
+ );
309
+ watch(
310
+ () => props.showProfileDropDown,
311
+ (newVal) => (showProfileDropDown.value = newVal),
312
+ );
313
+ watch(
314
+ () => props.isAuthenticated,
315
+ (newVal) => (isAuthenticated.value = newVal),
316
+ );
317
+ // Close dropdown when clicking outside
318
+ onMounted(() => {
319
+ clickEventListener = (e: MouseEvent) => {
320
+ if (!(e.target as HTMLElement).closest("#menu-dropdown")) {
321
+ showDropDown.value = false;
322
+ }
323
+ if (!(e.target as HTMLElement).closest("#menu-portal-switcher")) {
324
+ showPortalSwitcherDropDown.value = false;
325
+ }
326
+ if (!(e.target as HTMLElement).closest("#menu-profile-dropdown")) {
327
+ showProfileDropDown.value = false;
328
+ }
329
+ };
330
+ window.addEventListener("click", clickEventListener);
331
+ });
332
+
333
+ onUnmounted(() => {
334
+ if (clickEventListener !== null) {
335
+ window.removeEventListener("click", clickEventListener);
336
+ }
337
+ });
338
+
339
+ // Emit both the burgerState and showDropDown state to the parent component
340
+ const emit = defineEmits([
341
+ "update:burgerState",
342
+ "update:showDropDown",
343
+ "update:showPortalSwitcherDropDown",
344
+ "update:showProfileDropDown",
345
+ "clickSearch",
346
+ ]);
347
+
348
+ function toggleDropDown() {
349
+ showDropDown.value = !showDropDown.value;
350
+ emit("update:showDropDown", showDropDown.value);
351
+ }
352
+ function togglePortalSwitcher() {
353
+ showPortalSwitcherDropDown.value = !showPortalSwitcherDropDown.value;
354
+ emit("update:showPortalSwitcherDropDown", showPortalSwitcherDropDown.value);
355
+ }
356
+ function toggleProfileDropdown() {
357
+ showProfileDropDown.value = !showProfileDropDown.value;
358
+ emit("update:showProfileDropDown", showProfileDropDown.value);
359
+ }
360
+
361
+ function toggleBurger() {
362
+ burgerState.value = !burgerState.value;
363
+ emit("update:burgerState", burgerState.value);
364
+ }
365
+
366
+ // Expose function to defocus search button
367
+ let navSearchButton = ref<HTMLButtonElement | null>(null);
368
+ let mobileSearchButton = ref<HTMLButtonElement | null>(null);
369
+
370
+ function defocusSearchButton() {
371
+ if (navSearchButton.value) {
372
+ navSearchButton.value.blur();
373
+ }
374
+ }
375
+
376
+ defineExpose({
377
+ defocusSearchButton,
378
+ });
379
+ </script>
380
+
381
+ <style lang="scss">
382
+ @use "../../../assets/scss/variables.scss" as *;
383
+ .main-nav-items,
384
+ .link__wrapper .mir-link.regular-link.remove-underline a {
385
+ position: relative;
386
+ display: inline-block;
387
+ padding: 0;
388
+ margin: -10px;
389
+ padding: 10px;
390
+ background-color: transparent;
391
+ pointer-events: auto;
392
+ }
393
+
394
+ .secondary-nav-items {
395
+ display: flex;
396
+ gap: 15px;
397
+ }
398
+
399
+ .main-nav-items a {
400
+ font-size: $font-size-xsm;
401
+ font-weight: 300;
402
+ }
403
+
404
+ #menu-dropdown {
405
+ a {
406
+ font-size: $font-size-xsm;
407
+ font-weight: 300;
408
+ }
409
+ button {
410
+ font-size: $font-size-xsm;
411
+ font-weight: 300;
412
+ }
413
+ }
414
+ .mobile-menu-content-wrapper {
415
+ li {
416
+ margin-bottom: 14px;
417
+ }
418
+ ul:first-child {
419
+ margin-top: 35px;
420
+ }
421
+ ul:nth-child(2) {
422
+ margin-top: 60px;
423
+ }
424
+ ul:last-child {
425
+ margin-top: 60px;
426
+ }
427
+ h4 {
428
+ color: $white;
429
+ margin: 35px 0 24px 0;
430
+ }
431
+ a {
432
+ font-family: $font-oscine;
433
+ font-size: $font-size-md;
434
+ font-weight: 300;
435
+ }
436
+ p {
437
+ color: $white;
438
+ font-weight: 400;
439
+ margin-bottom: 25px;
440
+ }
441
+ }
442
+ #menu-dropdown {
443
+ position: relative;
444
+ display: inline-block;
445
+ li {
446
+ list-style-type: none;
447
+ }
448
+ }
449
+
450
+ .mir-link-logo img {
451
+ object-fit: contain;
452
+ }
453
+ .mobile-mir-link-logo img {
454
+ object-fit: contain;
455
+ max-width: 120px;
456
+ }
457
+ </style>
458
+
459
+ <style scoped lang="scss">
460
+ @use "../../../assets/scss/variables.scss" as *;
461
+ // Main menu styles
462
+
463
+ .header {
464
+ &__wrapper {
465
+ .search-icon {
466
+ align-items: center;
467
+ border-radius: 40px;
468
+ cursor: pointer;
469
+ display: flex;
470
+ height: 40px;
471
+ justify-content: center;
472
+ width: 40px;
473
+ @include md {
474
+ &:hover,
475
+ &:active,
476
+ &:focus,
477
+ &:target {
478
+ transition: $transition-background-color;
479
+ background-color: $blue-300;
480
+ }
481
+ }
482
+ }
483
+ }
484
+ }
485
+ .nav-search-wrapper {
486
+ max-width: 114px;
487
+ }
488
+ .nav-wrapper {
489
+ display: none;
490
+ gap: 0px;
491
+ flex-direction: row;
492
+ justify-content: space-between;
493
+ align-items: center;
494
+ max-width: $max-width;
495
+ margin: auto;
496
+
497
+ @include md {
498
+ display: flex;
499
+ margin-top: 15px;
500
+ }
501
+ }
502
+
503
+ .profile-dropdown-wrapper {
504
+ .profile-dropdown-sign-in {
505
+ width: 72px;
506
+ font-family: $font-opensans;
507
+ display: flex;
508
+ justify-content: center;
509
+ }
510
+ }
511
+ .main-nav-items {
512
+ display: flex;
513
+ white-space: nowrap;
514
+ gap: 30px;
515
+ flex-direction: row;
516
+ width: 100%;
517
+ height: 100%;
518
+ padding-left: 30px;
519
+ }
520
+
521
+ .dropdown-content {
522
+ position: absolute;
523
+ background-color: $white;
524
+ min-width: 160px;
525
+ box-shadow: $box-shadow;
526
+ border-radius: $border-radius;
527
+ padding: 10px 15px;
528
+ right: 10px;
529
+ :deep(li) {
530
+ padding: 7.5px 0;
531
+ :deep(a) {
532
+ display: block;
533
+ }
534
+ }
535
+ }
536
+ .profile-dropdown-content {
537
+ position: absolute;
538
+ background-color: $white;
539
+ min-width: 250px;
540
+ box-shadow: $box-shadow;
541
+ border-radius: $border-radius;
542
+ padding: 10px 15px;
543
+ right: 0px;
544
+ top: 45px;
545
+ }
546
+ .portal-switcher-content {
547
+ position: absolute;
548
+ background-color: $white;
549
+ min-width: 250px;
550
+ box-shadow: $box-shadow;
551
+ border-radius: $border-radius;
552
+ padding: 0px;
553
+ right: 0px;
554
+ top: 45px;
555
+ }
556
+
557
+ .portal-switcher-content {
558
+ .portal-switcher-links {
559
+ display: grid;
560
+ grid-template-columns: repeat(2, 1fr);
561
+ margin: 0;
562
+ padding: 20px;
563
+ grid-gap: 15px;
564
+
565
+ .portal-switcher-link {
566
+ list-style-type: none;
567
+ width: 100%;
568
+ display: flex;
569
+ align-items: center;
570
+ justify-content: center;
571
+
572
+ a {
573
+ font-size: $font-size-xsm;
574
+ font-family: $font-opensans;
575
+ width: 124px;
576
+ text-align: center;
577
+ }
578
+
579
+ img {
580
+ width: 30px;
581
+ height: 30px;
582
+ }
583
+
584
+ div {
585
+ margin-top: 10px;
586
+ }
587
+ }
588
+ }
589
+ }
590
+
591
+ .nav-dropdown-btn {
592
+ background: none;
593
+ border: none;
594
+ cursor: pointer;
595
+ font-size: $font-size-xsm;
596
+ font-family: $font-opensans;
597
+ font-weight: 600;
598
+ min-width: 170px;
599
+ outline: none;
600
+ padding: 10px 15px;
601
+ position: relative;
602
+ min-width: max-content;
603
+ width: 100%;
604
+ height: 100%;
605
+ &:hover {
606
+ transition: $transition-color;
607
+ color: $blue-600;
608
+ }
609
+ &:active,
610
+ &:focus,
611
+ &:target {
612
+ transition: $transition-color;
613
+ color: $blue-600;
614
+ }
615
+ &:not(:active):not(:focus):not(:target):not(:hover) {
616
+ transition: $transition-background-color;
617
+ background-color: transparent;
618
+ }
619
+
620
+ img {
621
+ width: 10px;
622
+ height: 10px;
623
+ margin-left: 0.5rem;
624
+ pointer-events: none;
625
+ }
626
+ }
627
+ .nav-portal-switcher-btn,
628
+ .nav-profile-dropdown-btn {
629
+ cursor: pointer;
630
+ display: flex;
631
+ justify-content: center;
632
+ align-items: center;
633
+ position: relative;
634
+ background: none;
635
+ outline: none;
636
+ border: none;
637
+ font-size: $font-size-xsm;
638
+ font-family: $font-opensans;
639
+ font-weight: 600;
640
+ height: 40px;
641
+ width: 100%;
642
+ min-width: 40px;
643
+ border-radius: 40px;
644
+ &:hover,
645
+ &:active,
646
+ &:focus,
647
+ &:target {
648
+ transition: $transition-background-color;
649
+ background-color: $blue-300;
650
+ }
651
+ &:not(:active):not(:focus):not(:target):not(:hover) {
652
+ transition: $transition-background-color;
653
+ background-color: transparent;
654
+ }
655
+
656
+ img {
657
+ cursor: pointer;
658
+ }
659
+
660
+ .profile-dropdown-title {
661
+ width: 60px;
662
+ }
663
+ }
664
+
665
+ #menu-portal-switcher,
666
+ #menu-profile-dropdown {
667
+ position: relative;
668
+ }
669
+
670
+ .menu-portal-switcher-btn {
671
+ cursor: pointer;
672
+ align-items: center;
673
+ border: none;
674
+ background: none;
675
+ border-radius: 40px;
676
+ display: flex;
677
+ height: 40px;
678
+ justify-content: center;
679
+ min-width: 40px;
680
+ &.is-active {
681
+ background-color: $blue-300;
682
+ }
683
+ }
684
+
685
+ .show {
686
+ display: block;
687
+ }
688
+
689
+ // Mobile menu styles
690
+ .mobile-nav-wrapper {
691
+ padding: 15px 30px 0 30px;
692
+
693
+ @include md {
694
+ display: none;
695
+ }
696
+ .mobile-logo-search-burger-wrapper {
697
+ display: grid;
698
+ grid-template-columns: 1fr 44px 44px 44px;
699
+ grid-template-rows: 1fr;
700
+ align-items: center;
701
+ width: 100%;
702
+ max-width: $max-width;
703
+ margin: auto;
704
+
705
+ .mobile-search-wrapper {
706
+ width: 44px;
707
+ height: 44px;
708
+ display: flex;
709
+ flex-direction: column;
710
+ align-items: center;
711
+ justify-content: center;
712
+ cursor: pointer;
713
+ img {
714
+ cursor: pointer;
715
+ }
716
+ }
717
+ .mobile-burger-wrapper {
718
+ display: flex;
719
+ padding-left: 10px;
720
+ cursor: pointer;
721
+ .burger-line {
722
+ margin: 5px 0;
723
+ transition: all 0.15s;
724
+ }
725
+ }
726
+ }
727
+ }
728
+
729
+ .mirsaic-mobile-bg {
730
+ height: 100%;
731
+ position: fixed;
732
+ right: 0;
733
+ left: 0;
734
+ z-index: 9;
735
+ }
736
+ .mobile-nav-wrapper.mirsaic-mobile-bg::before {
737
+ opacity: 1;
738
+ }
739
+ .mobile-nav-wrapper::before {
740
+ @extend .mirsaic--dark !optional;
741
+ background-size:
742
+ 984px,
743
+ 100% 100%;
744
+ content: "";
745
+ position: absolute;
746
+ top: 0;
747
+ left: 0;
748
+ right: 0;
749
+ bottom: 0;
750
+ opacity: 0;
751
+ transition: opacity 0.15s ease-in-out;
752
+ z-index: -1;
753
+ }
754
+ </style>