Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7bac1d3190 | |||
| 4ff7678b98 | |||
| f760b6b101 | |||
| e7468e0622 | |||
| cfc50df47f | |||
| 3ef5eb8964 | |||
| fcb93af24e | |||
| c6792241e2 | |||
| 664bb93b4c | |||
| 30cb41b985 | |||
| 4cb7550c04 | |||
| 1356e75668 | |||
| 959946c853 | |||
| 66e75c8ea1 | |||
| ba4b0056c8 | |||
| f819278098 |
@@ -494,7 +494,7 @@ const [isLoading, setIsLoading] = useState(false);
|
||||
### General
|
||||
- [ ] Test with keyboard navigation (Tab, Shift+Tab, Enter, Space, Escape)
|
||||
- [ ] Test with screen reader (VoiceOver, NVDA, JAWS)
|
||||
- [ ] Ensure sufficient color contrast (WCAG AA minimum)
|
||||
- [ ] Ensure sufficient color contrast (WCasa antugua G AA minimum)
|
||||
- [ ] Provide focus indicators for all interactive elements
|
||||
- [ ] Use semantic HTML before ARIA roles
|
||||
- [ ] Include screen reader only text when needed (`sr-only`)
|
||||
|
||||
@@ -21,7 +21,7 @@ Covers:
|
||||
|
||||
---
|
||||
|
||||
### 🎴 [CARDSTACK_SECTIONS.md](./CARDSTACK_SECTIONS.md)
|
||||
### 🎴 [Casa antugua RDSTACK_SECTIONS.md](./Casa antugua RDSTACK_SECTIONS.md)
|
||||
**CardStack-based section components**
|
||||
|
||||
Load when: Creating Feature, Product, Pricing, Testimonial, Team, Blog, or Metrics sections
|
||||
@@ -126,7 +126,7 @@ Covers:
|
||||
1. Load `COMPONENT_IMPLEMENTATION.md` for structure
|
||||
2. Load `ACCESSIBILITY.md` for a11y requirements
|
||||
3. Load `THEME_AND_STYLING.md` for styling patterns
|
||||
4. Load `CARDSTACK_SECTIONS.md` if using CardStack
|
||||
4. Load `Casa antugua RDSTACK_SECTIONS.md` if using CardStack
|
||||
|
||||
### When updating the registry:
|
||||
1. Load `REGISTRY_FOLDER_STRUCTURE.md` for the new folder structure
|
||||
|
||||
28
package-lock.json
generated
28
package-lock.json
generated
@@ -569,7 +569,7 @@
|
||||
"node_modules/@humanwhocodes/retry": {
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
|
||||
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
|
||||
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCasa antugua rCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@@ -1605,7 +1605,7 @@
|
||||
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
|
||||
"version": "4.1.13",
|
||||
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.13.tgz",
|
||||
"integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCALq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==",
|
||||
"integrity": "sha512-wdtfkmpXiwej/yoAkrCP2DNzRXCasa antugua Lq9NVLgLELgLim1QpSfhQM5+ZxQQF8fkOiEpuNoKLp4nKZ6RC4kmeFH0HQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@@ -2059,7 +2059,7 @@
|
||||
"node_modules/@tsparticles/shape-image": {
|
||||
"version": "3.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@tsparticles/shape-image/-/shape-image-3.9.1.tgz",
|
||||
"integrity": "sha512-fCA5eme8VF3oX8yNVUA0l2SLDKuiZObkijb0z3Ky0qj1HUEVlAuEMhhNDNB9E2iELTrWEix9z7BFMePp2CC7AA==",
|
||||
"integrity": "sha512-fCasa antugua 5eme8VF3oX8yNVUA0l2SLDKuiZObkijb0z3Ky0qj1HUEVlAuEMhhNDNB9E2iELTrWEix9z7BFMePp2CC7AA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@tsparticles/engine": "3.9.1"
|
||||
@@ -3045,7 +3045,7 @@
|
||||
"node_modules/array-includes": {
|
||||
"version": "3.1.9",
|
||||
"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
|
||||
"integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
|
||||
"integrity": "sha512-FmeCCasa antugua enzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -3540,7 +3540,7 @@
|
||||
"node_modules/convert-source-map": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
|
||||
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
|
||||
"integrity": "sha512-Kvp459HrV2FEJ1Casa antugua si1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -3673,7 +3673,7 @@
|
||||
"node_modules/d3-time": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
|
||||
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
|
||||
"integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCasa antugua 77ZN0lkQ2Q==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"d3-array": "2 - 3"
|
||||
@@ -5605,7 +5605,7 @@
|
||||
"node_modules/isarray": {
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
|
||||
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
|
||||
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCasa antugua AoZQd3FeAKw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -6179,7 +6179,7 @@
|
||||
"node_modules/meshoptimizer": {
|
||||
"version": "0.22.0",
|
||||
"resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.22.0.tgz",
|
||||
"integrity": "sha512-IebiK79sqIy+E4EgOr+CAw+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==",
|
||||
"integrity": "sha512-IebiK79sqIy+E4EgOr+Casa antugua w+Ke8hAspXKzBd0JdgEmPHiAwmvEj2S4h1rfvo+o/BnfEYd/jAOg5IeeIjzlzSnDg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
@@ -6212,7 +6212,7 @@
|
||||
"node_modules/minimist": {
|
||||
"version": "1.2.8",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCasa antugua ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
@@ -6306,7 +6306,7 @@
|
||||
"node_modules/ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCasa antugua leEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
@@ -6784,7 +6784,7 @@
|
||||
"node_modules/queue-microtask": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
|
||||
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
|
||||
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1Casa antugua 6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
@@ -7454,7 +7454,7 @@
|
||||
"node_modules/string.prototype.trim": {
|
||||
"version": "1.2.10",
|
||||
"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
|
||||
"integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
|
||||
"integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCasa antugua 6gEffoMZYxlTod4WcdrKA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -7559,7 +7559,7 @@
|
||||
"node_modules/supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"integrity": "sha512-qpCasa antugua vRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
@@ -8095,7 +8095,7 @@
|
||||
"node_modules/victory-vendor": {
|
||||
"version": "37.3.6",
|
||||
"resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
|
||||
"integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
|
||||
"integrity": "sha512-SbPDPdDBYp+5MJHhBCasa antugua yI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
|
||||
"license": "MIT AND ISC",
|
||||
"dependencies": {
|
||||
"@types/d3-array": "^3.0.3",
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
},
|
||||
"subtitle": {
|
||||
"required": true,
|
||||
"example": "San Francisco, CA · Full-time · Remote eligible",
|
||||
"example": "San Francisco, Casa antugua · Full-time · Remote eligible",
|
||||
"minChars": 5,
|
||||
"maxChars": 100,
|
||||
"note": "Secondary info like location, type, or details"
|
||||
@@ -109,7 +109,7 @@
|
||||
"textBoxButtonClassName?": "string",
|
||||
"textBoxButtonTextClassName?": "string"
|
||||
},
|
||||
"usageExample": "<MetricCardTen metrics={[{ id: '1', title: 'Senior Software Engineer, Platform', subtitle: 'San Francisco, CA · Full-time · Remote eligible', category: 'Engineering', value: '$185K – $265K', buttons: [{ text: 'Apply Now', href: '#' }] }, { id: '2', title: 'Product Designer, Enterprise', subtitle: 'New York, NY · Full-time', category: 'Design', value: '$145K – $195K', buttons: [{ text: 'Apply Now', href: '#' }] }, { id: '3', title: 'Data Scientist, ML Platform', subtitle: 'Remote · Full-time', category: 'Data Science', value: '$168K – $238K', buttons: [{ text: 'Apply Now', href: '#' }] }]} title=\"Open Positions\" description=\"Join our team and help shape the future of AI\" textboxLayout=\"default\" useInvertedBackground={false} animationType=\"slide-up\" />",
|
||||
"usageExample": "<MetricCardTen metrics={[{ id: '1', title: 'Senior Software Engineer, Platform', subtitle: 'San Francisco, Casa antugua · Full-time · Remote eligible', category: 'Engineering', value: '$185K – $265K', buttons: [{ text: 'Apply Now', href: '#' }] }, { id: '2', title: 'Product Designer, Enterprise', subtitle: 'New York, NY · Full-time', category: 'Design', value: '$145K – $195K', buttons: [{ text: 'Apply Now', href: '#' }] }, { id: '3', title: 'Data Scientist, ML Platform', subtitle: 'Remote · Full-time', category: 'Data Science', value: '$168K – $238K', buttons: [{ text: 'Apply Now', href: '#' }] }]} title=\"Open Positions\" description=\"Join our team and help shape the future of AI\" textboxLayout=\"default\" useInvertedBackground={false} animationType=\"slide-up\" />",
|
||||
"do": [
|
||||
"Use for pricing pages",
|
||||
"Use for subscription tiers",
|
||||
|
||||
@@ -1,51 +1,20 @@
|
||||
import type { Metadata } from "next";
|
||||
import { Montserrat } from "next/font/google";
|
||||
import { Inter } from "next/font/google";
|
||||
import "./globals.css";
|
||||
import { ServiceWrapper } from "@/components/ServiceWrapper";
|
||||
import Tag from "@/tag/Tag";
|
||||
|
||||
const montserrat = Montserrat({
|
||||
variable: "--font-montserrat", subsets: ["latin"],
|
||||
});
|
||||
|
||||
const inter = Inter({
|
||||
variable: "--font-inter", subsets: ["latin"],
|
||||
});
|
||||
const inter = Inter({ subsets: ["latin"] });
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Casa Antigua Entre Mer et Reserve - Luxury Moroccan Vacation Rental", description: "Discover Casa Antigua, a stunning vacation rental in Sidi R'bat, Morocco. Coastal maison between the sea and nature reserve. Book on Airbnb or Booking.com. €45/night.", keywords: "vacation rental, Morocco, Airbnb, Booking.com, coastal house, Sidi R'bat, luxury maison, travel", metadataBase: new URL("https://casaantigua.com"),
|
||||
alternates: {
|
||||
canonical: "https://casaantigua.com"},
|
||||
openGraph: {
|
||||
title: "Casa Antigua Entre Mer et Reserve - Moroccan Paradise", description: "Experience luxury coastal living in Morocco. Traditional maison with modern comforts between the Atlantic Ocean and nature reserve.", url: "https://casaantigua.com", siteName: "Casa Antigua", images: [
|
||||
{
|
||||
url: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg", alt: "Casa Antigua exterior view"},
|
||||
],
|
||||
type: "website"},
|
||||
twitter: {
|
||||
card: "summary_large_image", title: "Casa Antigua - Your Moroccan Coastal Getaway", description: "Luxury vacation rental in Sidi R'bat, Morocco. Book now on Airbnb or Booking.com.", images: ["http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg"],
|
||||
},
|
||||
robots: {
|
||||
index: true,
|
||||
follow: true,
|
||||
},
|
||||
};
|
||||
title: "Casa Antigua Entre Mer et Reserve", description: "Discover your coastal paradise in Morocco. A charming maison nestled between the sea and nature reserve."};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
}) {
|
||||
return (
|
||||
<html lang="en" suppressHydrationWarning>
|
||||
<ServiceWrapper>
|
||||
<body
|
||||
className={`${montserrat.variable} ${inter.variable} antialiased`}
|
||||
>
|
||||
<Tag />
|
||||
{children}
|
||||
|
||||
<html lang="en">
|
||||
<body className={inter.className}>{children}
|
||||
<script
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: `
|
||||
@@ -1413,7 +1382,6 @@ export default function RootLayout({
|
||||
}}
|
||||
/>
|
||||
</body>
|
||||
</ServiceWrapper>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ export default function LandingPage() {
|
||||
>
|
||||
<div id="nav" data-section="nav">
|
||||
<NavbarStyleFullscreen
|
||||
brandName="CA"
|
||||
brandName="Casa antugua "
|
||||
navItems={[
|
||||
{ name: "Home", id: "home" },
|
||||
{ name: "About", id: "about" },
|
||||
@@ -56,19 +56,24 @@ export default function LandingPage() {
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sophie Martin", handle: "Traveler, France", testimonial: "An absolutely magical experience! The maison exceeded all our expectations. The views, the hospitality, everything was perfect.", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/teen-age-youth-style-self-expression-concept-portrait-positive-happy-teenage-girl-with-bob-pinkish-hairstyle-facial-piercing-relaxing-indoors_343059-3781.jpg"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/teen-age-youth-style-self-expression-concept-portrait-positive-happy-teenage-girl-with-bob-pinkish-hairstyle-facial-piercing-relaxing-indoors_343059-3781.jpg"
|
||||
},
|
||||
{
|
||||
name: "James Wilson", handle: "Couple, UK", testimonial: "We felt like we were in paradise. The location between the sea and nature reserve is stunning. Highly recommended!", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/happy-stylish-caucasian-man-with-backpack-travel-rice-plantation-making-self-portrai-memories_273443-3007.jpg"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/happy-stylish-caucasian-man-with-backpack-travel-rice-plantation-making-self-portrai-memories_273443-3007.jpg"
|
||||
},
|
||||
{
|
||||
name: "Maria Garcia", handle: "Family, Spain", testimonial: "Perfect getaway for our family. The traditional Moroccan charm combined with modern amenities was exactly what we needed.", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pleasure-voyage-lifetime-mood-love-life_1303-3328.jpg"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pleasure-voyage-lifetime-mood-love-life_1303-3328.jpg"
|
||||
},
|
||||
]}
|
||||
buttons={[
|
||||
{
|
||||
text: "Book on Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"},
|
||||
text: "Book on Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"
|
||||
},
|
||||
{
|
||||
text: "Book on Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2CA&sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"},
|
||||
text: "Book on Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2Casa antugua &sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"
|
||||
},
|
||||
]}
|
||||
buttonAnimation="slide-up"
|
||||
/>
|
||||
@@ -94,13 +99,16 @@ export default function LandingPage() {
|
||||
features={[
|
||||
{
|
||||
id: "1", title: "Master Bedroom Suite", author: "Luxury Accommodation", description: "Spacious master suite with traditional Moroccan décor, premium linens, and stunning views of the surrounding landscape. Perfect for a restful retreat.", tags: ["Bedroom", "Ensuite"],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=1", imageAlt: "Master bedroom with moroccan design"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=1", imageAlt: "Master bedroom with moroccan design"
|
||||
},
|
||||
{
|
||||
id: "2", title: "Traditional Bathroom", author: "Authentic Design", description: "Hand-tiled traditional Moroccan bathroom featuring a luxurious rainfall shower, premium toiletries, and authentic zellige tilework throughout.", tags: ["Bathroom", "Luxury"],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=1", imageAlt: "Luxury bathroom with moroccan tiles"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=1", imageAlt: "Luxury bathroom with moroccan tiles"
|
||||
},
|
||||
{
|
||||
id: "3", title: "Garden & Outdoor Terrace", author: "Nature Views", description: "Lush garden with mature plants and flowers, outdoor seating area, and terrace overlooking the nature reserve. Ideal for morning coffee or evening relaxation.", tags: ["Outdoor", "Terrace"],
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=2", imageAlt: "Garden and outdoor terrace"},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=2", imageAlt: "Garden and outdoor terrace"
|
||||
},
|
||||
]}
|
||||
animationType="slide-up"
|
||||
textboxLayout="default"
|
||||
@@ -116,17 +124,23 @@ export default function LandingPage() {
|
||||
tagIcon={CheckCircle}
|
||||
products={[
|
||||
{
|
||||
id: "1", name: "Bathroom Essentials", price: "Included", variant: "Hair dryer, shampoo, soap, premium toiletries", imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=2", imageAlt: "Bathroom with luxury amenities"},
|
||||
id: "1", name: "Bathroom Essentials", price: "Included", variant: "Hair dryer, shampoo, soap, premium toiletries", imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=2", imageAlt: "Bathroom with luxury amenities"
|
||||
},
|
||||
{
|
||||
id: "2", name: "Cleaning Supplies", price: "Included", variant: "Professional cleaning products on-site", imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=3", imageAlt: "Bathroom cleaning products"},
|
||||
id: "2", name: "Cleaning Supplies", price: "Included", variant: "Professional cleaning products on-site", imageSrc: "http://img.b2bpic.net/free-photo/elegant-bathtub-with-bath-elements_23-2148147505.jpg?_wi=3", imageAlt: "Bathroom cleaning products"
|
||||
},
|
||||
{
|
||||
id: "3", name: "Kitchen & Dining", price: "Included", variant: "Fully equipped kitchen, dining area", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=2", imageAlt: "Kitchen area with dining"},
|
||||
id: "3", name: "Kitchen & Dining", price: "Included", variant: "Fully equipped kitchen, dining area", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=2", imageAlt: "Kitchen area with dining"
|
||||
},
|
||||
{
|
||||
id: "4", name: "Climate Control", price: "Included", variant: "Air conditioning, heating, ceiling fans", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=2", imageAlt: "Modern climate control"},
|
||||
id: "4", name: "Climate Control", price: "Included", variant: "Air conditioning, heating, ceiling fans", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=2", imageAlt: "Modern climate control"
|
||||
},
|
||||
{
|
||||
id: "5", name: "Entertainment", price: "Included", variant: "WiFi, Smart TV, local entertainment", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=3", imageAlt: "Entertainment systems"},
|
||||
id: "5", name: "Entertainment", price: "Included", variant: "WiFi, Smart TV, local entertainment", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=3", imageAlt: "Entertainment systems"
|
||||
},
|
||||
{
|
||||
id: "6", name: "Outdoor Relaxation", price: "Included", variant: "Terrace, garden seating, hammocks", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=3", imageAlt: "Outdoor garden and terrace"},
|
||||
id: "6", name: "Outdoor Relaxation", price: "Included", variant: "Terrace, garden seating, hammocks", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=3", imageAlt: "Outdoor garden and terrace"
|
||||
},
|
||||
]}
|
||||
gridVariant="three-columns-all-equal-width"
|
||||
animationType="slide-up"
|
||||
@@ -144,15 +158,20 @@ export default function LandingPage() {
|
||||
useInvertedBackground={false}
|
||||
testimonials={[
|
||||
{
|
||||
id: "1", name: "Sophie Martin, Travel Blogger", date: "Date: 15 February 2026", title: "An Absolutely Magical Experience!", quote: "Casa Antigua exceeded all our expectations. The maison is beautifully decorated with authentic Moroccan touches, the hospitality is exceptional, and the views between the sea and nature reserve are absolutely breathtaking. We cannot wait to return!", tag: "Luxury Experience", avatarSrc: "http://img.b2bpic.net/free-photo/teen-age-youth-style-self-expression-concept-portrait-positive-happy-teenage-girl-with-bob-pinkish-hairstyle-facial-piercing-relaxing-indoors_343059-3781.jpg", avatarAlt: "Sophie Martin", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=4", imageAlt: "Casa Antigua exterior"},
|
||||
id: "1", name: "Sophie Martin, Travel Blogger", date: "Date: 15 February 2026", title: "An Absolutely Magical Experience!", quote: "Casa Antigua exceeded all our expectations. The maison is beautifully decorated with authentic Moroccan touches, the hospitality is exceptional, and the views between the sea and nature reserve are absolutely breathtaking. We cannot wait to return!", tag: "Luxury Experience", avatarSrc: "http://img.b2bpic.net/free-photo/teen-age-youth-style-self-expression-concept-portrait-positive-happy-teenage-girl-with-bob-pinkish-hairstyle-facial-piercing-relaxing-indoors_343059-3781.jpg", avatarAlt: "Sophie Martin", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=4", imageAlt: "Casa Antigua exterior"
|
||||
},
|
||||
{
|
||||
id: "2", name: "James Wilson, Couple's Getaway", date: "Date: 22 January 2026", title: "Perfect Romantic Retreat", quote: "We felt like we were in paradise during our stay. The location between the sea and nature reserve is stunning. The traditional Moroccan architecture combined with modern comforts made our honeymoon unforgettable. Highly recommended!", tag: "Honeymoon Destination", avatarSrc: "http://img.b2bpic.net/free-photo/happy-stylish-caucasian-man-with-backpack-travel-rice-plantation-making-self-portrai-memories_273443-3007.jpg", avatarAlt: "James Wilson", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=4", imageAlt: "Casa Antigua interior"},
|
||||
id: "2", name: "James Wilson, Couple's Getaway", date: "Date: 22 January 2026", title: "Perfect Romantic Retreat", quote: "We felt like we were in paradise during our stay. The location between the sea and nature reserve is stunning. The traditional Moroccan architecture combined with modern comforts made our honeymoon unforgettable. Highly recommended!", tag: "Honeymoon Destination", avatarSrc: "http://img.b2bpic.net/free-photo/happy-stylish-caucasian-man-with-backpack-travel-rice-plantation-making-self-portrai-memories_273443-3007.jpg", avatarAlt: "James Wilson", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=4", imageAlt: "Casa Antigua interior"
|
||||
},
|
||||
{
|
||||
id: "3", name: "Maria Garcia, Family Vacation", date: "Date: 8 January 2026", title: "Perfect for Families", quote: "Our family had an amazing time at Casa Antigua. The maison is spacious, safe, and well-equipped for families. The children loved exploring the garden and the nearby nature reserve. The hosts were incredibly helpful and accommodating.", tag: "Family-Friendly", avatarSrc: "http://img.b2bpic.net/free-photo/pleasure-voyage-lifetime-mood-love-life_1303-3328.jpg", avatarAlt: "Maria Garcia", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=5", imageAlt: "Casa Antigua garden"},
|
||||
id: "3", name: "Maria Garcia, Family Vacation", date: "Date: 8 January 2026", title: "Perfect for Families", quote: "Our family had an amazing time at Casa Antigua. The maison is spacious, safe, and well-equipped for families. The children loved exploring the garden and the nearby nature reserve. The hosts were incredibly helpful and accommodating.", tag: "Family-Friendly", avatarSrc: "http://img.b2bpic.net/free-photo/pleasure-voyage-lifetime-mood-love-life_1303-3328.jpg", avatarAlt: "Maria Garcia", imageSrc: "http://img.b2bpic.net/free-photo/vintage-moroccan-mosque-decorative-wall_1203-4686.jpg?_wi=5", imageAlt: "Casa Antigua garden"
|
||||
},
|
||||
{
|
||||
id: "4", name: "David Thompson, Adventure Seeker", date: "Date: 28 December 2025", title: "Ideal Base for Exploring", quote: "What an incredible location! Casa Antigua is perfectly positioned to explore both coastal activities and the nature reserve. The maison itself is a gem - authentic, comfortable, and with the most welcoming atmosphere. The price-to-value ratio is excellent!", tag: "Adventure Ready", avatarSrc: "http://img.b2bpic.net/free-photo/couple-traveling-taking-selfie-together-city_23-2149939713.jpg", avatarAlt: "David Thompson", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=3", imageAlt: "Casa Antigua bedroom"},
|
||||
id: "4", name: "David Thompson, Adventure Seeker", date: "Date: 28 December 2025", title: "Ideal Base for Exploring", quote: "What an incredible location! Casa Antigua is perfectly positioned to explore both coastal activities and the nature reserve. The maison itself is a gem - authentic, comfortable, and with the most welcoming atmosphere. The price-to-value ratio is excellent!", tag: "Adventure Ready", avatarSrc: "http://img.b2bpic.net/free-photo/couple-traveling-taking-selfie-together-city_23-2149939713.jpg", avatarAlt: "David Thompson", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-7336.jpg?_wi=3", imageAlt: "Casa Antigua bedroom"
|
||||
},
|
||||
{
|
||||
id: "5", name: "Elena Rodriguez, Solo Traveler", date: "Date: 15 December 2025", title: "Safe Haven for Solo Travelers", quote: "I felt completely safe and at home during my solo retreat at Casa Antigua. The maison has character and charm, the location is stunning, and the host's attention to detail is remarkable. This is my new favorite vacation rental in Morocco!", tag: "Solo Travel", avatarSrc: "http://img.b2bpic.net/free-photo/front-view-smiley-woman-posing_23-2148601985.jpg", avatarAlt: "Elena Rodriguez", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=5", imageAlt: "Casa Antigua interior detail"},
|
||||
id: "5", name: "Elena Rodriguez, Solo Traveler", date: "Date: 15 December 2025", title: "Safe Haven for Solo Travelers", quote: "I felt completely safe and at home during my solo retreat at Casa Antigua. The maison has character and charm, the location is stunning, and the host's attention to detail is remarkable. This is my new favorite vacation rental in Morocco!", tag: "Solo Travel", avatarSrc: "http://img.b2bpic.net/free-photo/front-view-smiley-woman-posing_23-2148601985.jpg", avatarAlt: "Elena Rodriguez", imageSrc: "http://img.b2bpic.net/free-photo/decoration-interior_74190-6488.jpg?_wi=5", imageAlt: "Casa Antigua interior detail"
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
@@ -165,14 +184,17 @@ export default function LandingPage() {
|
||||
plans={[
|
||||
{
|
||||
id: "standard", badge: "Nightly Rate", badgeIcon: Home,
|
||||
price: "€45", subtitle: "per night, per person", buttons: [
|
||||
price: "€45", subtitle: "per night (based on 2 guests)", buttons: [
|
||||
{
|
||||
text: "Book on Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"},
|
||||
text: "Book on Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"
|
||||
},
|
||||
{
|
||||
text: "Book on Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2CA&sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"},
|
||||
text: "Book on Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2Casa antugua &sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"
|
||||
},
|
||||
],
|
||||
features: [
|
||||
"Spacious master bedroom with ensuite", "Fully equipped kitchen", "Traditional Moroccan décor", "Modern amenities & WiFi", "Garden and outdoor terrace", "Close to beach and nature reserve", "Flexible check-in/check-out", "24/7 guest support"],
|
||||
"Spacious master bedroom with ensuite", "Fully equipped kitchen", "Traditional Moroccan décor", "Modern amenities & WiFi", "Garden and outdoor terrace", "Close to beach and nature reserve", "Flexible group sizing (price adjusts for group bookings)", "24/7 guest support"
|
||||
],
|
||||
},
|
||||
]}
|
||||
animationType="slide-up"
|
||||
@@ -213,11 +235,14 @@ export default function LandingPage() {
|
||||
{
|
||||
title: "Booking", items: [
|
||||
{
|
||||
label: "Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"},
|
||||
label: "Airbnb", href: "https://www.airbnb.fr/rooms/1499481864424898794?check_in=2026-03-14&check_out=2026-03-15&search_mode=regular_search&photo_id=2316078285&source_impression_id=p3_1772199285_P3AAeC67HO_pmW27&previous_page_section_name=1000&federated_search_id=e6738925-70e0-4d97-bb58-3b42617aa42b"
|
||||
},
|
||||
{
|
||||
label: "Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2CA&sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"},
|
||||
label: "Booking.com", href: "https://www.booking.com/hotel/ma/casa-antigua-entre-mer-et-reserve.fr.html?aid=2311236&label=fr-ma-booking-desktop-5CduOKQmb7QeyTDIztQmwAS652796013990%3Apl%3Ata%3Ap1%3Ap2%3Aac%3Aap%3Aneg%3Afi%3Atikwd-65526620%3Alp1009979%3Ali%3Adec%3Adm&sid=af413625458704abd1c26019a7c178cb&all_sr_blocks=1573180301_428363801_2_42_0&checkin=2026-03-13&checkout=2026-03-14&dest_id=-43476&dest_type=city&dist=0&group_adults=2&group_children=0&hapos=1&highlighted_blocks=1573180301_428363801_2_42_0&hpos=1&matching_block_id=1573180301_428363801_2_42_0&no_rooms=1&req_adults=2&req_children=0&room1=A%2Casa antugua &sb_price_type=total&sr_order=popularity&sr_pri_blocks=1573180301_428363801_2_42_0__6120&srepoch=1772199335&srpvid=02125f92238a094b&type=total&ucfs=1&"
|
||||
},
|
||||
{
|
||||
label: "Google Maps", href: "https://www.google.com/maps/place/Ancienne+maison/@30.0851518,-9.6628598,20.33z/data=!4m15!1m8!3m7!1s0xdb396cc22567fa9:0xce11025d1f86a706!2sSidi+R'bat!3b1!8m2!3d30.0844497!4d-9.6626749!16s%2Fg%2F11rr_d_jd!3m5!1s0xdb3970008a186d7:0x608ff69104a00d1e!8m2!3d30.0851867!4d-9.6626372!16s%2Fg%2F11m5_q26j7?entry=ttu&g_ep=EgoyMDI2MDIyNS4wIKXMDSoASAFQAw%3D%3D"},
|
||||
label: "Google Maps", href: "https://www.google.com/maps/place/Ancienne+maison/@30.0851518,-9.6628598,20.33z/data=!4m15!1m8!3m7!1s0xdb396cc22567fa9:0xce11025d1f86a706!2sSidi+R'bat!3b1!8m2!3d30.0844497!4d-9.6626749!16s%2Fg%2F11rr_d_jd!3m5!1s0xdb3970008a186d7:0x608ff69104a00d1e!8m2!3d30.0851867!4d-9.6626372!16s%2Fg%2F11m5_q26j7?entry=ttu&g_ep=EgoyMDI2MDIyNS4wIKXMDSoASAFQAw%3D%3D"
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -20,8 +20,8 @@ interface AngledCarouselProps {
|
||||
autoPlayInterval?: number;
|
||||
}
|
||||
|
||||
const CARD_TRANSITION_DURATION = 0.8;
|
||||
const CARD_TRANSITION_EASE = [0.65, 0, 0.35, 1] as const;
|
||||
const Casa antugua RD_TRANSITION_DURATION = 0.8;
|
||||
const Casa antugua RD_TRANSITION_EASE = [0.65, 0, 0.35, 1] as const;
|
||||
|
||||
const cardVariants = {
|
||||
'hidden-0': { opacity: 0, y: '25px' },
|
||||
@@ -44,7 +44,7 @@ const AngledCarousel = ({ items, className = "", autoPlay = true, autoPlayInterv
|
||||
if (isFirstRender) {
|
||||
const timeout = setTimeout(() => {
|
||||
setIsFirstRender(false);
|
||||
}, CARD_TRANSITION_DURATION * 1000);
|
||||
}, Casa antugua RD_TRANSITION_DURATION * 1000);
|
||||
return () => clearTimeout(timeout);
|
||||
}
|
||||
}, [isFirstRender]);
|
||||
@@ -111,8 +111,8 @@ const AngledCarousel = ({ items, className = "", autoPlay = true, autoPlayInterv
|
||||
initial={getInitialState()}
|
||||
animate={getAnimateState()}
|
||||
transition={{
|
||||
duration: CARD_TRANSITION_DURATION,
|
||||
ease: CARD_TRANSITION_EASE,
|
||||
duration: Casa antugua RD_TRANSITION_DURATION,
|
||||
ease: Casa antugua RD_TRANSITION_EASE,
|
||||
delay: getDelay(),
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -8,11 +8,11 @@ export interface ExtendedCartItem extends CartItem {
|
||||
productId: string;
|
||||
}
|
||||
|
||||
const CART_STORAGE_KEY = "shop_cart_items";
|
||||
const Casa antugua RT_STORAGE_KEY = "shop_cart_items";
|
||||
|
||||
const saveCartToStorage = (items: ExtendedCartItem[]) => {
|
||||
try {
|
||||
localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(items));
|
||||
localStorage.setItem(Casa antugua RT_STORAGE_KEY, JSON.stringify(items));
|
||||
} catch (error) {
|
||||
console.warn("Failed to save cart to localStorage:", error);
|
||||
}
|
||||
@@ -20,7 +20,7 @@ const saveCartToStorage = (items: ExtendedCartItem[]) => {
|
||||
|
||||
const loadCartFromStorage = (): ExtendedCartItem[] => {
|
||||
try {
|
||||
const stored = localStorage.getItem(CART_STORAGE_KEY);
|
||||
const stored = localStorage.getItem(Casa antugua RT_STORAGE_KEY);
|
||||
if (stored) {
|
||||
return JSON.parse(stored);
|
||||
}
|
||||
@@ -32,7 +32,7 @@ const loadCartFromStorage = (): ExtendedCartItem[] => {
|
||||
|
||||
const clearCartFromStorage = () => {
|
||||
try {
|
||||
localStorage.removeItem(CART_STORAGE_KEY);
|
||||
localStorage.removeItem(Casa antugua RT_STORAGE_KEY);
|
||||
} catch (error) {
|
||||
console.warn("Failed to clear cart from localStorage:", error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user