Merge pull request 'fix: fix links' (#3) from linter into main

Reviewed-on: #3
This commit is contained in:
2025-07-04 10:27:43 +00:00
9 changed files with 146 additions and 217 deletions

View File

@ -2,9 +2,7 @@
<UiContainer class="space-y-[55px] sm:space-y-[75px] md:space-y-[100px]"> <UiContainer class="space-y-[55px] sm:space-y-[75px] md:space-y-[100px]">
<div class="grid grid-cols-1 xl:grid-cols-2 gap-[10px] sm:gap-[30px]"> <div class="grid grid-cols-1 xl:grid-cols-2 gap-[10px] sm:gap-[30px]">
<div class="flex flex-col gap-[10px] sm:gap-[30px]"> <div class="flex flex-col gap-[10px] sm:gap-[30px]">
<div <div class="h-[240px] sm:h-[400px] md:h-[490px] bg-block p-[25px] sm:p-[50px] rounded-2xl flex flex-col justify-between">
class="h-[240px] sm:h-[400px] md:h-[490px] bg-block p-[25px] sm:p-[50px] rounded-2xl flex flex-col justify-between"
>
<div> <div>
<h1 class="h1-big text-accent-green-light mb-6 md:mb-10"> <h1 class="h1-big text-accent-green-light mb-6 md:mb-10">
{{ component.front_section_lang[0].data.title }} {{ component.front_section_lang[0].data.title }}
@ -13,108 +11,52 @@
{{ component.front_section_lang[0].data.description }} {{ component.front_section_lang[0].data.description }}
</p> </p>
</div> </div>
<UiButtonArrow type="fill" <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getShopMenu()?.id, slug: menuStore.getShopMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
:arrow="true" <UiButtonArrow type="fill" :arrow="true">
> {{ $t("buy_gold") }}
{{ $t("buy_gold") }} </UiButtonArrow>
</UiButtonArrow> </nuxt-link>
</div> </div>
<div class="flex gap-[10px] sm:gap-[30px]"> <div class="flex gap-[10px] sm:gap-[30px]">
<div class="rounded-2xl h-[155px] sm:h-[225px] md:h-[280px] w-full" :style="{ backgroundImage: `url('/api/public/file/${component.img[1]}_l.webp')`, backgroundSize: 'cover', backgroundPosition: 'center' }" />
<div class="rounded-2xl h-[155px] sm:h-[225px] md:h-[280px] w-full" :style="{ backgroundImage: `url('/api/public/file/${component.img[2]}_l.webp')`, backgroundSize: 'cover' }" />
<div <div
class="rounded-2xl h-[155px] sm:h-[225px] md:h-[280px] w-full" class="hidden sm:block xl:hidden h-[225px] md:h-[280px] rounded-2xl w-full border border-block" :style="{ backgroundImage: `url('/api/public/file/${component.img[0]}_l.webp')`, backgroundSize: 'cover', backgroundPosition: 'center' }" />
:style="{
backgroundImage: `url('/api/public/file/${component.img[1]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
<div
class="rounded-2xl h-[155px] sm:h-[225px] md:h-[280px] w-full"
:style="{
backgroundImage: `url('/api/public/file/${component.img[2]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
<div
class="hidden sm:block xl:hidden h-[225px] md:h-[280px] rounded-2xl w-full border border-block"
:style="{
backgroundImage: `url('/api/public/file/${component.img[0]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
</div> </div>
</div> </div>
<div <div class="sm:hidden xl:block h-[326px] md:h-auto min-w-[40%] xl:min-w-[60%] rounded-2xl border border-block" :style="{ backgroundImage: `url('/api/public/file/${component.img[0]}_l.webp')`, backgroundSize: 'cover', backgroundPosition: 'center' }" />
class="sm:hidden xl:block h-[326px] md:h-auto min-w-[40%] xl:min-w-[60%] rounded-2xl border border-block"
:style="{
backgroundImage: `url('/api/public/file/${component.img[0]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
</div> </div>
<div <div class="grid md:grid-cols-1 xl:grid-cols-2 gap-[20px] md:auto-rows-fr sm:gap-[30px]">
class="grid md:grid-cols-1 xl:grid-cols-2 gap-[20px] md:auto-rows-fr sm:gap-[30px]"
>
<div class="space-25-55-75"> <div class="space-25-55-75">
<h2 class="h2-bold-bounded"> <h2 class="h2-bold-bounded">
{{ component.front_section_lang[0].data.section_2.title }} {{ component.front_section_lang[0].data.section_2.title }}
</h2> </h2>
<div class="space-y-[40px] sm:space-y-[50px]"> <div class="space-y-[40px] sm:space-y-[50px]">
<p <p v-for="(item, index) in component.front_section_lang[0].data .section_2.text_blocks" :key="index">
v-for="(item, index) in component.front_section_lang[0].data
.section_2.text_blocks"
:key="index"
>
{{ item }} {{ item }}
</p> </p>
</div> </div>
</div> </div>
<div <div class="w-full md:h-full rounded-2xl h-[327px] sm:h-[550px]" :style="{ backgroundImage: `url('/api/public/file/${component.img[3]}_l.webp')`, backgroundSize: 'cover', backgroundPosition: 'center' }" />
class="w-full md:h-full rounded-2xl h-[327px] sm:h-[550px]"
:style="{
backgroundImage: `url('/api/public/file/${component.img[3]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
</div> </div>
<div <div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-y-[25px] sm:gap-y-[55px] xl:gap-y-0 gap-x-[30px]">
class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-4 gap-y-[25px] sm:gap-y-[55px] xl:gap-y-0 gap-x-[30px]"
>
<h2 class="h2-bold-bounded sm:col-start-1 sm:col-end-3"> <h2 class="h2-bold-bounded sm:col-start-1 sm:col-end-3">
{{ component.front_section_lang[0].data.section_3.title }} {{ component.front_section_lang[0].data.section_3.title }}
</h2> </h2>
<div <div v-for="(item, index) in component.front_section_lang[0].data.section_3 .text_blocks" :key="index" class="flex flex-col justify-between space-25-55">
v-for="(item, index) in component.front_section_lang[0].data.section_3
.text_blocks"
:key="index"
class="flex flex-col justify-between space-25-55"
>
<p class="md:px-4 xl:p-0"> <p class="md:px-4 xl:p-0">
{{ item }} {{ item }}
</p> </p>
<div <div class="rounded-2xl h-[227px] sm:h-[281px]" :style="{ backgroundImage: `url('/api/public/file/${component.img[index + 4]}_l.webp')`, backgroundSize: 'cover', backgroundPosition: 'center' }" />
class="rounded-2xl h-[227px] sm:h-[281px]"
:style="{
backgroundImage: `url('/api/public/file/${component.img[index + 4]}_l.webp')`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}"
/>
</div> </div>
<div <div
class="sm:col-start-1 sm:col-end-3 xl:col-start-3 xl:col-end-5 flex justify-center xl:items-end xl:justify-end" class="sm:col-start-1 sm:col-end-3 xl:col-start-3 xl:col-end-5 flex justify-center xl:items-end xl:justify-end"
> >
<UiButtonArrow type="fill" <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getShopMenu()?.id, slug: menuStore.getShopMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
:arrow="true" <UiButtonArrow type="fill" :arrow="true">
> {{ $t("buy_gold") }}
{{ </UiButtonArrow>
$t("buy_gold") </nuxt-link>
}}
</UiButtonArrow>
</div> </div>
</div> </div>
</UiContainer> </UiContainer>
@ -147,4 +89,6 @@ defineProps<{
}[] }[]
} }
}>() }>()
const menuStore = useMenuStore()
</script> </script>

View File

@ -34,25 +34,13 @@
/> />
</div> </div>
</div> </div>
<div class="flex items-center justify-center w-[60%] mx-auto"> <div class="flex items-center justify-center w-[100%] xl:w-[90%] mx-auto">
<div <div class="flex flex-col items-center p-3 sm:p-6 md:p-8 xl:p-11 border border-block rounded-2xl gap-5">
class="flex flex-col items-center p-3 sm:p-6 md:p-8 xl:p-11 border border-block rounded-2xl gap-5" <h4 class="h4-uppercase-bold-inter text-accent-green-light dark:text-accent-green-dark">
>
<h4
class="h4-uppercase-bold-inter text-accent-green-light dark:text-accent-green-dark"
>
20 {{ $t("years") }} 20 {{ $t("years") }}
</h4> </h4>
<img <img class="dark:hidden" :src="`/api/public/chart?second_color=000&base_color=c7c7c7&width=1800&height=480`" alt="">
class="dark:hidden" <img class="hidden dark:block" :src="`/api/public/chart?second_color=fff&base_color=9a7f62&width=1800&height=480`" alt="">
:src="`/api/public/file/${component.img[2]}_l.webp`"
alt=""
>
<img
class="hidden dark:block"
:src="`/api/public/file/${component.img[3]}_l.webp`"
alt=""
>
</div> </div>
</div> </div>
</div> </div>

View File

@ -35,52 +35,14 @@
itemCount === 1 ? 'justify-center' : 'justify-between gap-2', itemCount === 1 ? 'justify-center' : 'justify-between gap-2',
]" ]"
> >
<div <Product v-for="product in productStore.productList" :key="product.id" :product="product" />
v-for="(item, index) in productStore.productList"
:key="index"
class="w-[200px] sm:w-[260px] md:w-[290px] sm:py-5 sm:px-[15px] py-[15px] px-[10px] bg-block rounded-2xl flex flex-col items-center gap-5 sm:gap-7"
>
<img
:src="`/api/public/file/${item.cover_picture_uuid}.webp`"
alt="pics"
class="max-h-[150px] sm:max-h-[180px] md:max-h-[205px]"
>
<div class="flex flex-col justify-between h-full">
<div class="flex flex-col gap-[10px] sm:gap-[15px] w-full">
<h3
class="text-[13px] sm:text-base md:text-lg text-xl font-bold leading-[150%] text-bg-dark"
>
{{ item.name }}
</h3>
<p class="text-[10px] sm:text-[12px] text-sm text-bg-dark">
{{ item.tax_name }}
</p>
</div>
<div class="flex items-center justify-between">
<p class="text-accent-green-light text-bold-24">
{{ item.formatted_price }}
</p>
<button
class="w-9 h-9 md:w-12 md:h-12 rounded-xl bg-button cursor-pointer hover:bg-button-hover transition-all flex items-center justify-center"
@click="productStore.incrementCartItem(item.id)"
>
<i
class="uil uil-shopping-cart text-[25px] md:text-[24px] text-bg-light"
/>
</button>
</div>
</div>
</div>
</div> </div>
<UiButtonArrow <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getShopMenu()?.id, slug: menuStore.getShopMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
:arrow="true" <UiButtonArrow type="fill" :arrow="true">
class="mx-auto" {{ $t("eshop") }}
type="fill" </UiButtonArrow>
@click="menuStore.navigateToShop" </nuxt-link>
>
{{ $t("eshop") }}
</UiButtonArrow>
</div> </div>
<!-- calculator-block --> <!-- calculator-block -->
@ -173,6 +135,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import Product from './Product.vue'
defineProps<{ defineProps<{
component: { component: {
id: number id: number
@ -211,8 +175,8 @@ const productStore = useProductStore()
async function updateItemCount() { async function updateItemCount() {
const width = window.innerWidth const width = window.innerWidth
if (width >= 1800) itemCount.value = 5 if (width >= 1800) itemCount.value = 5
else if (width >= 1200) itemCount.value = 4 else if (width >= 1600) itemCount.value = 4
else if (width >= 768) itemCount.value = 3 else if (width >= 1200) itemCount.value = 3
else if (width >= 640) itemCount.value = 2 else if (width >= 640) itemCount.value = 2
else itemCount.value = 1 else itemCount.value = 1
} }

View File

@ -46,10 +46,11 @@
<p> <p>
{{ $t("no_account") }} {{ $t("no_account") }}
</p> </p>
<p class="text-button cursor-pointer hover:text-button-hover" <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getRegistrationMenu()?.id, slug: menuStore.getRegistrationMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
@click="menuStore.navigateToItem(menuStore.menuItems?.find((item) => item.id === 4))"> <p class="text-button cursor-pointer hover:text-button-hover">
{{ $t("sign_up_now") }} {{ $t("sign_up_now") }}
</p> </p>
</nuxt-link>
</div> </div>
</div> </div>
</UiContainer> </UiContainer>

View File

@ -32,9 +32,11 @@
</div> </div>
<UiImgWrapper :src="`/api/public/file/${component.img[index]}_l.webp`"> <UiImgWrapper :src="`/api/public/file/${component.img[index]}_l.webp`">
<template #button> <template #button>
<UiButtonArrow :arrow="true"> <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: linksInfo[index].id, slug: linksInfo[index].slug } }">
{{ item.title }} <UiButtonArrow :arrow="true">
</UiButtonArrow> {{ item.title }}
</UiButtonArrow>
</nuxt-link>
</template> </template>
</UiImgWrapper> </UiImgWrapper>
</div> </div>
@ -83,4 +85,29 @@ type Component = {
defineProps<{ defineProps<{
component: Component component: Component
}>() }>()
const menuStore = useMenuStore()
const linksInfo = ref([
{
id: menuStore.getInvestitionMenu()?.id,
slug: menuStore.getInvestitionMenu()?.front_menu_lang.at(0)?.link_rewrite,
},
{
id: menuStore.getAboutGoldMenu()?.id,
slug: menuStore.getAboutGoldMenu()?.front_menu_lang.at(0)?.link_rewrite,
},
{
id: menuStore.getBusinessMenu()?.id,
slug: menuStore.getBusinessMenu()?.front_menu_lang.at(0)?.link_rewrite,
},
{
id: menuStore.getAboutUsMenu()?.id,
slug: menuStore.getAboutUsMenu()?.front_menu_lang.at(0)?.link_rewrite,
},
{
id: menuStore.getContactMenu()?.id,
slug: menuStore.getContactMenu()?.front_menu_lang.at(0)?.link_rewrite,
},
])
</script> </script>

View File

@ -19,13 +19,15 @@
{{ component.front_section_lang[0].data.title_second }} {{ component.front_section_lang[0].data.title_second }}
</h3> </h3>
<div class="flex w-full items-start justify-center sm:justify-end"> <div class="flex w-full items-start justify-center sm:justify-end">
<UiButtonArrow :arrow="true" <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getRegistrationMenu()?.id, slug: menuStore.getRegistrationMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
type="fill" <UiButtonArrow :arrow="true"
> type="fill"
{{ >
component.front_section_lang[0].data.button {{
}} component.front_section_lang[0].data.button
</UiButtonArrow> }}
</UiButtonArrow>
</nuxt-link>
</div> </div>
</div> </div>
</div> </div>
@ -52,4 +54,6 @@ defineProps<{
}[] }[]
} }
}>() }>()
const menuStore = useMenuStore()
</script> </script>

View File

@ -1,49 +1,17 @@
<template> <template>
<UiContainer class="space-y-[40px] sm:space-y-[55px] md:space-y-[75px]"> <UiContainer class="space-y-[40px] sm:space-y-[55px] md:space-y-[75px]">
<div <!-- product -->
:class="[ <div class="space-25-55-75 flex flex-col items-center">
'sm:mx-[50px] md:mx-0 xl:mx-[92px] flex items-stretch',
itemCount === 1 ? 'justify-center' : 'justify-between gap-2',
]"
>
<!-- product -->
<div <div
v-for="(item, index) in productStore.productList" :class="[
:key="index" 'sm:mx-[50px] md:mx-0 xl:mx-[92px] flex items-stretch',
class="w-[200px] sm:w-[260px] md:w-[290px] sm:py-5 sm:px-[15px] py-[15px] px-[10px] bg-block rounded-2xl flex flex-col items-center gap-5 sm:gap-7" itemCount === 1 ? 'justify-center' : 'justify-between gap-2',
]"
> >
<img <Product v-for="product in productStore.productList" :key="product.id" :product="product" />
:src="`/api/public/file/${item.cover_picture_uuid}.webp`"
alt="pics"
class="max-h-[150px] sm:max-h-[180px] md:max-h-[205px]"
>
<div class="flex flex-col justify-between h-full">
<div class="flex flex-col gap-[10px] sm:gap-[15px] w-full">
<h3
class="text-[13px] sm:text-base md:text-lg text-xl font-bold leading-[150%] text-bg-dark"
>
{{ item.name }}
</h3>
<p class="text-[10px] sm:text-[12px] text-sm text-bg-dark">
{{ item.tax_name }}
</p>
</div>
<div class="flex items-center justify-between">
<p class="text-accent-green-light text-bold-24">
{{ item.formatted_price }}
</p>
<button
class="w-9 h-9 md:w-12 md:h-12 rounded-xl bg-button cursor-pointer hover:bg-button-hover transition-all flex items-center justify-center"
@click="productStore.incrementCartItem(item.id)"
>
<i
class="uil uil-shopping-cart text-[25px] md:text-[24px] text-bg-light"
/>
</button>
</div>
</div>
</div> </div>
</div> </div>
<div class="flex flex-col gap-6 md:flex-row items-center justify-between"> <div class="flex flex-col gap-6 md:flex-row items-center justify-between">
<h3 <h3
class="h4-uppercase-bold-inter w-full text-center md:text-start xl:max-w-[50%]" class="h4-uppercase-bold-inter w-full text-center md:text-start xl:max-w-[50%]"
@ -51,19 +19,18 @@
Zlato je jistota, která nepodléhá času. Udělejte dnes rozhodnutí, které Zlato je jistota, která nepodléhá času. Udělejte dnes rozhodnutí, které
vás ochrání zítra vás ochrání zítra
</h3> </h3>
<UiButtonArrow <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getShopMenu()?.id, slug: menuStore.getShopMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
type="fill" <UiButtonArrow type="fill" :arrow="true">
:arrow="true" {{ $t("eshop") }}
@click="menuStore.navigateToShop" </UiButtonArrow>
> </nuxt-link>
{{ $t("eshop") }}
</UiButtonArrow>
</div> </div>
</UiContainer> </UiContainer>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount } from 'vue' import { ref, onMounted, onBeforeUnmount } from 'vue'
import Product from './Product.vue'
defineProps<{ defineProps<{
component: { component: {
@ -83,8 +50,8 @@ const productStore = useProductStore()
async function updateItemCount() { async function updateItemCount() {
const width = window.innerWidth const width = window.innerWidth
if (width >= 1800) itemCount.value = 5 if (width >= 1800) itemCount.value = 5
else if (width >= 1200) itemCount.value = 4 else if (width >= 1600) itemCount.value = 4
else if (width >= 768) itemCount.value = 3 else if (width >= 1200) itemCount.value = 3
else if (width >= 640) itemCount.value = 2 else if (width >= 640) itemCount.value = 2
else itemCount.value = 1 else itemCount.value = 1
} }

View File

@ -199,16 +199,11 @@
<p class="cursor-pointer hover:underline transition-all"> <p class="cursor-pointer hover:underline transition-all">
{{ $t("is_account") }} {{ $t("is_account") }}
</p> </p>
<p <nuxt-link :to="{ name: `id-slug___${$i18n.locale}`, params: { id: menuStore.getLoginMenu()?.id, slug: menuStore.getLoginMenu()?.front_menu_lang.at(0)?.link_rewrite } }">
class="text-button cursor-pointer hover:text-button-hover" <p class="text-button cursor-pointer hover:text-button-hover">
@click=" {{ $t("login") }}
menuStore.navigateToItem( </p>
menuStore.menuItems?.find((item) => item.id === 11), </nuxt-link>
)
"
>
{{ $t("login") }}
</p>
</div> </div>
</div> </div>
</UiContainer> </UiContainer>

View File

@ -131,10 +131,42 @@ export const useMenuStore = defineStore('menuStore', () => {
navigateToItem(menuItems.value?.find(item => item.id === 5)) navigateToItem(menuItems.value?.find(item => item.id === 5))
} }
function getShopMenu() {
return menuItems.value?.find(item => item.id === 5)
}
function getProductMenu() { function getProductMenu() {
return menuItems.value?.find(item => item.id === 14) return menuItems.value?.find(item => item.id === 14)
} }
function getRegistrationMenu() {
return menuItems.value?.find(item => item.id === 4)
}
function getLoginMenu() {
return menuItems.value?.find(item => item.id === 11)
}
function getInvestitionMenu() {
return menuItems.value?.find(item => item.id === 6)
}
function getAboutUsMenu() {
return menuItems.value?.find(item => item.id === 7)
}
function getBusinessMenu() {
return menuItems.value?.find(item => item.id === 8)
}
function getAboutGoldMenu() {
return menuItems.value?.find(item => item.id === 9)
}
function getContactMenu() {
return menuItems.value?.find(item => item.id === 10)
}
const getFirstImage = (size: 'l' | 'm' | 's' = 'm', needbaseurl: boolean) => { const getFirstImage = (size: 'l' | 'm' | 's' = 'm', needbaseurl: boolean) => {
const req = useRequestEvent() const req = useRequestEvent()
const url = useRequestURL() const url = useRequestURL()
@ -149,8 +181,7 @@ export const useMenuStore = defineStore('menuStore', () => {
} }
if (img.length > 0) { if (img.length > 0) {
if (needbaseurl) { if (needbaseurl) {
return `${req?.headers.get('x-forwarded-proto') || url.protocol}://${ return `${req?.headers.get('x-forwarded-proto') || url.protocol}://${req?.headers.get('x-forwarded-host')
req?.headers.get('x-forwarded-host')
|| url.host || url.host
|| req?.headers.get('host') || req?.headers.get('host')
}${img[0]}` }${img[0]}`
@ -265,5 +296,13 @@ export const useMenuStore = defineStore('menuStore', () => {
getLocales, getLocales,
getProductMenu, getProductMenu,
formatPrice, formatPrice,
getRegistrationMenu,
getLoginMenu,
getInvestitionMenu,
getAboutUsMenu,
getBusinessMenu,
getAboutGoldMenu,
getContactMenu,
getShopMenu,
} }
}) })