Add product slider
This commit is contained in:
@@ -0,0 +1,58 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
|
||||||
|
// types
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
selectedSlide: number;
|
||||||
|
slides: {
|
||||||
|
id: number;
|
||||||
|
picture: string;
|
||||||
|
}[]
|
||||||
|
}
|
||||||
|
|
||||||
|
// props
|
||||||
|
|
||||||
|
const props = defineProps<Props>();
|
||||||
|
const { slides, selectedSlide } = toRefs(props);
|
||||||
|
|
||||||
|
// emit
|
||||||
|
const emit = defineEmits(["update:selectedSlide"]);
|
||||||
|
|
||||||
|
// computed
|
||||||
|
|
||||||
|
const selectedSlideDetail = computed(() => {
|
||||||
|
return slides.value.find((item) => {
|
||||||
|
return item.id === selectedSlide.value;
|
||||||
|
})!;
|
||||||
|
});
|
||||||
|
|
||||||
|
// method
|
||||||
|
|
||||||
|
const changeSlide = (id: number) => {
|
||||||
|
emit("update:selectedSlide", id);
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="flex flex-col relative gap-4">
|
||||||
|
<div class="bg-red-300 w-full relative aspect-square overflow-hidden rounded-200">
|
||||||
|
<img
|
||||||
|
class="size-full absolute object-cover"
|
||||||
|
:src="selectedSlideDetail.picture"
|
||||||
|
:alt="String(selectedSlideDetail.id)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center justify-between gap-4">
|
||||||
|
<div
|
||||||
|
@click="changeSlide(slide.id)"
|
||||||
|
v-for="slide in slides"
|
||||||
|
:class="selectedSlide === slide.id ? 'ring-black' : 'ring-transparent'"
|
||||||
|
class="cursor-pointer aspect-square w-[108px] ring-2 ring-offset-4 rounded-200 w-full overflow-hidden relative"
|
||||||
|
:key="slide.id"
|
||||||
|
>
|
||||||
|
<img class="absolute object-cover size-full" :src="slide.picture" :alt="String(slide.id)" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -4,13 +4,31 @@
|
|||||||
const quantity = ref(1);
|
const quantity = ref(1);
|
||||||
const maxQuantity = ref(10);
|
const maxQuantity = ref(10);
|
||||||
|
|
||||||
|
const selectedSlide = ref(0);
|
||||||
|
const slides = [
|
||||||
|
{
|
||||||
|
id: 0,
|
||||||
|
picture: "/img/product-1.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 1,
|
||||||
|
picture: "/img/product-2.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 2,
|
||||||
|
picture: "/img/product-3.jpg"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex gap-12">
|
<div class="flex gap-12">
|
||||||
<div class="bg-red-300 w-full h-[500px] flex-1 rounded-200">
|
<Slider
|
||||||
|
class="flex-1"
|
||||||
</div>
|
v-model:selectedSlide="selectedSlide"
|
||||||
|
:slides="slides"
|
||||||
|
/>
|
||||||
<div class="flex-1 flex flex-col gap-3 mt-12">
|
<div class="flex-1 flex flex-col gap-3 mt-12">
|
||||||
<span class="typo-label-sm">
|
<span class="typo-label-sm">
|
||||||
سامسونگ
|
سامسونگ
|
||||||
|
|||||||
Reference in New Issue
Block a user