You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1326 lines
45 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. <template>
  2. <div
  3. class="NavBar tw-bg-white tw-sticky tw-top-0 tw-left-0 tw-w-full tw-border-0 tw-border-b tw-border-solid tw-border-neutral-200 tw-z-10"
  4. >
  5. <div
  6. class="tw-px-[20px] tw-py-[20px] md:tw-px-[30px] md:tw-py-[24px] xl:tw-px-[60px] xl:tw-pt-[22px] xl:tw-pb-[14px] xl:tw-max-w-[1366px] xl:tw-mx-auto"
  7. >
  8. <div class="tw-flex tw-justify-between tw-items-center xl:tw-h-[48px]">
  9. <div
  10. class="tw-flex tw-items-center tw-flex-grow xl:tw-grid xl:tw-grid-cols-[188px_auto] xl:tw-gap-[30px] xl:tw-basis-[70%]"
  11. >
  12. <img
  13. class="tw-mr-[20px] md:tw-mr-[40px] xl:tw-hidden"
  14. :src="require('@/assets/svg/menu.svg')"
  15. @click="clickMenu"
  16. />
  17. <nuxt-link
  18. :to="localePath('/')"
  19. class="tw-block tw-w-[146px] md:tw-w-[188px]"
  20. ><img
  21. :src="require('@/assets/svg/logo_v2.svg')"
  22. class="tw-w-full"
  23. alt=""
  24. />
  25. </nuxt-link>
  26. <!-- <v-card class="tw-hidden flex-row rounded-lg py-1 px-4 xl:tw-flex xl:tw-ml-[30px]" outlined
  27. v-if="showNavSearch" @click="bigSearch = true">
  28. <v-card flat color="transparent" :width="$vuetify.breakpoint.mdAndDown ? '70px' : '300px'"
  29. class="my-auto neutrals--text text--darken-3 text-size-14">
  30. {{
  31. this.$vuetify.breakpoint.mdAndDown
  32. ? $t("Looking ?")
  33. : $t("What are you looking for?")
  34. }}
  35. </v-card>
  36. <svg width="24" height="24" class="tw-my-auto" shape-rendering="geometricPrecision">
  37. <image xlink:href="@/assets/svg/icon-search-small.svg" src="@/assets/svg/icon-search-small.svg" width="24"
  38. height="24" />
  39. </svg>
  40. </v-card> -->
  41. <div v-if="showNavSearch" class="tw-w-full tw-hidden xl:tw-block">
  42. <Search
  43. v-if="showNavSearch"
  44. :exhibitionsCategories="exhibitionsCategories"
  45. :exhibitionsLocations="exhibitionsLocations"
  46. :exhibitionsSearchs="exhibitionsSearchs"
  47. :servicesLocations="servicesLocations"
  48. :servicesSearchs="servicesSearchs"
  49. @loaading="isPageLoading = true"
  50. />
  51. </div>
  52. </div>
  53. <div
  54. class="tw-basis-[46%] md:tw-basis-[66%] xl:tw-basis-[43%] xl:tw-ml-[56px]"
  55. v-click-outside="clickOutSide"
  56. >
  57. <div class="tw-flex tw-justify-end xl:tw-hidden">
  58. <div class="tw-flex tw-justify-center tw-items-center">
  59. <v-img
  60. max-width="24"
  61. class="mr-4 float-left"
  62. contain
  63. :src="require('@/assets/svg/search-black.svg')"
  64. @click="clickSearch"
  65. ></v-img>
  66. </div>
  67. <!--v-img
  68. max-width="24"
  69. class="mr-4 hidden-md-and-up"
  70. contain
  71. :src="require('@/assets/svg/shopping-bag.svg')"
  72. ></v-img-->
  73. <span max-width="28px" v-if="$auth.$state.loggedIn">
  74. <v-menu
  75. offset-y
  76. bottom
  77. left
  78. nudge-bottom="20"
  79. class="neutrals darken-1 mt-4 on-top"
  80. >
  81. <template v-slot:activator="{ on, attrs }">
  82. <v-btn
  83. v-bind="attrs"
  84. v-on="on"
  85. @click="UserInfoPopup = true"
  86. v-if="$auth.$storage.getUniversal('userPicture')"
  87. icon
  88. width="28px"
  89. height="28px"
  90. class="ms-2"
  91. >
  92. <v-img
  93. :src="userPicture"
  94. max-width="28px"
  95. max-height="28px"
  96. class="rounded-circle"
  97. :key="userPicture"
  98. ></v-img>
  99. </v-btn>
  100. <v-btn
  101. v-bind="attrs"
  102. v-on="on"
  103. @click="UserInfoPopup = true"
  104. v-else-if="
  105. $auth.$storage.getUniversal('userLastName') != undefined
  106. "
  107. fab
  108. class="user-no-picture-border mx-2 tw-shadow-none"
  109. color="primary"
  110. width="28"
  111. height="28"
  112. >
  113. <span class="tw-text-[16px]">
  114. {{ $auth.$storage.getUniversal("userLastName") }}
  115. </span>
  116. </v-btn>
  117. <nuxt-link
  118. v-else
  119. class="tw-bg-primary-default tw-rounded-[12px] tw-whitespace-nowrap tw-block tw-text-white tw-px-[16px] tw-py-[9px] tw-whitespace-nowrap tw-text-[10px] tw-font-medium tw-transition-all tw-duration-200 tw-ease-in-out hover:tw-bg-primary-light"
  120. :to="localePath('/user')"
  121. >
  122. {{ $t("Log in/Sign up") }}
  123. </nuxt-link>
  124. </template>
  125. <div class="neutrals darken-1 tw-hidden xl:tw-block">
  126. <v-btn
  127. :to="
  128. localePath(
  129. $auth.$storage.getUniversal('authtoken')
  130. ? `/user/${
  131. $auth.$storage.getUniversal('authtoken').user_id
  132. }`
  133. : ''
  134. )
  135. "
  136. class="neutrals darken-1 neutrals--text text--darken-5 no-text-transform elevation-0 text-size-14"
  137. >
  138. <unicon
  139. class="mr-3"
  140. name="user"
  141. height="20px"
  142. fill="neutrals-darken5"
  143. />{{ $t("Profile") }}
  144. </v-btn>
  145. <v-btn
  146. @click="logout"
  147. class="neutrals darken-1 warning--text no-text-transform elevation-0"
  148. >
  149. <unicon
  150. class="mr-3 text-size-14"
  151. name="signout"
  152. height="20px"
  153. fill="#EF5A5A"
  154. />{{ $t("Logout") }}
  155. </v-btn>
  156. </div>
  157. <!-- <v-list class="neutrals darken-1 tw-hidden xl:tw-block">
  158. <v-list-item>
  159. <v-btn :to="
  160. localePath(
  161. $auth.$storage.getUniversal('authtoken')
  162. ? `/user/${
  163. $auth.$storage.getUniversal('authtoken').user_id
  164. }`
  165. : ''
  166. )
  167. "
  168. class="neutrals darken-1 neutrals--text text--darken-5 no-text-transform elevation-0 text-size-14">
  169. <unicon class="mr-3" name="user" height="20px" fill="neutrals-darken5" />{{ $t("Profile") }}
  170. </v-btn>
  171. </v-list-item>
  172. <v-list-item>
  173. <v-btn @click="logout" class="neutrals darken-1 warning--text no-text-transform elevation-0">
  174. <unicon class="mr-3 text-size-14" name="signout" height="20px" fill="#EF5A5A" />{{ $t("Logout") }}
  175. </v-btn>
  176. </v-list-item>
  177. </v-list> -->
  178. </v-menu>
  179. </span>
  180. <span v-else>
  181. <nuxt-link :to="localePath('/user')">
  182. <img class="" :src="require('@/assets/svg/profile.svg')" />
  183. </nuxt-link>
  184. </span>
  185. </div>
  186. <div
  187. class="tw-hidden xl:tw-flex xl:tw-justify-end xl:tw-items-center"
  188. >
  189. <v-btn
  190. v-if="$i18n.locale == 'zh-tw'"
  191. depressed
  192. class="remove-upper tw-mx-0 tw-px-0 tw-bg-transparent tw-text-primary-default"
  193. href="https://medium.com/showeasy"
  194. target="_blank"
  195. >
  196. {{ $t("Blog") }}
  197. </v-btn>
  198. <v-btn
  199. v-else
  200. depressed
  201. class="remove-upper tw-mx-0 tw-px-0 tw-bg-transparent tw-text-primary-default"
  202. href="https://medium.com/showeasy-eng"
  203. target="_blank"
  204. >
  205. {{ $t("Blog") }}
  206. </v-btn>
  207. <v-menu offset-y class="on-top">
  208. <template v-slot:activator="{ on, attrs }">
  209. <v-btn
  210. v-bind="attrs"
  211. v-on="on"
  212. depressed
  213. class="white neutrals--text text--darken-5 no-text-transform tw-body-3 tw-font-normal"
  214. >
  215. {{ $i18n.localeProperties["title"] }}
  216. <img src="@/assets/svg/down-arrow.svg" alt="" class="ml-1" />
  217. </v-btn>
  218. </template>
  219. <v-list>
  220. <v-list-item
  221. v-for="(lang, idx) in this.$i18n.locales"
  222. :key="idx"
  223. class="tw-mx-auto"
  224. >
  225. <nuxt-link
  226. :to="switchLocalePath(lang.code)"
  227. class="tw-rounded-[10px] tw-text-base-primary text-decoration-none tw-body-3 tw-font-normal tw-w-full tw-px-[12px] tw-py-[8px] hover:tw-bg-primary-3 hover:tw-text-primary-1"
  228. >
  229. {{ lang.text }}
  230. </nuxt-link>
  231. </v-list-item>
  232. </v-list>
  233. </v-menu>
  234. <changeCurrency></changeCurrency>
  235. <nuxt-link
  236. class="tw-px-[10px] tw-mr-[10px] hover:tw-bg-primary-3 active:tw-bg-primary-3"
  237. :to="localePath('/FAQ')"
  238. ><img src="~/assets/svg/faq.svg" alt=""
  239. /></nuxt-link>
  240. <!-- <v-btn
  241. depressed
  242. class="white tw-mr-[16px]"
  243. :to="localePath('/FAQ')"
  244. >
  245. <svg width="20" height="20">
  246. <image
  247. xlink:href="@/assets/svg/help-circle.svg"
  248. src="@/assets/svg/help-circle.svg"
  249. width="20"
  250. height="20"
  251. />
  252. </svg>
  253. </v-btn> -->
  254. <!-- <v-btn depressed class="white" small>
  255. <img src="@/assets/svg/shopping-bag.svg" alt="" />
  256. </v-btn> -->
  257. <div v-if="$auth.$state.loggedIn" class="tw-relative">
  258. <div @click="UserInfoPopup = true"
  259. v-if="$auth.$storage.getUniversal('userPicture')"
  260. class="ms-2 tw-bg-primary-default tw-w-[28px] tw-h-[28px] tw-rounded-[28px]">
  261. <v-img v-if="userPicture"
  262. :src="userPicture"
  263. class="tw-rounded-[28px] tw-w-[28px] tw-h-[28px] tw-flex tw-items-center tw-cursor-pointer"
  264. alt=""
  265. />
  266. </div>
  267. <v-btn
  268. @click="UserInfoPopup = true"
  269. v-else-if="
  270. $auth.$storage.getUniversal('userLastName') != undefined
  271. "
  272. fab
  273. :class="['mx-2 tw-shadow-none tw-bg-primary-default',($auth.$storage.getUniversal('userLastName')!=undefined && $auth.$storage.getUniversal('userLastName')
  274. && $auth.$storage.getUniversal('userLastName').length>1)?'tw-w-[40px] tw-rounded-[20px]':'tw-w-[28px] tw-rounded-[28px]']"
  275. color="primary"
  276. height="28"
  277. >
  278. <span :class="[($auth.$storage.getUniversal('isLetter')!=undefined && $auth.$storage.getUniversal('isLetter')==false)?'tw-text-[16px]':'tw-text-[12px]']">
  279. {{ $auth.$storage.getUniversal("userLastName") }}
  280. </span>
  281. </v-btn>
  282. <nuxt-link
  283. v-else
  284. class="tw-bg-primary-default tw-rounded-[12px] tw-whitespace-nowrap tw-block tw-text-white tw-px-[16px] tw-py-[9px] tw-whitespace-nowrap tw-text-[10px] tw-font-medium tw-transition-all tw-duration-200 tw-ease-in-out hover:tw-bg-primary-light"
  285. :to="localePath('/user')"
  286. >
  287. {{ $t("Log in/Sign up") }}
  288. </nuxt-link>
  289. <div
  290. :class="[
  291. 'tw-grid-cols-1 tw-gap-[14px] tw-px-[10px] tw-py-[8px] tw-bg-white tw-rounded-[10px] tw-w-max tw-absolute tw-right-0 tw-top-[40px] tw-z-50 tw-shadow-[0_1px_4px_0_rgba(0,0,0,0.3)]',
  292. UserInfoPopup && width >= 1366 ? 'tw-grid' : 'tw-hidden',
  293. ]"
  294. >
  295. <nuxt-link
  296. :to="
  297. localePath('/user/mobileUserInfoPopup')"
  298. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  299. @click.native="UserInfoPopup = false"
  300. ><img src="~/assets/svg/profile.svg" alt="" />
  301. <div class="tw-head-body tw-text-base-primary">
  302. {{ $t("userProfile.profile") }}
  303. </div>
  304. </nuxt-link>
  305. <!-- <nuxt-link :to="localePath('/user/myBooking')"
  306. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"><img
  307. src="~/assets/svg/bookings.svg" alt="" />
  308. <div class="tw-head-body tw-text-base-primary">
  309. {{ $t('My Bookings')}}
  310. </div>
  311. </nuxt-link> -->
  312. <nuxt-link
  313. :to="localePath('/user/saveExhibition')"
  314. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  315. @click.native="UserInfoPopup = false"
  316. ><img src="~/assets/svg/saveExhibition.svg" alt="" />
  317. <div class="tw-head-body tw-text-base-primary">
  318. {{ $t("userProfile.savedExhibitions") }}
  319. </div>
  320. </nuxt-link>
  321. <!-- <nuxt-link :to="localePath('/user/saveService')"
  322. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  323. @click.native="UserInfoPopup = false"><img src="~/assets/svg/saveService.svg" alt="" />
  324. <div class="tw-head-body tw-text-base-primary">
  325. {{ $t("userProfile.savedServices") }}
  326. </div>
  327. </nuxt-link> -->
  328. <nuxt-link
  329. :to="localePath('/user/companyInfo')"
  330. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  331. @click.native="UserInfoPopup = false"
  332. ><img src="~/assets/svg/companyInfo.svg" alt="" />
  333. <div class="tw-head-body tw-text-base-primary">
  334. {{ $t("userProfile.companyInfo") }}
  335. </div>
  336. </nuxt-link>
  337. <nuxt-link
  338. :to="localePath('/user/contactInfo')"
  339. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  340. @click.native="UserInfoPopup = false"
  341. ><img src="~/assets/svg/contactInfo.svg" alt="" />
  342. <div class="tw-head-body tw-text-base-primary">
  343. {{ $t("Contact Info") }}
  344. </div>
  345. </nuxt-link>
  346. <nuxt-link
  347. :to="localePath('/user/setting')"
  348. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  349. @click.native="UserInfoPopup = false"
  350. ><img src="~/assets/svg/profile_setting.svg" alt="" />
  351. <div class="tw-head-body tw-text-base-primary">
  352. {{ $t("userProfile.setting") }}
  353. </div>
  354. </nuxt-link>
  355. <div
  356. class="tw-border tw-border-t tw-border-solid tw-border-neutral-200"
  357. ></div>
  358. <button
  359. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  360. @click="logout"
  361. >
  362. <img src="~/assets/svg/logout.svg" alt="" />
  363. <div
  364. class="tw-flex tw-head-body tw-text-error-default tw-justify-start"
  365. >
  366. {{ $t("userProfile.logout") }}
  367. </div>
  368. </button>
  369. </div>
  370. </div>
  371. <div v-else>
  372. <nuxt-link
  373. :to="localePath('/user')"
  374. class="tw-text-[14px] tw-min-w-[123px] tw-whitespace-nowrap tw-text-white tw-bg-primary-1 tw-px-[16px] tw-py-[9px] tw-rounded-[12px]"
  375. >
  376. {{ $t("Log in/Sign up") }}</nuxt-link
  377. >
  378. </div>
  379. </div>
  380. </div>
  381. </div>
  382. <div
  383. ref="dropdown"
  384. :class="[
  385. 'navBar-row2 tw-relative tw-hidden xl:tw-grid xl:tw-mt-[35px] tw-transition-all tw-duration-200 tw-delay-75 tw-ease-linear',
  386. ]"
  387. >
  388. <div
  389. class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3"
  390. @mouseleave="exhibitionActiveIndex = 0"
  391. >
  392. <a
  393. :href="localePath('/exhibition')"
  394. @click="isPageLoading = true"
  395. :class="[
  396. 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default',
  397. $route.path.match('\/exhibition')
  398. ? 'tw-text-primary-default'
  399. : '',
  400. ]"
  401. >
  402. {{ $t("Exhibition") }}</a
  403. >
  404. <div v-if="exhibitionsCategoryList.length>0"
  405. class="customDropMenu exhibition tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] tw-overflow-hidden tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]"
  406. >
  407. <div
  408. class="tw-relative tw-grid tw-grid-cols-2 tw-max-w-[700px] tw-max-h-[556px] tw-overflow-hidden"
  409. >
  410. <div
  411. class="tw-list-none tw-overflow-x-hidden tw-overflow-y-auto tw-h-auto tw-break-inside-avoid tw-grid tw-grid-cols-1 tw-gap-[20px]"
  412. >
  413. <div
  414. class="tw-list-none tw-mr-[20px]"
  415. v-for="(item, index) in exhibitionsCategoryList"
  416. :key="index"
  417. @mouseover="exhibitionActiveIndex = index"
  418. >
  419. <div
  420. :class="[
  421. 'exhibitionDropdownLink tw-grid tw-grid-cols-[30px_auto] tw-gap-[10px] tw-body-4 tw-font-normal hover:tw-text-primary-default',
  422. exhibitionActiveIndex == index
  423. ? 'tw-text-primary-default active'
  424. : 'tw-text-neutrals-900',
  425. ]"
  426. >
  427. <img
  428. v-if="exhibitionListIcon[index] !== undefined"
  429. :src="
  430. require(`@/assets/img/CategoryIcon/${exhibitionListIcon[index]}.png`)
  431. "
  432. /><span class="tw-flex tw-items-center tw-min-w-[322px]">{{
  433. $t(item.CategoryName)
  434. }}</span>
  435. </div>
  436. </div>
  437. </div>
  438. <div class="tw-w-full tw-overflow-x-hidden tw-overflow-y-auto" v-if="exhibitionsCategoryList.length>0">
  439. <ul
  440. class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[20px] tw-px-[20px]"
  441. >
  442. <li class="tw-list-none">
  443. <a
  444. :href="
  445. localePath(
  446. `/exhibition?category=${exhibitionsCategoryList[exhibitionActiveIndex].CategoryID}`
  447. )
  448. "
  449. class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default"
  450. >{{ $t("All") }}</a
  451. >
  452. </li>
  453. <template v-if="exhibitionsCategoryList[
  454. exhibitionActiveIndex
  455. ].SubCategoryList && exhibitionsCategoryList[
  456. exhibitionActiveIndex
  457. ].SubCategoryList.length>0">
  458. <li
  459. v-for="(sub, index) in exhibitionsCategoryList[
  460. exhibitionActiveIndex
  461. ].SubCategoryList"
  462. :key="index"
  463. class="tw-list-none"
  464. >
  465. <a
  466. :href="localePath(`/exhibition?subcategory=${sub.CategoryID}`)"
  467. class="tw-block tw-min-h-[30px] tw-body-4 tw-font-normal tw-min-w-[230px] tw-text-neutral-800 hover:tw-text-primary-default"
  468. >{{ sub.CategoryName }}</a
  469. >
  470. </li></template>
  471. </ul>
  472. </div>
  473. </div>
  474. </div>
  475. </div>
  476. <span class="vertical-line"></span>
  477. <div
  478. class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3"
  479. >
  480. <a
  481. :href="localePath(`/service`)"
  482. :class="[
  483. 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default',
  484. $route.path.match('\/service') ? 'tw-text-primary-default' : '',
  485. ]"
  486. >
  487. {{ $t("All Services") }}</a
  488. >
  489. <div v-if="serviceCategoryList.length>0"
  490. class="customDropMenu services tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] -tw-mb-[60px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]"
  491. >
  492. <ul
  493. v-for="(item, index) in serviceCategoryList"
  494. :key="item.id"
  495. class="tw-list-none tw-mb-0 tw-mr-[40px] tw-h-auto tw-break-inside-avoid"
  496. >
  497. <li class="tw-list-none">
  498. <a
  499. :href="localePath(`/service?category=${item.id}`)"
  500. class="tw-block tw-mb-[16px] tw-grid tw-grid-cols-[16px_auto] tw-gap-[10px] tw-body-4 tw-font-normal tw-text-primary-default hover:tw-text-primary-default"
  501. >
  502. <svg
  503. width="16"
  504. height="16"
  505. class="tw-my-auto"
  506. shape-rendering="geometricPrecision"
  507. v-if="serviceListIcon[index] !== undefined"
  508. >
  509. <image
  510. :xlink:href="
  511. require(`@/assets/svg/${serviceListIcon[index]}.svg`)
  512. "
  513. :src="
  514. require(`@/assets/svg/${serviceListIcon[index]}.svg`)
  515. "
  516. width="16"
  517. height="16"
  518. />
  519. </svg>
  520. <div v-else></div>
  521. <span>{{ item.title }}</span>
  522. </a>
  523. <ul
  524. class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[16px] tw-p-0"
  525. >
  526. <li
  527. v-for="(sub, index) in item.subcategory"
  528. :key="index"
  529. class="tw-list-none"
  530. >
  531. <a
  532. :href="localePath(`/service?subcatg=${sub.id}`)"
  533. class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default"
  534. >{{ sub.title }}</a
  535. >
  536. </li>
  537. </ul>
  538. </li>
  539. <div class="tw-h-[60px]"></div>
  540. </ul>
  541. </div>
  542. </div>
  543. <div
  544. ref="headerSwiper"
  545. class="swiper-container headerService tw-w-full tw-overflow-hidden tw-relative tw-max-w-[1008px] tw-ml-[25px] tw-transition-all tw-duration-200 tw-delay-75 tw-ease-in"
  546. >
  547. <div class="swiper-wrapper">
  548. <div
  549. class="swiper-slide customMenuLink tw-relative tw-justify-start tw-items-center tw-w-auto"
  550. v-for="item in serviceCategoryList"
  551. :key="item.id"
  552. >
  553. <a
  554. :href="localePath(`/service/${item.id}`)"
  555. class="tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default tw-whitespace-nowrap"
  556. >{{ item.title }}</a
  557. >
  558. <ul v-if="item.subcategory && item.subcategory.length>0"
  559. class="customDropMenu oneType tw-grid-cols-1 tw-gap-[16px] tw-bg-white tw-p-[20px] tw-rounded-[10px] tw-w-max tw-absolute tw-top-[36px] tw-left-0 tw-mt-[10px] tw-shadow-[0_1px_6px_0_rgba(0,0,0,0.4)]"
  560. >
  561. <li
  562. v-for="(sub, index) in item.subcategory"
  563. :key="index"
  564. class="tw-list-none"
  565. >
  566. <a
  567. :href="localePath(`/service?subcatg=${sub.id}`)"
  568. class="tw-block tw-body-4 tw-font-normal tw-text-black hover:tw-text-primary-default"
  569. >{{ sub.title }}</a
  570. >
  571. </li>
  572. </ul>
  573. </div>
  574. </div>
  575. <div
  576. :class="[
  577. 'swiper-button-prev headerService tw-text-black tw-hidden',
  578. headerServiceSwiper
  579. ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center'
  580. : '',
  581. ]"
  582. ></div>
  583. <div
  584. :class="[
  585. 'swiper-button-next headerService tw-text-black tw-hidden',
  586. headerServiceSwiper
  587. ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center'
  588. : '',
  589. ]"
  590. ></div>
  591. </div>
  592. </div>
  593. </div>
  594. <Drawer
  595. :serviceCategory.sync="serviceCategoryList"
  596. :exhibitionsCategory.sync="exhibitionsCategoryList"
  597. :serviceListIcon="serviceListIcon"
  598. :exhibitionListIcon="exhibitionListIcon"
  599. @changeLang="changeLang()"
  600. />
  601. <SearchDialog
  602. ref="searchDialog"
  603. :exhibitionsCategoryList="exhibitionsCategoryList"
  604. :exhibitionsLocations="exhibitionsLocations"
  605. :exhibitionListIcon="exhibitionListIcon"
  606. :exhibitionsCategories="exhibitionsCategories"
  607. :servicesLocations="servicesLocations"
  608. :servicesSearchs="servicesSearchs"
  609. :populars="populars"
  610. @loaading="isPageLoading = true"
  611. />
  612. <mobileUserInfoPopup
  613. v-show="width < 1366"
  614. :show="UserInfoPopup"
  615. :width="width"
  616. @popup="UserInfoPopup = $event"
  617. >
  618. </mobileUserInfoPopup>
  619. <loading :isLoading="isPageLoading"></loading>
  620. </div>
  621. </template>
  622. <script>
  623. import Search from "@/components/home/headerInlineSearch";
  624. import Drawer from "@/components/newDrawer";
  625. import SearchDialog from "@/components/SearchDialog";
  626. import mobileUserInfoPopup from "@/components/mobileUserInfoPopup.vue";
  627. import { SettingsIcon } from "vue-feather-icons";
  628. // import jwt_decode from "authtoken-decode";
  629. import loading from "@/components/newComponent/loading/loading.vue";
  630. import changeCurrency from "@/components/dropdown/changeCurrencyWeb.vue";
  631. import Swiper from "swiper/bundle";
  632. // import { getCurrentTime } from "~/utils/assist";
  633. import { getFirstName } from "~/utils/common";
  634. // import { handler } from "@tailwindcss/line-clamp";
  635. export default {
  636. components: {
  637. Drawer,
  638. Search,
  639. SettingsIcon,
  640. SearchDialog,
  641. mobileUserInfoPopup,
  642. loading,
  643. changeCurrency,
  644. Swiper,
  645. },
  646. data() {
  647. return {
  648. isFirstEnter: false,
  649. show: false,
  650. bigSearch: false,
  651. userPicture: "",
  652. showNavSearch: true,
  653. servicesSearchs: [],
  654. servicesLocations: [],
  655. serviceCategoryList: [
  656. { id: 'Taiwan',title: 'Taiwan service',subcategory: [{id: 'Taiwan',title: 'Taiwan service'}] }
  657. ],
  658. serviceListIcon: [
  659. "Booth",
  660. "Exhibit",
  661. "event",
  662. "Marketing",
  663. "journey",
  664. "human",
  665. "service_others",
  666. ],
  667. exhibitionsCategoryList: [],
  668. exhibitionsSearchs: [],
  669. exhibitionsLocations: [],
  670. exhibitionsCategories: [],
  671. exhibitionListIcon: [
  672. "rawMaterial",
  673. "aeroSpace",
  674. "energy",
  675. "autoMobile",
  676. "electronics",
  677. "contrucstion",
  678. "security",
  679. "Machinary",
  680. "Medical",
  681. "education",
  682. "textile",
  683. "food",
  684. "entertainment",
  685. "consumer",
  686. "others",
  687. ],
  688. populars: {},
  689. exhibitionActiveIndex: 0,
  690. width: undefined,
  691. drawer: false,
  692. group: null,
  693. isPageLoading: false,
  694. UserInfoPopup: false,
  695. headerServiceSwiper: null,
  696. offsetLeft: 0,
  697. top: 0,
  698. TAIWAN_ID: 18,
  699. JAPAN_ID: 16,
  700. ITALY_ID: 31,
  701. };
  702. },
  703. created() {
  704. if (process.client) {
  705. this.width = window.innerWidth;
  706. }
  707. if (!this.$route) return;
  708. if (!this.$route.name) return;
  709. const [path, lang] = this.$route.name.split("___");
  710. if (path == "index") {
  711. this.showNavSearch = false;
  712. } else {
  713. this.showNavSearch = true;
  714. }
  715. this.isFirstEnter = true;
  716. this.fetchUser();
  717. // this.socialRegister();
  718. // this.getServiceCategory();
  719. // this.getExhibitionsCategory();
  720. // this.getServiceHistory();
  721. // this.getExhibitionsHistory();
  722. // this.getServiceLocations();
  723. // this.getExhibitionsLocations();
  724. this.getExhibitionsCategories();
  725. // this.getExhibitionsCollections();
  726. // this.getPopulars();
  727. },
  728. mounted() {
  729. let vm = this;
  730. vm.$nextTick(function () {
  731. window.addEventListener("resize", this.onResize);
  732. vm.initSwiper();
  733. });
  734. },
  735. beforeDestroy() {
  736. window.removeEventListener("resize", this.onResize);
  737. },
  738. computed: {
  739. windowWidth() {
  740. if (process.client) {
  741. this.width = window.innerWidth;
  742. }
  743. return this.width;
  744. },
  745. pictureStatus() {
  746. return this.$store.getters.getPictureStatus;
  747. },
  748. registerStatus() {
  749. return this.$store.getters.getRegisterStatus;
  750. },
  751. lang() {
  752. return this.$i18n.localeProperties["langQuery"];
  753. },
  754. },
  755. watch: {
  756. group: {
  757. handler: function () {
  758. this.drawer = false;
  759. },
  760. },
  761. $route: {
  762. handler: function (to, from) {
  763. if (!to) return;
  764. if (!to.name) return;
  765. const [path, lang] = to.name.split("___");
  766. if (path == "index") {
  767. this.showNavSearch = false;
  768. } else {
  769. this.showNavSearch = true;
  770. }
  771. if (path === "exhibition") {
  772. this.isPageLoading = false;
  773. }
  774. // if (path === "service") {
  775. // this.isPageLoading = false;
  776. // }
  777. if (to != from) {
  778. this.bigSearch = false;
  779. }
  780. },
  781. },
  782. pictureStatus: {
  783. handler: function (newVal, oldVal) {
  784. if(this.isFirstEnter==false){
  785. this.fetchUser();
  786. this.$forceUpdate();
  787. }
  788. },
  789. },
  790. registerStatus: {
  791. handler: function (newVal, oldVal) {
  792. // this.socialRegister();
  793. },
  794. },
  795. lang: {
  796. handler: function (newVal, oldVal) {
  797. if (newVal != oldVal) {
  798. this.$refs.dropdown.style.opacity = 0;
  799. // this.getServiceCategory();
  800. // this.getExhibitionsCategory();
  801. // this.getServiceHistory();
  802. // this.getExhibitionsHistory();
  803. // this.getServiceLocations();
  804. // this.getExhibitionsLocations();
  805. this.getExhibitionsCategories();
  806. // this.getExhibitionsCollections();
  807. this.initSwiper();
  808. }
  809. },
  810. },
  811. },
  812. methods: {
  813. clickOutSide() {
  814. this.show = false;
  815. this.UserInfoPopup = false;
  816. },
  817. onResize() {
  818. if (process.client) {
  819. this.width = window.innerWidth;
  820. }
  821. },
  822. clickMenu() {
  823. if (this.windowWidth < 1366) {
  824. this.$store.dispatch("toggleDrawer", true);
  825. }
  826. },
  827. clickSearch() {
  828. this.$store.dispatch("toggleSearchDialog", true);
  829. },
  830. initSwiper() {
  831. let vm = this;
  832. vm.$nextTick(function () {
  833. vm.headerServiceSwiper = new Swiper(".swiper-container.headerService", {
  834. direction: "horizontal",
  835. initialSlide: 0,
  836. observer: true,
  837. observeParents: true,
  838. rebuildOnUpdate: true,
  839. slidesPerView: "auto",
  840. spaceBetween: 25,
  841. watchSlidesVisibility: true,
  842. slideVisibleClass: "swiper-slide-visible",
  843. allowTouchMove: false,
  844. navigation: {
  845. nextEl: ".swiper-button-next.headerService",
  846. prevEl: ".swiper-button-prev.headerService",
  847. },
  848. });
  849. vm.headerServiceSwiper.init();
  850. vm.headerServiceSwiper.update();
  851. // this.$refs.headerSwiper.style.opacity = 1;
  852. vm.$refs.dropdown.style.opacity = 1;
  853. });
  854. },
  855. fetchUser() {
  856. if (this.$auth.loggedIn) {
  857. this.$auth.$storage.removeUniversal("userLastName");
  858. this.$auth.$storage.removeUniversal("userPicture");
  859. this.userPicture = "";
  860. this.$auth.$storage.removeUniversal("isLetter");
  861. this.$axios
  862. .get(`/trending/api/members/info`)
  863. .then((response) => {
  864. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  865. let data = response.data.DATA.rel
  866. if(data){
  867. if(data.MemberPicture){
  868. this.userPicture = data.MemberPicture;
  869. this.$auth.$storage.setUniversal("userPicture", data.MemberPicture);
  870. }
  871. if(data.LastName){
  872. let arr = getFirstName(data.LastName,this.$i18n.localeProperties["langQuery"]);
  873. let name = arr[0];
  874. let isLetter = arr[1];
  875. this.$auth.$storage.setUniversal("userLastName", name);
  876. this.$auth.$storage.setUniversal("isLetter", isLetter);
  877. }
  878. }
  879. }
  880. this.isFirstEnter = false;
  881. })
  882. .catch((error) => {
  883. this.isFirstEnter = false;
  884. console.log(error)
  885. });
  886. }
  887. },
  888. // getServiceCategory() {
  889. // let vm = this;
  890. // vm.$nextTick(() => {
  891. // vm.$axios
  892. // .get(`/service/category?lang_code=${this.lang}`)
  893. // .then((result) => {
  894. // vm.serviceCategoryList = result.data.map((item) => {
  895. // const subcategory = item.service_subcategory.map((sub) => {
  896. // return {
  897. // id: sub.id,
  898. // title: sub.language_text[0].text,
  899. // key: sub.language_text[0].text,
  900. // type: "subcategory",
  901. // order: sub.order_in_category,
  902. // };
  903. // });
  904. // return {
  905. // id: item.id,
  906. // order: item.order,
  907. // title: item.language_text[0].text,
  908. // key: item.language_text[0].text,
  909. // type: "category",
  910. // subcategory: subcategory,
  911. // };
  912. // });
  913. // return result.data;
  914. // })
  915. // .catch((err) => {
  916. // console.log(err);
  917. // });
  918. // });
  919. // },
  920. // getExhibitionsCategory() {
  921. // this.$axios
  922. // .get(
  923. // `/t/exhibitions/categories?lang=${this.$i18n.localeProperties["langQuery"]}&sort=true`
  924. // )
  925. // .then((result) => {
  926. // this.exhibitionsCategoryList = result.data.sort_results;
  927. // this.exhibitionsCategoryList = this.exhibitionsCategoryList.map(
  928. // (item) => {
  929. // item.subcategories_list = item.subcategories_list.map(
  930. // (children) => {
  931. // return {
  932. // id: children.subcategory_id,
  933. // title: children.subcategory_name,
  934. // key: children.subcategory_name,
  935. // type: "subcategory",
  936. // };
  937. // }
  938. // );
  939. // return {
  940. // id: item.categories_id,
  941. // title: item.category_name,
  942. // key: item.category_name,
  943. // type: "category",
  944. // subcategory: item.subcategories_list,
  945. // };
  946. // }
  947. // );
  948. // })
  949. // .catch((err) => {
  950. // console.log(err);
  951. // });
  952. // },
  953. // getServiceHistory() {
  954. // this.$axios
  955. // .get(
  956. // `/trending/services/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
  957. // )
  958. // .then((response) => {
  959. // this.servicesSearchs = response.data.searches;
  960. // })
  961. // .catch((error) => console.log(error));
  962. // },
  963. // getExhibitionsHistory() {
  964. // this.$axios
  965. // .get(
  966. // `/trending/exhibitions/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
  967. // )
  968. // .then((response) => {
  969. // this.exhibitionsSearchs = response.data.searches;
  970. // })
  971. // .catch((error) => console.log(error));
  972. // },
  973. // getServiceLocations() {
  974. // this.$axios
  975. // .get(
  976. // `/trending/services/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
  977. // )
  978. // .then((response) => {
  979. // this.servicesLocations = response.data.locations;
  980. // })
  981. // .catch((error) => console.log(error));
  982. // },
  983. // getExhibitionsLocations() {
  984. // this.$axios
  985. // .get(
  986. // `/trending/exhibitions/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
  987. // )
  988. // .then((response) => {
  989. // this.exhibitionsLocations = response.data.locations;
  990. // })
  991. // .catch((error) => console.log(error));
  992. // },
  993. getExhibitionsCategories() {
  994. this.$axios
  995. .get(`/trending/api/Exhibition/Categories?Lang=${this.$i18n.localeProperties["langQuery"]}`)
  996. .then((response) => {
  997. if(response && response.data && response.data.DATA && response.data.DATA.rel){
  998. let data = response.data.DATA.rel
  999. if(data.length>0){
  1000. this.exhibitionsCategoryList = data;
  1001. }
  1002. }
  1003. })
  1004. .catch((error) =>
  1005. console.log(error)
  1006. );
  1007. },
  1008. // getExhibitionsCollections() {
  1009. // this.$axios
  1010. // .get(
  1011. // `/trending/exhibitions/collections?lang=${this.$i18n.localeProperties["langQuery"]}`
  1012. // )
  1013. // .then((response) => {
  1014. // this.collections = response.data.collections;
  1015. // })
  1016. // .catch((error) => console.log(error));
  1017. // },
  1018. changeLang() {
  1019. // this.getServiceCategory();
  1020. // this.getExhibitionsCategory();
  1021. // this.getServiceHistory();
  1022. // this.getExhibitionsHistory();
  1023. // this.getServiceLocations();
  1024. // this.getExhibitionsLocations();
  1025. this.getExhibitionsCategories();
  1026. // this.getExhibitionsCollections();
  1027. },
  1028. getPopulars() {
  1029. this.$axios
  1030. .get(
  1031. `/trending/search/popular?lang=${this.$i18n.localeProperties["langQuery"]}`
  1032. )
  1033. .then((response) => {
  1034. this.populars = response.data;
  1035. })
  1036. .catch((error) => console.log(error));
  1037. },
  1038. logout() {
  1039. this.$auth.$storage.removeUniversal("authtoken");
  1040. this.$auth.$storage.removeUniversal("userPicture");
  1041. this.$auth.$storage.removeUniversal("userLastName");
  1042. this.$auth.$storage.removeUniversal("userBeforePath");
  1043. if (this.width < 1024) {
  1044. this.$router.push(this.localePath("/"));
  1045. } else {
  1046. this.$router.push(this.localePath("/user"));
  1047. }
  1048. this.$auth.logout();
  1049. this.$nuxt.refresh();
  1050. this.UserInfoPopup = false;
  1051. },
  1052. // socialRegister() {
  1053. // if (this.$auth.loggedIn) {
  1054. // const jsonPayload =
  1055. // this.$auth.$storage.getUniversal("authtoken") &&
  1056. // this.$auth.$storage.getUniversal("authtoken").token != undefined
  1057. // ? jwt_decode(this.$auth.$storage.getUniversal("authtoken").token)
  1058. // : { ueid: "" };
  1059. // if (
  1060. // this.$auth.$state.strategy === "google" ||
  1061. // this.$auth.$state.strategy === "facebook"
  1062. // )
  1063. // {
  1064. // const userData = {
  1065. // social_id:
  1066. // this.$auth.$state.strategy === "google"
  1067. // ? this.$auth.$state.user.sub
  1068. // : this.$auth.$state.user.id,
  1069. // first_name:
  1070. // this.$auth.$state.strategy === "google"
  1071. // ? this.$auth.$state.user.given_name
  1072. // : this.$auth.$state.user.first_name,
  1073. // last_name:
  1074. // this.$auth.$state.strategy === "google"
  1075. // ? this.$auth.$state.user.family_name
  1076. // : this.$auth.$state.user.last_name,
  1077. // email: this.$auth.$state.user.email,
  1078. // picture:
  1079. // this.$auth.$state.strategy === "google"
  1080. // ? this.$auth.$state.user.picture
  1081. // : this.$auth.$state.user.picture.data.url,
  1082. // social_schema: this.$auth.$state.strategy,
  1083. // };
  1084. // jsonPayload.ueid != ""
  1085. // ? (userData.user_id = JSON.parse(jsonPayload.ueid))
  1086. // : "";
  1087. // this.$axios
  1088. // .post("/member/users/social", userData)
  1089. // .then((result) => {
  1090. // this.$auth.$storage.setUniversal("authtoken", result.data, true);
  1091. // this.$store.dispatch("updatePicture");
  1092. // })
  1093. // .catch((err) => {
  1094. // console.log(err);
  1095. // });
  1096. // }
  1097. // this.$store.dispatch("updatePicture");
  1098. // }
  1099. // },
  1100. // toShowList(countryId) {
  1101. // if (countryId > 0) {
  1102. // this.$router.push(this.localePath(`/exhibition?country=${countryId}`));
  1103. // } else {
  1104. // this.$router.push(this.localePath(`/exhibition`));
  1105. // }
  1106. // this.isPageLoading = true;
  1107. // },
  1108. },
  1109. };
  1110. </script>
  1111. <style lang="scss" scoped>
  1112. .v-menu__content {
  1113. box-shadow: none;
  1114. min-width: 186px;
  1115. border-radius: 10px;
  1116. }
  1117. .v-list-item {
  1118. padding-left: 12px;
  1119. padding-right: 12px;
  1120. color: #232323 !important;
  1121. }
  1122. .navBar-row2 {
  1123. opacity: 0;
  1124. grid-template-columns: fit-content(70px) 50px fit-content(90px) auto;
  1125. }
  1126. .navBar-row2 {
  1127. opacity: 0;
  1128. grid-template-columns: fit-content(70px) 50px fit-content(90px) auto;
  1129. }
  1130. .vertical-line {
  1131. display: inline-block;
  1132. border-left: 1.5px solid;
  1133. margin: 5px 20px 5px 20px;
  1134. height: 15px;
  1135. }
  1136. :deep(.v-toolbar__content) {
  1137. max-width: 1366px;
  1138. width: 1366px;
  1139. }
  1140. .user-picture-container {
  1141. width: 28px;
  1142. height: 28px;
  1143. }
  1144. .user-picture-border {
  1145. border: 1px solid #f5cda8;
  1146. }
  1147. .user-no-picture-border {
  1148. border: 2px solid #f5cda8;
  1149. }
  1150. .user-no-picture-font {
  1151. font-family: "DM Sans";
  1152. font-style: normal;
  1153. font-weight: 400;
  1154. font-size: 16px;
  1155. line-height: 21px;
  1156. }
  1157. .v-btn:before {
  1158. background-color: rgba(238, 149, 70, 0.6) !important;
  1159. font-color: #ee9546;
  1160. }
  1161. .on-top {
  1162. z-index: 500;
  1163. }
  1164. .customMenuLink {
  1165. &::after {
  1166. content: "";
  1167. display: block;
  1168. width: 150%;
  1169. height: 40px;
  1170. position: absolute;
  1171. top: 20px;
  1172. left: 0;
  1173. }
  1174. &:hover {
  1175. .customDropMenu {
  1176. display: block;
  1177. &.oneType {
  1178. display: grid;
  1179. }
  1180. }
  1181. }
  1182. }
  1183. .customDropMenu {
  1184. column-count: 4;
  1185. display: none;
  1186. &.exhibition {
  1187. column-count: initial;
  1188. column-gap: initial;
  1189. }
  1190. &.services {
  1191. column-count: 3;
  1192. column-gap: 30px;
  1193. }
  1194. &.oneType {
  1195. column-count: 1;
  1196. column-gap: 30px;
  1197. }
  1198. > ul {
  1199. &:last-of-type {
  1200. > div {
  1201. display: none !important;
  1202. }
  1203. }
  1204. }
  1205. }
  1206. .swiper-button {
  1207. &-prev {
  1208. left: 0;
  1209. &::before {
  1210. content: "";
  1211. display: block;
  1212. width: 60px;
  1213. height: 100%;
  1214. background-image: url("~/assets/svg/swiper_linear.svg");
  1215. // background-image: linear-gradient(to left, transparent, #fff);
  1216. position: absolute;
  1217. left: -6px;
  1218. top: 0;
  1219. z-index: -1;
  1220. transform: rotate(180deg);
  1221. }
  1222. &:after {
  1223. content: "";
  1224. display: block;
  1225. position: absolute;
  1226. right: 10px;
  1227. background-image: url("~/assets/svg/left-arrow-default.svg");
  1228. background-position: center;
  1229. background-repeat: no-repeat;
  1230. background-size: 7px 13px;
  1231. width: 24px;
  1232. height: 24px;
  1233. }
  1234. }
  1235. &-next {
  1236. right: 0;
  1237. &::before {
  1238. content: "";
  1239. display: block;
  1240. width: 60px;
  1241. height: 100%;
  1242. background-image: url("~/assets/svg/swiper_linear.svg");
  1243. // background-image: linear-gradient(to right, transparent, #fff);
  1244. position: absolute;
  1245. right: -6px;
  1246. top: 0;
  1247. z-index: -1;
  1248. }
  1249. &:after {
  1250. content: "";
  1251. display: block;
  1252. position: absolute;
  1253. left: 10px;
  1254. background-image: url("~/assets/svg/right-arrow-default.svg");
  1255. background-position: center;
  1256. background-repeat: no-repeat;
  1257. background-size: 7px 13px;
  1258. width: 24px;
  1259. height: 24px;
  1260. }
  1261. }
  1262. }
  1263. :deep(.swiper-container) {
  1264. .swiper-slide {
  1265. opacity: 0;
  1266. display: flex;
  1267. &.swiper-slide-visible {
  1268. opacity: 1;
  1269. }
  1270. }
  1271. [aria-disabled="true"] {
  1272. opacity: 0;
  1273. &::before {
  1274. display: none;
  1275. }
  1276. &::after {
  1277. display: none;
  1278. }
  1279. }
  1280. }
  1281. .exhibitionDropdownLink {
  1282. &.active {
  1283. background-image: url("@/assets/svg/icon-arrow.svg");
  1284. background-position: right center;
  1285. background-size: 16px;
  1286. background-repeat: no-repeat;
  1287. }
  1288. }
  1289. </style>