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.

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