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.

1392 lines
46 KiB

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('jwt')
  130. ? `/user/${
  131. $auth.$storage.getUniversal('jwt').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('jwt')
  162. ? `/user/${
  163. $auth.$storage.getUniversal('jwt').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
  259. v-if="$auth.$storage.getUniversal('userPicture')"
  260. class="tw-mx-auto"
  261. >
  262. <img
  263. :src="userPicture"
  264. class="tw-max-w-[28px] tw-max-h-[28px] tw-rounded-[50px] tw-flex tw-items-center tw-cursor-pointer"
  265. @click="UserInfoPopup = true"
  266. alt=""
  267. />
  268. </div>
  269. <v-btn
  270. @click="UserInfoPopup = true"
  271. v-else-if="
  272. $auth.$storage.getUniversal('userLastName') != undefined
  273. "
  274. fab
  275. class="user-no-picture-border mx-2 tw-shadow-none"
  276. color="primary"
  277. width="28"
  278. height="28"
  279. >
  280. <span class="tw-text-[16px]">
  281. {{ $auth.$storage.getUniversal("userLastName") }}
  282. </span>
  283. </v-btn>
  284. <nuxt-link
  285. v-else
  286. 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"
  287. :to="localePath('/user')"
  288. >
  289. {{ $t("Log in/Sign up") }}
  290. </nuxt-link>
  291. <div
  292. :class="[
  293. '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)]',
  294. UserInfoPopup && width >= 1366 ? 'tw-grid' : 'tw-hidden',
  295. ]"
  296. >
  297. <nuxt-link
  298. :to="
  299. localePath('/user/mobileUserInfoPopup')"
  300. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  301. @click.native="UserInfoPopup = false"
  302. ><img src="~/assets/svg/profile.svg" alt="" />
  303. <div class="tw-head-body tw-text-base-primary">
  304. {{ $t("userProfile.profile") }}
  305. </div>
  306. </nuxt-link>
  307. <!-- <nuxt-link :to="localePath('/user/myBooking')"
  308. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"><img
  309. src="~/assets/svg/bookings.svg" alt="" />
  310. <div class="tw-head-body tw-text-base-primary">
  311. {{ $t('My Bookings')}}
  312. </div>
  313. </nuxt-link> -->
  314. <nuxt-link
  315. :to="localePath('/user/saveExhibition')"
  316. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  317. @click.native="UserInfoPopup = false"
  318. ><img src="~/assets/svg/saveExhibition.svg" alt="" />
  319. <div class="tw-head-body tw-text-base-primary">
  320. {{ $t("userProfile.savedExhibitions") }}
  321. </div>
  322. </nuxt-link>
  323. <!-- <nuxt-link :to="localePath('/user/saveService')"
  324. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  325. @click.native="UserInfoPopup = false"><img src="~/assets/svg/saveService.svg" alt="" />
  326. <div class="tw-head-body tw-text-base-primary">
  327. {{ $t("userProfile.savedServices") }}
  328. </div>
  329. </nuxt-link> -->
  330. <nuxt-link
  331. :to="localePath('/user/companyInfo')"
  332. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  333. @click.native="UserInfoPopup = false"
  334. ><img src="~/assets/svg/companyInfo.svg" alt="" />
  335. <div class="tw-head-body tw-text-base-primary">
  336. {{ $t("userProfile.companyInfo") }}
  337. </div>
  338. </nuxt-link>
  339. <nuxt-link
  340. :to="localePath('/user/contactInfo')"
  341. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  342. @click.native="UserInfoPopup = false"
  343. ><img src="~/assets/svg/contactInfo.svg" alt="" />
  344. <div class="tw-head-body tw-text-base-primary">
  345. {{ $t("Contact Info") }}
  346. </div>
  347. </nuxt-link>
  348. <nuxt-link
  349. :to="localePath('/user/setting')"
  350. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  351. @click.native="UserInfoPopup = false"
  352. ><img src="~/assets/svg/profile_setting.svg" alt="" />
  353. <div class="tw-head-body tw-text-base-primary">
  354. {{ $t("userProfile.setting") }}
  355. </div>
  356. </nuxt-link>
  357. <div
  358. class="tw-border tw-border-t tw-border-solid tw-border-neutral-200"
  359. ></div>
  360. <button
  361. class="tw-grid tw-grid-cols-[20px_auto] tw-gap-[10px] tw-px-[10px] tw-py-[8px]"
  362. @click="logout"
  363. >
  364. <img src="~/assets/svg/logout.svg" alt="" />
  365. <div
  366. class="tw-flex tw-head-body tw-text-error-default tw-justify-start"
  367. >
  368. {{ $t("userProfile.logout") }}
  369. </div>
  370. </button>
  371. </div>
  372. </div>
  373. <div v-else>
  374. <nuxt-link
  375. :to="localePath('/user')"
  376. 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]"
  377. >
  378. {{ $t("Log in/Sign up") }}</nuxt-link
  379. >
  380. </div>
  381. </div>
  382. </div>
  383. </div>
  384. <div
  385. ref="dropdown"
  386. :class="[
  387. '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',
  388. ]"
  389. >
  390. <div
  391. class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3"
  392. @mouseleave="exhibitionActiveIndex = 0"
  393. >
  394. <a
  395. :href="localePath('/exhibition')"
  396. @click="isPageLoading = true"
  397. :class="[
  398. 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default',
  399. $route.path.match('\/exhibition')
  400. ? 'tw-text-primary-default'
  401. : '',
  402. ]"
  403. >
  404. {{ $t("Exhibition") }}</a
  405. >
  406. <div
  407. 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)]"
  408. >
  409. <div
  410. class="tw-relative tw-grid tw-grid-cols-2 tw-w-[700px] tw-h-[556px] tw-overflow-hidden"
  411. >
  412. <div
  413. 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]"
  414. >
  415. <div
  416. class="tw-list-none tw-mr-[20px]"
  417. v-for="(item, index) in exhibitionsCategoryList"
  418. :key="index"
  419. @mouseover="exhibitionActiveIndex = index"
  420. >
  421. <div
  422. :class="[
  423. 'exhibitionDropdownLink tw-grid tw-grid-cols-[30px_auto] tw-gap-[10px] tw-body-4 tw-font-normal hover:tw-text-primary-default',
  424. exhibitionActiveIndex == index
  425. ? 'tw-text-primary-default active'
  426. : 'tw-text-neutrals-900',
  427. ]"
  428. >
  429. <img
  430. v-if="exhibitionListIcon[index] !== undefined"
  431. :src="
  432. require(`@/assets/img/CategoryIcon/${exhibitionListIcon[index]}.png`)
  433. "
  434. /><span class="tw-flex tw-items-center tw-min-w-[322px]">{{
  435. $t(item.title)
  436. }}</span>
  437. </div>
  438. </div>
  439. </div>
  440. <div class="tw-w-full tw-overflow-x-hidden tw-overflow-y-auto">
  441. <ul
  442. class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[20px] tw-px-[20px]"
  443. >
  444. <li class="tw-list-none">
  445. <a
  446. :href="
  447. localePath(
  448. `/exhibition?category=${exhibitionsCategoryList[exhibitionActiveIndex].id}`
  449. )
  450. "
  451. class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default"
  452. >{{ $t("All") }}</a
  453. >
  454. </li>
  455. <li
  456. v-for="(sub, index) in exhibitionsCategoryList[
  457. exhibitionActiveIndex
  458. ].subcategory"
  459. :key="index"
  460. class="tw-list-none"
  461. >
  462. <a
  463. :href="localePath(`/exhibition?subcategory=${sub.id}`)"
  464. 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"
  465. >{{ sub.title }}</a
  466. >
  467. </li>
  468. </ul>
  469. </div>
  470. </div>
  471. </div>
  472. </div>
  473. <span class="vertical-line"></span>
  474. <div
  475. class="customMenuLink tw-relative tw-flex tw-justify-start tw-items-center tw-z-3"
  476. >
  477. <a
  478. :href="localePath('/service')"
  479. :class="[
  480. 'tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default',
  481. $route.path.match('\/service') ? 'tw-text-primary-default' : '',
  482. ]"
  483. >
  484. {{ $t("All Services") }}</a
  485. >
  486. <div
  487. 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)]"
  488. >
  489. <ul
  490. v-for="(item, index) in serviceCategoryList"
  491. :key="item.id"
  492. class="tw-list-none tw-mb-0 tw-mr-[40px] tw-h-auto tw-break-inside-avoid"
  493. >
  494. <li class="tw-list-none">
  495. <a
  496. :href="localePath(`/service?category=${item.id}`)"
  497. 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"
  498. >
  499. <svg
  500. width="16"
  501. height="16"
  502. class="tw-my-auto"
  503. shape-rendering="geometricPrecision"
  504. v-if="serviceListIcon[index] !== undefined"
  505. >
  506. <image
  507. :xlink:href="
  508. require(`@/assets/svg/${serviceListIcon[index]}.svg`)
  509. "
  510. :src="
  511. require(`@/assets/svg/${serviceListIcon[index]}.svg`)
  512. "
  513. width="16"
  514. height="16"
  515. />
  516. </svg>
  517. <div v-else></div>
  518. <span>{{ item.title }}</span>
  519. </a>
  520. <ul
  521. class="tw-list-none tw-grid tw-grid-cols-1 tw-gap-[16px] tw-p-0"
  522. >
  523. <li
  524. v-for="(sub, index) in item.subcategory"
  525. :key="index"
  526. class="tw-list-none"
  527. >
  528. <a
  529. :href="localePath(`/service?subcatg=${sub.id}`)"
  530. class="tw-block tw-body-4 tw-font-normal tw-text-neutral-800 hover:tw-text-primary-default"
  531. >{{ sub.title }}</a
  532. >
  533. </li>
  534. </ul>
  535. </li>
  536. <div class="tw-h-[60px]"></div>
  537. </ul>
  538. </div>
  539. </div>
  540. <div
  541. ref="headerSwiper"
  542. 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"
  543. >
  544. <div class="swiper-wrapper">
  545. <div
  546. class="swiper-slide customMenuLink tw-relative tw-justify-start tw-items-center tw-w-auto"
  547. v-for="item in serviceCategoryList"
  548. :key="item.id"
  549. >
  550. <a
  551. :href="localePath(`/service?category=${item.id}`)"
  552. class="tw-text-black tw-body-3 tw-font-normal hover:tw-text-primary-default tw-whitespace-nowrap"
  553. >{{ item.title }}</a
  554. >
  555. <ul
  556. 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)]"
  557. >
  558. <li
  559. v-for="(sub, index) in item.subcategory"
  560. :key="index"
  561. class="tw-list-none"
  562. >
  563. <a
  564. :href="localePath(`/service?subcatg=${sub.id}`)"
  565. class="tw-block tw-body-4 tw-font-normal tw-text-black hover:tw-text-primary-default"
  566. >{{ sub.title }}</a
  567. >
  568. </li>
  569. </ul>
  570. </div>
  571. </div>
  572. <div
  573. :class="[
  574. 'swiper-button-prev headerService tw-text-black tw-hidden',
  575. headerServiceSwiper
  576. ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center'
  577. : '',
  578. ]"
  579. ></div>
  580. <div
  581. :class="[
  582. 'swiper-button-next headerService tw-text-black tw-hidden',
  583. headerServiceSwiper
  584. ? 'xl:tw-flex xl:tw-justify-center xl:tw-items-center'
  585. : '',
  586. ]"
  587. ></div>
  588. </div>
  589. </div>
  590. </div>
  591. <Drawer
  592. :serviceCategory.sync="serviceCategoryList"
  593. :exhibitionsCategory.sync="exhibitionsCategoryList"
  594. :serviceListIcon="serviceListIcon"
  595. :exhibitionListIcon="exhibitionListIcon"
  596. @changeLang="changeLang()"
  597. />
  598. <SearchDialog
  599. ref="searchDialog"
  600. :exhibitionsCategoryList="exhibitionsCategoryList"
  601. :exhibitionsLocations="exhibitionsLocations"
  602. :exhibitionListIcon="exhibitionListIcon"
  603. :exhibitionsCategories="exhibitionsCategories"
  604. :servicesLocations="servicesLocations"
  605. :servicesSearchs="servicesSearchs"
  606. :populars="populars"
  607. @loaading="isPageLoading = true"
  608. />
  609. <mobileUserInfoPopup
  610. v-show="width < 1366"
  611. :show="UserInfoPopup"
  612. :width="width"
  613. @popup="UserInfoPopup = $event"
  614. >
  615. </mobileUserInfoPopup>
  616. <loading :isLoading="isPageLoading"></loading>
  617. </div>
  618. </template>
  619. <script>
  620. import Search from "@/components/home/headerInlineSearch";
  621. import Drawer from "@/components/newDrawer";
  622. import SearchDialog from "@/components/SearchDialog";
  623. import mobileUserInfoPopup from "@/components/mobileUserInfoPopup.vue";
  624. import { SettingsIcon } from "vue-feather-icons";
  625. import jwt_decode from "jwt-decode";
  626. import loading from "@/components/newComponent/loading/loading.vue";
  627. import changeCurrency from "@/components/dropdown/changeCurrencyWeb.vue";
  628. import Swiper from "swiper/bundle";
  629. import { handler } from "@tailwindcss/line-clamp";
  630. export default {
  631. components: {
  632. Drawer,
  633. Search,
  634. SettingsIcon,
  635. SearchDialog,
  636. mobileUserInfoPopup,
  637. loading,
  638. changeCurrency,
  639. Swiper,
  640. },
  641. data() {
  642. return {
  643. show: false,
  644. bigSearch: false,
  645. userPicture: "",
  646. showNavSearch: true,
  647. servicesSearchs: [],
  648. servicesLocations: [],
  649. serviceCategoryList: [{ title: 'Food Equipment',subcategory: [{
  650. id: '1',
  651. title: 'Food Equipment-01'
  652. }] },{ title: 'Machine Tool',subcategory: [{
  653. id: '1',
  654. title: 'Machine Tool-01'
  655. }] },{ title: 'Food Equipment',subcategory: [{
  656. id: '1',
  657. title: 'Food Equipment-01'
  658. }] },{ title: 'Food Equipment',subcategory: [{
  659. id: '1',
  660. title: 'Food Equipment-01'
  661. }] },{ title: 'Food Equipment',subcategory: [{
  662. id: '1',
  663. title: 'Food Equipment-01'
  664. }] },{ title: 'Food Equipment',subcategory: [{
  665. id: '1',
  666. title: 'Food Equipment-01'
  667. }] },{ title: 'Food Equipment',subcategory: [{
  668. id: '1',
  669. title: 'Food Equipment-01'
  670. }] },{ title: 'Food Equipment',subcategory: [{
  671. id: '1',
  672. title: 'Food Equipment-01'
  673. }] },{ title: 'Food Equipment',subcategory: [{
  674. id: '1',
  675. title: 'Food Equipment-01'
  676. }] },{ title: 'Food Equipment',subcategory: [{
  677. id: '1',
  678. title: 'Food Equipment-01'
  679. }] }],
  680. serviceListIcon: [
  681. "Booth",
  682. "Exhibit",
  683. "event",
  684. "Marketing",
  685. "journey",
  686. "human",
  687. "service_others",
  688. ],
  689. exhibitionsCategoryList: [{ title: 'Food Equipment',subcategory: [{
  690. id: '1',
  691. title: 'Food Equipment-01'
  692. }] },{ title: 'Machine Tool',subcategory: [{
  693. id: '1',
  694. title: 'Machine Tool-01'
  695. }] },{ title: 'Food Equipment',subcategory: [{
  696. id: '1',
  697. title: 'Food Equipment-01'
  698. }] },{ title: 'Food Equipment',subcategory: [{
  699. id: '1',
  700. title: 'Food Equipment-01'
  701. }] },{ title: 'Food Equipment',subcategory: [{
  702. id: '1',
  703. title: 'Food Equipment-01'
  704. }] },{ title: 'Food Equipment',subcategory: [{
  705. id: '1',
  706. title: 'Food Equipment-01'
  707. }] },{ title: 'Food Equipment',subcategory: [{
  708. id: '1',
  709. title: 'Food Equipment-01'
  710. }] },{ title: 'Food Equipment',subcategory: [{
  711. id: '1',
  712. title: 'Food Equipment-01'
  713. }] },{ title: 'Machine Tool',subcategory: [{
  714. id: '1',
  715. title: 'Machine Tool-01'
  716. }] },{ title: 'Food Equipment',subcategory: [{
  717. id: '1',
  718. title: 'Food Equipment-01'
  719. }] },{ title: 'Food Equipment',subcategory: [{
  720. id: '1',
  721. title: 'Food Equipment-01'
  722. }] },{ title: 'Food Equipment',subcategory: [{
  723. id: '1',
  724. title: 'Food Equipment-01'
  725. }] },{ title: 'Food Equipment',subcategory: [{
  726. id: '1',
  727. title: 'Food Equipment-01'
  728. }] },{ title: 'Food Equipment',subcategory: [{
  729. id: '1',
  730. title: 'Food Equipment-01'
  731. }] }],
  732. exhibitionsSearchs: [],
  733. exhibitionsLocations: [],
  734. exhibitionsCategories: [],
  735. exhibitionListIcon: [
  736. "rawMaterial",
  737. "aeroSpace",
  738. "energy",
  739. "autoMobile",
  740. "electronics",
  741. "contrucstion",
  742. "security",
  743. "Machinary",
  744. "Medical",
  745. "education",
  746. "textile",
  747. "food",
  748. "entertainment",
  749. "consumer",
  750. "others",
  751. ],
  752. populars: {},
  753. exhibitionActiveIndex: 0,
  754. width: undefined,
  755. drawer: false,
  756. group: null,
  757. isPageLoading: false,
  758. UserInfoPopup: false,
  759. headerServiceSwiper: null,
  760. offsetLeft: 0,
  761. top: 0,
  762. TAIWAN_ID: 18,
  763. JAPAN_ID: 16,
  764. ITALY_ID: 31,
  765. };
  766. },
  767. async created() {
  768. if (process.client) {
  769. this.width = window.innerWidth;
  770. }
  771. if (!this.$route) return;
  772. if (!this.$route.name) return;
  773. const [path, lang] = this.$route.name.split("___");
  774. if (path == "index") {
  775. this.showNavSearch = false;
  776. } else {
  777. this.showNavSearch = true;
  778. }
  779. await this.fetchUser();
  780. await this.socialRegister();
  781. // await this.getServiceCategory();
  782. // await this.getExhibitionsCategory();
  783. // await this.getServiceHistory();
  784. // await this.getExhibitionsHistory();
  785. // await this.getServiceLocations();
  786. // await this.getExhibitionsLocations();
  787. // await this.getExhibitionsCategories();
  788. // await this.getExhibitionsCollections();
  789. // await this.getPopulars();
  790. },
  791. mounted() {
  792. let vm = this;
  793. vm.$nextTick(function () {
  794. window.addEventListener("resize", this.onResize);
  795. vm.initSwiper();
  796. });
  797. },
  798. beforeDestroy() {
  799. window.removeEventListener("resize", this.onResize);
  800. },
  801. computed: {
  802. windowWidth() {
  803. if (process.client) {
  804. this.width = window.innerWidth;
  805. }
  806. return this.width;
  807. },
  808. pictureStatus() {
  809. return this.$store.getters.getPictureStatus;
  810. },
  811. registerStatus() {
  812. return this.$store.getters.getRegisterStatus;
  813. },
  814. lang() {
  815. return this.$i18n.localeProperties["langQuery"];
  816. },
  817. },
  818. watch: {
  819. group: {
  820. handler: function () {
  821. this.drawer = false;
  822. },
  823. },
  824. $route: {
  825. handler: function (to, from) {
  826. if (!to) return;
  827. if (!to.name) return;
  828. const [path, lang] = to.name.split("___");
  829. if (path == "index") {
  830. this.showNavSearch = false;
  831. } else {
  832. this.showNavSearch = true;
  833. }
  834. if (path === "exhibition") {
  835. this.isPageLoading = false;
  836. }
  837. if (path === "service") {
  838. this.isPageLoading = false;
  839. }
  840. if (to != from) {
  841. this.bigSearch = false;
  842. }
  843. },
  844. },
  845. pictureStatus: {
  846. handler: function (newVal, oldVal) {
  847. this.fetchUser();
  848. this.$forceUpdate();
  849. },
  850. },
  851. registerStatus: {
  852. handler: function (newVal, oldVal) {
  853. this.socialRegister();
  854. },
  855. },
  856. lang: {
  857. handler: async function (newVal, oldVal) {
  858. if (newVal != oldVal) {
  859. this.$refs.dropdown.style.opacity = 0;
  860. // await this.getServiceCategory();
  861. // await this.getExhibitionsCategory();
  862. // await this.getServiceHistory();
  863. // await this.getExhibitionsHistory();
  864. // await this.getServiceLocations();
  865. // await this.getExhibitionsLocations();
  866. // await this.getExhibitionsCategories();
  867. // await this.getExhibitionsCollections();
  868. await this.initSwiper();
  869. }
  870. },
  871. },
  872. },
  873. methods: {
  874. clickOutSide() {
  875. this.show = false;
  876. this.UserInfoPopup = false;
  877. },
  878. onResize() {
  879. if (process.client) {
  880. this.width = window.innerWidth;
  881. }
  882. },
  883. clickMenu() {
  884. if (this.windowWidth < 1366) {
  885. this.$store.dispatch("toggleDrawer", true);
  886. }
  887. },
  888. clickSearch() {
  889. this.$store.dispatch("toggleSearchDialog", true);
  890. },
  891. initSwiper() {
  892. let vm = this;
  893. vm.$nextTick(function () {
  894. vm.headerServiceSwiper = new Swiper(".swiper-container.headerService", {
  895. direction: "horizontal",
  896. initialSlide: 0,
  897. observer: true,
  898. observeParents: true,
  899. rebuildOnUpdate: true,
  900. slidesPerView: "auto",
  901. spaceBetween: 25,
  902. watchSlidesVisibility: true,
  903. slideVisibleClass: "swiper-slide-visible",
  904. allowTouchMove: false,
  905. navigation: {
  906. nextEl: ".swiper-button-next.headerService",
  907. prevEl: ".swiper-button-prev.headerService",
  908. },
  909. });
  910. vm.headerServiceSwiper.init();
  911. vm.headerServiceSwiper.update();
  912. // this.$refs.headerSwiper.style.opacity = 1;
  913. vm.$refs.dropdown.style.opacity = 1;
  914. });
  915. },
  916. async fetchUser() {
  917. if (this.$auth.loggedIn) {
  918. const jwt = this.$auth.$storage.getUniversal("jwt");
  919. let jsonPayload = {};
  920. if (jwt) {
  921. const token = this.$auth.$storage.getUniversal("jwt").token;
  922. jsonPayload = jwt_decode(token) || {};
  923. }
  924. if (!this.$auth.$storage.getUniversal("userPicture")) {
  925. this.userPicture = jsonPayload.picture || "";
  926. this.$auth.$storage.setUniversal("userPicture", jsonPayload.picture);
  927. } else {
  928. this.userPicture = this.$auth.$storage.getUniversal("userPicture");
  929. }
  930. this.$auth.$storage.setUniversal(
  931. "userLastName",
  932. jsonPayload && jsonPayload.last_name
  933. ? jsonPayload.last_name.substring(0, 1)
  934. : ""
  935. );
  936. }
  937. },
  938. getServiceCategory() {
  939. let vm = this;
  940. vm.$nextTick(() => {
  941. vm.$axios
  942. .get(`/service/category?lang_code=${this.lang}`)
  943. .then((result) => {
  944. vm.serviceCategoryList = result.data.map((item) => {
  945. const subcategory = item.service_subcategory.map((sub) => {
  946. return {
  947. id: sub.id,
  948. title: sub.language_text[0].text,
  949. key: sub.language_text[0].text,
  950. type: "subcategory",
  951. order: sub.order_in_category,
  952. };
  953. });
  954. return {
  955. id: item.id,
  956. order: item.order,
  957. title: item.language_text[0].text,
  958. key: item.language_text[0].text,
  959. type: "category",
  960. subcategory: subcategory,
  961. };
  962. });
  963. return result.data;
  964. })
  965. .catch((err) => {
  966. console.log(err);
  967. });
  968. });
  969. },
  970. async getExhibitionsCategory() {
  971. await this.$axios
  972. .get(
  973. `/t/exhibitions/categories?lang=${this.$i18n.localeProperties["langQuery"]}&sort=true`
  974. )
  975. .then((result) => {
  976. this.exhibitionsCategoryList = result.data.sort_results;
  977. this.exhibitionsCategoryList = this.exhibitionsCategoryList.map(
  978. (item) => {
  979. item.subcategories_list = item.subcategories_list.map(
  980. (children) => {
  981. return {
  982. id: children.subcategory_id,
  983. title: children.subcategory_name,
  984. key: children.subcategory_name,
  985. type: "subcategory",
  986. };
  987. }
  988. );
  989. return {
  990. id: item.categories_id,
  991. title: item.category_name,
  992. key: item.category_name,
  993. type: "category",
  994. subcategory: item.subcategories_list,
  995. };
  996. }
  997. );
  998. })
  999. .catch((err) => {
  1000. console.log(err);
  1001. });
  1002. },
  1003. async getServiceHistory() {
  1004. await this.$axios
  1005. .get(
  1006. `/trending/services/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
  1007. )
  1008. .then((response) => {
  1009. this.servicesSearchs = response.data.searches;
  1010. })
  1011. .catch((error) => console.log(error));
  1012. },
  1013. async getExhibitionsHistory() {
  1014. await this.$axios
  1015. .get(
  1016. `/trending/exhibitions/search/history?lang=${this.$i18n.localeProperties["langQuery"]}`
  1017. )
  1018. .then((response) => {
  1019. this.exhibitionsSearchs = response.data.searches;
  1020. })
  1021. .catch((error) => console.log(error));
  1022. },
  1023. async getServiceLocations() {
  1024. await this.$axios
  1025. .get(
  1026. `/trending/services/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
  1027. )
  1028. .then((response) => {
  1029. this.servicesLocations = response.data.locations;
  1030. })
  1031. .catch((error) => console.log(error));
  1032. },
  1033. async getExhibitionsLocations() {
  1034. await this.$axios
  1035. .get(
  1036. `/trending/exhibitions/locations?lang=${this.$i18n.localeProperties["langQuery"]}`
  1037. )
  1038. .then((response) => {
  1039. this.exhibitionsLocations = response.data.locations;
  1040. })
  1041. .catch((error) => console.log(error));
  1042. },
  1043. async getExhibitionsCategories() {
  1044. await this.$axios
  1045. .get(
  1046. `/t/exhibitions/categories?lang=${this.$i18n.localeProperties["langQuery"]}&sort=true`
  1047. )
  1048. .then((result) => {
  1049. this.exhibitionsCategories = result.data.sort_results;
  1050. this.exhibitionsCategories = this.exhibitionsCategories.map(
  1051. (item) => {
  1052. item.subcategories_list = item.subcategories_list.map(
  1053. (children) => {
  1054. return {
  1055. id: children.subcategory_id,
  1056. title: children.subcategory_name,
  1057. key: children.subcategory_name,
  1058. type: "subcategory",
  1059. };
  1060. }
  1061. );
  1062. return {
  1063. id: item.categories_id,
  1064. title: item.category_name,
  1065. key: item.category_name,
  1066. type: "category",
  1067. subcategory: item.subcategories_list,
  1068. };
  1069. }
  1070. );
  1071. })
  1072. .catch((err) => {
  1073. console.log(err);
  1074. });
  1075. },
  1076. async getExhibitionsCollections() {
  1077. await this.$axios
  1078. .get(
  1079. `/trending/exhibitions/collections?lang=${this.$i18n.localeProperties["langQuery"]}`
  1080. )
  1081. .then((response) => {
  1082. this.collections = response.data.collections;
  1083. })
  1084. .catch((error) => console.log(error));
  1085. },
  1086. async changeLang() {
  1087. // await this.getServiceCategory();
  1088. // await this.getExhibitionsCategory();
  1089. // await this.getServiceHistory();
  1090. // await this.getExhibitionsHistory();
  1091. // await this.getServiceLocations();
  1092. // await this.getExhibitionsLocations();
  1093. // await this.getExhibitionsCategories();
  1094. // await this.getExhibitionsCollections();
  1095. },
  1096. async getPopulars() {
  1097. await this.$axios
  1098. .get(
  1099. `/trending/search/popular?lang=${this.$i18n.localeProperties["langQuery"]}`
  1100. )
  1101. .then((response) => {
  1102. this.populars = response.data;
  1103. })
  1104. .catch((error) => console.log(error));
  1105. },
  1106. logout() {
  1107. this.$auth.$storage.removeUniversal("authtoken");
  1108. this.$auth.$storage.removeUniversal("userPicture");
  1109. this.$auth.$storage.removeUniversal("userLastName");
  1110. this.$auth.$storage.removeUniversal("userBeforePath");
  1111. if (this.width < 1024) {
  1112. this.$router.push(this.localePath("/"));
  1113. } else {
  1114. this.$router.push(this.localePath("/user"));
  1115. }
  1116. this.$auth.logout();
  1117. this.$nuxt.refresh();
  1118. this.UserInfoPopup = false;
  1119. },
  1120. async socialRegister() {
  1121. if (this.$auth.loggedIn) {
  1122. const jsonPayload =
  1123. this.$auth.$storage.getUniversal("jwt") &&
  1124. this.$auth.$storage.getUniversal("jwt").token != undefined
  1125. ? jwt_decode(this.$auth.$storage.getUniversal("jwt").token)
  1126. : { ueid: "" };
  1127. if (
  1128. this.$auth.$state.strategy === "google" ||
  1129. this.$auth.$state.strategy === "facebook"
  1130. ) {
  1131. const userData = {
  1132. social_id:
  1133. this.$auth.$state.strategy === "google"
  1134. ? this.$auth.$state.user.sub
  1135. : this.$auth.$state.user.id,
  1136. first_name:
  1137. this.$auth.$state.strategy === "google"
  1138. ? this.$auth.$state.user.given_name
  1139. : this.$auth.$state.user.first_name,
  1140. last_name:
  1141. this.$auth.$state.strategy === "google"
  1142. ? this.$auth.$state.user.family_name
  1143. : this.$auth.$state.user.last_name,
  1144. email: this.$auth.$state.user.email,
  1145. picture:
  1146. this.$auth.$state.strategy === "google"
  1147. ? this.$auth.$state.user.picture
  1148. : this.$auth.$state.user.picture.data.url,
  1149. social_schema: this.$auth.$state.strategy,
  1150. };
  1151. jsonPayload.ueid != ""
  1152. ? (userData.user_id = JSON.parse(jsonPayload.ueid))
  1153. : "";
  1154. await this.$axios
  1155. .post("/member/users/social", userData)
  1156. .then((result) => {
  1157. this.$auth.$storage.setUniversal("jwt", result.data, true);
  1158. this.$store.dispatch("updatePicture");
  1159. })
  1160. .catch((err) => {
  1161. console.log(err);
  1162. });
  1163. }
  1164. this.$store.dispatch("updatePicture");
  1165. }
  1166. },
  1167. toShowList(countryId) {
  1168. if (countryId > 0) {
  1169. this.$router.push(this.localePath(`/exhibition?country=${countryId}`));
  1170. } else {
  1171. this.$router.push(this.localePath(`/exhibition`));
  1172. }
  1173. this.isPageLoading = true;
  1174. },
  1175. },
  1176. };
  1177. </script>
  1178. <style lang="scss" scoped>
  1179. .v-menu__content {
  1180. box-shadow: none;
  1181. min-width: 186px;
  1182. border-radius: 10px;
  1183. }
  1184. .v-list-item {
  1185. padding-left: 12px;
  1186. padding-right: 12px;
  1187. color: #232323 !important;
  1188. }
  1189. .navBar-row2 {
  1190. opacity: 0;
  1191. grid-template-columns: fit-content(70px) 50px fit-content(90px) auto;
  1192. }
  1193. .navBar-row2 {
  1194. opacity: 0;
  1195. grid-template-columns: fit-content(70px) 50px fit-content(90px) auto;
  1196. }
  1197. .vertical-line {
  1198. display: inline-block;
  1199. border-left: 1.5px solid;
  1200. margin: 5px 20px 5px 20px;
  1201. height: 15px;
  1202. }
  1203. :deep(.v-toolbar__content) {
  1204. max-width: 1366px;
  1205. width: 1366px;
  1206. }
  1207. .user-picture-container {
  1208. width: 28px;
  1209. height: 28px;
  1210. }
  1211. .user-picture-border {
  1212. border: 1px solid #f5cda8;
  1213. }
  1214. .user-no-picture-border {
  1215. border: 2px solid #f5cda8;
  1216. }
  1217. .user-no-picture-font {
  1218. font-family: "DM Sans";
  1219. font-style: normal;
  1220. font-weight: 400;
  1221. font-size: 16px;
  1222. line-height: 21px;
  1223. }
  1224. .v-btn:before {
  1225. background-color: rgba(238, 149, 70, 0.6) !important;
  1226. font-color: #ee9546;
  1227. }
  1228. .on-top {
  1229. z-index: 500;
  1230. }
  1231. .customMenuLink {
  1232. &::after {
  1233. content: "";
  1234. display: block;
  1235. width: 150%;
  1236. height: 40px;
  1237. position: absolute;
  1238. top: 20px;
  1239. left: 0;
  1240. }
  1241. &:hover {
  1242. .customDropMenu {
  1243. display: block;
  1244. &.oneType {
  1245. display: grid;
  1246. }
  1247. }
  1248. }
  1249. }
  1250. .customDropMenu {
  1251. column-count: 4;
  1252. display: none;
  1253. &.exhibition {
  1254. column-count: initial;
  1255. column-gap: initial;
  1256. }
  1257. &.services {
  1258. column-count: 3;
  1259. column-gap: 30px;
  1260. }
  1261. &.oneType {
  1262. column-count: 1;
  1263. column-gap: 30px;
  1264. }
  1265. > ul {
  1266. &:last-of-type {
  1267. > div {
  1268. display: none !important;
  1269. }
  1270. }
  1271. }
  1272. }
  1273. .swiper-button {
  1274. &-prev {
  1275. left: 0;
  1276. &::before {
  1277. content: "";
  1278. display: block;
  1279. width: 60px;
  1280. height: 100%;
  1281. background-image: url("~/assets/svg/swiper_linear.svg");
  1282. // background-image: linear-gradient(to left, transparent, #fff);
  1283. position: absolute;
  1284. left: -6px;
  1285. top: 0;
  1286. z-index: -1;
  1287. transform: rotate(180deg);
  1288. }
  1289. &:after {
  1290. content: "";
  1291. display: block;
  1292. position: absolute;
  1293. right: 10px;
  1294. background-image: url("~/assets/svg/left-arrow-default.svg");
  1295. background-position: center;
  1296. background-repeat: no-repeat;
  1297. background-size: 7px 13px;
  1298. width: 24px;
  1299. height: 24px;
  1300. }
  1301. }
  1302. &-next {
  1303. right: 0;
  1304. &::before {
  1305. content: "";
  1306. display: block;
  1307. width: 60px;
  1308. height: 100%;
  1309. background-image: url("~/assets/svg/swiper_linear.svg");
  1310. // background-image: linear-gradient(to right, transparent, #fff);
  1311. position: absolute;
  1312. right: -6px;
  1313. top: 0;
  1314. z-index: -1;
  1315. }
  1316. &:after {
  1317. content: "";
  1318. display: block;
  1319. position: absolute;
  1320. left: 10px;
  1321. background-image: url("~/assets/svg/right-arrow-default.svg");
  1322. background-position: center;
  1323. background-repeat: no-repeat;
  1324. background-size: 7px 13px;
  1325. width: 24px;
  1326. height: 24px;
  1327. }
  1328. }
  1329. }
  1330. :deep(.swiper-container) {
  1331. .swiper-slide {
  1332. opacity: 0;
  1333. display: flex;
  1334. &.swiper-slide-visible {
  1335. opacity: 1;
  1336. }
  1337. }
  1338. [aria-disabled="true"] {
  1339. opacity: 0;
  1340. &::before {
  1341. display: none;
  1342. }
  1343. &::after {
  1344. display: none;
  1345. }
  1346. }
  1347. }
  1348. .exhibitionDropdownLink {
  1349. &.active {
  1350. background-image: url("@/assets/svg/icon-arrow.svg");
  1351. background-position: right center;
  1352. background-size: 16px;
  1353. background-repeat: no-repeat;
  1354. }
  1355. }
  1356. </style>