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.

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