Compare commits
No commits in common. "711fb414abb8200828090df91f3ba65924019af0" and "8d6d7d6a53d3661eaff4d4d1843f76f951398551" have entirely different histories.
711fb414ab
...
8d6d7d6a53
@ -1,4 +1,4 @@
|
|||||||
import { PrismaClient } from '@prisma/client';
|
import { PrismaClient } from '@prisma/client';
|
||||||
|
|
||||||
const prisma = new PrismaClient();
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ async function main() {
|
|||||||
{
|
{
|
||||||
title: 'محصولات تخصصی مراقبت از مفاصل',
|
title: 'محصولات تخصصی مراقبت از مفاصل',
|
||||||
subtitle: 'برای سگهای مسن و پرتحرک، تضمین سلامت و شادابی با کلاژن فعال',
|
subtitle: 'برای سگهای مسن و پرتحرک، تضمین سلامت و شادابی با کلاژن فعال',
|
||||||
imageUrl: '/assets/images/hero-section-image.png',
|
imageUrl: '/images/slider/slide1.webp', // Assuming we have these in public/images
|
||||||
buttonText: 'مشاهده محصولات مفاصل',
|
buttonText: 'مشاهده محصولات مفاصل',
|
||||||
buttonLink: '/shop/joints',
|
buttonLink: '/shop/joints',
|
||||||
order: 1,
|
order: 1,
|
||||||
@ -19,7 +19,7 @@ async function main() {
|
|||||||
{
|
{
|
||||||
title: 'ویتامینهای ضروری برای رشد توله سگها',
|
title: 'ویتامینهای ضروری برای رشد توله سگها',
|
||||||
subtitle: 'رشد کامل استخوانها و تقویت سیستم ایمنی از ماه اول',
|
subtitle: 'رشد کامل استخوانها و تقویت سیستم ایمنی از ماه اول',
|
||||||
imageUrl: '/assets/images/regenerated_image_1779109861747.png',
|
imageUrl: '/images/slider/slide2.webp',
|
||||||
buttonText: 'خرید ویتامین توله',
|
buttonText: 'خرید ویتامین توله',
|
||||||
buttonLink: '/shop/puppy',
|
buttonLink: '/shop/puppy',
|
||||||
order: 2,
|
order: 2,
|
||||||
@ -38,7 +38,7 @@ async function main() {
|
|||||||
{
|
{
|
||||||
vetName: 'دکتر علیرضا رضایی',
|
vetName: 'دکتر علیرضا رضایی',
|
||||||
clinicName: 'کلینیک دامپزشکی پایتخت',
|
clinicName: 'کلینیک دامپزشکی پایتخت',
|
||||||
imageUrl: '/assets/images/regenerated_image_1779109861747.png',
|
imageUrl: '/images/vets/vet1.webp',
|
||||||
quote: 'مکملهای مفصلی کانینا از نظر سرعت جذب و اثربخشی در سگهای نژاد بزرگ بینظیر هستند. ما نتایج فوقالعادهای روی دیسپلازی هیپ مشاهده کردیم.',
|
quote: 'مکملهای مفصلی کانینا از نظر سرعت جذب و اثربخشی در سگهای نژاد بزرگ بینظیر هستند. ما نتایج فوقالعادهای روی دیسپلازی هیپ مشاهده کردیم.',
|
||||||
rating: 5,
|
rating: 5,
|
||||||
order: 1,
|
order: 1,
|
||||||
@ -47,7 +47,7 @@ async function main() {
|
|||||||
{
|
{
|
||||||
vetName: 'دکتر سارا شمس',
|
vetName: 'دکتر سارا شمس',
|
||||||
clinicName: 'بیمارستان دامپزشکی تهران',
|
clinicName: 'بیمارستان دامپزشکی تهران',
|
||||||
imageUrl: '/assets/images/regenerated_image_1779109861747.png',
|
imageUrl: '/images/vets/vet2.webp',
|
||||||
quote: 'من همیشه برای ریزش مو و مشکلات پوستی گربهها، قرصهای مخمر و بیوتین کانینا را تجویز میکنم. نتایج معمولاً در کمتر از ۳ هفته قابل مشاهده است.',
|
quote: 'من همیشه برای ریزش مو و مشکلات پوستی گربهها، قرصهای مخمر و بیوتین کانینا را تجویز میکنم. نتایج معمولاً در کمتر از ۳ هفته قابل مشاهده است.',
|
||||||
rating: 5,
|
rating: 5,
|
||||||
order: 2,
|
order: 2,
|
||||||
|
|||||||
@ -88,7 +88,7 @@ async function main() {
|
|||||||
|
|
||||||
// Build display name with size
|
// Build display name with size
|
||||||
const displayName = `${baseName} - ${sizeLabel}`;
|
const displayName = `${baseName} - ${sizeLabel}`;
|
||||||
const priceDisplay = `${sellPrice.toLocaleString()} تومان`;
|
const priceDisplay = `${sellPrice.toLocaleString()} T`;
|
||||||
|
|
||||||
const product = await prisma.product.upsert({
|
const product = await prisma.product.upsert({
|
||||||
where: { artNo },
|
where: { artNo },
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { PrismaClient } from '@prisma/client';
|
import { PrismaClient } from '@prisma/client';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
@ -84,7 +84,7 @@ async function main() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "silver",
|
id: "silver",
|
||||||
name: "نقره میکروسیلور (Microsilver BG)",
|
name: "نقره میکروسیلور (Microsilver)",
|
||||||
description: "ذرات نقره خالص با ساختار اسفنجی که به دلیل اندازه ذرات درشت، جذب خون نمیشوند اما اثر آنتیباکتریال پایداری بر سطح غشاها دارند. بر خلاف نقره کلوئیدی معمولی، میکروسیلور رسوب سطحی طولانیمدت ایجاد کرده و فلور طبیعی را تخریب نمیکند.",
|
description: "ذرات نقره خالص با ساختار اسفنجی که به دلیل اندازه ذرات درشت، جذب خون نمیشوند اما اثر آنتیباکتریال پایداری بر سطح غشاها دارند. بر خلاف نقره کلوئیدی معمولی، میکروسیلور رسوب سطحی طولانیمدت ایجاد کرده و فلور طبیعی را تخریب نمیکند.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"مبارزه با باکتریهای مقاوم در دهان و پوست",
|
"مبارزه با باکتریهای مقاوم در دهان و پوست",
|
||||||
@ -95,7 +95,7 @@ async function main() {
|
|||||||
{
|
{
|
||||||
id: "colostrum",
|
id: "colostrum",
|
||||||
name: "آغوز (Colostrum)",
|
name: "آغوز (Colostrum)",
|
||||||
description: "اولین شیر پستانداران پس از زایمان که حاوی دوز بالایی از ایمونوگلوبولینها (IgG, IgA, IgM)، لاکتوفرین و سایتوکاینها برای فعالسازی فوری سیستم ایمنی است. سد دفاعی روده را تقویت کرده و از نفوذ پاتوژنها جلوگیری میکند.",
|
description: "اولین شیر پستانداران که حاوی دوز بالایی از ایمونوگلوبولینها (IgG, IgA, IgM)، لاکتوفرین و سایتوکاینها برای فعالسازی فوری سیستم ایمنی است. سد دفاعی روده را تقویت کرده و از نفوذ پاتوژنها جلوگیری میکند.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"تقویت سد دفاعی روده",
|
"تقویت سد دفاعی روده",
|
||||||
"انتقال مستقیم آنتیبادی به نوزادان",
|
"انتقال مستقیم آنتیبادی به نوزادان",
|
||||||
@ -104,7 +104,7 @@ async function main() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "peat-extract",
|
id: "peat-extract",
|
||||||
name: "عصاره پیت (Peat Extract / Moor)",
|
name: "عصاره پیت (Peat Extract)",
|
||||||
description: "مادهای کاملاً طبیعی حاصل از تجزیه گیاهان در طول هزاران سال که غنی از اسیدهای هومیک با ساختار پلیمری دارای بار منفی است. سموم، قارچها و باکتریهای مضر را در روده به دام انداخته و دفع میکند.",
|
description: "مادهای کاملاً طبیعی حاصل از تجزیه گیاهان در طول هزاران سال که غنی از اسیدهای هومیک با ساختار پلیمری دارای بار منفی است. سموم، قارچها و باکتریهای مضر را در روده به دام انداخته و دفع میکند.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"جذب سموم و فلزات سنگین در دستگاه گوارش",
|
"جذب سموم و فلزات سنگین در دستگاه گوارش",
|
||||||
@ -115,121 +115,31 @@ async function main() {
|
|||||||
{
|
{
|
||||||
id: "collagen",
|
id: "collagen",
|
||||||
name: "کلاژن هیدرولیز شده",
|
name: "کلاژن هیدرولیز شده",
|
||||||
description: "پپتیدهای کلاژن نوع I و II با وزن مولکولی پایین که مستقیماً در ماتریکس غضروف مفصلی جذب شده و ساختار استخوانها و تاندونها را تقویت کرده و تحرک مفاصل را بهبود میبخشند.",
|
description: "پپتیدهای کلاژن نوع I و II با وزن مولکولی پایین که مستقیماً در ماتریکس غضروف مفصلی جذب شده و سنتز کلاژن را تحریک میکنند. پروتئین خالص ۹۴٪.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"بازسازی غضروف مفصلی",
|
"بازسازی غضروف مفصلی",
|
||||||
"تقویت بافت همبند و تاندونها",
|
"تقویت بافت همبند",
|
||||||
"بهبود خاصیت ارتجاعی مفاصل"
|
"بهبود خاصیت ارتجاعی مفاصل"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "biotin",
|
id: "biotin",
|
||||||
name: "بیوتین (Biotin / Vitamin H)",
|
name: "بیوتین (ویتامین H / B7)",
|
||||||
description: "ویتامین ضروری از گروه B که به عنوان کوآنزیم در مسیرهای سنتز کراتین و چربیها عمل میکند. کمبود آن باعث ریزش مو، کدر شدن پوشش و شکنندگی پنجهها میشود.",
|
description: "کوآنزیم کربوکسیلازهای مسئول سنتز اسیدهای چرب و گلوکونئوژنز. با دوز ۱,۰۰۰,۰۰۰ میکروگرم در کیلوگرم در محصولات کانینا، قویترین دوز موجود در بازار مکملهای دامپزشکی.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"جلوگیری از ریزش مو و بازسازی پوشش مویی",
|
"جلوگیری از ریزش مو",
|
||||||
"تقویت رنگدانه طبیعی مو و بینی",
|
"تقویت رنگدانه پوشش",
|
||||||
"محکمسازی پنجه، ناخن و سمها"
|
"محکمسازی پنجه و ناخن"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "taurin",
|
id: "taurin",
|
||||||
name: "تورین (Taurine)",
|
name: "تورین",
|
||||||
description: "اسید آمینه بسیار حیاتی برای گربهها. بدن گربه قادر به سنتز تورین نیست و کمبود آن در رژیم غذایی میتواند به تخریب تدریجی شبکیه چشم (نابینایی) و بیماری قلبی منجر گردد.",
|
description: "اسید آمینه ضروری شرطی برای گربهها. بدن گربه قادر به سنتز تورین نیست و کمبود آن منجر به دژنراسیون مرکزی شبکیه (نابینایی) و کاردیومیوپاتی متسع میشود.",
|
||||||
benefits: [
|
benefits: [
|
||||||
"سلامت بینایی و شبکیه چشم گربهها",
|
"سلامت بینایی و شبکیه چشم",
|
||||||
"تقویت عضله قلب و عملکرد پمپاژ خون",
|
"تقویت عضله قلب",
|
||||||
"پشتیبانی از سیستم ایمنی و تولید مثل"
|
"سیستم ایمنی گربه"
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "salmon-oil",
|
|
||||||
name: "روغن ماهی سالمون (Salmon Oil)",
|
|
||||||
description: "روغن ماهی سالمون خالص، سرشار از اسیدهای چرب امگا ۳ (DHA و EPA) که به کاهش پاسخهای التهابی، سلامت سیستم قلبی عروقی و پوست و مو کمک شایانی میکند.",
|
|
||||||
benefits: [
|
|
||||||
"بهبود براقیت و لطافت پوست و مو",
|
|
||||||
"خواص ضدالتهابی قوی در مفاصل",
|
|
||||||
"تقویت سیستم ایمنی و عملکردهای شناختی"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "black-cumin",
|
|
||||||
name: "سیاه دانه (Black Cumin)",
|
|
||||||
description: "دانههای سیاه دانه مصری غنی از اسیدهای چرب غیراشباع و روغنهای فرار گیاهی با عطر آجیلی قوی که عملکرد گوارش و متابولیسم را بهبود میبخشند.",
|
|
||||||
benefits: [
|
|
||||||
"تنظیم متابولیسم عمومی و هضم بهتر",
|
|
||||||
"تقویت سیستم دفاعی طبیعی بدن",
|
|
||||||
"خواص طبیعی ضد باکتری و ضدقارچ"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "eggshell",
|
|
||||||
name: "پودر پوسته تخم مرغ (Eggshell Powder)",
|
|
||||||
description: "منبع طبیعی کلسیم ارگانیک با غلظت کلسیم بالا (۳۶٪) و مقدار ناچیز فسفر (۰.۱٪) جهت تنظیم نسبت کلسیم به فسفر در غذاهای گوشتی پخته یا خام.",
|
|
||||||
benefits: [
|
|
||||||
"تامین کلسیم بدون افزایش ناخواسته فسفر",
|
|
||||||
"جایگزین عالی برای حیوانات دارای آلرژی به استخوان",
|
|
||||||
"پشتیبانی از سلامت استخوان و دندان"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "hawthorn",
|
|
||||||
name: "زالزالک (Hawthorn)",
|
|
||||||
description: "عصاره گیاهی دارویی با سابقه مصرف طولانی جهت مهار طبیعی آنزیمهای آسیبرسان و بهبود خونرسانی و کارایی کلی عضله قلب.",
|
|
||||||
benefits: [
|
|
||||||
"تقویت انقباضات ماهیچه قلب",
|
|
||||||
"بهبود جریان خون در رگهای کرونری",
|
|
||||||
"افزایش نشاط در سگ و گربههای مسن"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "l-carnitine",
|
|
||||||
name: "ال-کارنیتین (L-Carnitine)",
|
|
||||||
description: "ترکیب شبهآمینه که با تسهیل انتقال اسیدهای چرب به درون میتوکندری، به تولید انرژی سلولی کمک کرده و از خستگی عضلانی جلوگیری مینماید.",
|
|
||||||
benefits: [
|
|
||||||
"تولید انرژی از چربیها در ماهیچه قلب",
|
|
||||||
"بهبود قدرت بدنی و کاهش خستگی عضلات",
|
|
||||||
"حمایت از متابولیسم سالم چربیها"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "seaweed",
|
|
||||||
name: "جلبک دریایی (Seaweed)",
|
|
||||||
description: "جلبک قهوهای اقیانوسی ارگانیک حاوی اسیدهای آمینه، ویتامینها و ید طبیعی جهت کمک به تنظیم غده تیروئید و تقویت پیگمنتهای تیره حیوان.",
|
|
||||||
benefits: [
|
|
||||||
"تقویت رنگدانه بینی، پنجه و پوشش مویی",
|
|
||||||
"بهبود هضم و جذب مواد مغذی",
|
|
||||||
"پشتیبانی عمومی از سلامت غده تیروئید"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "hyaluronic",
|
|
||||||
name: "هیالورونات سدیم (Sodium Hyaluronate)",
|
|
||||||
description: "مادهای فوقالعاده با خاصیت اتصال به آب بالا که روانکننده و مرطوبکننده قرنیه چشم بوده و از خشکی و خارش چشمها جلوگیری میکند.",
|
|
||||||
benefits: [
|
|
||||||
"شستشو و تسکین چشمهای تحریکشده و قرمز",
|
|
||||||
"رطوبترسانی ماندگار به سطح خارجی قرنیه",
|
|
||||||
"کمک به رفع چسبندگی و قی کردن چشم"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "calendula-sea-buckthorn",
|
|
||||||
name: "روغن کالاندولا و سنجد دریایی",
|
|
||||||
description: "روغنهای طبیعی گیاهی با اثرات ضدالتهابی، بازسازیکننده و تسکیندهنده پوست که یک سد دفاعی فیزیکی و بیولوژیکی ایجاد میکنند.",
|
|
||||||
benefits: [
|
|
||||||
"ترمیم خشکی، ترک خوردگی و آسیبهای پنجه",
|
|
||||||
"تسکین التهاب و قرمزی ناشی از گزش حشرات",
|
|
||||||
"کمک به بازسازی سریعتر لایههای آسیبدیده پوست"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: "dodecanoic",
|
|
||||||
name: "اسید دودکانوئیک و مارگوسا",
|
|
||||||
description: "عوامل فعال طبیعی و گیاهی بدون مواد حشرهکش شیمیایی با خواص دورکننده قوی در برابر انگلهای خارجی نظیر کک، کنه و شپش.",
|
|
||||||
benefits: [
|
|
||||||
"دفع موثر کنهها، ککها و شپشهای گزنده",
|
|
||||||
"جلوگیری از مستقر شدن انگلها و تخم آنها در محیط",
|
|
||||||
"ایمن برای حیوان و اعضای خانواده در محیط خانه"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]),
|
]),
|
||||||
|
|||||||
BIN
backend/uploads/1783765738982-360633697.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
backend/uploads/1783765761042-126169451.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
backend/uploads/1783766019136-538342352.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
backend/uploads/1783766176570-259772529.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
backend/uploads/1783766236883-149191779.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
backend/uploads/1783766312952-814581776.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
backend/uploads/1783766352024-429505659.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
backend/uploads/1783772119526-938188787.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
backend/uploads/1783772147356-620840114.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect, useRef } from 'react';
|
import { useState, useEffect, useRef } from 'react';
|
||||||
import { X, Upload, Image as ImageIcon, Trash2, CheckCircle2, Clipboard } from 'lucide-react';
|
import { X, Upload, Image as ImageIcon, Trash2, CheckCircle2, Clipboard } from 'lucide-react';
|
||||||
import api, { BASE_DOMAIN } from '../../services/api';
|
import api from '../../services/api';
|
||||||
import Spinner from './Spinner';
|
import Spinner from './Spinner';
|
||||||
|
|
||||||
interface Media {
|
interface Media {
|
||||||
@ -186,7 +186,7 @@ export default function MediaSelector({ isOpen, onClose, onSelect, multiple = fa
|
|||||||
) : (
|
) : (
|
||||||
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4">
|
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4">
|
||||||
{mediaList.map((media) => {
|
{mediaList.map((media) => {
|
||||||
const imgUrl = media.url.startsWith('http') ? media.url : `${BASE_DOMAIN}${media.url}`;
|
const imgUrl = media.url.startsWith('http') ? media.url : `https://apicanina.parsaaghayi.ir${media.url}`;
|
||||||
const isSelected = selectedUrl && imgUrl === selectedUrl;
|
const isSelected = selectedUrl && imgUrl === selectedUrl;
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
|||||||
@ -26,22 +26,22 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--font-sans: "Vazirmatn";
|
--font-sans: "Vazirmatn", sans-serif;
|
||||||
--font-vazir: "Vazirmatn";
|
--font-vazir: "Vazirmatn", sans-serif;
|
||||||
--font-shabnam: "Shabnam";
|
--font-shabnam: "Shabnam", sans-serif;
|
||||||
--font-lalezar: "Lalezar", cursive;
|
--font-lalezar: "Lalezar", cursive;
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
:root {
|
:root {
|
||||||
font-family: "Vazirmatn" !important;
|
font-family: "Vazirmatn", sans-serif !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: var(--color-gray-50);
|
background-color: var(--color-gray-50);
|
||||||
color: var(--color-gray-900);
|
color: var(--color-gray-900);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
font-family: "Vazirmatn" !important;
|
font-family: "Vazirmatn", sans-serif !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
button, a {
|
button, a {
|
||||||
@ -51,6 +51,6 @@
|
|||||||
|
|
||||||
@layer utilities {
|
@layer utilities {
|
||||||
.font-vazir {
|
.font-vazir {
|
||||||
font-family: "Vazirmatn";
|
font-family: "Vazirmatn", sans-serif;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Search, Plus, Edit2, Trash2, FileText, Image as ImageIcon, CheckCircle2, XCircle } from 'lucide-react';
|
import { Search, Plus, Edit2, Trash2, FileText, Image as ImageIcon, CheckCircle2, XCircle } from 'lucide-react';
|
||||||
import api, { BASE_DOMAIN } from '../services/api';
|
import api from '../services/api';
|
||||||
import Spinner from '../components/ui/Spinner';
|
import Spinner from '../components/ui/Spinner';
|
||||||
import Pagination from '../components/ui/Pagination';
|
import Pagination from '../components/ui/Pagination';
|
||||||
import MediaSelector from '../components/ui/MediaSelector';
|
import MediaSelector from '../components/ui/MediaSelector';
|
||||||
@ -152,7 +152,7 @@ export default function Blogs() {
|
|||||||
<tr key={blog.id} className="hover:bg-gray-50/50 transition-colors">
|
<tr key={blog.id} className="hover:bg-gray-50/50 transition-colors">
|
||||||
<td className="py-3 px-6">
|
<td className="py-3 px-6">
|
||||||
{blog.imageUrl ? (
|
{blog.imageUrl ? (
|
||||||
<img src={blog.imageUrl.startsWith('http') ? blog.imageUrl : `${BASE_DOMAIN}${blog.imageUrl}`} alt="blog" className="w-16 h-10 rounded-lg object-cover border border-gray-200" />
|
<img src={blog.imageUrl.startsWith('http') ? blog.imageUrl : `https://apicanina.parsaaghayi.ir${blog.imageUrl}`} alt="blog" className="w-16 h-10 rounded-lg object-cover border border-gray-200" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-16 h-10 rounded-lg bg-gray-100 flex items-center justify-center text-gray-400">
|
<div className="w-16 h-10 rounded-lg bg-gray-100 flex items-center justify-center text-gray-400">
|
||||||
<ImageIcon className="w-4 h-4" />
|
<ImageIcon className="w-4 h-4" />
|
||||||
@ -222,7 +222,7 @@ export default function Blogs() {
|
|||||||
<label className="text-sm font-bold text-gray-700">تصویر شاخص</label>
|
<label className="text-sm font-bold text-gray-700">تصویر شاخص</label>
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
{formData.imageUrl ? (
|
{formData.imageUrl ? (
|
||||||
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `${BASE_DOMAIN}${formData.imageUrl}`} alt="preview" className="w-24 h-16 rounded-xl object-cover border border-gray-200" />
|
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `https://apicanina.parsaaghayi.ir${formData.imageUrl}`} alt="preview" className="w-24 h-16 rounded-xl object-cover border border-gray-200" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-24 h-16 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
<div className="w-24 h-16 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
||||||
<ImageIcon className="w-6 h-6" />
|
<ImageIcon className="w-6 h-6" />
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Search, Plus, Edit2, Trash2, FolderTree, Image as ImageIcon, X } from 'lucide-react';
|
import { Search, Plus, Edit2, Trash2, FolderTree, Image as ImageIcon, X } from 'lucide-react';
|
||||||
import api, { BASE_DOMAIN } from '../services/api';
|
import api from '../services/api';
|
||||||
import Spinner from '../components/ui/Spinner';
|
import Spinner from '../components/ui/Spinner';
|
||||||
import Pagination from '../components/ui/Pagination';
|
import Pagination from '../components/ui/Pagination';
|
||||||
import MediaSelector from '../components/ui/MediaSelector';
|
import MediaSelector from '../components/ui/MediaSelector';
|
||||||
@ -158,7 +158,7 @@ export default function Categories() {
|
|||||||
<tr key={cat.id} className="hover:bg-gray-50/50 transition-colors">
|
<tr key={cat.id} className="hover:bg-gray-50/50 transition-colors">
|
||||||
<td className="py-3 px-6">
|
<td className="py-3 px-6">
|
||||||
{cat.imageUrl ? (
|
{cat.imageUrl ? (
|
||||||
<img src={cat.imageUrl.startsWith('http') ? cat.imageUrl : `${BASE_DOMAIN}${cat.imageUrl}`} alt={cat.name} className="w-12 h-12 rounded-xl object-cover border border-gray-200" />
|
<img src={cat.imageUrl.startsWith('http') ? cat.imageUrl : `https://apicanina.parsaaghayi.ir${cat.imageUrl}`} alt={cat.name} className="w-12 h-12 rounded-xl object-cover border border-gray-200" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-12 h-12 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
<div className="w-12 h-12 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
||||||
<ImageIcon className="w-5 h-5" />
|
<ImageIcon className="w-5 h-5" />
|
||||||
@ -240,7 +240,7 @@ export default function Categories() {
|
|||||||
<label className="text-sm font-bold text-gray-700">تصویر دستهبندی</label>
|
<label className="text-sm font-bold text-gray-700">تصویر دستهبندی</label>
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
{formData.imageUrl ? (
|
{formData.imageUrl ? (
|
||||||
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `${BASE_DOMAIN}${formData.imageUrl}`} alt="preview" className="w-16 h-16 rounded-xl object-cover border border-gray-200" />
|
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `https://apicanina.parsaaghayi.ir${formData.imageUrl}`} alt="preview" className="w-16 h-16 rounded-xl object-cover border border-gray-200" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-16 h-16 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
<div className="w-16 h-16 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
||||||
<ImageIcon className="w-6 h-6" />
|
<ImageIcon className="w-6 h-6" />
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect, useRef } from 'react';
|
import { useState, useEffect, useRef } from 'react';
|
||||||
import { Upload, Image as ImageIcon, Trash2, Copy, CheckCircle2, Search, X, FolderOpen } from 'lucide-react';
|
import { Upload, Image as ImageIcon, Trash2, Copy, CheckCircle2, Search, X, FolderOpen } from 'lucide-react';
|
||||||
import api, { BASE_DOMAIN } from '../services/api';
|
import api from '../services/api';
|
||||||
import Spinner from '../components/ui/Spinner';
|
import Spinner from '../components/ui/Spinner';
|
||||||
|
|
||||||
interface Media {
|
interface Media {
|
||||||
@ -102,7 +102,7 @@ export default function MediaManager() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleCopyUrl = async (media: Media) => {
|
const handleCopyUrl = async (media: Media) => {
|
||||||
const fullUrl = media.url.startsWith('http') ? media.url : `${BASE_DOMAIN}${media.url}`;
|
const fullUrl = media.url.startsWith('http') ? media.url : `https://apicanina.parsaaghayi.ir${media.url}`;
|
||||||
try {
|
try {
|
||||||
await navigator.clipboard.writeText(fullUrl);
|
await navigator.clipboard.writeText(fullUrl);
|
||||||
setCopiedId(media.id);
|
setCopiedId(media.id);
|
||||||
@ -202,7 +202,7 @@ export default function MediaManager() {
|
|||||||
) : (
|
) : (
|
||||||
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 p-6">
|
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 p-6">
|
||||||
{filtered.map(media => {
|
{filtered.map(media => {
|
||||||
const imgUrl = media.url.startsWith('http') ? media.url : `${BASE_DOMAIN}${media.url}`;
|
const imgUrl = media.url.startsWith('http') ? media.url : `https://apicanina.parsaaghayi.ir${media.url}`;
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
key={media.id}
|
key={media.id}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Search, Trash2, Heart, Image as ImageIcon } from 'lucide-react';
|
import { Search, Trash2, Heart, Image as ImageIcon } from 'lucide-react';
|
||||||
import api, { BASE_DOMAIN } from '../services/api';
|
import api from '../services/api';
|
||||||
import Spinner from '../components/ui/Spinner';
|
import Spinner from '../components/ui/Spinner';
|
||||||
import Pagination from '../components/ui/Pagination';
|
import Pagination from '../components/ui/Pagination';
|
||||||
|
|
||||||
@ -91,7 +91,7 @@ export default function Pets() {
|
|||||||
<tr key={pet.id} className="hover:bg-gray-50/50 transition-colors">
|
<tr key={pet.id} className="hover:bg-gray-50/50 transition-colors">
|
||||||
<td className="py-3 px-6">
|
<td className="py-3 px-6">
|
||||||
{pet.imageUrl ? (
|
{pet.imageUrl ? (
|
||||||
<img src={pet.imageUrl.startsWith('http') ? pet.imageUrl : `${BASE_DOMAIN}${pet.imageUrl}`} alt={pet.name} className="w-12 h-12 rounded-full object-cover border-2 border-purple-100" />
|
<img src={pet.imageUrl.startsWith('http') ? pet.imageUrl : `https://apicanina.parsaaghayi.ir${pet.imageUrl}`} alt={pet.name} className="w-12 h-12 rounded-full object-cover border-2 border-purple-100" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-12 h-12 rounded-full bg-purple-50 flex items-center justify-center text-purple-300 border-2 border-purple-100">
|
<div className="w-12 h-12 rounded-full bg-purple-50 flex items-center justify-center text-purple-300 border-2 border-purple-100">
|
||||||
<ImageIcon className="w-5 h-5" />
|
<ImageIcon className="w-5 h-5" />
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Search, Filter, Box, Plus, Edit2, Trash2, Image as ImageIcon, X } from 'lucide-react';
|
import { Search, Filter, Box, Plus, Edit2, Trash2, Image as ImageIcon, X } from 'lucide-react';
|
||||||
import { toast } from 'react-hot-toast';
|
import { toast } from 'react-hot-toast';
|
||||||
import api, { BASE_DOMAIN } from '../services/api';
|
import api from '../services/api';
|
||||||
import Spinner from '../components/ui/Spinner';
|
import Spinner from '../components/ui/Spinner';
|
||||||
import Pagination from '../components/ui/Pagination';
|
import Pagination from '../components/ui/Pagination';
|
||||||
import MediaSelector from '../components/ui/MediaSelector';
|
import MediaSelector from '../components/ui/MediaSelector';
|
||||||
@ -214,7 +214,7 @@ export default function Products() {
|
|||||||
<tr key={product.id} className="hover:bg-gray-50/50 transition-colors">
|
<tr key={product.id} className="hover:bg-gray-50/50 transition-colors">
|
||||||
<td className="py-3 px-6">
|
<td className="py-3 px-6">
|
||||||
{product.imageUrl ? (
|
{product.imageUrl ? (
|
||||||
<img src={product.imageUrl.startsWith('http') ? product.imageUrl : `${BASE_DOMAIN}${product.imageUrl}`} alt={product.name} className="w-12 h-12 rounded-xl object-cover border border-gray-200" />
|
<img src={product.imageUrl.startsWith('http') ? product.imageUrl : `https://apicanina.parsaaghayi.ir${product.imageUrl}`} alt={product.name} className="w-12 h-12 rounded-xl object-cover border border-gray-200" />
|
||||||
) : (
|
) : (
|
||||||
<div className="w-12 h-12 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
<div className="w-12 h-12 rounded-xl bg-gray-100 flex items-center justify-center text-gray-400">
|
||||||
<ImageIcon className="w-5 h-5" />
|
<ImageIcon className="w-5 h-5" />
|
||||||
@ -385,7 +385,7 @@ export default function Products() {
|
|||||||
{formData.imageUrl ? (
|
{formData.imageUrl ? (
|
||||||
<div className="w-full flex flex-col items-center">
|
<div className="w-full flex flex-col items-center">
|
||||||
<div className="relative group">
|
<div className="relative group">
|
||||||
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `${BASE_DOMAIN}${formData.imageUrl}`} alt="product" className="max-w-xs h-48 object-cover rounded-xl shadow-md" />
|
<img src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `https://apicanina.parsaaghayi.ir${formData.imageUrl}`} alt="product" className="max-w-xs h-48 object-cover rounded-xl shadow-md" />
|
||||||
<div className="absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded-xl flex items-center justify-center gap-3">
|
<div className="absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity rounded-xl flex items-center justify-center gap-3">
|
||||||
<button type="button" onClick={() => setIsMediaSelectorOpen(true)} className="bg-white text-gray-800 px-4 py-2 rounded-lg font-bold text-sm">تغییر عکس</button>
|
<button type="button" onClick={() => setIsMediaSelectorOpen(true)} className="bg-white text-gray-800 px-4 py-2 rounded-lg font-bold text-sm">تغییر عکس</button>
|
||||||
</div>
|
</div>
|
||||||
@ -435,7 +435,7 @@ export default function Products() {
|
|||||||
isOpen={isMediaSelectorOpen}
|
isOpen={isMediaSelectorOpen}
|
||||||
onClose={() => setIsMediaSelectorOpen(false)}
|
onClose={() => setIsMediaSelectorOpen(false)}
|
||||||
onSelect={(url) => setFormData({...formData, imageUrl: url})}
|
onSelect={(url) => setFormData({...formData, imageUrl: url})}
|
||||||
selectedUrl={formData.imageUrl.startsWith('http') ? formData.imageUrl : formData.imageUrl ? `${BASE_DOMAIN}${formData.imageUrl}` : undefined}
|
selectedUrl={formData.imageUrl.startsWith('http') ? formData.imageUrl : formData.imageUrl ? `https://apicanina.parsaaghayi.ir${formData.imageUrl}` : undefined}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -1,13 +1,7 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
export const BASE_DOMAIN = import.meta.env.VITE_API_URL
|
|
||||||
? import.meta.env.VITE_API_URL.replace(/\/api$/, '')
|
|
||||||
: (import.meta.env.DEV ? 'http://127.0.0.1:4001' : 'https://apicanina.parsaaghayi.ir');
|
|
||||||
|
|
||||||
const baseURL = `${BASE_DOMAIN}/api`;
|
|
||||||
|
|
||||||
const api = axios.create({
|
const api = axios.create({
|
||||||
baseURL,
|
baseURL: 'https://apicanina.parsaaghayi.ir/api', // Backend NestJS API URL
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,81 +0,0 @@
|
|||||||
import type { Metadata } from "next";
|
|
||||||
import { ShieldCheck, History, Award, CheckCircle } from "lucide-react";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "درباره ما",
|
|
||||||
description: "داستان کانینا ایران و میراث ۴۰ ساله شرکت Canina pharma GmbH آلمان در تولید مکملهای فوقتخصصی دامپزشکی.",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function AboutPage() {
|
|
||||||
return (
|
|
||||||
<div className="bg-medical-gray-50 py-16 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
|
||||||
<div className="max-w-4xl mx-auto space-y-16">
|
|
||||||
|
|
||||||
{/* Hero Section */}
|
|
||||||
<div className="text-center space-y-4">
|
|
||||||
<span className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 border border-canina-blue/10 rounded-full text-canina-blue text-xs font-black uppercase tracking-widest">
|
|
||||||
<History className="w-4 h-4" />
|
|
||||||
داستان ما از ۱۹۸۴
|
|
||||||
</span>
|
|
||||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
|
||||||
درباره <span className="text-canina-blue italic">کانینا ایران</span>
|
|
||||||
</h1>
|
|
||||||
<p className="text-lg text-medical-gray-500 max-w-2xl mx-auto leading-relaxed">
|
|
||||||
میراث علمی و تعهد ما به تدارک هوشمندانه سلامت برای همراهان وفادار شما.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Brand Image Placeholder / Card */}
|
|
||||||
<div className="relative bg-canina-blue rounded-[3rem] p-12 overflow-hidden text-white shadow-2xl">
|
|
||||||
<div className="absolute inset-0 opacity-10 bg-[url('https://www.transparenttextures.com/patterns/cubes.png')]" />
|
|
||||||
<div className="relative z-10 space-y-6">
|
|
||||||
<h2 className="text-3xl font-black italic">Canina pharma GmbH</h2>
|
|
||||||
<p className="text-base text-white/80 leading-relaxed max-w-2xl">
|
|
||||||
شرکت Canina pharma GmbH در سال ۱۹۸۴ توسط پتر و کریستین کرشنمایر در شهر برگیش گلادباخ آلمان تأسیس شد. این کمپانی با فلسفه «مادر طبیعت بهترین نسخه را میداند»، برای بیش از ۴۰ سال است که استاندارد طلایی مکملهای دامپزشکی را در جهان تعریف میکند.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Narrative Section */}
|
|
||||||
<div className="space-y-8 text-medical-gray-700 leading-relaxed">
|
|
||||||
<p>
|
|
||||||
امروز محصولات کانینا در بیش از ۴۰ کشور جهان توزیع میشود. کانینا ایران به عنوان نماینده رسمی این برند، با هدف ارتقای کیفیت زندگی حیوانات خانگی و دسترسی آسان جامعه دامپزشکی و دارندگان حیوانات به این مکملهای ارزشمند، فعالیت خود را آغاز نموده است. تمامی محصولات با بستهبندی اصلی آلمان و دارای برچسب اصالت سازمان دامپزشکی ارائه میشوند.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Key Features Grid */}
|
|
||||||
<div className="grid md:grid-cols-3 gap-6">
|
|
||||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-8 shadow-sm hover:shadow-xl transition-all">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center mb-6">
|
|
||||||
<ShieldCheck className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">گرید فوقدارویی</h3>
|
|
||||||
<p className="text-sm text-medical-gray-500 font-bold leading-relaxed">
|
|
||||||
استفاده از مواد اولیه کاملاً طبیعی و فرآوری شده در بالاترین سطح کیفی دارویی مطابق استانداردهای اروپا.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-8 shadow-sm hover:shadow-xl transition-all">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center mb-6">
|
|
||||||
<Award className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">گواهیهای بینالمللی</h3>
|
|
||||||
<p className="text-sm text-medical-gray-500 font-bold leading-relaxed">
|
|
||||||
دارای تأییدیههای IFS Food و HACCP که ایمنی، سلامت و یکپارچگی خطوط تولید را تضمین میکند.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-8 shadow-sm hover:shadow-xl transition-all">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center mb-6">
|
|
||||||
<CheckCircle className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">تعهد به اصالت</h3>
|
|
||||||
<p className="text-sm text-medical-gray-500 font-bold leading-relaxed">
|
|
||||||
ارائه محصولات اصل با ضمانت اصالت کالا و برچسبهای رهگیری قانونی وزارت بهداشت و دامپزشکی.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
import type { Metadata } from "next";
|
|
||||||
import { Mail, Phone, MapPin, Clock, Send } from "lucide-react";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "تماس با ما",
|
|
||||||
description: "راههای ارتباطی با نمایندگی رسمی مکملهای دامپزشکی کانینا در ایران.",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function ContactPage() {
|
|
||||||
return (
|
|
||||||
<div className="bg-medical-gray-50 py-16 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
|
||||||
<div className="max-w-6xl mx-auto space-y-16">
|
|
||||||
|
|
||||||
{/* Title */}
|
|
||||||
<div className="text-center space-y-4">
|
|
||||||
<span className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 border border-canina-blue/10 rounded-full text-canina-blue text-xs font-black uppercase tracking-widest">
|
|
||||||
پاسخگوی شما هستیم
|
|
||||||
</span>
|
|
||||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
|
||||||
تماس با <span className="text-canina-blue italic">کانینا ایران</span>
|
|
||||||
</h1>
|
|
||||||
<p className="text-lg text-medical-gray-500 max-w-2xl mx-auto leading-relaxed">
|
|
||||||
جهت مشاوره تخصصی، خرید عمده و پیگیری سفارشات با ما در ارتباط باشید.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="grid lg:grid-cols-12 gap-12 items-start">
|
|
||||||
{/* Contact Details */}
|
|
||||||
<div className="lg:col-span-5 space-y-8">
|
|
||||||
<h3 className="text-2xl font-black text-medical-gray-900">اطلاعات نمایندگی</h3>
|
|
||||||
|
|
||||||
<div className="space-y-6">
|
|
||||||
<div className="flex gap-4 p-6 bg-white border border-medical-gray-200 rounded-[2rem] shadow-sm">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue/5 text-canina-blue rounded-2xl flex items-center justify-center shrink-0">
|
|
||||||
<Phone className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-wider mb-1">تلفنهای تماس</h4>
|
|
||||||
<p className="text-lg font-black text-medical-gray-900 tracking-wider">۰۲۱-۸۸۸۸ ۴۴۴۴</p>
|
|
||||||
<p className="text-sm text-medical-gray-500 font-bold">شنبه تا چهارشنبه ۹:۰۰ الی ۱۸:۰۰</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex gap-4 p-6 bg-white border border-medical-gray-200 rounded-[2rem] shadow-sm">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue/5 text-canina-blue rounded-2xl flex items-center justify-center shrink-0">
|
|
||||||
<Mail className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-wider mb-1">پست الکترونیک</h4>
|
|
||||||
<p className="text-sm font-black text-medical-gray-900">info@canino-iran.com</p>
|
|
||||||
<p className="text-xs text-medical-gray-500 font-bold">پاسخگویی در کمتر از ۲۴ ساعت کاری</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="flex gap-4 p-6 bg-white border border-medical-gray-200 rounded-[2rem] shadow-sm">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue/5 text-canina-blue rounded-2xl flex items-center justify-center shrink-0">
|
|
||||||
<MapPin className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-wider mb-1">نشانی دفتر مرکزی</h4>
|
|
||||||
<p className="text-sm font-bold text-medical-gray-900 leading-relaxed">
|
|
||||||
تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Contact Form */}
|
|
||||||
<div className="lg:col-span-7 bg-white border border-medical-gray-200 rounded-[3rem] p-10 shadow-xl">
|
|
||||||
<h3 className="text-2xl font-black text-medical-gray-900 mb-8">ارسال پیام مستقیم</h3>
|
|
||||||
|
|
||||||
<form className="space-y-6">
|
|
||||||
<div className="grid md:grid-cols-2 gap-6">
|
|
||||||
<div className="space-y-2">
|
|
||||||
<label className="text-xs font-black text-medical-gray-500">نام و نام خانوادگی</label>
|
|
||||||
<input type="text" className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl p-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
<label className="text-xs font-black text-medical-gray-500">شماره موبایل</label>
|
|
||||||
<input type="text" className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl p-4 text-sm font-bold text-left focus:outline-none focus:ring-2 focus:ring-canina-blue/20" dir="ltr" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-2">
|
|
||||||
<label className="text-xs font-black text-medical-gray-500">موضوع پیام</label>
|
|
||||||
<input type="text" className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl p-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="space-y-2">
|
|
||||||
<label className="text-xs font-black text-medical-gray-500">متن پیام</label>
|
|
||||||
<textarea rows={4} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl p-4 text-sm font-bold focus:outline-none focus:ring-2 focus:ring-canina-blue/20"></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button type="button" className="w-full bg-canina-blue text-white py-4 rounded-2xl font-black flex items-center justify-center gap-2 hover:shadow-xl hover:shadow-canina-blue/20 transition-all">
|
|
||||||
<Send className="w-5 h-5 rotate-180" />
|
|
||||||
ارسال پیام
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -70,13 +70,13 @@
|
|||||||
@import "tailwindcss";
|
@import "tailwindcss";
|
||||||
|
|
||||||
@theme {
|
@theme {
|
||||||
--font-sans: "Vazirmatn";
|
--font-sans: "Vazirmatn", sans-serif;
|
||||||
--font-vazir: "Vazirmatn";
|
--font-vazir: "Vazirmatn", sans-serif;
|
||||||
--font-shabnam: "Shabnam";
|
--font-shabnam: "Shabnam", sans-serif;
|
||||||
--font-sahel: "Sahel";
|
--font-sahel: "Sahel", sans-serif;
|
||||||
--font-lalezar: "Lalezar", cursive;
|
--font-lalezar: "Lalezar", cursive;
|
||||||
--font-nastaliq: "IranNastaliq", serif;
|
--font-nastaliq: "IranNastaliq", serif;
|
||||||
--font-iranian-sans: "IranianSans";
|
--font-iranian-sans: "IranianSans", sans-serif;
|
||||||
|
|
||||||
/* Brand Colors */
|
/* Brand Colors */
|
||||||
--color-canina-blue: #1E4053;
|
--color-canina-blue: #1E4053;
|
||||||
@ -99,11 +99,11 @@
|
|||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
:root {
|
:root {
|
||||||
font-family: "Vazirmatn" !important;
|
font-family: "Vazirmatn", sans-serif !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
html, body, #root {
|
html, body, #root {
|
||||||
font-family: "Vazirmatn" !important;
|
font-family: "Vazirmatn", sans-serif !important;
|
||||||
@apply bg-medical-gray-50 text-medical-gray-900 antialiased;
|
@apply bg-medical-gray-50 text-medical-gray-900 antialiased;
|
||||||
font-feature-settings: "ss01", "ss02", "cv01", "cv11";
|
font-feature-settings: "ss01", "ss02", "cv01", "cv11";
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@
|
|||||||
|
|
||||||
@layer utilities {
|
@layer utilities {
|
||||||
.font-vazir {
|
.font-vazir {
|
||||||
font-family: "Vazirmatn";
|
font-family: "Vazirmatn", sans-serif;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,48 +32,43 @@ export default function Home() {
|
|||||||
<VetGallery testimonials={testimonials} />
|
<VetGallery testimonials={testimonials} />
|
||||||
|
|
||||||
{/* Navigation to Sections */}
|
{/* Navigation to Sections */}
|
||||||
<section className="py-12 bg-medical-gray-50 border-y border-medical-gray-100 font-sans">
|
<section className="py-20 bg-medical-gray-50 border-y border-medical-gray-100 font-sans">
|
||||||
<div className="max-w-7xl mx-auto px-4 grid md:grid-cols-2 gap-8">
|
<div className="max-w-7xl mx-auto px-4 grid md:grid-cols-2 gap-8">
|
||||||
{/* Specialty Shop Card */}
|
|
||||||
<Link
|
<Link
|
||||||
href="/shop"
|
href="/shop"
|
||||||
className="bg-gradient-to-br from-blue-50/60 to-canina-blue/5 p-12 rounded-[2.5rem] border border-blue-100/60 shadow-md hover:shadow-2xl hover:-translate-y-2 transition-all cursor-pointer group block relative overflow-hidden"
|
className="bg-white p-12 rounded-[3.5rem] border border-medical-gray-200 shadow-sm hover:shadow-2xl hover:-translate-y-2 transition-all cursor-pointer group block"
|
||||||
>
|
>
|
||||||
<div className="absolute -top-12 -left-12 w-32 h-32 bg-canina-blue/5 rounded-full blur-2xl group-hover:scale-150 transition-transform duration-700" />
|
|
||||||
<h3 className="text-3xl font-black text-medical-gray-900 mb-4 group-hover:text-canina-blue transition-colors font-lalezar tracking-wide">
|
<h3 className="text-3xl font-black text-medical-gray-900 mb-4 group-hover:text-canina-blue transition-colors font-lalezar tracking-wide">
|
||||||
{getText('nav_card_shop_title', "فروشگاه تخصصی")}
|
{getText('nav_card_shop_title', "فروشگاه تخصصی")}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-medical-gray-600 mb-8 leading-relaxed font-shabnam">
|
<p className="text-medical-gray-500 mb-8 leading-relaxed font-shabnam">
|
||||||
{getText('nav_card_shop_desc', "دسترسی به تمامی محصولات بر اساس علائم بالینی و نیازهای پت شما.")}
|
{getText('nav_card_shop_desc', "دسترسی به تمامی محصولات بر اساس علائم بالینی و نیازهای پت شما.")}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center gap-2 text-canina-blue font-black tracking-widest uppercase text-xs font-vazir">
|
<div className="flex items-center gap-2 text-canina-blue font-black tracking-widest uppercase text-xs font-vazir">
|
||||||
{getText('nav_card_shop_cta', "کاتالوگ کامل محصولات")}
|
{getText('nav_card_shop_cta', "کاتالوگ کامل محصولات")}
|
||||||
<span className="text-lg group-hover:-translate-x-1 transition-transform">←</span>
|
<span className="text-lg">←</span>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
{/* Scientific Wiki Card */}
|
|
||||||
<Link
|
<Link
|
||||||
href="/wiki"
|
href="/wiki"
|
||||||
className="bg-gradient-to-br from-emerald-50/60 to-green-50/20 p-12 rounded-[2.5rem] border border-emerald-100/60 shadow-md hover:shadow-2xl hover:-translate-y-2 transition-all cursor-pointer group block relative overflow-hidden"
|
className="bg-medical-gray-900 p-12 rounded-[3.5rem] text-white hover:shadow-2xl hover:-translate-y-2 transition-all cursor-pointer group block"
|
||||||
>
|
>
|
||||||
<div className="absolute -top-12 -left-12 w-32 h-32 bg-emerald-500/5 rounded-full blur-2xl group-hover:scale-150 transition-transform duration-700" />
|
<h3 className="text-3xl font-black mb-4 group-hover:text-canina-blue transition-colors font-lalezar tracking-wide">
|
||||||
<h3 className="text-3xl font-black text-medical-gray-900 mb-4 group-hover:text-emerald-700 transition-colors font-lalezar tracking-wide">
|
|
||||||
{getText('nav_card_wiki_title', "دانشنامه علمی")}
|
{getText('nav_card_wiki_title', "دانشنامه علمی")}
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-medical-gray-600 mb-8 leading-relaxed font-shabnam">
|
<p className="text-white/60 mb-8 leading-relaxed font-shabnam">
|
||||||
{getText('nav_card_wiki_desc', "آشنایی با ترکیبات نایاب و استانداردهای دارویی محصولات آلمانی کانینا.")}
|
{getText('nav_card_wiki_desc', "آشنایی با ترکیبات نایاب و استانداردهای دارویی محصولات آلمانی کانینا.")}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex items-center gap-2 text-emerald-700 font-black tracking-widest uppercase text-xs font-vazir">
|
<div className="flex items-center gap-2 text-canina-blue font-black tracking-widest uppercase text-xs font-vazir">
|
||||||
{getText('nav_card_wiki_cta', "مطالعه مقالات تخصصی")}
|
{getText('nav_card_wiki_cta', "مطالعه مقالات تخصصی")}
|
||||||
<span className="text-lg group-hover:-translate-x-1 transition-transform">←</span>
|
<span className="text-lg">←</span>
|
||||||
</div>
|
</div>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* About Section Teaser */}
|
{/* About Section Teaser */}
|
||||||
<section className="py-16 bg-white overflow-hidden font-sans">
|
<section className="py-24 bg-white overflow-hidden font-sans">
|
||||||
<div className="max-w-7xl mx-auto px-4 grid lg:grid-cols-2 gap-16 lg:gap-24 items-center">
|
<div className="max-w-7xl mx-auto px-4 grid lg:grid-cols-2 gap-16 lg:gap-24 items-center">
|
||||||
<div className="relative">
|
<div className="relative">
|
||||||
<div className="absolute -top-10 -right-10 w-40 h-40 bg-canina-blue/5 rounded-full blur-3xl" />
|
<div className="absolute -top-10 -right-10 w-40 h-40 bg-canina-blue/5 rounded-full blur-3xl" />
|
||||||
@ -82,7 +77,7 @@ export default function Home() {
|
|||||||
alt="Laboratory"
|
alt="Laboratory"
|
||||||
className="rounded-[3rem] shadow-2xl relative z-10 grayscale-[10%]"
|
className="rounded-[3rem] shadow-2xl relative z-10 grayscale-[10%]"
|
||||||
/>
|
/>
|
||||||
<div className="absolute -bottom-6 -left-6 bg-canina-blue text-white p-8 rounded-[2rem] shadow-xl z-20">
|
<div className="absolute -bottom-6 -left-6 bg-canina-blue text-white p-8 rounded-3xl shadow-xl z-20">
|
||||||
<div className="text-4xl font-black mb-1 font-lalezar tracking-wide">{getText('quality', "کیفیت")}</div>
|
<div className="text-4xl font-black mb-1 font-lalezar tracking-wide">{getText('quality', "کیفیت")}</div>
|
||||||
<div className="text-xs uppercase tracking-widest font-bold opacity-80 font-vazir">{getText('ultra_pharmaceutical', "استانداردهای فوقدارویی")}</div>
|
<div className="text-xs uppercase tracking-widest font-bold opacity-80 font-vazir">{getText('ultra_pharmaceutical', "استانداردهای فوقدارویی")}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -116,7 +111,7 @@ export default function Home() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Call to Action */}
|
{/* Call to Action */}
|
||||||
<section className="bg-canina-blue py-12 relative overflow-hidden font-sans">
|
<section className="bg-canina-blue py-20 relative overflow-hidden font-sans">
|
||||||
<div className="absolute inset-0 opacity-10">
|
<div className="absolute inset-0 opacity-10">
|
||||||
<div className="grid grid-cols-10 h-full w-full">
|
<div className="grid grid-cols-10 h-full w-full">
|
||||||
{Array.from({length: 100}).map((_, i) => (
|
{Array.from({length: 100}).map((_, i) => (
|
||||||
|
|||||||
@ -1,61 +0,0 @@
|
|||||||
import type { Metadata } from "next";
|
|
||||||
import { Shield } from "lucide-react";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "حریم خصوصی",
|
|
||||||
description: "سیاستهای حفاظت از اطلاعات شخصی کاربران در وبسایت کانینا ایران.",
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function PrivacyPage() {
|
|
||||||
return (
|
|
||||||
<div className="bg-medical-gray-50 py-16 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
|
||||||
<div className="max-w-4xl mx-auto space-y-12">
|
|
||||||
|
|
||||||
{/* Header */}
|
|
||||||
<div className="text-center space-y-4">
|
|
||||||
<div className="w-16 h-16 bg-canina-blue/10 text-canina-blue rounded-[2rem] flex items-center justify-center mx-auto mb-6">
|
|
||||||
<Shield className="w-8 h-8" />
|
|
||||||
</div>
|
|
||||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
|
||||||
حریم خصوصی کاربران
|
|
||||||
</h1>
|
|
||||||
<p className="text-lg text-medical-gray-500 max-w-2xl mx-auto leading-relaxed">
|
|
||||||
تعهد ما به امنیت دادهها و اطلاعات شخصی ثبت شده در وبسایت کانینا ایران.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Content Document */}
|
|
||||||
<div className="bg-white border border-medical-gray-200 rounded-[3rem] p-10 md:p-12 shadow-xl space-y-8 text-medical-gray-700 leading-relaxed">
|
|
||||||
<section className="space-y-4">
|
|
||||||
<h3 className="text-xl font-black text-medical-gray-900">۱. جمعآوری اطلاعات</h3>
|
|
||||||
<p>
|
|
||||||
ما برای ارائه خدمات بهتر، از جمله پردازش سفارشات خرید، ثبت مشخصات شناسنامه پت شما در پرونده پزشکی و ارائه هشدارهای هوشمند دورههای درمان، اطلاعات محدودی نظیر شماره تماس، نام، آدرس تحویل و مشخصات حیوان خانگی شما را جمعآوری میکنیم.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="space-y-4">
|
|
||||||
<h3 className="text-xl font-black text-medical-gray-900">۲. استفاده از اطلاعات</h3>
|
|
||||||
<p>
|
|
||||||
اطلاعات دریافتی شما صرفاً برای مقاصد عملیاتی سایت (ارسال محصولات، هماهنگیهای پشتیبانی، یادآوری تمدید خودکار مکملها و بهینهسازی تجربه خرید) استفاده خواهد شد و به هیچ عنوان در اختیار شرکتها یا سازمانهای ثالث قرار نمیگیرد.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="space-y-4">
|
|
||||||
<h3 className="text-xl font-black text-medical-gray-900">۳. امنیت دادهها</h3>
|
|
||||||
<p>
|
|
||||||
تمامی اطلاعات حساس کاربران با استفاده از پروتکلهای امنیتی استاندارد و بستر امن HTTPS رمزگذاری شده و بر روی سرورهای ابری محافظت شده ذخیره میگردند. تیم فنی کانینا متعهد به پایش مداوم و بهروزرسانی سیستمهای امنیتی جهت جلوگیری از دسترسیهای غیرمجاز است.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="space-y-4">
|
|
||||||
<h3 className="text-xl font-black text-medical-gray-900">۴. حقوق کاربران</h3>
|
|
||||||
<p>
|
|
||||||
شما در هر زمان میتوانید با ورود به پنل کاربری خود اقدام به تصحیح، تغییر یا حذف کامل مشخصات پرونده، نشانیها و اطلاعات کاربری خود نمایید.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -139,7 +139,7 @@ const ArchiveProductCard: React.FC<{ product: Product, onClick: (p: Product) =>
|
|||||||
|
|
||||||
<div className="p-6 flex flex-col flex-1">
|
<div className="p-6 flex flex-col flex-1">
|
||||||
<div className="text-[10px] font-bold text-canina-blue uppercase tracking-widest mb-2">{product.category}</div>
|
<div className="text-[10px] font-bold text-canina-blue uppercase tracking-widest mb-2">{product.category}</div>
|
||||||
<h3 dir="ltr" className="text-lg font-black text-medical-gray-900 group-hover:text-canina-blue transition-colors mb-3 leading-tight text-left">{product.name}</h3>
|
<h3 className="text-lg font-black text-medical-gray-900 group-hover:text-canina-blue transition-colors mb-3 leading-tight">{product.name}</h3>
|
||||||
|
|
||||||
<div className="flex flex-wrap gap-1 mb-6">
|
<div className="flex flex-wrap gap-1 mb-6">
|
||||||
{product.symptoms.slice(0, 2).map((s, i) => (
|
{product.symptoms.slice(0, 2).map((s, i) => (
|
||||||
|
|||||||
@ -10,14 +10,10 @@ import { ProductCardSkeleton } from "./Skeleton";
|
|||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { useSettingsStore } from "../lib/store/settingsStore";
|
import { useSettingsStore } from "../lib/store/settingsStore";
|
||||||
|
|
||||||
import { useCartStore } from "../lib/store/cartStore";
|
|
||||||
|
|
||||||
function ProductCard({ product, onClick }: { product: Product; key?: string | number; onClick: (p: Product) => void }) {
|
function ProductCard({ product, onClick }: { product: Product; key?: string | number; onClick: (p: Product) => void }) {
|
||||||
const router = useRouter();
|
|
||||||
const getText = useSettingsStore(state => state.getText);
|
const getText = useSettingsStore(state => state.getText);
|
||||||
const { getActivePet } = usePetStore();
|
const { getActivePet } = usePetStore();
|
||||||
const activePet = getActivePet();
|
const activePet = getActivePet();
|
||||||
const { addItem } = useCartStore();
|
|
||||||
|
|
||||||
const compatibility = useMemo(() => {
|
const compatibility = useMemo(() => {
|
||||||
if (!activePet) return null;
|
if (!activePet) return null;
|
||||||
@ -34,6 +30,7 @@ function ProductCard({ product, onClick }: { product: Product; key?: string | nu
|
|||||||
whileInView={{ opacity: 1, y: 0 }}
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
viewport={{ once: true }}
|
viewport={{ once: true }}
|
||||||
transition={{ duration: 0.5 }}
|
transition={{ duration: 0.5 }}
|
||||||
|
onClick={() => onClick(product)}
|
||||||
className="group bg-white rounded-3xl border border-medical-gray-200 overflow-hidden hover:shadow-2xl hover:shadow-canina-blue/10 transition-all duration-500 flex flex-col h-full cursor-pointer relative"
|
className="group bg-white rounded-3xl border border-medical-gray-200 overflow-hidden hover:shadow-2xl hover:shadow-canina-blue/10 transition-all duration-500 flex flex-col h-full cursor-pointer relative"
|
||||||
>
|
>
|
||||||
{compatibility && (
|
{compatibility && (
|
||||||
@ -57,64 +54,41 @@ function ProductCard({ product, onClick }: { product: Product; key?: string | nu
|
|||||||
{product.category}
|
{product.category}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Main PDP Link */}
|
{/* Hover Actions */}
|
||||||
<Link href={`/shop/${product.slug || product.id}`} className="absolute inset-0 z-10" />
|
<Link href={`/shop/${product.slug || product.id}`} className="absolute inset-0 z-10" />
|
||||||
|
<div className="absolute inset-0 bg-canina-blue/60 opacity-0 group-hover:opacity-100 backdrop-blur-sm transition-all duration-300 flex items-center justify-center gap-4">
|
||||||
{/* Hover Actions (z-20 to be clickable over the main PDP link) */}
|
<div className="w-12 h-12 rounded-full bg-white text-canina-blue flex items-center justify-center hover:scale-110 transition-transform shadow-lg">
|
||||||
<div className="absolute inset-0 bg-canina-blue/60 opacity-0 group-hover:opacity-100 backdrop-blur-sm transition-all duration-300 flex items-center justify-center gap-4 z-20">
|
|
||||||
<div
|
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
router.push(`/shop/${product.slug || product.id}`);
|
|
||||||
}}
|
|
||||||
className="w-12 h-12 rounded-full bg-white text-canina-blue flex items-center justify-center hover:scale-110 transition-transform shadow-lg cursor-pointer"
|
|
||||||
>
|
|
||||||
<Eye className="w-5 h-5" />
|
<Eye className="w-5 h-5" />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div className="w-12 h-12 rounded-full bg-canina-blue text-white flex items-center justify-center hover:scale-110 transition-transform shadow-lg border border-white/20">
|
||||||
onClick={(e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
addItem(product, 1);
|
|
||||||
toast.success(`${product.name} به سبد خرید شما اضافه شد.`);
|
|
||||||
}}
|
|
||||||
className="w-12 h-12 rounded-full bg-canina-blue text-white flex items-center justify-center hover:scale-110 transition-transform shadow-lg border border-white/20 cursor-pointer"
|
|
||||||
>
|
|
||||||
<ShoppingCart className="w-5 h-5" />
|
<ShoppingCart className="w-5 h-5" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Content Area */}
|
{/* Content Area */}
|
||||||
<div className="p-8 flex flex-col flex-1" onClick={() => router.push(`/shop/${product.slug || product.id}`)}>
|
<div className="p-8 flex flex-col flex-1">
|
||||||
<div className="flex items-start justify-between mb-4 gap-2">
|
<div className="flex items-start justify-between mb-4 gap-2">
|
||||||
<h3 dir="ltr" className="text-base md:text-lg font-black text-medical-gray-900 group-hover:text-canina-blue transition-colors leading-tight text-left line-clamp-2 flex-1">
|
<h3 className="text-xl font-black text-medical-gray-900 group-hover:text-canina-blue transition-colors leading-tight">
|
||||||
{product.name}
|
{product.name}
|
||||||
</h3>
|
</h3>
|
||||||
<ShieldCheck className="w-6 h-6 text-canina-blue flex-shrink-0" />
|
<ShieldCheck className="w-6 h-6 text-canina-blue flex-shrink-0" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p className="text-sm text-medical-gray-500 leading-relaxed mb-6 flex-1 line-clamp-2">
|
<p className="text-sm text-medical-gray-500 leading-relaxed mb-6 flex-1">
|
||||||
{product.shortDescription || product.description}
|
{product.description}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="space-y-4 pt-4 border-t border-medical-gray-100 mt-auto">
|
<div className="space-y-4 pt-4 border-t border-medical-gray-100">
|
||||||
{product.benefits && (
|
<div className="flex items-center gap-3">
|
||||||
<div className="flex items-center gap-3">
|
<div className="w-1 h-1 rounded-full bg-canina-blue" />
|
||||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue" />
|
<span className="text-xs font-semibold text-medical-gray-700 italic">{product.benefits}</span>
|
||||||
<span className="text-xs font-semibold text-medical-gray-700 italic">{product.benefits}</span>
|
</div>
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
|
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="text-lg font-black text-medical-gray-900 font-vazir whitespace-nowrap">{product.price}</div>
|
<div className="text-xl font-black text-medical-gray-900 font-vazir">{product.price}</div>
|
||||||
<button
|
<button className="text-xs font-black text-canina-blue uppercase tracking-widest border-b-2 border-canina-blue pb-1 hover:text-medical-gray-900 hover:border-medical-gray-900 transition-all">
|
||||||
onClick={(e) => {
|
{getText('product_view_details', "مشاهده جزییات")}
|
||||||
e.stopPropagation();
|
|
||||||
router.push(`/shop/${product.slug || product.id}`);
|
|
||||||
}}
|
|
||||||
className="text-xs font-black text-canina-blue uppercase tracking-widest border-b-2 border-canina-blue pb-1 hover:text-medical-gray-900 hover:border-medical-gray-900 transition-all whitespace-nowrap"
|
|
||||||
>
|
|
||||||
{getText('product_view_details', "مشاهده جزئیات")}
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -148,28 +122,33 @@ export default function FeaturedProducts() {
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-16 bg-medical-gray-50">
|
<section className="py-24 bg-medical-gray-50">
|
||||||
<div className="max-w-7xl mx-auto px-4">
|
<div className="max-w-7xl mx-auto px-4">
|
||||||
{/* Header - Correct RTL alignment with primary and secondary elements */}
|
<div className="flex flex-col lg:flex-row items-end justify-between mb-16 gap-6">
|
||||||
<div className="flex items-center justify-between w-full mb-12 pb-6 border-b border-medical-gray-200">
|
<div className="lg:w-2/3">
|
||||||
<div>
|
<div className="text-canina-blue text-xs font-bold uppercase tracking-[0.2em] mb-4 font-vazir">{getText('featured_badge', "بیشترین انتخاب توسط دامپزشکان")}</div>
|
||||||
<div className="text-canina-blue text-xs font-bold uppercase tracking-[0.2em] mb-2 font-vazir">{getText('featured_badge', "بیشترین انتخاب توسط دامپزشکان")}</div>
|
<h2 className="text-3xl lg:text-5xl font-black text-medical-gray-900 leading-[1.2] font-lalezar tracking-wide">
|
||||||
<h2 className="text-2xl md:text-3xl lg:text-4xl font-black text-medical-gray-900 font-lalezar tracking-wide">
|
{getText('featured_title_line1', "محصولات برگزیده و راهکارهای")} <br />
|
||||||
{getText('featured_title_line1', "محصولات برگزیده و راهکارهای")} <span className="text-canina-blue">{getText('featured_title_line2', "درمان تخصصی")}</span>
|
<span className="text-canina-blue">{getText('featured_title_line2', "درمان تخصصی")}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<div className="lg:w-1/3 text-left lg:text-right">
|
||||||
onClick={() => router.push('/shop')}
|
<p className="text-medical-gray-500 text-sm leading-relaxed mb-4">
|
||||||
className="inline-flex items-center gap-2 text-canina-blue font-black text-sm hover:translate-x-1 transition-all group font-vazir"
|
{getText('featured_desc', "محصولات دارویی کانینا با استفاده از دانش پیشرفته بیوتکنولوژی و مواد اولیه ارگانیک نایاب فرآوری شدهاند.")}
|
||||||
>
|
</p>
|
||||||
{getText('featured_view_all', "مشاهده تمامی محصولات")}
|
<button
|
||||||
<span className="text-lg group-hover:-translate-x-1 transition-transform">←</span>
|
onClick={() => router.push('/shop')}
|
||||||
</button>
|
className="inline-flex items-center gap-2 text-canina-blue font-bold text-sm hover:translate-x-1 transition-transform rtl:hover:-translate-x-1"
|
||||||
|
>
|
||||||
|
{getText('featured_view_all', "مشاهده تمامی محصولات")}
|
||||||
|
<span className="text-lg">←</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-10">
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-10">
|
||||||
{isLoading ? (
|
{isLoading ? (
|
||||||
Array.from({ length: 4 }).map((_, i) => <ProductCardSkeleton key={i} />)
|
Array.from({ length: 3 }).map((_, i) => <ProductCardSkeleton key={i} />)
|
||||||
) : products.length > 0 ? (
|
) : products.length > 0 ? (
|
||||||
products.map((p) => (
|
products.map((p) => (
|
||||||
<ProductCard key={p.id} onClick={(p) => router.push(`/shop/${p.slug || p.id}`)} product={p} />
|
<ProductCard key={p.id} onClick={(p) => router.push(`/shop/${p.slug || p.id}`)} product={p} />
|
||||||
|
|||||||
@ -10,25 +10,27 @@ export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {
|
|||||||
}) {
|
}) {
|
||||||
const getText = useSettingsStore(state => state.getText);
|
const getText = useSettingsStore(state => state.getText);
|
||||||
return (
|
return (
|
||||||
<footer className="bg-medical-gray-900 text-white pt-24 pb-12 font-shabnam" dir="rtl">
|
<footer className="bg-medical-gray-900 text-white pt-24 pb-12 font-vazir" dir="rtl">
|
||||||
<div className="max-w-7xl mx-auto px-6">
|
<div className="max-w-7xl mx-auto px-6">
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-16 mb-20">
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-16 mb-20">
|
||||||
|
|
||||||
{/* Brand Presence */}
|
{/* Brand Presence */}
|
||||||
<div className="space-y-8">
|
<div className="space-y-8">
|
||||||
<div className="flex items-center gap-3 cursor-pointer group" onClick={() => onNavigate("home")}>
|
<div className="flex items-center gap-4 cursor-pointer group" onClick={() => onNavigate("home")}>
|
||||||
<div className="w-12 h-12 bg-canina-blue rounded-2xl flex items-center justify-center text-white font-bold text-2xl group-hover:bg-medical-gray-900 transition-all shadow-xl shadow-canina-blue/20 italic">C</div>
|
<div className="w-16 h-16 bg-white rounded-2xl flex items-center justify-center p-2 group-hover:scale-105 transition-transform">
|
||||||
<div className="flex flex-col">
|
<img src="https://canina.de/media/fb/d5/47/1683116813/Logo.png" alt="Canina Logo" className="w-full h-auto" referrerPolicy="no-referrer" />
|
||||||
<span className="text-white font-extrabold text-2xl tracking-tighter leading-none italic font-sans">Canina <span className="text-sm not-italic font-medium border-l-2 border-white/20 pl-2 ml-2 font-shabnam">{getText('brand_name_fa', "ایران")}</span></span>
|
</div>
|
||||||
<span className="text-[10px] text-slate-400 font-bold uppercase tracking-widest leading-none mt-1.5 font-shabnam">{getText('brand_subtitle', "نماینده رسمی Canina Pharma GmbH آلمان")}</span>
|
<div>
|
||||||
|
<h3 className="text-2xl font-black italic tracking-tighter">{getText('footer_brand_title', "کانینا ایران")}</h3>
|
||||||
|
<p className="text-[10px] text-white/40 font-bold uppercase tracking-widest">{getText('footer_brand_subtitle', "نماینده رسمی در ایران")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-sm text-slate-300 leading-relaxed font-medium">
|
<p className="text-sm text-white/60 leading-relaxed font-medium">
|
||||||
{getText('footer_brand_desc', "تدارک هوشمندانه سلامت برای همراهان وفادار شما. واردکننده انحصاری مکملهای درمانی با گرید دارویی اختصاصی از آلمان با سابقه ۴۰ سال نوآوری.")}
|
{getText('footer_brand_desc', "تدارک هوشمندانه سلامت برای همراهان وفادار شما. واردکننده انحصاری مکملهای درمانی با گرید دارویی اختصاصی از آلمان با سابقه ۴۰ سال نوآوری.")}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
{[Instagram, Globe].map((Icon, i) => (
|
{[Instagram, Globe].map((Icon, i) => (
|
||||||
<a key={i} href="#" className="w-10 h-10 bg-white/10 rounded-xl flex items-center justify-center hover:bg-canina-blue hover:text-white transition-all text-slate-300">
|
<a key={i} href="#" className="w-10 h-10 bg-white/5 rounded-xl flex items-center justify-center hover:bg-canina-blue hover:text-white transition-all text-white/40">
|
||||||
<Icon className="w-5 h-5" />
|
<Icon className="w-5 h-5" />
|
||||||
</a>
|
</a>
|
||||||
))}
|
))}
|
||||||
@ -37,8 +39,8 @@ export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {
|
|||||||
|
|
||||||
{/* Quick Links */}
|
{/* Quick Links */}
|
||||||
<div className="space-y-8">
|
<div className="space-y-8">
|
||||||
<h4 className="text-xl font-bold text-white border-b-2 border-canina-blue pb-2 max-w-max font-lalezar">{getText('footer_links_title', "دسترسی سریع")}</h4>
|
<h4 className="text-lg font-black text-canina-blue italic underline decoration-white/20 underline-offset-8">{getText('footer_links_title', "دسترسی سریع")}</h4>
|
||||||
<ul className="space-y-4 text-sm font-bold text-slate-300">
|
<ul className="space-y-4 text-sm font-bold text-white/60">
|
||||||
<li onClick={() => onShopNavigate()} className="hover:text-white hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group">
|
<li onClick={() => onShopNavigate()} className="hover:text-white hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group">
|
||||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
||||||
{getText('footer_link_products', "محصولات تخصصی ۲۰۲۴")}
|
{getText('footer_link_products', "محصولات تخصصی ۲۰۲۴")}
|
||||||
@ -55,7 +57,7 @@ export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {
|
|||||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
||||||
{getText('footer_link_wiki', "دانشنامه ترکیبات")}
|
{getText('footer_link_wiki', "دانشنامه ترکیبات")}
|
||||||
</li>
|
</li>
|
||||||
<li onClick={onB2BOpen} className="hover:text-canina-blue hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group text-blue-200">
|
<li onClick={onB2BOpen} className="hover:text-canina-blue hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group text-blue-300">
|
||||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
||||||
{getText('footer_link_b2b', "پنل سفارش عمده (B2B)")}
|
{getText('footer_link_b2b', "پنل سفارش عمده (B2B)")}
|
||||||
</li>
|
</li>
|
||||||
@ -64,36 +66,36 @@ export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {
|
|||||||
|
|
||||||
{/* Location & Contact */}
|
{/* Location & Contact */}
|
||||||
<div className="space-y-8 lg:col-span-2">
|
<div className="space-y-8 lg:col-span-2">
|
||||||
<h4 className="text-xl font-bold text-white border-b-2 border-canina-blue pb-2 max-w-max font-lalezar">{getText('footer_contact_title', "اطلاعات تماس نمایندگی")}</h4>
|
<h4 className="text-lg font-black text-canina-blue italic underline decoration-white/20 underline-offset-8">{getText('footer_contact_title', "اطلاعات تماس نمایندگی")}</h4>
|
||||||
<div className="grid md:grid-cols-2 gap-8">
|
<div className="grid md:grid-cols-2 gap-8">
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex gap-4 group">
|
<div className="flex gap-4 group">
|
||||||
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-blue-400 group-hover:scale-110 transition-transform flex-shrink-0">
|
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-canina-blue group-hover:scale-110 transition-transform flex-shrink-0">
|
||||||
<Phone className="w-6 h-6" />
|
<Phone className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-[11px] text-slate-400 font-extrabold uppercase mb-1">{getText('footer_phone_label', "خط ویژه فروش")}</p>
|
<p className="text-[10px] text-white/40 font-black uppercase mb-1">{getText('footer_phone_label', "خط ویژه فروش")}</p>
|
||||||
<p className="text-lg font-extrabold tracking-widest text-left text-slate-200" dir="ltr">{getText('footer_phone', "۰۲۱-۸۸۸۸ ۴۴۴۴")}</p>
|
<p className="text-lg font-black tracking-widest text-left" dir="ltr">{getText('footer_phone', "۰۲۱-۸۸۸۸ ۴۴۴۴")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex gap-4 group">
|
<div className="flex gap-4 group">
|
||||||
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-blue-400 group-hover:scale-110 transition-transform flex-shrink-0">
|
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-canina-blue group-hover:scale-110 transition-transform flex-shrink-0">
|
||||||
<Mail className="w-6 h-6" />
|
<Mail className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-[11px] text-slate-400 font-extrabold uppercase mb-1">{getText('footer_email_label', "مکاتبات رسمی")}</p>
|
<p className="text-[10px] text-white/40 font-black uppercase mb-1">{getText('footer_email_label', "مکاتبات رسمی")}</p>
|
||||||
<p className="text-sm font-bold text-slate-300">{getText('footer_email', "info@canino-iran.com")}</p>
|
<p className="text-sm font-bold">{getText('footer_email', "info@canino-iran.com")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex gap-4 group">
|
<div className="flex gap-4 group">
|
||||||
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-blue-400 group-hover:scale-110 transition-transform flex-shrink-0">
|
<div className="w-12 h-12 bg-white/5 rounded-2xl flex items-center justify-center text-canina-blue group-hover:scale-110 transition-transform flex-shrink-0">
|
||||||
<MapPin className="w-6 h-6" />
|
<MapPin className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="text-[11px] text-slate-400 font-extrabold uppercase mb-1">{getText('footer_address_label', "دفتر مرکزی")}</p>
|
<p className="text-[10px] text-white/40 font-black uppercase mb-1">{getText('footer_address_label', "دفتر مرکزی")}</p>
|
||||||
<p className="text-sm font-bold leading-relaxed text-slate-300">{getText('footer_address', "تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹")}</p>
|
<p className="text-sm font-bold leading-relaxed">{getText('footer_address', "تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -104,22 +106,22 @@ export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {
|
|||||||
<ShieldCheck className="w-6 h-6" />
|
<ShieldCheck className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h5 className="text-sm font-bold text-white">{getText('footer_auth_title', "اصالت کالا تضمین میشود")}</h5>
|
<h5 className="text-sm font-black">{getText('footer_auth_title', "اصالت کالا تضمین میشود")}</h5>
|
||||||
<p className="text-[10px] text-slate-400 font-bold">{getText('footer_auth_desc', "تمامی محصولات دارای لیبل اصالت وزارت بهداشت و QR Code اختصاصی هستند.")}</p>
|
<p className="text-[10px] text-white/40 font-bold">{getText('footer_auth_desc', "تمامی محصولات دارای لیبل اصالت وزارت بهداشت و QR Code اختصاصی هستند.")}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm font-bold text-slate-200 self-center font-lalezar tracking-wide">{getText('footer_auth_badge', "اصالت آلمانی کانینا")}</div>
|
<div className="text-xs font-black italic text-white/20">{getText('footer_auth_badge', "اصالت آلمانی کانینا")}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="pt-12 border-t border-white/5 flex flex-col md:flex-row items-center justify-between gap-6 text-[10px] font-bold uppercase tracking-[0.3em] font-shabnam">
|
<div className="pt-12 border-t border-white/5 flex flex-col md:flex-row items-center justify-between gap-6 text-[10px] font-black text-white/20 uppercase tracking-[0.3em]">
|
||||||
<div className="text-slate-400 font-shabnam">{getText('footer_copyright', "© ۲۰۲۶ کانینا ایران. تمامی حقوق محفوظ است.")}</div>
|
<div>{getText('footer_copyright', "© ۲۰۲۶ کانینا ایران. تمامی حقوق محفوظ است.")}</div>
|
||||||
<div className="flex gap-8 font-shabnam text-slate-400">
|
<div className="flex gap-8 font-vazir">
|
||||||
<button onClick={() => onNavigate("about")} className="font-extrabold hover:text-white transition-colors">{getText('footer_about', "درباره ما")}</button>
|
<button onClick={() => onNavigate("home")} className="hover:text-white transition-colors">{getText('footer_about', "درباره ما")}</button>
|
||||||
<button onClick={() => onNavigate("contact")} className="font-extrabold hover:text-white transition-colors">{getText('footer_contact', "تماس با ما")}</button>
|
<button onClick={() => onNavigate("home")} className="hover:text-white transition-colors">{getText('footer_contact', "تماس با ما")}</button>
|
||||||
<button onClick={() => onNavigate("privacy")} className="font-extrabold hover:text-white transition-colors">{getText('footer_privacy', "حریم خصوصی")}</button>
|
<button className="hover:text-white transition-colors">{getText('footer_privacy', "حریم خصوصی")}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
import { motion, useMotionValue, useTransform, animate } from "motion/react";
|
import { motion, useMotionValue, useTransform, animate } from "motion/react";
|
||||||
import { ChevronLeft, Calendar, Globe, ShieldCheck } from "lucide-react";
|
import { ChevronLeft } from "lucide-react";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { toPersian } from "../lib/utils";
|
import { toPersian } from "../lib/utils";
|
||||||
import { useSettingsStore } from "../lib/store/settingsStore";
|
import { useSettingsStore } from "../lib/store/settingsStore";
|
||||||
@ -110,14 +110,14 @@ export default function Hero({ banners = [] }: { banners?: any[] }) {
|
|||||||
element.scrollIntoView({ behavior: 'smooth' });
|
element.scrollIntoView({ behavior: 'smooth' });
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
className="bg-canina-blue text-white px-10 py-5 rounded-full font-bold text-lg hover:bg-canina-blue/90 hover:shadow-2xl focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all flex items-center gap-2 group font-vazir min-h-[58px] shadow-lg shadow-canina-blue/20 cursor-pointer"
|
className="bg-medical-gray-900 text-white px-10 py-5 rounded-full font-bold text-lg hover:bg-canina-blue hover:shadow-2xl focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all flex items-center gap-2 group font-vazir min-h-[48px]"
|
||||||
>
|
>
|
||||||
{getText('hero_btn_advisor', "دستیار سلامت پت")}
|
{getText('hero_btn_advisor', "دستیار سلامت پت")}
|
||||||
<ChevronLeft className="w-5 h-5 group-hover:-translate-x-1 transition-transform" />
|
<ChevronLeft className="w-5 h-5 group-hover:-translate-x-1 transition-transform" />
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/shop')}
|
onClick={() => router.push('/shop')}
|
||||||
className="bg-white border-2 border-medical-gray-900 text-medical-gray-900 px-10 py-5 rounded-full font-bold text-lg hover:bg-medical-gray-50 focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all font-vazir min-h-[58px] shadow-sm cursor-pointer"
|
className="bg-white border-2 border-medical-gray-200 text-medical-gray-700 px-10 py-5 rounded-full font-bold text-lg hover:border-canina-blue hover:text-canina-blue focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all font-vazir min-h-[48px]"
|
||||||
>
|
>
|
||||||
{getText('hero_btn_products', "مشاهده محصولات")}
|
{getText('hero_btn_products', "مشاهده محصولات")}
|
||||||
</button>
|
</button>
|
||||||
@ -133,7 +133,7 @@ export default function Hero({ banners = [] }: { banners?: any[] }) {
|
|||||||
transition={{ duration: 1, ease: "easeOut" }}
|
transition={{ duration: 1, ease: "easeOut" }}
|
||||||
className="relative z-10"
|
className="relative z-10"
|
||||||
>
|
>
|
||||||
<div className="aspect-square bg-gradient-to-br from-slate-200 to-slate-300 rounded-[2.5rem] overflow-hidden border-4 border-white shadow-2xl relative">
|
<div className="aspect-square bg-gradient-to-br from-slate-200 to-slate-300 rounded-[2rem] overflow-hidden border-4 border-white shadow-2xl relative">
|
||||||
<img
|
<img
|
||||||
src={getText('hero_image_url', '') || (banners.length > 0 && banners[0].imageUrl ? banners[0].imageUrl : "/assets/images/hero-section-image.png")}
|
src={getText('hero_image_url', '') || (banners.length > 0 && banners[0].imageUrl ? banners[0].imageUrl : "/assets/images/hero-section-image.png")}
|
||||||
alt={banners.length > 0 ? banners[0].title : "Canina Pharma Germany"}
|
alt={banners.length > 0 ? banners[0].title : "Canina Pharma Germany"}
|
||||||
@ -168,41 +168,30 @@ export default function Hero({ banners = [] }: { banners?: any[] }) {
|
|||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
animate={{ opacity: 1, y: 0 }}
|
animate={{ opacity: 1, y: 0 }}
|
||||||
transition={{ delay: 0.8, duration: 0.6 }}
|
transition={{ delay: 0.8, duration: 0.6 }}
|
||||||
className="grid grid-cols-1 md:grid-cols-3 gap-8 py-10 border-t border-medical-gray-150"
|
className="grid grid-cols-1 md:grid-cols-3 gap-8 py-12 border-t border-medical-gray-150"
|
||||||
>
|
>
|
||||||
{/* Stat 1: Founded Year */}
|
<div className="flex flex-col items-center justify-center text-center">
|
||||||
<div className="bg-medical-gray-50/50 border border-medical-gray-100 rounded-3xl p-6 flex items-center gap-6 group hover:shadow-xl hover:shadow-canina-blue/5 transition-all">
|
<Typewriter text={getText('hero_stat_founded', "سال تأسیس ۱۹۸۴")} />
|
||||||
<div className="w-14 h-14 bg-white rounded-2xl flex items-center justify-center text-canina-blue shadow-sm group-hover:bg-canina-blue group-hover:text-white transition-all duration-300">
|
|
||||||
<Calendar className="w-7 h-7" />
|
|
||||||
</div>
|
|
||||||
<div className="text-right">
|
|
||||||
<div className="text-3xl font-black text-canina-blue font-vazir leading-none">۱۹۸۴</div>
|
|
||||||
<div className="text-xs text-medical-gray-500 font-extrabold uppercase tracking-tight mt-2 font-vazir">{getText('hero_stat_founded', "سال تاسیس برند در آلمان")}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="flex flex-col items-center justify-center text-center">
|
||||||
{/* Stat 2: Active Agencies */}
|
<StatCounter target={40} />
|
||||||
<div className="bg-medical-gray-50/50 border border-medical-gray-100 rounded-3xl p-6 flex items-center gap-6 group hover:shadow-xl hover:shadow-canina-blue/5 transition-all">
|
<div className="text-sm text-medical-gray-600 font-extrabold uppercase tracking-tight mt-3 font-vazir">{getText('hero_stat_agencies', "نمایندگی فعال")}</div>
|
||||||
<div className="w-14 h-14 bg-white rounded-2xl flex items-center justify-center text-canina-blue shadow-sm group-hover:bg-canina-blue group-hover:text-white transition-all duration-300">
|
|
||||||
<Globe className="w-7 h-7" />
|
|
||||||
</div>
|
|
||||||
<div className="text-right">
|
|
||||||
<div className="flex items-baseline">
|
|
||||||
<StatCounter target={40} />
|
|
||||||
</div>
|
|
||||||
<div className="text-xs text-medical-gray-500 font-extrabold uppercase tracking-tight mt-2 font-vazir">{getText('hero_stat_agencies', "نمایندگی فعال جهانی")}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div className="flex flex-col items-center justify-center text-center">
|
||||||
{/* Stat 3: German Formula */}
|
<div className="relative overflow-hidden group">
|
||||||
<div className="bg-medical-gray-50/50 border border-medical-gray-100 rounded-3xl p-6 flex items-center gap-6 group hover:shadow-xl hover:shadow-canina-blue/5 transition-all">
|
<motion.div
|
||||||
<div className="w-14 h-14 bg-white rounded-2xl flex items-center justify-center text-canina-blue shadow-sm group-hover:bg-canina-blue group-hover:text-white transition-all duration-300">
|
className="text-4xl lg:text-6xl font-black text-canina-blue font-vazir relative z-10"
|
||||||
<ShieldCheck className="w-7 h-7" />
|
>
|
||||||
</div>
|
۱۰۰٪
|
||||||
<div className="text-right">
|
</motion.div>
|
||||||
<div className="text-3xl font-black text-canina-blue font-vazir leading-none">۱۰۰٪</div>
|
<motion.div
|
||||||
<div className="text-xs text-medical-gray-500 font-extrabold uppercase tracking-tight mt-2 font-vazir">{getText('hero_stat_german_formula', "فرمولاسیون علمی اختصاصی")}</div>
|
initial={{ x: "-100%" }}
|
||||||
|
animate={{ x: "200%" }}
|
||||||
|
transition={{ duration: 3, repeat: Infinity, ease: "linear" }}
|
||||||
|
className="absolute inset-0 bg-gradient-to-r from-transparent via-white/40 to-transparent skew-x-12 z-20 pointer-events-none"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="text-sm text-medical-gray-600 font-extrabold uppercase tracking-tight mt-3 font-vazir">{getText('hero_stat_german_formula', "فرمول آلمانی")}</div>
|
||||||
</div>
|
</div>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -127,33 +127,10 @@ export default function IngredientWiki() {
|
|||||||
return (
|
return (
|
||||||
<div className="space-y-32">
|
<div className="space-y-32">
|
||||||
{filtered.map((ing, idx) => {
|
{filtered.map((ing, idx) => {
|
||||||
const hasIngredient = products.filter(p => {
|
const hasIngredient = products.filter(p =>
|
||||||
const ingNameClean = ing.name.split('(')[0].trim().toLowerCase();
|
p.main_ingredients?.some(mi => mi.toLowerCase().includes(ing.name.toLowerCase())) ||
|
||||||
const ingIdClean = ing.id.replace(/-/g, ' ').toLowerCase();
|
p.main_ingredients?.some(mi => mi.toLowerCase().includes(ing.id.replace('-', ' ')))
|
||||||
|
);
|
||||||
return p.main_ingredients?.some(mi => {
|
|
||||||
const miClean = mi.toLowerCase();
|
|
||||||
return miClean.includes(ingNameClean) ||
|
|
||||||
ingNameClean.includes(miClean) ||
|
|
||||||
miClean.includes(ingIdClean) ||
|
|
||||||
(ing.id === 'green-mussel' && (miClean.includes('صدف') || miClean.includes('mussel'))) ||
|
|
||||||
(ing.id === 'collagen' && miClean.includes('کلاژن')) ||
|
|
||||||
(ing.id === 'silver' && (miClean.includes('نقره') || miClean.includes('silver'))) ||
|
|
||||||
(ing.id === 'peat-extract' && (miClean.includes('پیت') || miClean.includes('moor') || miClean.includes('عصاره'))) ||
|
|
||||||
(ing.id === 'colostrum' && (miClean.includes('آغوز') || miClean.includes('colostrum'))) ||
|
|
||||||
(ing.id === 'biotin' && (miClean.includes('بیوتین') || miClean.includes('biotin'))) ||
|
|
||||||
(ing.id === 'taurin' && (miClean.includes('تورین') || miClean.includes('taurine'))) ||
|
|
||||||
(ing.id === 'salmon-oil' && (miClean.includes('سالمون') || miClean.includes('salmon') || miClean.includes('ماهی'))) ||
|
|
||||||
(ing.id === 'black-cumin' && (miClean.includes('سیاه دانه') || miClean.includes('زیره') || miClean.includes('cumin'))) ||
|
|
||||||
(ing.id === 'eggshell' && (miClean.includes('پوسته تخم مرغ') || miClean.includes('تخممرغ') || miClean.includes('eggshell'))) ||
|
|
||||||
(ing.id === 'hawthorn' && (miClean.includes('زالزالک') || miClean.includes('hawthorn'))) ||
|
|
||||||
(ing.id === 'l-carnitine' && (miClean.includes('کارنیتین') || miClean.includes('carnitine'))) ||
|
|
||||||
(ing.id === 'seaweed' && (miClean.includes('جلبک') || miClean.includes('seaweed'))) ||
|
|
||||||
(ing.id === 'hyaluronic' && (miClean.includes('هیالورونات') || miClean.includes('hyaluron'))) ||
|
|
||||||
(ing.id === 'calendula-sea-buckthorn' && (miClean.includes('کالاندولا') || miClean.includes('سنجد') || miClean.includes('calendula'))) ||
|
|
||||||
(ing.id === 'dodecanoic' && (miClean.includes('دودکانوئیک') || miClean.includes('مارگوسا') || miClean.includes('insect')));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={ing.id} className={`flex flex-col lg:flex-row items-center gap-16 ${idx % 2 === 1 ? 'lg:flex-row-reverse' : ''}`}>
|
<div key={ing.id} className={`flex flex-col lg:flex-row items-center gap-16 ${idx % 2 === 1 ? 'lg:flex-row-reverse' : ''}`}>
|
||||||
|
|||||||
@ -50,7 +50,7 @@ export default function OrderDetailsModal({ isOpen, onClose, order }: OrderDetai
|
|||||||
font-family: 'Vazirmatn';
|
font-family: 'Vazirmatn';
|
||||||
src: url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/fonts/webfonts/Vazirmatn-Regular.woff2') format('woff2');
|
src: url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/fonts/webfonts/Vazirmatn-Regular.woff2') format('woff2');
|
||||||
}
|
}
|
||||||
body { font-family: 'Vazirmatn'; padding: 40px; color: #333; }
|
body { font-family: 'Vazirmatn', sans-serif; padding: 40px; color: #333; }
|
||||||
.header { display: flex; justify-between: space-between; align-items: center; border-bottom: 2px solid #0055FF; pb: 20px; mb: 40px; }
|
.header { display: flex; justify-between: space-between; align-items: center; border-bottom: 2px solid #0055FF; pb: 20px; mb: 40px; }
|
||||||
.logo { font-size: 24px; font-weight: 900; color: #0055FF; }
|
.logo { font-size: 24px; font-weight: 900; color: #0055FF; }
|
||||||
.info { margin-bottom: 40px; display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
|
.info { margin-bottom: 40px; display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
|
||||||
|
|||||||
@ -77,10 +77,8 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
const [showRefillModal, setShowRefillModal] = useState(false);
|
const [showRefillModal, setShowRefillModal] = useState(false);
|
||||||
const [itemQuantity, setItemQuantity] = useState(1);
|
const [itemQuantity, setItemQuantity] = useState(1);
|
||||||
const [allProducts, setAllProducts] = useState<Product[]>([]);
|
const [allProducts, setAllProducts] = useState<Product[]>([]);
|
||||||
const [isMounted, setIsMounted] = useState(false);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setIsMounted(true);
|
|
||||||
productService.getProducts({ limit: 999 })
|
productService.getProducts({ limit: 999 })
|
||||||
.then((res) => {
|
.then((res) => {
|
||||||
const products = res.data;
|
const products = res.data;
|
||||||
@ -178,92 +176,58 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Breadcrumbs */}
|
{/* Breadcrumbs */}
|
||||||
<nav className="hidden md:flex items-center gap-2 text-sm font-semibold text-medical-gray-600 mb-10 overflow-x-auto whitespace-nowrap py-3 border-b border-medical-gray-100">
|
<nav className="hidden md:flex items-center gap-2 text-xs font-bold text-medical-gray-400 mb-8 overflow-x-auto whitespace-nowrap py-2">
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/')}
|
onClick={() => router.push('/')}
|
||||||
className="hover:text-canina-blue transition-colors font-vazir cursor-pointer"
|
className="hover:text-canina-blue transition-colors font-vazir cursor-pointer"
|
||||||
>
|
>
|
||||||
خانه
|
خانه
|
||||||
</button>
|
</button>
|
||||||
<ChevronLeft className="w-3.5 h-3.5 flex-shrink-0 text-medical-gray-300" />
|
<ChevronLeft className="w-3 h-3 flex-shrink-0" />
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push(`/shop?category=${product.categorySlug}`)}
|
onClick={() => router.push(`/shop?category=${product.categorySlug}`)}
|
||||||
className="hover:text-canina-blue cursor-pointer font-vazir"
|
className="hover:text-canina-blue cursor-pointer font-vazir"
|
||||||
>
|
>
|
||||||
{product.category}
|
{product.category}
|
||||||
</button>
|
</button>
|
||||||
<ChevronLeft className="w-3.5 h-3.5 flex-shrink-0 text-medical-gray-300" />
|
<ChevronLeft className="w-3 h-3 flex-shrink-0" />
|
||||||
<span className="text-canina-blue font-vazir whitespace-nowrap font-bold">{product.name}</span>
|
<span className="text-canina-blue font-vazir whitespace-nowrap">{product.name}</span>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{/* Global Single Grid Layout - Aligns Sticky Buy Box at the Top */}
|
|
||||||
<div className="grid lg:grid-cols-12 gap-12 items-start">
|
<div className="grid lg:grid-cols-12 gap-12 items-start">
|
||||||
|
{/* Main Content Area */}
|
||||||
{/* Right/Main Content Column (lg:col-span-8) */}
|
|
||||||
<div className="lg:col-span-8 space-y-12">
|
<div className="lg:col-span-8 space-y-12">
|
||||||
|
<div>
|
||||||
{/* Above the Fold Grid */}
|
<div className="flex flex-wrap items-center gap-3 mb-4">
|
||||||
<div className="grid md:grid-cols-12 gap-12 items-start">
|
<div className="px-3 py-1 bg-canina-blue text-white rounded-full text-[10px] font-black uppercase tracking-widest font-vazir whitespace-nowrap">
|
||||||
{/* Right Column: Product Image Frame (md:col-span-5) */}
|
استاندارد صنعتی آلمان
|
||||||
<div className="md:col-span-5 w-full">
|
|
||||||
<motion.div
|
|
||||||
initial={{ opacity: 0, scale: 0.95 }}
|
|
||||||
animate={{ opacity: 1, scale: 1 }}
|
|
||||||
className="bg-white rounded-[2.5rem] border border-medical-gray-200 shadow-xl relative group overflow-hidden h-[380px] flex items-center justify-center p-8"
|
|
||||||
>
|
|
||||||
<div className="absolute top-6 left-6 flex flex-col gap-2 z-10">
|
|
||||||
<div className="px-3 py-1 bg-green-500 text-white rounded-full text-[10px] font-black uppercase tracking-widest flex items-center gap-1 font-vazir shadow-sm">
|
|
||||||
<CheckCircle2 className="w-3 h-3" />
|
|
||||||
موجود در انبار
|
|
||||||
</div>
|
|
||||||
<div className="px-3 py-1 bg-canina-blue text-white rounded-full text-[10px] font-black uppercase tracking-widest font-vazir whitespace-nowrap shadow-sm">
|
|
||||||
گرید دارویی اختصاصی
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<SafeImage
|
|
||||||
src={product.image}
|
|
||||||
alt={product.name}
|
|
||||||
className="w-full h-full"
|
|
||||||
imgClassName="max-h-[300px] w-auto object-contain drop-shadow-2xl group-hover:scale-105 transition-transform duration-700 mx-auto my-auto"
|
|
||||||
/>
|
|
||||||
</motion.div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Left Column: Product Title & Description (md:col-span-7) */}
|
|
||||||
<div className="md:col-span-7 space-y-6">
|
|
||||||
<div>
|
|
||||||
<div className="flex flex-wrap items-center gap-3 mb-4">
|
|
||||||
<div className="px-3 py-1 bg-canina-blue text-white rounded-full text-[10px] font-black uppercase tracking-widest font-vazir whitespace-nowrap shadow-sm">
|
|
||||||
استاندارد صنعتی آلمان
|
|
||||||
</div>
|
|
||||||
{product.specialBadge && (
|
|
||||||
<div className="px-3 py-1 bg-medical-gray-900 text-white rounded-full text-[10px] font-black uppercase tracking-widest font-vazir whitespace-nowrap shadow-sm">
|
|
||||||
{product.specialBadge}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
<h1 dir="ltr" className="text-2xl md:text-3xl lg:text-4xl font-black text-medical-gray-900 leading-tight mb-4 italic font-sans text-left">
|
|
||||||
{product.name}
|
|
||||||
</h1>
|
|
||||||
<p className="text-xl text-canina-blue font-bold italic opacity-70 leading-relaxed max-w-2xl font-vazir mb-6 text-right" dir="rtl">
|
|
||||||
{isMounted && pets.length > 0 ? (
|
|
||||||
product.optimisticTemplate?.replace("[PetName]", activePet?.name || "").replace("[OnSet]", product.onSetOfAction || "به زودی")
|
|
||||||
) : (
|
|
||||||
product.scientificTagline
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
{fullProduct.shortDescription && (
|
|
||||||
<p className="text-lg text-medical-gray-600 font-bold leading-relaxed max-w-3xl font-vazir border-r-4 border-canina-blue pr-6 py-2 bg-canina-blue/5 rounded-l-2xl">
|
|
||||||
{fullProduct.shortDescription}
|
|
||||||
</p>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
{product.specialBadge && (
|
||||||
|
<div className="px-3 py-1 bg-medical-gray-900 text-white rounded-full text-[10px] font-black uppercase tracking-widest font-vazir whitespace-nowrap">
|
||||||
|
{product.specialBadge}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
<h1 className="text-4xl lg:text-6xl font-black text-medical-gray-900 leading-tight mb-4 italic font-vazir">
|
||||||
|
{product.name}
|
||||||
|
</h1>
|
||||||
|
<p className="text-xl text-canina-blue font-bold italic opacity-70 leading-relaxed max-w-2xl font-vazir mb-6">
|
||||||
|
{pets.length > 0 ? (
|
||||||
|
product.optimisticTemplate?.replace("[PetName]", activePet?.name || "").replace("[OnSet]", product.onSetOfAction || "به زودی")
|
||||||
|
) : (
|
||||||
|
product.scientificTagline
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
{fullProduct.shortDescription && (
|
||||||
|
<p className="text-lg text-medical-gray-600 font-medium leading-relaxed max-w-3xl font-vazir border-r-4 border-canina-blue pr-6 py-2 bg-canina-blue/5 rounded-l-2xl">
|
||||||
|
{fullProduct.shortDescription}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Key Benefits Section */}
|
{/* Key Benefits Section */}
|
||||||
{fullProduct.keyBenefits && fullProduct.keyBenefits.length > 0 && (
|
{fullProduct.keyBenefits && fullProduct.keyBenefits.length > 0 && (
|
||||||
<section className="space-y-8 pt-6 border-t border-medical-gray-100">
|
<section className="space-y-8">
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
||||||
<Star className="w-6 h-6" />
|
<Star className="w-6 h-6" />
|
||||||
@ -274,7 +238,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
{fullProduct.keyBenefits.map((benefit, i) => {
|
{fullProduct.keyBenefits.map((benefit, i) => {
|
||||||
const Icon = ICON_MAP[benefit.icon] || CheckCircle2;
|
const Icon = ICON_MAP[benefit.icon] || CheckCircle2;
|
||||||
return (
|
return (
|
||||||
<div key={i} className="bg-white border border-medical-gray-200 rounded-[2.5rem] p-8 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all group overflow-hidden relative">
|
<div key={i} className="bg-white border border-medical-gray-100 rounded-[2rem] p-8 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all group overflow-hidden relative">
|
||||||
<div className="absolute -top-10 -left-10 w-24 h-24 bg-canina-blue/5 rounded-full group-hover:scale-150 transition-transform duration-700" />
|
<div className="absolute -top-10 -left-10 w-24 h-24 bg-canina-blue/5 rounded-full group-hover:scale-150 transition-transform duration-700" />
|
||||||
<div className="w-12 h-12 bg-medical-gray-50 rounded-2xl flex items-center justify-center text-canina-blue mb-6 group-hover:bg-canina-blue group-hover:text-white transition-all">
|
<div className="w-12 h-12 bg-medical-gray-50 rounded-2xl flex items-center justify-center text-canina-blue mb-6 group-hover:bg-canina-blue group-hover:text-white transition-all">
|
||||||
<Icon className="w-6 h-6" />
|
<Icon className="w-6 h-6" />
|
||||||
@ -288,86 +252,31 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Comprehensive Product Description Section (Below the fold) */}
|
<motion.div
|
||||||
{fullProduct.description && (
|
initial={{ opacity: 0, scale: 0.95 }}
|
||||||
<section className="bg-white border border-medical-gray-200 rounded-[2.5rem] p-8 md:p-10 shadow-md space-y-6">
|
animate={{ opacity: 1, scale: 1 }}
|
||||||
<div className="flex items-center gap-4">
|
className="bg-white rounded-[3.5rem] p-12 border border-medical-gray-200 shadow-xl relative group overflow-hidden"
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
>
|
||||||
<Info className="w-6 h-6" />
|
<div className="absolute top-6 left-6 flex flex-col gap-2 z-10">
|
||||||
</div>
|
<div className="px-3 py-1 bg-green-50 text-green-600 rounded-full text-[10px] font-black uppercase tracking-widest border border-green-100 flex items-center gap-1 font-vazir">
|
||||||
<h3 className="text-2xl font-black text-medical-gray-900 italic font-vazir">توضیحات و معرفی محصول</h3>
|
<CheckCircle2 className="w-3 h-3" />
|
||||||
|
موجود در انبار
|
||||||
</div>
|
</div>
|
||||||
<div className="text-base text-medical-gray-600 font-medium leading-loose font-vazir space-y-4 pt-4 border-t border-medical-gray-100">
|
<div className="px-3 py-1 bg-canina-blue/5 text-canina-blue rounded-full text-[10px] font-black uppercase tracking-widest border border-canina-blue/10 font-vazir whitespace-nowrap">
|
||||||
{fullProduct.description.split('\n').filter(Boolean).map((para, pIdx) => (
|
گرید دارویی اختصاصی
|
||||||
<p key={pIdx}>{para.trim()}</p>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{/* Smart Dosage Calculator Utility Section */}
|
|
||||||
<section className="bg-white rounded-[2.5rem] border border-medical-gray-200 p-8 md:p-10 shadow-md space-y-8">
|
|
||||||
<div className="flex items-center gap-4">
|
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
|
||||||
<Clock className="w-6 h-6" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h3 className="text-2xl font-black text-medical-gray-900 italic font-vazir">ماشین حساب هوشمند مصرف</h3>
|
|
||||||
<p className="text-xs text-medical-gray-400 font-bold font-vazir mt-1">تخمین دقیق دوز روزانه و ماندگاری هر بسته بر اساس مشخصات پت شما</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<SafeImage
|
||||||
<div className="grid md:grid-cols-2 gap-8 items-center">
|
src={product.image}
|
||||||
{/* Manual Slider Inputs */}
|
alt={product.name}
|
||||||
<div className="bg-medical-gray-50 rounded-[2rem] p-6 border border-medical-gray-100 space-y-6">
|
className="w-full max-w-md mx-auto h-auto drop-shadow-2xl group-hover:scale-105 transition-transform duration-700"
|
||||||
<div className="flex items-center justify-between">
|
/>
|
||||||
<span className="text-xs font-black text-medical-gray-500 font-vazir">وزن پت (کیلوگرم)</span>
|
</motion.div>
|
||||||
<span className="text-lg font-black text-canina-blue font-vazir">{toPersian(weight)} کگ</span>
|
|
||||||
</div>
|
|
||||||
<input
|
|
||||||
type="range"
|
|
||||||
min="1" max="100"
|
|
||||||
value={weight}
|
|
||||||
onChange={(e) => setWeight(parseInt(e.target.value))}
|
|
||||||
className="w-full h-2 bg-medical-gray-200 rounded-lg appearance-none cursor-pointer accent-canina-blue [&::-webkit-slider-thumb]:w-6 [&::-webkit-slider-thumb]:h-6 [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-canina-blue [&::-webkit-slider-thumb]:appearance-none"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="space-y-2">
|
|
||||||
<span className="text-[10px] font-black text-medical-gray-400 font-vazir">سن حیوان</span>
|
|
||||||
<div className="flex gap-2">
|
|
||||||
<button onClick={() => setPetType("young")} className={`flex-1 py-3 rounded-xl text-xs font-black transition-all border ${petType === "young" ? 'bg-canina-blue border-canina-blue text-white shadow-lg' : 'bg-white border-medical-gray-200 text-medical-gray-400'}`}>جوان</button>
|
|
||||||
<button onClick={() => setPetType("adult")} className={`flex-1 py-3 rounded-xl text-xs font-black transition-all border ${petType === "adult" ? 'bg-canina-blue border-canina-blue text-white shadow-lg' : 'bg-white border-medical-gray-200 text-medical-gray-400'}`}>بالغ</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Calculation Results Output */}
|
|
||||||
<div className="bg-canina-blue rounded-[2rem] p-8 text-white border-b-8 border-white/20 shadow-2xl flex flex-col justify-between h-full min-h-[220px]">
|
|
||||||
<div className="flex items-center gap-2 mb-4 opacity-90 border-b border-white/10 pb-3">
|
|
||||||
<Sparkles className="w-4 h-4 text-white" />
|
|
||||||
<span className="text-[10px] font-bold uppercase tracking-widest font-vazir text-white">تخمین هوش مصنوعی (AI Advice)</span>
|
|
||||||
</div>
|
|
||||||
<div className="flex items-center justify-between">
|
|
||||||
<div>
|
|
||||||
<div className="text-3xl font-black font-vazir text-white">{toPersian(calculation.duration)} روز</div>
|
|
||||||
<div className="text-[10px] font-bold text-white/80 font-vazir whitespace-nowrap mt-1">تخمین اتمام مصرف بسته</div>
|
|
||||||
</div>
|
|
||||||
<div className="text-left">
|
|
||||||
<div className="text-2xl font-black font-vazir text-white">{toPersian(calculation.dailyDose)}</div>
|
|
||||||
<div className="text-[10px] font-bold text-white/80 font-vazir whitespace-nowrap mt-1">دوز روزانه ({calculation.unit === 'g' ? 'گرم' : calculation.unit})</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<p className="text-[11px] text-white/60 font-bold font-vazir mt-6 leading-relaxed">
|
|
||||||
* دوزها تخمینی هستند؛ توصیه میشود برای مصرف دقیق کاتالوگ محصول را مطالعه کنید.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Ingredients Section */}
|
{/* Ingredients Section */}
|
||||||
<section className="space-y-8">
|
<section className="space-y-8">
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
<div className="w-12 h-12 bg-medical-gray-900 text-white rounded-2xl flex items-center justify-center shadow-lg">
|
||||||
<FlaskConical className="w-6 h-6" />
|
<FlaskConical className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-3xl font-black text-medical-gray-900 italic font-vazir">ترکیبات و آنالیز علمی</h3>
|
<h3 className="text-3xl font-black text-medical-gray-900 italic font-vazir">ترکیبات و آنالیز علمی</h3>
|
||||||
@ -375,7 +284,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
|
|
||||||
<div className="space-y-10">
|
<div className="space-y-10">
|
||||||
{/* Ingredients Cards */}
|
{/* Ingredients Cards */}
|
||||||
<div className="bg-white rounded-[2.5rem] p-8 md:p-10 border border-medical-gray-200 shadow-md">
|
<div className="bg-white rounded-[2.5rem] p-8 border border-medical-gray-200">
|
||||||
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-widest mb-6 font-vazir">مواد تشکیلدهنده برتر</h4>
|
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-widest mb-6 font-vazir">مواد تشکیلدهنده برتر</h4>
|
||||||
<div className="flex flex-wrap gap-3">
|
<div className="flex flex-wrap gap-3">
|
||||||
{product.main_ingredients.map((ing, idx) => {
|
{product.main_ingredients.map((ing, idx) => {
|
||||||
@ -402,7 +311,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
<div className="text-[10px] font-black text-medical-gray-400 uppercase tracking-widest mb-4 font-vazir">تخمین اتمام بسته (هوش مصنوعی)</div>
|
<div className="text-[10px] font-black text-medical-gray-400 uppercase tracking-widest mb-4 font-vazir">تخمین اتمام بسته (هوش مصنوعی)</div>
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
{Object.entries(product.analysis).map(([key, value]) => (
|
{Object.entries(product.analysis).map(([key, value]) => (
|
||||||
<div key={key} className="bg-canina-blue text-white p-8 rounded-[2.5rem] border-b-2 border-white/20 shadow-xl group hover:scale-[1.02] transition-all duration-300">
|
<div key={key} className="bg-canina-blue text-white p-8 rounded-[2rem] border-b-2 border-white/20 shadow-xl group hover:scale-[1.02] transition-all duration-300">
|
||||||
<div className="text-[10px] font-black text-white/80 uppercase tracking-widest mb-3 font-vazir whitespace-nowrap">{key}</div>
|
<div className="text-[10px] font-black text-white/80 uppercase tracking-widest mb-3 font-vazir whitespace-nowrap">{key}</div>
|
||||||
<div className="text-3xl font-black font-vazir tracking-tighter text-white">{toPersian(value)}</div>
|
<div className="text-3xl font-black font-vazir tracking-tighter text-white">{toPersian(value)}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -413,17 +322,13 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Feeding / Usage Instructions Section (Dynamic Header based on product category) */}
|
{/* Feeding Section */}
|
||||||
<section className="bg-white border border-medical-gray-200 rounded-[2.5rem] p-8 md:p-10 shadow-md">
|
<section className="bg-canina-blue/5 border border-canina-blue/10 rounded-[3rem] p-10">
|
||||||
<div className="flex items-center gap-4 mb-8">
|
<div className="flex items-center gap-4 mb-8">
|
||||||
<div className="w-12 h-12 bg-canina-blue text-white rounded-2xl flex items-center justify-center shadow-lg">
|
<div className="w-10 h-10 bg-canina-blue text-white rounded-xl flex items-center justify-center">
|
||||||
<CalendarDays className="w-6 h-6" />
|
<CalendarDays className="w-6 h-6" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-2xl font-black text-medical-gray-900 italic font-vazir">
|
<h3 className="text-2xl font-black text-medical-gray-900 italic font-vazir">توصیه غذایی و نحوه مصرف</h3>
|
||||||
{product.categorySlug === 'special-care' || product.name.toLowerCase().includes('pfotenpflege') || product.name.toLowerCase().includes('augenpflege')
|
|
||||||
? 'دستورالعمل و نحوه استفاده موضعی'
|
|
||||||
: 'توصیه غذایی و نحوه مصرف'}
|
|
||||||
</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<p className="text-medical-gray-700 leading-relaxed text-sm md:text-base font-medium font-vazir">
|
<p className="text-medical-gray-700 leading-relaxed text-sm md:text-base font-medium font-vazir">
|
||||||
{product.feedingAdvice}
|
{product.feedingAdvice}
|
||||||
@ -432,12 +337,12 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
|
|
||||||
{/* Specialist Note */}
|
{/* Specialist Note */}
|
||||||
{product.specialist && (
|
{product.specialist && (
|
||||||
<section className="bg-white rounded-[2.5rem] p-8 md:p-10 border border-medical-gray-200 shadow-md">
|
<section className="bg-white rounded-[3rem] p-10 border border-medical-gray-200">
|
||||||
<div className="flex flex-col md:flex-row gap-10 items-start">
|
<div className="flex flex-col md:flex-row gap-10 items-start">
|
||||||
<img
|
<img
|
||||||
src={product.specialist.image}
|
src={product.specialist.image}
|
||||||
alt={product.specialist.name}
|
alt={product.specialist.name}
|
||||||
className="w-32 h-32 rounded-[2rem] object-cover border-4 border-medical-gray-50 shadow-xl"
|
className="w-32 h-32 rounded-[2.5rem] object-cover border-4 border-medical-gray-50 shadow-xl"
|
||||||
/>
|
/>
|
||||||
<div className="flex-1">
|
<div className="flex-1">
|
||||||
<div className="inline-flex items-center gap-2 px-3 py-1 bg-medical-gray-900 text-white rounded-full text-[10px] font-black uppercase tracking-widest mb-4 font-vazir whitespace-nowrap">
|
<div className="inline-flex items-center gap-2 px-3 py-1 bg-medical-gray-900 text-white rounded-full text-[10px] font-black uppercase tracking-widest mb-4 font-vazir whitespace-nowrap">
|
||||||
@ -457,7 +362,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
{/* Specialized Landing Banner */}
|
{/* Specialized Landing Banner */}
|
||||||
<section>
|
<section>
|
||||||
<div
|
<div
|
||||||
className="relative bg-canina-blue rounded-[2.5rem] p-12 overflow-hidden group cursor-pointer border border-medical-gray-200 shadow-md"
|
className="relative bg-canina-blue rounded-[3rem] p-12 overflow-hidden group cursor-pointer"
|
||||||
onClick={() => toast.info("بزودی: صفحه فرود تخصصی این محصول در حال آمادهسازی است")}
|
onClick={() => toast.info("بزودی: صفحه فرود تخصصی این محصول در حال آمادهسازی است")}
|
||||||
>
|
>
|
||||||
<div className="absolute top-0 right-0 w-full h-full bg-[url('https://www.transparenttextures.com/patterns/cubes.png')] opacity-10" />
|
<div className="absolute top-0 right-0 w-full h-full bg-[url('https://www.transparenttextures.com/patterns/cubes.png')] opacity-10" />
|
||||||
@ -489,7 +394,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="grid md:grid-cols-1 gap-4">
|
<div className="grid md:grid-cols-1 gap-4">
|
||||||
{product.faqs.map((faq, i) => (
|
{product.faqs.map((faq, i) => (
|
||||||
<details key={i} className="group bg-white border border-medical-gray-200 rounded-[2rem] overflow-hidden hover:border-canina-blue/30 transition-all">
|
<details key={i} className="group bg-white border border-medical-gray-200 rounded-3xl overflow-hidden hover:border-canina-blue/30 transition-all">
|
||||||
<summary className="flex items-center justify-between p-6 cursor-pointer list-none">
|
<summary className="flex items-center justify-between p-6 cursor-pointer list-none">
|
||||||
<span className="font-bold text-medical-gray-900 font-vazir">{faq.question}</span>
|
<span className="font-bold text-medical-gray-900 font-vazir">{faq.question}</span>
|
||||||
<ChevronDown className="w-5 h-5 text-canina-blue group-open:rotate-180 transition-transform" />
|
<ChevronDown className="w-5 h-5 text-canina-blue group-open:rotate-180 transition-transform" />
|
||||||
@ -504,16 +409,52 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Sticky Sidebar (Clean Buy Box) - Sticky starts at the top, level with the title */}
|
{/* Sticky Sidebar */}
|
||||||
<div className="lg:col-span-4 lg:sticky lg:top-28 space-y-8">
|
<div className="lg:col-span-4 lg:sticky lg:top-24 space-y-8">
|
||||||
<div className="bg-white rounded-[2.5rem] border-2 border-medical-gray-100 p-8 shadow-2xl relative overflow-hidden">
|
<div className="bg-white rounded-[3rem] border-2 border-medical-gray-100 p-8 shadow-2xl relative overflow-hidden">
|
||||||
<div className="absolute top-0 right-0 w-24 h-24 bg-canina-blue/5 rounded-full -mr-12 -mt-12" />
|
<div className="absolute top-0 right-0 w-24 h-24 bg-canina-blue/5 rounded-full -mr-12 -mt-12" />
|
||||||
|
|
||||||
<div className="text-[10px] font-black text-medical-gray-400 uppercase tracking-widest mb-1 font-vazir">قیمت نهایی محصول</div>
|
<div className="text-4xl font-black font-vazir text-medical-gray-900 tracking-tighter mb-4">
|
||||||
<div className="text-4xl font-black font-vazir text-medical-gray-900 tracking-tighter mb-8">
|
|
||||||
{toPersian(product.price)}
|
{toPersian(product.price)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Refill Auto-Calculator */}
|
||||||
|
<div className="bg-canina-blue rounded-[2rem] p-6 text-white mb-8 border-b-8 border-white/20 shadow-2xl">
|
||||||
|
<div className="flex items-center gap-2 mb-4 opacity-90">
|
||||||
|
<Clock className="w-4 h-4 text-white" />
|
||||||
|
<span className="text-[10px] font-bold uppercase tracking-widest font-vazir text-white">هوش مصنوعی تکرار خرید</span>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div>
|
||||||
|
<div className="text-2xl font-black font-vazir text-white">{toPersian(calculation.duration)} روز</div>
|
||||||
|
<div className="text-[9px] font-bold text-white/80 font-vazir whitespace-nowrap">تخمین اتمام برای {toPersian(weight)} کیلوگرم</div>
|
||||||
|
</div>
|
||||||
|
<div className="text-left">
|
||||||
|
<div className="text-xl font-black font-vazir text-white">{toPersian(calculation.dailyDose)}</div>
|
||||||
|
<div className="text-[9px] font-bold text-white/80 font-vazir whitespace-nowrap">دوز روزانه ({calculation.unit === 'g' ? 'گرم' : calculation.unit})</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Manual Calculator (Mini) */}
|
||||||
|
<div className="bg-medical-gray-50 rounded-2xl p-6 border border-medical-gray-100 mb-8 space-y-6">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<span className="text-[10px] font-black text-medical-gray-400 font-vazir">وزن پت (کیلوگرم)</span>
|
||||||
|
<span className="text-sm font-black text-canina-blue font-vazir">{toPersian(weight)}</span>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
type="range"
|
||||||
|
min="1" max="100"
|
||||||
|
value={weight}
|
||||||
|
onChange={(e) => setWeight(parseInt(e.target.value))}
|
||||||
|
className="w-full h-1.5 bg-medical-gray-200 rounded-lg appearance-none cursor-pointer accent-canina-blue"
|
||||||
|
/>
|
||||||
|
<div className="flex gap-2">
|
||||||
|
<button onClick={() => setPetType("young")} className={`flex-1 py-2 rounded-xl text-[10px] font-black transition-all ${petType === "young" ? 'bg-canina-blue text-white shadow-lg' : 'bg-white text-medical-gray-400'}`}>جوان</button>
|
||||||
|
<button onClick={() => setPetType("adult")} className={`flex-1 py-2 rounded-xl text-[10px] font-black transition-all ${petType === "adult" ? 'bg-canina-blue text-white shadow-lg' : 'bg-white text-medical-gray-400'}`}>بالغ</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex gap-4 mb-6">
|
<div className="flex gap-4 mb-6">
|
||||||
{/* Quantity Selector - 40% Width */}
|
{/* Quantity Selector - 40% Width */}
|
||||||
<div className="flex items-center gap-4 bg-medical-gray-50 border border-medical-gray-100 rounded-2xl p-2 h-16 w-[40%]">
|
<div className="flex items-center gap-4 bg-medical-gray-50 border border-medical-gray-100 rounded-2xl p-2 h-16 w-[40%]">
|
||||||
@ -547,12 +488,12 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="mt-6 flex flex-col gap-3 border-t border-medical-gray-50 pt-6">
|
<div className="mt-6 flex flex-col gap-3">
|
||||||
<div className="flex items-center gap-2 text-xs font-bold text-medical-gray-500 font-vazir">
|
<div className="flex items-center gap-2 text-[10px] font-bold text-medical-gray-400 font-vazir">
|
||||||
<ShieldCheck className="w-4 h-4 text-green-500" />
|
<ShieldCheck className="w-4 h-4 text-green-500" />
|
||||||
ضمانت اصالت محصول (Made in Germany)
|
ضمانت اصالت محصول (Made in Germany)
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2 text-xs font-bold text-medical-gray-500 font-vazir">
|
<div className="flex items-center gap-2 text-[10px] font-bold text-medical-gray-400 font-vazir">
|
||||||
<Clock className="w-4 h-4 text-canina-blue" />
|
<Clock className="w-4 h-4 text-canina-blue" />
|
||||||
آماده ارسال (تحویل حداکثر ۴۸ ساعت)
|
آماده ارسال (تحویل حداکثر ۴۸ ساعت)
|
||||||
</div>
|
</div>
|
||||||
@ -561,7 +502,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
|
|||||||
|
|
||||||
{/* expected results box */}
|
{/* expected results box */}
|
||||||
{product.expectedResults && product.expectedResults.length > 0 && (
|
{product.expectedResults && product.expectedResults.length > 0 && (
|
||||||
<div className="bg-white rounded-[2.5rem] border border-medical-gray-200 p-8 shadow-md">
|
<div className="bg-white rounded-[2.5rem] border border-medical-gray-200 p-8">
|
||||||
<h4 className="text-[10px] font-black text-medical-gray-400 uppercase tracking-widest mb-6 font-vazir">تغییرات قابل انتظار</h4>
|
<h4 className="text-[10px] font-black text-medical-gray-400 uppercase tracking-widest mb-6 font-vazir">تغییرات قابل انتظار</h4>
|
||||||
<div className="space-y-4">
|
<div className="space-y-4">
|
||||||
{product.expectedResults.map((res, i) => {
|
{product.expectedResults.map((res, i) => {
|
||||||
|
|||||||
@ -90,13 +90,13 @@ export default function SmartAdvisor({ onComplete, rules = [] }: SmartAdvisorPro
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section id="canino-advisor" className="py-12 bg-white">
|
<section id="canino-advisor" className="py-24 bg-white">
|
||||||
<div className="max-w-4xl mx-auto px-4">
|
<div className="max-w-4xl mx-auto px-4">
|
||||||
<div className="text-center mb-8">
|
<div className="text-center mb-12">
|
||||||
<motion.div
|
<motion.div
|
||||||
initial={{ opacity: 0, y: 20 }}
|
initial={{ opacity: 0, y: 20 }}
|
||||||
whileInView={{ opacity: 1, y: 0 }}
|
whileInView={{ opacity: 1, y: 0 }}
|
||||||
className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 rounded-full mb-4"
|
className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 rounded-full mb-6"
|
||||||
>
|
>
|
||||||
<Sparkle className="w-4 h-4 text-canina-blue" />
|
<Sparkle className="w-4 h-4 text-canina-blue" />
|
||||||
<span className="text-canina-blue text-xs font-black uppercase tracking-widest font-vazir">{getText('advisor_badge', "تکنولوژی پایش هوشمند")}</span>
|
<span className="text-canina-blue text-xs font-black uppercase tracking-widest font-vazir">{getText('advisor_badge', "تکنولوژی پایش هوشمند")}</span>
|
||||||
@ -133,16 +133,16 @@ export default function SmartAdvisor({ onComplete, rules = [] }: SmartAdvisorPro
|
|||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<button
|
<button
|
||||||
onClick={() => setType("سگ")}
|
onClick={() => setType("سگ")}
|
||||||
className={`flex flex-col items-center gap-4 p-8 rounded-[2.5rem] border-4 transition-all focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none cursor-pointer ${type === "سگ" ? 'border-canina-blue bg-white shadow-xl shadow-canina-blue/10 scale-105 text-canina-blue' : 'border-medical-gray-250 bg-white text-medical-gray-500 hover:border-canina-blue/30 hover:text-canina-blue/70'}`}
|
className={`flex flex-col items-center gap-4 p-8 rounded-[2.5rem] border-4 transition-all focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none ${type === "سگ" ? 'border-canina-blue bg-white shadow-xl shadow-canina-blue/10 scale-105' : 'border-transparent bg-white/50 text-medical-gray-400 hover:bg-white'}`}
|
||||||
>
|
>
|
||||||
<Dog className="w-12 h-12" />
|
<Dog className={`w-12 h-12 ${type === "سگ" ? 'text-canina-blue' : 'text-current'}`} />
|
||||||
<span className="text-lg font-black font-vazir">سگ</span>
|
<span className="text-lg font-black font-vazir">سگ</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => setType("گربه")}
|
onClick={() => setType("گربه")}
|
||||||
className={`flex flex-col items-center gap-4 p-8 rounded-[2.5rem] border-4 transition-all focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none cursor-pointer ${type === "گربه" ? 'border-canina-blue bg-white shadow-xl shadow-canina-blue/10 scale-105 text-canina-blue' : 'border-medical-gray-250 bg-white text-medical-gray-500 hover:border-canina-blue/30 hover:text-canina-blue/70'}`}
|
className={`flex flex-col items-center gap-4 p-8 rounded-[2.5rem] border-4 transition-all focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none ${type === "گربه" ? 'border-canina-blue bg-white shadow-xl shadow-canina-blue/10 scale-105' : 'border-transparent bg-white/50 text-medical-gray-400 hover:bg-white'}`}
|
||||||
>
|
>
|
||||||
<Cat className="w-12 h-12" />
|
<Cat className={`w-12 h-12 ${type === "گربه" ? 'text-canina-blue' : 'text-current'}`} />
|
||||||
<span className="text-lg font-black font-vazir">گربه</span>
|
<span className="text-lg font-black font-vazir">گربه</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -294,7 +294,7 @@ export default function SmartAdvisor({ onComplete, rules = [] }: SmartAdvisorPro
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={handleSubmit}
|
onClick={handleSubmit}
|
||||||
className="flex-[2] py-6 bg-canina-blue text-white rounded-3xl font-black text-lg hover:bg-canina-blue/90 focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all shadow-xl shadow-canina-blue/30 flex items-center justify-center gap-3 font-vazir min-h-[48px]"
|
className="flex-[2] py-6 bg-canina-blue text-white rounded-3xl font-black text-lg hover:bg-indigo-700 focus-visible:ring-4 focus-visible:ring-canina-blue/30 focus-visible:outline-none transition-all shadow-xl shadow-canina-blue/20 flex items-center justify-center gap-3 font-vazir min-h-[48px]"
|
||||||
>
|
>
|
||||||
{getText('advisor_complete', "تکمیل و صدور شناسنامه")}
|
{getText('advisor_complete', "تکمیل و صدور شناسنامه")}
|
||||||
<ChevronLeft className="w-5 h-5" />
|
<ChevronLeft className="w-5 h-5" />
|
||||||
|
|||||||
@ -38,7 +38,7 @@ const VIDEOS = [
|
|||||||
export default function VetGallery({ testimonials = [] }: { testimonials?: any[] }) {
|
export default function VetGallery({ testimonials = [] }: { testimonials?: any[] }) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const getText = useSettingsStore(state => state.getText);
|
const getText = useSettingsStore(state => state.getText);
|
||||||
const displayItems = VIDEOS;
|
const displayItems = testimonials.length > 0 ? testimonials : VIDEOS;
|
||||||
const [selectedVideo, setSelectedVideo] = useState<any>(null);
|
const [selectedVideo, setSelectedVideo] = useState<any>(null);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
export interface ScientificTerm {
|
export interface ScientificTerm {
|
||||||
term: string;
|
term: string;
|
||||||
definition: string;
|
definition: string;
|
||||||
wikiId?: string;
|
wikiId?: string;
|
||||||
@ -7,28 +7,28 @@ export interface ScientificTerm {
|
|||||||
export const SCIENTIFIC_TERMS: Record<string, ScientificTerm> = {
|
export const SCIENTIFIC_TERMS: Record<string, ScientificTerm> = {
|
||||||
"گلیکوزآمینوگلیکان": {
|
"گلیکوزآمینوگلیکان": {
|
||||||
term: "گلیکوزآمینوگلیکان (GAG)",
|
term: "گلیکوزآمینوگلیکان (GAG)",
|
||||||
definition: "ترکیبات ساختاری ضروری برای بازسازی غضروفها و مایع مفصلی که در مفاصل و تاندونها نقش حیاتی دارند.",
|
definition: "ترکیبات ساختاری ضروری برای بازسازی غضروفها و مایع مفصلی که در Canhydrox GAG به وفور یافت میشود.",
|
||||||
wikiId: "green-mussel"
|
wikiId: "gag"
|
||||||
},
|
},
|
||||||
"اسیدهای هومیک": {
|
"اسیدهای هومیک": {
|
||||||
term: "اسیدهای هومیک",
|
term: "اسیدهای هومیک",
|
||||||
definition: "مواد آلی طبیعی موجود در عصاره پیت (Moor) که از مخاط روده محافظت کرده و سموم را در گوارش به دام میاندازند.",
|
definition: "مواد آلی طبیعی موجود در عصاره پیت (Moor) که از مخاط روده محافظت کرده و سموم را جذب میکنند.",
|
||||||
wikiId: "peat-extract"
|
wikiId: "humic-acids"
|
||||||
},
|
},
|
||||||
"کلاژن زیستفعال": {
|
"کلاژن زیستفعال": {
|
||||||
term: "کلاژن زیستفعال (Bioactive Collagen)",
|
term: "کلاژن زیستفعال",
|
||||||
definition: "پروتئینهای اختصاصی هیدرولیز شده که به سرعت جذب استخوان و تاندون شده و بازسازی مفاصل را بهبود میبخشند.",
|
definition: "پروتئینهای اختصاصی هیدرولیز شده که به سرعت جذب استخوان و تاندون شده و استحکام ساختاری ایجاد میکنند.",
|
||||||
wikiId: "collagen"
|
wikiId: "collagen"
|
||||||
},
|
},
|
||||||
"تیموکینون": {
|
"تیموکینون": {
|
||||||
term: "تیموکینون (Thymoquinone)",
|
term: "تیموکینون",
|
||||||
definition: "ماده موثره اصلی در روغن سیاه دانه با خواص ضدالتهابی، ضدآلرژی و آنتیاکسیدان بسیار قوی.",
|
definition: "ماده موثره اصلی در روغن سیاه دانه (Nigella sativa) با خواص ضدالتهابی، ضدآلرژی و آنتیاکسیدان. با مهار مسیر NF-κB تولید سایتوکاینهای پیشالتهابی را کاهش میدهد.",
|
||||||
wikiId: "black-cumin"
|
wikiId: "thymoquinone"
|
||||||
},
|
},
|
||||||
"امگا ۳": {
|
"امگا ۳": {
|
||||||
term: "امگا ۳ (Omega-3)",
|
term: "امگا ۳",
|
||||||
definition: "اسیدهای چرب ضروری شامل EPA و DHA که برای سلامت پوست، مو، قلب و عملکرد مغز حیاتی هستند.",
|
definition: "اسیدهای چرب ضروری شامل EPA و DHA که برای سلامت پوست، مو، قلب و عملکرد شناختی حیاتی هستند. EPA پیشماده رزولوینهای ضدالتهابی و DHA ۳۰٪ وزن خشک مغز را تشکیل میدهد.",
|
||||||
wikiId: "salmon-oil"
|
wikiId: "omega3"
|
||||||
},
|
},
|
||||||
"میکروسیلور": {
|
"میکروسیلور": {
|
||||||
term: "نقره میکروسیلور (Microsilver BG)",
|
term: "نقره میکروسیلور (Microsilver BG)",
|
||||||
@ -37,97 +37,52 @@ export const SCIENTIFIC_TERMS: Record<string, ScientificTerm> = {
|
|||||||
},
|
},
|
||||||
"صدف لبسبز": {
|
"صدف لبسبز": {
|
||||||
term: "صدف لبسبز (Green-lipped Mussel)",
|
term: "صدف لبسبز (Green-lipped Mussel)",
|
||||||
definition: "صدف بومی نیوزلند حاوی گلوکوزامینگلیکانهای طبیعی که نقش کلیدی در ساخت و بازسازی غضروفها ایفا میکند.",
|
definition: "صدف بومی نیوزلند حاوی گلوکوزامینگلیکانهای طبیعی که نقش حیاتی در بازسازی غضروف و مفاصل دارند.",
|
||||||
wikiId: "green-mussel"
|
wikiId: "joints"
|
||||||
},
|
},
|
||||||
"نسبت Ca:P": {
|
"نسبت Ca:P": {
|
||||||
term: "نسبت کلسیم به فسفر (Ca:P Ratio)",
|
term: "نسبت کلسیم به فسفر (Ca:P Ratio)",
|
||||||
definition: "نسبت کلسیم به فسفر جهت حفظ سلامت استخوانها و کلیه. پودر پوسته تخم مرغ بهترین تنظیمکننده این نسبت است.",
|
definition: "نسبت ایدهآل کلسیم به فسفر در رژیم حیوانات ۱.۲:۱ تا ۱.۵:۱ است. عدم تعادل این نسبت منجر به مشکلات کلیوی و استخوانی میشود. پودر پوسته تخم مرغ کانینا با ۳۶٪ کلسیم و ۰.۱٪ فسفر بهترین تنظیمکننده این نسبت است.",
|
||||||
wikiId: "eggshell"
|
wikiId: "nutrition"
|
||||||
},
|
},
|
||||||
"ویتامین D3": {
|
"ویتامین D3": {
|
||||||
term: "ویتامین D3 (کولهکلسیفرول)",
|
term: "ویتامین D3 (کولهکلسیفرول)",
|
||||||
definition: "فرمی فعال از ویتامین D که جذب کلسیم از روده را افزایش داده و به سلامت استخوانها کمک میکند.",
|
definition: "فرم فعال ویتامین D که جذب کلسیم از روده را تا ۳۰٪ افزایش میدهد. هشدار: مصرف همزمان با ویتامین D2 (ارگوکلسیفرول) مجاز نیست زیرا رقابت این دو جذب مؤثر را کاهش میدهد.",
|
||||||
wikiId: "vitamins"
|
wikiId: "vitamins"
|
||||||
},
|
},
|
||||||
"BARF": {
|
"BARF": {
|
||||||
term: "رژیم غذایی خام (BARF)",
|
term: "رژیم BARF (Biologically Appropriate Raw Food)",
|
||||||
definition: "رژیم غذایی خام طبیعی شامل گوشت و استخوان که مکملهای پوسته تخم مرغ و پودر خون برای تکمیل آن طراحی شدهاند.",
|
definition: "رژیم غذایی خام متناسب با زیستشناسی حیوان که شامل گوشت خام، استخوان، اندامها و سبزیجات است. مکملهای کانینا مانند Eierschalenpulver، Rinderblut Pulver و Rinderfett Pulver برای تکمیل این رژیم طراحی شدهاند.",
|
||||||
wikiId: "eggshell"
|
wikiId: "nutrition"
|
||||||
},
|
},
|
||||||
"آغوز": {
|
"آغوز": {
|
||||||
term: "آغوز (Colostrum)",
|
term: "آغوز (Colostrum)",
|
||||||
definition: "اولین شیر پستانداران پس از زایمان، غنی از ایمونوگلوبولینها جهت فعالسازی فوری سیستم ایمنی نوزادان.",
|
definition: "اولین شیر پستانداران حاوی IgG, IgA, IgM و لاکتوفرین که سد دفاعی روده را تقویت کرده و ایمنی غیرفعال منتقل میکند. محصول Immun-Booster کانینا حاوی ۲۰٪ پودر آغوز است.",
|
||||||
wikiId: "colostrum"
|
wikiId: "immune"
|
||||||
},
|
},
|
||||||
"ال-کارنیتین": {
|
"ال-کارنیتین": {
|
||||||
term: "ال-کارنیتین (L-Carnitine)",
|
term: "ال-کارنیتین",
|
||||||
definition: "آمینو اسیدی که وظیفه انتقال اسیدهای چرب به درون میتوکندری جهت تولید انرژی و تقویت عملکرد قلب را دارد.",
|
definition: "مادهای شبهآمینواسید که اسیدهای چرب زنجیره بلند را به داخل میتوکندری کاردیومیوسیتها منتقل کرده و ATP تولید میکند. محصول Herz Vital کانینا حاوی ۳۰,۰۰۰mg/kg ال-کارنیتین است.",
|
||||||
wikiId: "l-carnitine"
|
wikiId: "heart"
|
||||||
},
|
},
|
||||||
"زالزالک": {
|
"زالزالک": {
|
||||||
term: "زالزالک (Hawthorn)",
|
term: "زالزالک (Crataegus oxyacantha)",
|
||||||
definition: "عصاره گیاهی تقویتکننده عملکرد انقباضی عضله قلب و بهبودبخش گردش خون عروق کرونر.",
|
definition: "گیاه دارویی با اثر مهارکننده ACE طبیعی که جریان خون کرونر را بهبود بخشیده و فشار بر قلب را کاهش میدهد.",
|
||||||
wikiId: "hawthorn"
|
wikiId: "heart"
|
||||||
},
|
},
|
||||||
"بیوتین": {
|
"بیوتین": {
|
||||||
term: "بیوتین (Biotin / Vitamin H)",
|
term: "بیوتین (ویتامین H / B7)",
|
||||||
definition: "کوآنزیم ضروری برای ساخت کراتین و جلوگیری از ریزش مو و تقویت ناخنها و پنجههای حیوان.",
|
definition: "کوآنزیم کربوکسیلازهای مسئول سنتز اسیدهای چرب و گلوکونئوژنز. کمبود آن منجر به ریزش مو و شکنندگی پنجه میشود. قرص Biotin-Tabs کانینا با ۱,۰۰۰,۰۰۰ میکروگرم در کیلوگرم قویترین دوز موجود است.",
|
||||||
wikiId: "biotin"
|
wikiId: "skin"
|
||||||
},
|
},
|
||||||
"هیدروکسی آپاتیت": {
|
"هیدروکسی آپاتیت": {
|
||||||
term: "هیدروکسی آپاتیت (Hydroxyapatite)",
|
term: "هیدروکسی آپاتیت",
|
||||||
definition: "ترکیب کلسیم فسفات طبیعی که بخش عمده استخوان و دندانها را تشکیل داده و موجب افزایش استحکام اسکلت میشود.",
|
definition: "کلسیم فسفات بلوری که ۹۰٪ بافت دندان و بخش عمده استخوان را تشکیل میدهد. با جذب مستقیم در توده استخوانی، استحکام اسکلت را تضمین میکند.",
|
||||||
wikiId: "green-mussel"
|
wikiId: "joints"
|
||||||
},
|
},
|
||||||
"EPA/DHA": {
|
"EPA/DHA": {
|
||||||
term: "EPA و DHA",
|
term: "EPA و DHA",
|
||||||
definition: "اسیدهای چرب بلندزنجیره امگا ۳ که اثرات ضدالتهابی عمیق داشته و برای رشد سیستم عصبی و چشمها حیاتی هستند.",
|
definition: "ایکوزاپنتائنوئیک اسید (EPA) پیشماده رزولوینهای ضدالتهابی و دوکوزاهگزانوئیک اسید (DHA) ۳۰٪ وزن خشک مغز را تشکیل میدهد. نسبت ۳:۲ EPA:DHA در روغن سالمون کانینا بهینهسازی شده است.",
|
||||||
wikiId: "salmon-oil"
|
wikiId: "omega3"
|
||||||
},
|
|
||||||
"روغن ماهی سالمون": {
|
|
||||||
term: "روغن ماهی سالمون (Salmon Oil)",
|
|
||||||
definition: "منبع ۱۰۰٪ خالص و طبیعی اسیدهای چرب امگا ۳ که کیفیت پوست و مو را ارتقا داده و مفاصل را روان میکند.",
|
|
||||||
wikiId: "salmon-oil"
|
|
||||||
},
|
|
||||||
"سیاه دانه": {
|
|
||||||
term: "سیاه دانه (Black Cumin)",
|
|
||||||
definition: "دانه گیاه سیاه دانه مصری با خواص قوی ضدآلرژی، تقویتکننده سیستم ایمنی و هضم بهتر غذا.",
|
|
||||||
wikiId: "black-cumin"
|
|
||||||
},
|
|
||||||
"جلبک دریایی": {
|
|
||||||
term: "جلبک دریایی (Seaweed)",
|
|
||||||
definition: "جلبک قهوهای غنی از اسیدهای آمینه و مواد معدنی کمیاب (به ویژه ید) جهت تقویت رنگدانههای پوشش، بینی و پنجهها.",
|
|
||||||
wikiId: "seaweed"
|
|
||||||
},
|
|
||||||
"پوسته تخم مرغ": {
|
|
||||||
term: "پودر پوسته تخم مرغ (Eggshell Powder)",
|
|
||||||
definition: "منبع کلسیم ارگانیک صد درصد خالص با جذب بسیار بالا و مناسب برای رژیمهای بدون استخوان یا حساسیتهای غذایی.",
|
|
||||||
wikiId: "eggshell"
|
|
||||||
},
|
|
||||||
"پیت": {
|
|
||||||
term: "عصاره پیت (Peat Extract / Moor)",
|
|
||||||
definition: "عصاره طبیعی حاصل از تجزیه گیاهان در طول هزاران سال، غنی از اسیدهای هومیک برای تنظیم فلور گوارشی.",
|
|
||||||
wikiId: "peat-extract"
|
|
||||||
},
|
|
||||||
"اسید دودکانوئیک": {
|
|
||||||
term: "اسید دودکانوئیک (Dodecanoic Acid)",
|
|
||||||
definition: "اسید چرب با منشأ گیاهی با اثر دفعکننده حشرات موذی نظیر کنه، کک و شپش از محیط زندگی پت.",
|
|
||||||
wikiId: "dodecanoic"
|
|
||||||
},
|
|
||||||
"هیالورونات سدیم": {
|
|
||||||
term: "هیالورونات سدیم (Sodium Hyaluronate)",
|
|
||||||
definition: "روانکننده و رطوبترسان طبیعی قرنیه چشم جهت شستشو و تسکین چشمهای تحریک شده و گریان.",
|
|
||||||
wikiId: "hyaluronic"
|
|
||||||
},
|
|
||||||
"روغن کالاندولا": {
|
|
||||||
term: "روغن کالاندولا و سنجد دریایی (Calendula & Sea Buckthorn)",
|
|
||||||
definition: "روغنهای تسکیندهنده، ضدباکتری و التیامبخش پوست جهت بهبود سوزش، زخمهای سطحی و خشکی پنجهها.",
|
|
||||||
wikiId: "calendula-sea-buckthorn"
|
|
||||||
},
|
|
||||||
"تورین": {
|
|
||||||
term: "تورین (Taurine)",
|
|
||||||
definition: "آمینو اسید بسیار ضروری برای گربهها جهت جلوگیری از دژنراسیون شبکیه (نابینایی) و نارسایی قلبی.",
|
|
||||||
wikiId: "taurin"
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
const baseURL = typeof window !== 'undefined' ? '/api' : (process.env.NEXT_PUBLIC_API_URL || (process.env.NODE_ENV === 'development' ? 'http://localhost:4001/api' : 'https://apicanina.parsaaghayi.ir/api'));
|
const baseURL = typeof window !== 'undefined' ? '/api' : (process.env.NEXT_PUBLIC_API_URL || 'https://apicanina.parsaaghayi.ir/api');
|
||||||
|
|
||||||
const api = axios.create({
|
const api = axios.create({
|
||||||
baseURL,
|
baseURL,
|
||||||
|
|||||||
@ -55,7 +55,7 @@ export class ProductService {
|
|||||||
specialBadge: data.specialBadge,
|
specialBadge: data.specialBadge,
|
||||||
onSetOfAction: data.onSetOfAction,
|
onSetOfAction: data.onSetOfAction,
|
||||||
optimisticTemplate: data.optimisticTemplate,
|
optimisticTemplate: data.optimisticTemplate,
|
||||||
feedingAdvice: data.dosageLogic || data.feedingAdvice || '',
|
feedingAdvice: data.feedingAdvice,
|
||||||
image: data.imageUrl?.startsWith('http') ? data.imageUrl : data.imageUrl ? `/api${data.imageUrl}` : data.image,
|
image: data.imageUrl?.startsWith('http') ? data.imageUrl : data.imageUrl ? `/api${data.imageUrl}` : data.image,
|
||||||
|
|
||||||
main_ingredients: data.ingredientList?.map((i: any) => i.ingredient) || data.ingredients?.split(/[،,-]/).map((s: string) => s.trim()).filter(Boolean) || [],
|
main_ingredients: data.ingredientList?.map((i: any) => i.ingredient) || data.ingredients?.split(/[،,-]/).map((s: string) => s.trim()).filter(Boolean) || [],
|
||||||
|
|||||||