Merge version_3 into main #7

Merged
bender merged 7 commits from version_3 into main 2026-03-04 05:56:26 +00:00
7 changed files with 32 additions and 32 deletions

View File

@@ -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`)

View File

@@ -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
View File

@@ -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",

View File

@@ -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",

View File

@@ -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" },
@@ -72,7 +72,7 @@ export default function LandingPage() {
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"
@@ -189,7 +189,7 @@ export default function LandingPage() {
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: [
@@ -238,7 +238,7 @@ export default function LandingPage() {
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"

View File

@@ -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(),
}}
>

View File

@@ -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);
}