diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000000..6227a0179be --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,31 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: [ mit ] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./dist + publish_branch: gh-pages diff --git a/index.html b/index.html index 095fb3a4537..5341172bd3d 100644 --- a/index.html +++ b/index.html @@ -4,9 +4,25 @@ Vite + React + TS +
+ diff --git a/package-lock.json b/package-lock.json index 836b9e63b46..a46693e4d65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.3", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", "@types/node": "^20.14.10", @@ -1184,9 +1184,9 @@ } }, "node_modules/@mate-academy/scripts": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-1.8.5.tgz", - "integrity": "sha512-mHRY2FkuoYCf5U0ahIukkaRo5LSZsxrTSgMJheFoyf3VXsTvfM9OfWcZIDIDB521kdPrScHHnRp+JRNjCfUO5A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mate-academy/scripts/-/scripts-2.1.3.tgz", + "integrity": "sha512-a07wHTj/1QUK2Aac5zHad+sGw4rIvcNl5lJmJpAD7OxeSbnCdyI6RXUHwXhjF5MaVo9YHrJ0xVahyERS2IIyBQ==", "dev": true, "dependencies": { "@octokit/rest": "^17.11.2", diff --git a/package.json b/package.json index ae251685c8b..2e14a3c94bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react_phone-catalog", - "homepage": "react_phone-catalog", + "homepage": "https://mitnues.github.io/react_phone-catalog/", "version": "0.1.0", "keywords": [], "author": "Mate Academy", @@ -16,7 +16,7 @@ }, "devDependencies": { "@cypress/react18": "^2.0.1", - "@mate-academy/scripts": "^1.8.5", + "@mate-academy/scripts": "^2.1.3", "@mate-academy/students-ts-config": "*", "@mate-academy/stylelint-config": "*", "@types/node": "^20.14.10", diff --git a/public/.nojekyll b/public/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/public/404.html b/public/404.html new file mode 100644 index 00000000000..7d29f78c320 --- /dev/null +++ b/public/404.html @@ -0,0 +1,22 @@ + + + + + Phone Catalog + + + + + diff --git a/public/api/accessories.json b/public/api/accessories.json index 6a36890cec7..fa274bc408e 100644 --- a/public/api/accessories.json +++ b/public/api/accessories.json @@ -11,9 +11,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "space gray", "images": [ - "img/accessories/apple-watch-series-3/space-gray/00.webp", - "img/accessories/apple-watch-series-3/space-gray/01.webp", - "img/accessories/apple-watch-series-3/space-gray/02.webp" + "/img/accessories/apple-watch-series-3/space-gray/00.webp", + "/img/accessories/apple-watch-series-3/space-gray/01.webp", + "/img/accessories/apple-watch-series-3/space-gray/02.webp" ], "description": [ { @@ -53,9 +53,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "space gray", "images": [ - "img/accessories/apple-watch-series-3/space-gray/00.webp", - "img/accessories/apple-watch-series-3/space-gray/01.webp", - "img/accessories/apple-watch-series-3/space-gray/02.webp" + "/img/accessories/apple-watch-series-3/space-gray/00.webp", + "/img/accessories/apple-watch-series-3/space-gray/01.webp", + "/img/accessories/apple-watch-series-3/space-gray/02.webp" ], "description": [ { @@ -95,9 +95,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-3/gold/00.webp", - "img/accessories/apple-watch-series-3/gold/01.webp", - "img/accessories/apple-watch-series-3/gold/02.webp" + "/img/accessories/apple-watch-series-3/gold/00.webp", + "/img/accessories/apple-watch-series-3/gold/01.webp", + "/img/accessories/apple-watch-series-3/gold/02.webp" ], "description": [ { @@ -137,9 +137,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-3/gold/00.webp", - "img/accessories/apple-watch-series-3/gold/01.webp", - "img/accessories/apple-watch-series-3/gold/02.webp" + "/img/accessories/apple-watch-series-3/gold/00.webp", + "/img/accessories/apple-watch-series-3/gold/01.webp", + "/img/accessories/apple-watch-series-3/gold/02.webp" ], "description": [ { @@ -179,9 +179,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-3/silver/00.webp", - "img/accessories/apple-watch-series-3/silver/01.webp", - "img/accessories/apple-watch-series-3/silver/02.webp" + "/img/accessories/apple-watch-series-3/silver/00.webp", + "/img/accessories/apple-watch-series-3/silver/01.webp", + "/img/accessories/apple-watch-series-3/silver/02.webp" ], "description": [ { @@ -221,9 +221,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-3/silver/00.webp", - "img/accessories/apple-watch-series-3/silver/01.webp", - "img/accessories/apple-watch-series-3/silver/02.webp" + "/img/accessories/apple-watch-series-3/silver/00.webp", + "/img/accessories/apple-watch-series-3/silver/01.webp", + "/img/accessories/apple-watch-series-3/silver/02.webp" ], "description": [ { @@ -263,9 +263,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "space gray", "images": [ - "img/accessories/apple-watch-series-6/space-gray/00.webp", - "img/accessories/apple-watch-series-6/space-gray/01.webp", - "img/accessories/apple-watch-series-6/space-gray/02.webp" + "/img/accessories/apple-watch-series-6/space-gray/00.webp", + "/img/accessories/apple-watch-series-6/space-gray/01.webp", + "/img/accessories/apple-watch-series-6/space-gray/02.webp" ], "description": [ { @@ -305,9 +305,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "space gray", "images": [ - "img/accessories/apple-watch-series-6/space-gray/00.webp", - "img/accessories/apple-watch-series-6/space-gray/01.webp", - "img/accessories/apple-watch-series-6/space-gray/02.webp" + "/img/accessories/apple-watch-series-6/space-gray/00.webp", + "/img/accessories/apple-watch-series-6/space-gray/01.webp", + "/img/accessories/apple-watch-series-6/space-gray/02.webp" ], "description": [ { @@ -347,9 +347,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-6/silver/00.webp", - "img/accessories/apple-watch-series-6/silver/01.webp", - "img/accessories/apple-watch-series-6/silver/02.webp" + "/img/accessories/apple-watch-series-6/silver/00.webp", + "/img/accessories/apple-watch-series-6/silver/01.webp", + "/img/accessories/apple-watch-series-6/silver/02.webp" ], "description": [ { @@ -389,9 +389,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-6/silver/00.webp", - "img/accessories/apple-watch-series-6/silver/01.webp", - "img/accessories/apple-watch-series-6/silver/02.webp" + "/img/accessories/apple-watch-series-6/silver/00.webp", + "/img/accessories/apple-watch-series-6/silver/01.webp", + "/img/accessories/apple-watch-series-6/silver/02.webp" ], "description": [ { @@ -431,9 +431,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-6/gold/00.webp", - "img/accessories/apple-watch-series-6/gold/01.webp", - "img/accessories/apple-watch-series-6/gold/02.webp" + "/img/accessories/apple-watch-series-6/gold/00.webp", + "/img/accessories/apple-watch-series-6/gold/01.webp", + "/img/accessories/apple-watch-series-6/gold/02.webp" ], "description": [ { @@ -473,9 +473,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-6/gold/00.webp", - "img/accessories/apple-watch-series-6/gold/01.webp", - "img/accessories/apple-watch-series-6/gold/02.webp" + "/img/accessories/apple-watch-series-6/gold/00.webp", + "/img/accessories/apple-watch-series-6/gold/01.webp", + "/img/accessories/apple-watch-series-6/gold/02.webp" ], "description": [ { @@ -515,9 +515,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "blue", "images": [ - "img/accessories/apple-watch-series-6/blue/00.webp", - "img/accessories/apple-watch-series-6/blue/01.webp", - "img/accessories/apple-watch-series-6/blue/02.webp" + "/img/accessories/apple-watch-series-6/blue/00.webp", + "/img/accessories/apple-watch-series-6/blue/01.webp", + "/img/accessories/apple-watch-series-6/blue/02.webp" ], "description": [ { @@ -557,9 +557,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "blue", "images": [ - "img/accessories/apple-watch-series-6/blue/00.webp", - "img/accessories/apple-watch-series-6/blue/01.webp", - "img/accessories/apple-watch-series-6/blue/02.webp" + "/img/accessories/apple-watch-series-6/blue/00.webp", + "/img/accessories/apple-watch-series-6/blue/01.webp", + "/img/accessories/apple-watch-series-6/blue/02.webp" ], "description": [ { @@ -599,9 +599,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "red", "images": [ - "img/accessories/apple-watch-series-6/red/00.webp", - "img/accessories/apple-watch-series-6/red/01.webp", - "img/accessories/apple-watch-series-6/red/02.webp" + "/img/accessories/apple-watch-series-6/red/00.webp", + "/img/accessories/apple-watch-series-6/red/01.webp", + "/img/accessories/apple-watch-series-6/red/02.webp" ], "description": [ { @@ -641,9 +641,9 @@ "colorsAvailable": ["space gray", "silver", "gold", "blue", "red"], "color": "red", "images": [ - "img/accessories/apple-watch-series-6/red/00.webp", - "img/accessories/apple-watch-series-6/red/01.webp", - "img/accessories/apple-watch-series-6/red/02.webp" + "/img/accessories/apple-watch-series-6/red/00.webp", + "/img/accessories/apple-watch-series-6/red/01.webp", + "/img/accessories/apple-watch-series-6/red/02.webp" ], "description": [ { @@ -683,9 +683,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-5/silver/00.webp", - "img/accessories/apple-watch-series-5/silver/01.webp", - "img/accessories/apple-watch-series-5/silver/02.webp" + "/img/accessories/apple-watch-series-5/silver/00.webp", + "/img/accessories/apple-watch-series-5/silver/01.webp", + "/img/accessories/apple-watch-series-5/silver/02.webp" ], "description": [ { @@ -725,9 +725,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-5/silver/00.webp", - "img/accessories/apple-watch-series-5/silver/01.webp", - "img/accessories/apple-watch-series-5/silver/02.webp" + "/img/accessories/apple-watch-series-5/silver/00.webp", + "/img/accessories/apple-watch-series-5/silver/01.webp", + "/img/accessories/apple-watch-series-5/silver/02.webp" ], "description": [ { @@ -767,9 +767,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-5/gold/00.webp", - "img/accessories/apple-watch-series-5/gold/01.webp", - "img/accessories/apple-watch-series-5/gold/02.webp" + "/img/accessories/apple-watch-series-5/gold/00.webp", + "/img/accessories/apple-watch-series-5/gold/01.webp", + "/img/accessories/apple-watch-series-5/gold/02.webp" ], "description": [ { @@ -809,9 +809,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-5/gold/00.webp", - "img/accessories/apple-watch-series-5/gold/01.webp", - "img/accessories/apple-watch-series-5/gold/02.webp" + "/img/accessories/apple-watch-series-5/gold/00.webp", + "/img/accessories/apple-watch-series-5/gold/01.webp", + "/img/accessories/apple-watch-series-5/gold/02.webp" ], "description": [ { @@ -851,9 +851,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "space-gray", "images": [ - "img/accessories/apple-watch-series-5/space-gray/00.webp", - "img/accessories/apple-watch-series-5/space-gray/01.webp", - "img/accessories/apple-watch-series-5/space-gray/02.webp" + "/img/accessories/apple-watch-series-5/space-gray/00.webp", + "/img/accessories/apple-watch-series-5/space-gray/01.webp", + "/img/accessories/apple-watch-series-5/space-gray/02.webp" ], "description": [ { @@ -893,9 +893,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "space-gray", "images": [ - "img/accessories/apple-watch-series-5/space-gray/00.webp", - "img/accessories/apple-watch-series-5/space-gray/01.webp", - "img/accessories/apple-watch-series-5/space-gray/02.webp" + "/img/accessories/apple-watch-series-5/space-gray/00.webp", + "/img/accessories/apple-watch-series-5/space-gray/01.webp", + "/img/accessories/apple-watch-series-5/space-gray/02.webp" ], "description": [ { @@ -935,9 +935,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-4/silver/00.webp", - "img/accessories/apple-watch-series-4/silver/01.webp", - "img/accessories/apple-watch-series-4/silver/02.webp" + "/img/accessories/apple-watch-series-4/silver/00.webp", + "/img/accessories/apple-watch-series-4/silver/01.webp", + "/img/accessories/apple-watch-series-4/silver/02.webp" ], "description": [ { @@ -977,9 +977,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "silver", "images": [ - "img/accessories/apple-watch-series-4/silver/00.webp", - "img/accessories/apple-watch-series-4/silver/01.webp", - "img/accessories/apple-watch-series-4/silver/02.webp" + "/img/accessories/apple-watch-series-4/silver/00.webp", + "/img/accessories/apple-watch-series-4/silver/01.webp", + "/img/accessories/apple-watch-series-4/silver/02.webp" ], "description": [ { @@ -1019,9 +1019,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-4/gold/00.webp", - "img/accessories/apple-watch-series-4/gold/01.webp", - "img/accessories/apple-watch-series-4/gold/02.webp" + "/img/accessories/apple-watch-series-4/gold/00.webp", + "/img/accessories/apple-watch-series-4/gold/01.webp", + "/img/accessories/apple-watch-series-4/gold/02.webp" ], "description": [ { @@ -1061,9 +1061,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "gold", "images": [ - "img/accessories/apple-watch-series-4/gold/00.webp", - "img/accessories/apple-watch-series-4/gold/01.webp", - "img/accessories/apple-watch-series-4/gold/02.webp" + "/img/accessories/apple-watch-series-4/gold/00.webp", + "/img/accessories/apple-watch-series-4/gold/01.webp", + "/img/accessories/apple-watch-series-4/gold/02.webp" ], "description": [ { @@ -1103,9 +1103,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "space-gray", "images": [ - "img/accessories/apple-watch-series-4/space-gray/00.webp", - "img/accessories/apple-watch-series-4/space-gray/01.webp", - "img/accessories/apple-watch-series-4/space-gray/02.webp" + "/img/accessories/apple-watch-series-4/space-gray/00.webp", + "/img/accessories/apple-watch-series-4/space-gray/01.webp", + "/img/accessories/apple-watch-series-4/space-gray/02.webp" ], "description": [ { @@ -1145,9 +1145,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "space-gray", "images": [ - "img/accessories/apple-watch-series-4/space-gray/00.webp", - "img/accessories/apple-watch-series-4/space-gray/01.webp", - "img/accessories/apple-watch-series-4/space-gray/02.webp" + "/img/accessories/apple-watch-series-4/space-gray/00.webp", + "/img/accessories/apple-watch-series-4/space-gray/01.webp", + "/img/accessories/apple-watch-series-4/space-gray/02.webp" ], "description": [ { @@ -1187,9 +1187,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "silver", "images": [ - "img/accessories/apple-watch-se/silver/00.webp", - "img/accessories/apple-watch-se/silver/01.webp", - "img/accessories/apple-watch-se/silver/02.webp" + "/img/accessories/apple-watch-se/silver/00.webp", + "/img/accessories/apple-watch-se/silver/01.webp", + "/img/accessories/apple-watch-se/silver/02.webp" ], "description": [ { @@ -1229,9 +1229,9 @@ "colorsAvailable": ["silver", "gold", "space gray"], "color": "silver", "images": [ - "img/accessories/apple-watch-se/silver/00.webp", - "img/accessories/apple-watch-se/silver/01.webp", - "img/accessories/apple-watch-se/silver/02.webp" + "/img/accessories/apple-watch-se/silver/00.webp", + "/img/accessories/apple-watch-se/silver/01.webp", + "/img/accessories/apple-watch-se/silver/02.webp" ], "description": [ { @@ -1271,9 +1271,9 @@ "colorsAvailable": ["silver", "space gray", "gold"], "color": "gold", "images": [ - "img/accessories/apple-watch-se/gold/00.webp", - "img/accessories/apple-watch-se/gold/01.webp", - "img/accessories/apple-watch-se/gold/02.webp" + "/img/accessories/apple-watch-se/gold/00.webp", + "/img/accessories/apple-watch-se/gold/01.webp", + "/img/accessories/apple-watch-se/gold/02.webp" ], "description": [ { @@ -1313,9 +1313,9 @@ "colorsAvailable": ["space gray", "silver", "gold"], "color": "gold", "images": [ - "img/accessories/apple-watch-se/gold/00.webp", - "img/accessories/apple-watch-se/gold/01.webp", - "img/accessories/apple-watch-se/gold/02.webp" + "/img/accessories/apple-watch-se/gold/00.webp", + "/img/accessories/apple-watch-se/gold/01.webp", + "/img/accessories/apple-watch-se/gold/02.webp" ], "description": [ { @@ -1355,9 +1355,9 @@ "colorsAvailable": ["silver", "space gray", "gold"], "color": "space gray", "images": [ - "img/accessories/apple-watch-se/space-gray/00.webp", - "img/accessories/apple-watch-se/space-gray/01.webp", - "img/accessories/apple-watch-se/space-gray/02.webp" + "/img/accessories/apple-watch-se/space-gray/00.webp", + "/img/accessories/apple-watch-se/space-gray/01.webp", + "/img/accessories/apple-watch-se/space-gray/02.webp" ], "description": [ { @@ -1397,9 +1397,9 @@ "colorsAvailable": ["silver", "space gray", "gold"], "color": "space gray", "images": [ - "img/accessories/apple-watch-se/space-gray/00.webp", - "img/accessories/apple-watch-se/space-gray/01.webp", - "img/accessories/apple-watch-se/space-gray/02.webp" + "/img/accessories/apple-watch-se/space-gray/00.webp", + "/img/accessories/apple-watch-se/space-gray/01.webp", + "/img/accessories/apple-watch-se/space-gray/02.webp" ], "description": [ { diff --git a/public/api/phones.json b/public/api/phones.json index e1535893222..cb5c7a2d0ae 100644 --- a/public/api/phones.json +++ b/public/api/phones.json @@ -11,11 +11,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-11/black/00.webp", - "img/phones/apple-iphone-11/black/01.webp", - "img/phones/apple-iphone-11/black/02.webp", - "img/phones/apple-iphone-11/black/03.webp", - "img/phones/apple-iphone-11/black/04.webp" + "/img/phones/apple-iphone-11/black/00.webp", + "/img/phones/apple-iphone-11/black/01.webp", + "/img/phones/apple-iphone-11/black/02.webp", + "/img/phones/apple-iphone-11/black/03.webp", + "/img/phones/apple-iphone-11/black/04.webp" ], "description": [ { @@ -59,11 +59,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "green", "images": [ - "img/phones/apple-iphone-11/green/00.webp", - "img/phones/apple-iphone-11/green/01.webp", - "img/phones/apple-iphone-11/green/02.webp", - "img/phones/apple-iphone-11/green/03.webp", - "img/phones/apple-iphone-11/green/04.webp" + "/img/phones/apple-iphone-11/green/00.webp", + "/img/phones/apple-iphone-11/green/01.webp", + "/img/phones/apple-iphone-11/green/02.webp", + "/img/phones/apple-iphone-11/green/03.webp", + "/img/phones/apple-iphone-11/green/04.webp" ], "description": [ { @@ -107,11 +107,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-11/purple/00.webp", - "img/phones/apple-iphone-11/purple/01.webp", - "img/phones/apple-iphone-11/purple/02.webp", - "img/phones/apple-iphone-11/purple/03.webp", - "img/phones/apple-iphone-11/purple/04.webp" + "/img/phones/apple-iphone-11/purple/00.webp", + "/img/phones/apple-iphone-11/purple/01.webp", + "/img/phones/apple-iphone-11/purple/02.webp", + "/img/phones/apple-iphone-11/purple/03.webp", + "/img/phones/apple-iphone-11/purple/04.webp" ], "description": [ { @@ -155,11 +155,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-11/red/00.webp", - "img/phones/apple-iphone-11/red/01.webp", - "img/phones/apple-iphone-11/red/02.webp", - "img/phones/apple-iphone-11/red/03.webp", - "img/phones/apple-iphone-11/red/04.webp" + "/img/phones/apple-iphone-11/red/00.webp", + "/img/phones/apple-iphone-11/red/01.webp", + "/img/phones/apple-iphone-11/red/02.webp", + "/img/phones/apple-iphone-11/red/03.webp", + "/img/phones/apple-iphone-11/red/04.webp" ], "description": [ { @@ -203,11 +203,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-11/white/00.webp", - "img/phones/apple-iphone-11/white/01.webp", - "img/phones/apple-iphone-11/white/02.webp", - "img/phones/apple-iphone-11/white/03.webp", - "img/phones/apple-iphone-11/white/04.webp" + "/img/phones/apple-iphone-11/white/00.webp", + "/img/phones/apple-iphone-11/white/01.webp", + "/img/phones/apple-iphone-11/white/02.webp", + "/img/phones/apple-iphone-11/white/03.webp", + "/img/phones/apple-iphone-11/white/04.webp" ], "description": [ { @@ -251,11 +251,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "yellow", "images": [ - "img/phones/apple-iphone-11/yellow/00.webp", - "img/phones/apple-iphone-11/yellow/01.webp", - "img/phones/apple-iphone-11/yellow/02.webp", - "img/phones/apple-iphone-11/yellow/03.webp", - "img/phones/apple-iphone-11/yellow/04.webp" + "/img/phones/apple-iphone-11/yellow/00.webp", + "/img/phones/apple-iphone-11/yellow/01.webp", + "/img/phones/apple-iphone-11/yellow/02.webp", + "/img/phones/apple-iphone-11/yellow/03.webp", + "/img/phones/apple-iphone-11/yellow/04.webp" ], "description": [ { @@ -299,11 +299,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-11/black/00.webp", - "img/phones/apple-iphone-11/black/01.webp", - "img/phones/apple-iphone-11/black/02.webp", - "img/phones/apple-iphone-11/black/03.webp", - "img/phones/apple-iphone-11/black/04.webp" + "/img/phones/apple-iphone-11/black/00.webp", + "/img/phones/apple-iphone-11/black/01.webp", + "/img/phones/apple-iphone-11/black/02.webp", + "/img/phones/apple-iphone-11/black/03.webp", + "/img/phones/apple-iphone-11/black/04.webp" ], "description": [ { @@ -347,11 +347,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "green", "images": [ - "img/phones/apple-iphone-11/green/00.webp", - "img/phones/apple-iphone-11/green/01.webp", - "img/phones/apple-iphone-11/green/02.webp", - "img/phones/apple-iphone-11/green/03.webp", - "img/phones/apple-iphone-11/green/04.webp" + "/img/phones/apple-iphone-11/green/00.webp", + "/img/phones/apple-iphone-11/green/01.webp", + "/img/phones/apple-iphone-11/green/02.webp", + "/img/phones/apple-iphone-11/green/03.webp", + "/img/phones/apple-iphone-11/green/04.webp" ], "description": [ { @@ -395,11 +395,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-11/purple/00.webp", - "img/phones/apple-iphone-11/purple/01.webp", - "img/phones/apple-iphone-11/purple/02.webp", - "img/phones/apple-iphone-11/purple/03.webp", - "img/phones/apple-iphone-11/purple/04.webp" + "/img/phones/apple-iphone-11/purple/00.webp", + "/img/phones/apple-iphone-11/purple/01.webp", + "/img/phones/apple-iphone-11/purple/02.webp", + "/img/phones/apple-iphone-11/purple/03.webp", + "/img/phones/apple-iphone-11/purple/04.webp" ], "description": [ { @@ -443,11 +443,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-11/red/00.webp", - "img/phones/apple-iphone-11/red/01.webp", - "img/phones/apple-iphone-11/red/02.webp", - "img/phones/apple-iphone-11/red/03.webp", - "img/phones/apple-iphone-11/red/04.webp" + "/img/phones/apple-iphone-11/red/00.webp", + "/img/phones/apple-iphone-11/red/01.webp", + "/img/phones/apple-iphone-11/red/02.webp", + "/img/phones/apple-iphone-11/red/03.webp", + "/img/phones/apple-iphone-11/red/04.webp" ], "description": [ { @@ -491,11 +491,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-11/white/00.webp", - "img/phones/apple-iphone-11/white/01.webp", - "img/phones/apple-iphone-11/white/02.webp", - "img/phones/apple-iphone-11/white/03.webp", - "img/phones/apple-iphone-11/white/04.webp" + "/img/phones/apple-iphone-11/white/00.webp", + "/img/phones/apple-iphone-11/white/01.webp", + "/img/phones/apple-iphone-11/white/02.webp", + "/img/phones/apple-iphone-11/white/03.webp", + "/img/phones/apple-iphone-11/white/04.webp" ], "description": [ { @@ -539,11 +539,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "yellow", "images": [ - "img/phones/apple-iphone-11/yellow/00.webp", - "img/phones/apple-iphone-11/yellow/01.webp", - "img/phones/apple-iphone-11/yellow/02.webp", - "img/phones/apple-iphone-11/yellow/03.webp", - "img/phones/apple-iphone-11/yellow/04.webp" + "/img/phones/apple-iphone-11/yellow/00.webp", + "/img/phones/apple-iphone-11/yellow/01.webp", + "/img/phones/apple-iphone-11/yellow/02.webp", + "/img/phones/apple-iphone-11/yellow/03.webp", + "/img/phones/apple-iphone-11/yellow/04.webp" ], "description": [ { @@ -587,11 +587,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-11/black/00.webp", - "img/phones/apple-iphone-11/black/01.webp", - "img/phones/apple-iphone-11/black/02.webp", - "img/phones/apple-iphone-11/black/03.webp", - "img/phones/apple-iphone-11/black/04.webp" + "/img/phones/apple-iphone-11/black/00.webp", + "/img/phones/apple-iphone-11/black/01.webp", + "/img/phones/apple-iphone-11/black/02.webp", + "/img/phones/apple-iphone-11/black/03.webp", + "/img/phones/apple-iphone-11/black/04.webp" ], "description": [ { @@ -635,11 +635,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "green", "images": [ - "img/phones/apple-iphone-11/green/00.webp", - "img/phones/apple-iphone-11/green/01.webp", - "img/phones/apple-iphone-11/green/02.webp", - "img/phones/apple-iphone-11/green/03.webp", - "img/phones/apple-iphone-11/green/04.webp" + "/img/phones/apple-iphone-11/green/00.webp", + "/img/phones/apple-iphone-11/green/01.webp", + "/img/phones/apple-iphone-11/green/02.webp", + "/img/phones/apple-iphone-11/green/03.webp", + "/img/phones/apple-iphone-11/green/04.webp" ], "description": [ { @@ -683,11 +683,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-11/purple/00.webp", - "img/phones/apple-iphone-11/purple/01.webp", - "img/phones/apple-iphone-11/purple/02.webp", - "img/phones/apple-iphone-11/purple/03.webp", - "img/phones/apple-iphone-11/purple/04.webp" + "/img/phones/apple-iphone-11/purple/00.webp", + "/img/phones/apple-iphone-11/purple/01.webp", + "/img/phones/apple-iphone-11/purple/02.webp", + "/img/phones/apple-iphone-11/purple/03.webp", + "/img/phones/apple-iphone-11/purple/04.webp" ], "description": [ { @@ -731,11 +731,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-11/red/00.webp", - "img/phones/apple-iphone-11/red/01.webp", - "img/phones/apple-iphone-11/red/02.webp", - "img/phones/apple-iphone-11/red/03.webp", - "img/phones/apple-iphone-11/red/04.webp" + "/img/phones/apple-iphone-11/red/00.webp", + "/img/phones/apple-iphone-11/red/01.webp", + "/img/phones/apple-iphone-11/red/02.webp", + "/img/phones/apple-iphone-11/red/03.webp", + "/img/phones/apple-iphone-11/red/04.webp" ], "description": [ { @@ -779,11 +779,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-11/white/00.webp", - "img/phones/apple-iphone-11/white/01.webp", - "img/phones/apple-iphone-11/white/02.webp", - "img/phones/apple-iphone-11/white/03.webp", - "img/phones/apple-iphone-11/white/04.webp" + "/img/phones/apple-iphone-11/white/00.webp", + "/img/phones/apple-iphone-11/white/01.webp", + "/img/phones/apple-iphone-11/white/02.webp", + "/img/phones/apple-iphone-11/white/03.webp", + "/img/phones/apple-iphone-11/white/04.webp" ], "description": [ { @@ -827,11 +827,11 @@ "colorsAvailable": ["black", "green", "yellow", "white", "purple", "red"], "color": "yellow", "images": [ - "img/phones/apple-iphone-11/yellow/00.webp", - "img/phones/apple-iphone-11/yellow/01.webp", - "img/phones/apple-iphone-11/yellow/02.webp", - "img/phones/apple-iphone-11/yellow/03.webp", - "img/phones/apple-iphone-11/yellow/04.webp" + "/img/phones/apple-iphone-11/yellow/00.webp", + "/img/phones/apple-iphone-11/yellow/01.webp", + "/img/phones/apple-iphone-11/yellow/02.webp", + "/img/phones/apple-iphone-11/yellow/03.webp", + "/img/phones/apple-iphone-11/yellow/04.webp" ], "description": [ { @@ -875,9 +875,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro/gold/00.webp", - "img/phones/apple-iphone-11-pro/gold/01.webp", - "img/phones/apple-iphone-11-pro/gold/02.webp" + "/img/phones/apple-iphone-11-pro/gold/00.webp", + "/img/phones/apple-iphone-11-pro/gold/01.webp", + "/img/phones/apple-iphone-11-pro/gold/02.webp" ], "description": [ { @@ -921,10 +921,10 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/02.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/03.webp" + "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/02.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/03.webp" ], "description": [ { @@ -968,9 +968,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro/silver/00.webp", - "img/phones/apple-iphone-11-pro/silver/01.webp", - "img/phones/apple-iphone-11-pro/silver/02.webp" + "/img/phones/apple-iphone-11-pro/silver/00.webp", + "/img/phones/apple-iphone-11-pro/silver/01.webp", + "/img/phones/apple-iphone-11-pro/silver/02.webp" ], "description": [ { @@ -1014,9 +1014,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro/spacegray/00.webp", - "img/phones/apple-iphone-11-pro/spacegray/01.webp", - "img/phones/apple-iphone-11-pro/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro/spacegray/02.webp" ], "description": [ { @@ -1060,9 +1060,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro/gold/00.webp", - "img/phones/apple-iphone-11-pro/gold/01.webp", - "img/phones/apple-iphone-11-pro/gold/02.webp" + "/img/phones/apple-iphone-11-pro/gold/00.webp", + "/img/phones/apple-iphone-11-pro/gold/01.webp", + "/img/phones/apple-iphone-11-pro/gold/02.webp" ], "description": [ { @@ -1106,10 +1106,10 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/02.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/03.webp" + "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/02.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/03.webp" ], "description": [ { @@ -1153,9 +1153,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro/silver/00.webp", - "img/phones/apple-iphone-11-pro/silver/01.webp", - "img/phones/apple-iphone-11-pro/silver/02.webp" + "/img/phones/apple-iphone-11-pro/silver/00.webp", + "/img/phones/apple-iphone-11-pro/silver/01.webp", + "/img/phones/apple-iphone-11-pro/silver/02.webp" ], "description": [ { @@ -1199,9 +1199,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro/spacegray/00.webp", - "img/phones/apple-iphone-11-pro/spacegray/01.webp", - "img/phones/apple-iphone-11-pro/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro/spacegray/02.webp" ], "description": [ { @@ -1245,9 +1245,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro/gold/00.webp", - "img/phones/apple-iphone-11-pro/gold/01.webp", - "img/phones/apple-iphone-11-pro/gold/02.webp" + "/img/phones/apple-iphone-11-pro/gold/00.webp", + "/img/phones/apple-iphone-11-pro/gold/01.webp", + "/img/phones/apple-iphone-11-pro/gold/02.webp" ], "description": [ { @@ -1291,10 +1291,10 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/02.webp", - "img/phones/apple-iphone-11-pro/midnightgreen/03.webp" + "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/02.webp", + "/img/phones/apple-iphone-11-pro/midnightgreen/03.webp" ], "description": [ { @@ -1338,9 +1338,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro/silver/00.webp", - "img/phones/apple-iphone-11-pro/silver/01.webp", - "img/phones/apple-iphone-11-pro/silver/02.webp" + "/img/phones/apple-iphone-11-pro/silver/00.webp", + "/img/phones/apple-iphone-11-pro/silver/01.webp", + "/img/phones/apple-iphone-11-pro/silver/02.webp" ], "description": [ { @@ -1384,9 +1384,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro/spacegray/00.webp", - "img/phones/apple-iphone-11-pro/spacegray/01.webp", - "img/phones/apple-iphone-11-pro/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro/spacegray/02.webp" ], "description": [ { @@ -1430,9 +1430,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro-max/gold/00.webp", - "img/phones/apple-iphone-11-pro-max/gold/01.webp", - "img/phones/apple-iphone-11-pro-max/gold/02.webp" + "/img/phones/apple-iphone-11-pro-max/gold/00.webp", + "/img/phones/apple-iphone-11-pro-max/gold/01.webp", + "/img/phones/apple-iphone-11-pro-max/gold/02.webp" ], "description": [ { @@ -1476,9 +1476,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" + "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" ], "description": [ { @@ -1522,9 +1522,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro-max/silver/00.webp", - "img/phones/apple-iphone-11-pro-max/silver/01.webp", - "img/phones/apple-iphone-11-pro-max/silver/02.webp" + "/img/phones/apple-iphone-11-pro-max/silver/00.webp", + "/img/phones/apple-iphone-11-pro-max/silver/01.webp", + "/img/phones/apple-iphone-11-pro-max/silver/02.webp" ], "description": [ { @@ -1568,9 +1568,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro-max/spacegray/00.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/01.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/02.webp" ], "description": [ { @@ -1614,9 +1614,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro-max/gold/00.webp", - "img/phones/apple-iphone-11-pro-max/gold/01.webp", - "img/phones/apple-iphone-11-pro-max/gold/02.webp" + "/img/phones/apple-iphone-11-pro-max/gold/00.webp", + "/img/phones/apple-iphone-11-pro-max/gold/01.webp", + "/img/phones/apple-iphone-11-pro-max/gold/02.webp" ], "description": [ { @@ -1660,9 +1660,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" + "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" ], "description": [ { @@ -1706,9 +1706,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro-max/silver/00.webp", - "img/phones/apple-iphone-11-pro-max/silver/01.webp", - "img/phones/apple-iphone-11-pro-max/silver/02.webp" + "/img/phones/apple-iphone-11-pro-max/silver/00.webp", + "/img/phones/apple-iphone-11-pro-max/silver/01.webp", + "/img/phones/apple-iphone-11-pro-max/silver/02.webp" ], "description": [ { @@ -1752,9 +1752,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro-max/spacegray/00.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/01.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/02.webp" ], "description": [ { @@ -1798,9 +1798,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-11-pro-max/gold/00.webp", - "img/phones/apple-iphone-11-pro-max/gold/01.webp", - "img/phones/apple-iphone-11-pro-max/gold/02.webp" + "/img/phones/apple-iphone-11-pro-max/gold/00.webp", + "/img/phones/apple-iphone-11-pro-max/gold/01.webp", + "/img/phones/apple-iphone-11-pro-max/gold/02.webp" ], "description": [ { @@ -1844,9 +1844,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "midnightgreen", "images": [ - "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", - "img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" + "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/01.webp", + "/img/phones/apple-iphone-11-pro-max/midnightgreen/02.webp" ], "description": [ { @@ -1890,9 +1890,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-11-pro-max/silver/00.webp", - "img/phones/apple-iphone-11-pro-max/silver/01.webp", - "img/phones/apple-iphone-11-pro-max/silver/02.webp" + "/img/phones/apple-iphone-11-pro-max/silver/00.webp", + "/img/phones/apple-iphone-11-pro-max/silver/01.webp", + "/img/phones/apple-iphone-11-pro-max/silver/02.webp" ], "description": [ { @@ -1936,9 +1936,9 @@ "colorsAvailable": ["spacegray", "midnightgreen", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-11-pro-max/spacegray/00.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/01.webp", - "img/phones/apple-iphone-11-pro-max/spacegray/02.webp" + "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/01.webp", + "/img/phones/apple-iphone-11-pro-max/spacegray/02.webp" ], "description": [ { @@ -1982,11 +1982,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "black", "images": [ - "img/phones/apple-iphone-7/black/00.webp", - "img/phones/apple-iphone-7/black/01.webp", - "img/phones/apple-iphone-7/black/02.webp", - "img/phones/apple-iphone-7/black/03.webp", - "img/phones/apple-iphone-7/black/04.webp" + "/img/phones/apple-iphone-7/black/00.webp", + "/img/phones/apple-iphone-7/black/01.webp", + "/img/phones/apple-iphone-7/black/02.webp", + "/img/phones/apple-iphone-7/black/03.webp", + "/img/phones/apple-iphone-7/black/04.webp" ], "description": [ { @@ -2030,11 +2030,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-7/gold/00.webp", - "img/phones/apple-iphone-7/gold/01.webp", - "img/phones/apple-iphone-7/gold/02.webp", - "img/phones/apple-iphone-7/gold/03.webp", - "img/phones/apple-iphone-7/gold/04.webp" + "/img/phones/apple-iphone-7/gold/00.webp", + "/img/phones/apple-iphone-7/gold/01.webp", + "/img/phones/apple-iphone-7/gold/02.webp", + "/img/phones/apple-iphone-7/gold/03.webp", + "/img/phones/apple-iphone-7/gold/04.webp" ], "description": [ { @@ -2078,11 +2078,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "rosegold", "images": [ - "img/phones/apple-iphone-7/rosegold/00.webp", - "img/phones/apple-iphone-7/rosegold/01.webp", - "img/phones/apple-iphone-7/rosegold/02.webp", - "img/phones/apple-iphone-7/rosegold/03.webp", - "img/phones/apple-iphone-7/rosegold/04.webp" + "/img/phones/apple-iphone-7/rosegold/00.webp", + "/img/phones/apple-iphone-7/rosegold/01.webp", + "/img/phones/apple-iphone-7/rosegold/02.webp", + "/img/phones/apple-iphone-7/rosegold/03.webp", + "/img/phones/apple-iphone-7/rosegold/04.webp" ], "description": [ { @@ -2126,11 +2126,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-7/silver/00.webp", - "img/phones/apple-iphone-7/silver/01.webp", - "img/phones/apple-iphone-7/silver/02.webp", - "img/phones/apple-iphone-7/silver/03.webp", - "img/phones/apple-iphone-7/silver/04.webp" + "/img/phones/apple-iphone-7/silver/00.webp", + "/img/phones/apple-iphone-7/silver/01.webp", + "/img/phones/apple-iphone-7/silver/02.webp", + "/img/phones/apple-iphone-7/silver/03.webp", + "/img/phones/apple-iphone-7/silver/04.webp" ], "description": [ { @@ -2174,11 +2174,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "black", "images": [ - "img/phones/apple-iphone-7-plus/black/00.webp", - "img/phones/apple-iphone-7-plus/black/01.webp", - "img/phones/apple-iphone-7-plus/black/02.webp", - "img/phones/apple-iphone-7-plus/black/03.webp", - "img/phones/apple-iphone-7-plus/black/04.webp" + "/img/phones/apple-iphone-7-plus/black/00.webp", + "/img/phones/apple-iphone-7-plus/black/01.webp", + "/img/phones/apple-iphone-7-plus/black/02.webp", + "/img/phones/apple-iphone-7-plus/black/03.webp", + "/img/phones/apple-iphone-7-plus/black/04.webp" ], "description": [ { @@ -2222,11 +2222,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-7-plus/gold/00.webp", - "img/phones/apple-iphone-7-plus/gold/01.webp", - "img/phones/apple-iphone-7-plus/gold/02.webp", - "img/phones/apple-iphone-7-plus/gold/03.webp", - "img/phones/apple-iphone-7-plus/gold/04.webp" + "/img/phones/apple-iphone-7-plus/gold/00.webp", + "/img/phones/apple-iphone-7-plus/gold/01.webp", + "/img/phones/apple-iphone-7-plus/gold/02.webp", + "/img/phones/apple-iphone-7-plus/gold/03.webp", + "/img/phones/apple-iphone-7-plus/gold/04.webp" ], "description": [ { @@ -2270,11 +2270,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "rosegold", "images": [ - "img/phones/apple-iphone-7-plus/rosegold/00.webp", - "img/phones/apple-iphone-7-plus/rosegold/01.webp", - "img/phones/apple-iphone-7-plus/rosegold/02.webp", - "img/phones/apple-iphone-7-plus/rosegold/03.webp", - "img/phones/apple-iphone-7-plus/rosegold/04.webp" + "/img/phones/apple-iphone-7-plus/rosegold/00.webp", + "/img/phones/apple-iphone-7-plus/rosegold/01.webp", + "/img/phones/apple-iphone-7-plus/rosegold/02.webp", + "/img/phones/apple-iphone-7-plus/rosegold/03.webp", + "/img/phones/apple-iphone-7-plus/rosegold/04.webp" ], "description": [ { @@ -2318,11 +2318,11 @@ "colorsAvailable": ["black", "rosegold", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-7-plus/silver/00.webp", - "img/phones/apple-iphone-7-plus/silver/01.webp", - "img/phones/apple-iphone-7-plus/silver/02.webp", - "img/phones/apple-iphone-7-plus/silver/03.webp", - "img/phones/apple-iphone-7-plus/silver/04.webp" + "/img/phones/apple-iphone-7-plus/silver/00.webp", + "/img/phones/apple-iphone-7-plus/silver/01.webp", + "/img/phones/apple-iphone-7-plus/silver/02.webp", + "/img/phones/apple-iphone-7-plus/silver/03.webp", + "/img/phones/apple-iphone-7-plus/silver/04.webp" ], "description": [ { @@ -2366,10 +2366,10 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-8/gold/00.webp", - "img/phones/apple-iphone-8/gold/01.webp", - "img/phones/apple-iphone-8/gold/02.webp", - "img/phones/apple-iphone-8/gold/03.webp" + "/img/phones/apple-iphone-8/gold/00.webp", + "/img/phones/apple-iphone-8/gold/01.webp", + "/img/phones/apple-iphone-8/gold/02.webp", + "/img/phones/apple-iphone-8/gold/03.webp" ], "description": [ { @@ -2413,10 +2413,10 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-8/silver/00.webp", - "img/phones/apple-iphone-8/silver/01.webp", - "img/phones/apple-iphone-8/silver/02.webp", - "img/phones/apple-iphone-8/silver/03.webp" + "/img/phones/apple-iphone-8/silver/00.webp", + "/img/phones/apple-iphone-8/silver/01.webp", + "/img/phones/apple-iphone-8/silver/02.webp", + "/img/phones/apple-iphone-8/silver/03.webp" ], "description": [ { @@ -2460,10 +2460,10 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-8/spacegray/00.webp", - "img/phones/apple-iphone-8/spacegray/01.webp", - "img/phones/apple-iphone-8/spacegray/02.webp", - "img/phones/apple-iphone-8/spacegray/03.webp" + "/img/phones/apple-iphone-8/spacegray/00.webp", + "/img/phones/apple-iphone-8/spacegray/01.webp", + "/img/phones/apple-iphone-8/spacegray/02.webp", + "/img/phones/apple-iphone-8/spacegray/03.webp" ], "description": [ { @@ -2507,11 +2507,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "coral", "images": [ - "img/phones/apple-iphone-xr/coral/00.webp", - "img/phones/apple-iphone-xr/coral/01.webp", - "img/phones/apple-iphone-xr/coral/02.webp", - "img/phones/apple-iphone-xr/coral/03.webp", - "img/phones/apple-iphone-xr/coral/04.webp" + "/img/phones/apple-iphone-xr/coral/00.webp", + "/img/phones/apple-iphone-xr/coral/01.webp", + "/img/phones/apple-iphone-xr/coral/02.webp", + "/img/phones/apple-iphone-xr/coral/03.webp", + "/img/phones/apple-iphone-xr/coral/04.webp" ], "description": [ { @@ -2555,11 +2555,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "red", "images": [ - "img/phones/apple-iphone-xr/red/00.webp", - "img/phones/apple-iphone-xr/red/01.webp", - "img/phones/apple-iphone-xr/red/02.webp", - "img/phones/apple-iphone-xr/red/03.webp", - "img/phones/apple-iphone-xr/red/04.webp" + "/img/phones/apple-iphone-xr/red/00.webp", + "/img/phones/apple-iphone-xr/red/01.webp", + "/img/phones/apple-iphone-xr/red/02.webp", + "/img/phones/apple-iphone-xr/red/03.webp", + "/img/phones/apple-iphone-xr/red/04.webp" ], "description": [ { @@ -2603,11 +2603,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "white", "images": [ - "img/phones/apple-iphone-xr/white/00.webp", - "img/phones/apple-iphone-xr/white/01.webp", - "img/phones/apple-iphone-xr/white/02.webp", - "img/phones/apple-iphone-xr/white/03.webp", - "img/phones/apple-iphone-xr/white/04.webp" + "/img/phones/apple-iphone-xr/white/00.webp", + "/img/phones/apple-iphone-xr/white/01.webp", + "/img/phones/apple-iphone-xr/white/02.webp", + "/img/phones/apple-iphone-xr/white/03.webp", + "/img/phones/apple-iphone-xr/white/04.webp" ], "description": [ { @@ -2651,11 +2651,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "yellow", "images": [ - "img/phones/apple-iphone-xr/yellow/00.webp", - "img/phones/apple-iphone-xr/yellow/01.webp", - "img/phones/apple-iphone-xr/yellow/02.webp", - "img/phones/apple-iphone-xr/yellow/03.webp", - "img/phones/apple-iphone-xr/yellow/04.webp" + "/img/phones/apple-iphone-xr/yellow/00.webp", + "/img/phones/apple-iphone-xr/yellow/01.webp", + "/img/phones/apple-iphone-xr/yellow/02.webp", + "/img/phones/apple-iphone-xr/yellow/03.webp", + "/img/phones/apple-iphone-xr/yellow/04.webp" ], "description": [ { @@ -2699,9 +2699,9 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "coral", "images": [ - "img/phones/apple-iphone-xr/coral/00.webp", - "img/phones/apple-iphone-xr/coral/01.webp", - "img/phones/apple-iphone-xr/coral/02.webp" + "/img/phones/apple-iphone-xr/coral/00.webp", + "/img/phones/apple-iphone-xr/coral/01.webp", + "/img/phones/apple-iphone-xr/coral/02.webp" ], "description": [ { @@ -2745,11 +2745,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "red", "images": [ - "img/phones/apple-iphone-xr/red/00.webp", - "img/phones/apple-iphone-xr/red/01.webp", - "img/phones/apple-iphone-xr/red/02.webp", - "img/phones/apple-iphone-xr/red/03.webp", - "img/phones/apple-iphone-xr/red/04.webp" + "/img/phones/apple-iphone-xr/red/00.webp", + "/img/phones/apple-iphone-xr/red/01.webp", + "/img/phones/apple-iphone-xr/red/02.webp", + "/img/phones/apple-iphone-xr/red/03.webp", + "/img/phones/apple-iphone-xr/red/04.webp" ], "description": [ { @@ -2793,11 +2793,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "white", "images": [ - "img/phones/apple-iphone-xr/white/00.webp", - "img/phones/apple-iphone-xr/white/01.webp", - "img/phones/apple-iphone-xr/white/02.webp", - "img/phones/apple-iphone-xr/white/03.webp", - "img/phones/apple-iphone-xr/white/04.webp" + "/img/phones/apple-iphone-xr/white/00.webp", + "/img/phones/apple-iphone-xr/white/01.webp", + "/img/phones/apple-iphone-xr/white/02.webp", + "/img/phones/apple-iphone-xr/white/03.webp", + "/img/phones/apple-iphone-xr/white/04.webp" ], "description": [ { @@ -2841,11 +2841,11 @@ "colorsAvailable": ["white", "yellow", "red", "coral"], "color": "yellow", "images": [ - "img/phones/apple-iphone-xr/yellow/00.webp", - "img/phones/apple-iphone-xr/yellow/01.webp", - "img/phones/apple-iphone-xr/yellow/02.webp", - "img/phones/apple-iphone-xr/yellow/03.webp", - "img/phones/apple-iphone-xr/yellow/04.webp" + "/img/phones/apple-iphone-xr/yellow/00.webp", + "/img/phones/apple-iphone-xr/yellow/01.webp", + "/img/phones/apple-iphone-xr/yellow/02.webp", + "/img/phones/apple-iphone-xr/yellow/03.webp", + "/img/phones/apple-iphone-xr/yellow/04.webp" ], "description": [ { @@ -2889,11 +2889,11 @@ "colorsAvailable": ["spacegray", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-xs/gold/00.webp", - "img/phones/apple-iphone-xs/gold/01.webp", - "img/phones/apple-iphone-xs/gold/02.webp", - "img/phones/apple-iphone-xs/gold/03.webp", - "img/phones/apple-iphone-xs/gold/04.webp" + "/img/phones/apple-iphone-xs/gold/00.webp", + "/img/phones/apple-iphone-xs/gold/01.webp", + "/img/phones/apple-iphone-xs/gold/02.webp", + "/img/phones/apple-iphone-xs/gold/03.webp", + "/img/phones/apple-iphone-xs/gold/04.webp" ], "description": [ { @@ -2937,11 +2937,11 @@ "colorsAvailable": ["spacegray", "gold"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-xs/spacegray/00.webp", - "img/phones/apple-iphone-xs/spacegray/01.webp", - "img/phones/apple-iphone-xs/spacegray/02.webp", - "img/phones/apple-iphone-xs/spacegray/03.webp", - "img/phones/apple-iphone-xs/spacegray/04.webp" + "/img/phones/apple-iphone-xs/spacegray/00.webp", + "/img/phones/apple-iphone-xs/spacegray/01.webp", + "/img/phones/apple-iphone-xs/spacegray/02.webp", + "/img/phones/apple-iphone-xs/spacegray/03.webp", + "/img/phones/apple-iphone-xs/spacegray/04.webp" ], "description": [ { @@ -2985,11 +2985,11 @@ "colorsAvailable": ["spacegray", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-xs/gold/00.webp", - "img/phones/apple-iphone-xs/gold/01.webp", - "img/phones/apple-iphone-xs/gold/02.webp", - "img/phones/apple-iphone-xs/gold/03.webp", - "img/phones/apple-iphone-xs/gold/04.webp" + "/img/phones/apple-iphone-xs/gold/00.webp", + "/img/phones/apple-iphone-xs/gold/01.webp", + "/img/phones/apple-iphone-xs/gold/02.webp", + "/img/phones/apple-iphone-xs/gold/03.webp", + "/img/phones/apple-iphone-xs/gold/04.webp" ], "description": [ { @@ -3033,11 +3033,11 @@ "colorsAvailable": ["spacegray", "gold"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-xs/spacegray/00.webp", - "img/phones/apple-iphone-xs/spacegray/01.webp", - "img/phones/apple-iphone-xs/spacegray/02.webp", - "img/phones/apple-iphone-xs/spacegray/03.webp", - "img/phones/apple-iphone-xs/spacegray/04.webp" + "/img/phones/apple-iphone-xs/spacegray/00.webp", + "/img/phones/apple-iphone-xs/spacegray/01.webp", + "/img/phones/apple-iphone-xs/spacegray/02.webp", + "/img/phones/apple-iphone-xs/spacegray/03.webp", + "/img/phones/apple-iphone-xs/spacegray/04.webp" ], "description": [ { @@ -3081,11 +3081,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-xs-max/gold/00.webp", - "img/phones/apple-iphone-xs-max/gold/01.webp", - "img/phones/apple-iphone-xs-max/gold/02.webp", - "img/phones/apple-iphone-xs-max/gold/03.webp", - "img/phones/apple-iphone-xs-max/gold/04.webp" + "/img/phones/apple-iphone-xs-max/gold/00.webp", + "/img/phones/apple-iphone-xs-max/gold/01.webp", + "/img/phones/apple-iphone-xs-max/gold/02.webp", + "/img/phones/apple-iphone-xs-max/gold/03.webp", + "/img/phones/apple-iphone-xs-max/gold/04.webp" ], "description": [ { @@ -3129,11 +3129,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-xs-max/silver/00.webp", - "img/phones/apple-iphone-xs-max/silver/01.webp", - "img/phones/apple-iphone-xs-max/silver/02.webp", - "img/phones/apple-iphone-xs-max/silver/03.webp", - "img/phones/apple-iphone-xs-max/silver/04.webp" + "/img/phones/apple-iphone-xs-max/silver/00.webp", + "/img/phones/apple-iphone-xs-max/silver/01.webp", + "/img/phones/apple-iphone-xs-max/silver/02.webp", + "/img/phones/apple-iphone-xs-max/silver/03.webp", + "/img/phones/apple-iphone-xs-max/silver/04.webp" ], "description": [ { @@ -3177,11 +3177,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-xs-max/spacegray/00.webp", - "img/phones/apple-iphone-xs-max/spacegray/01.webp", - "img/phones/apple-iphone-xs-max/spacegray/02.webp", - "img/phones/apple-iphone-xs-max/spacegray/03.webp", - "img/phones/apple-iphone-xs-max/spacegray/04.webp" + "/img/phones/apple-iphone-xs-max/spacegray/00.webp", + "/img/phones/apple-iphone-xs-max/spacegray/01.webp", + "/img/phones/apple-iphone-xs-max/spacegray/02.webp", + "/img/phones/apple-iphone-xs-max/spacegray/03.webp", + "/img/phones/apple-iphone-xs-max/spacegray/04.webp" ], "description": [ { @@ -3225,11 +3225,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "gold", "images": [ - "img/phones/apple-iphone-xs-max/gold/00.webp", - "img/phones/apple-iphone-xs-max/gold/01.webp", - "img/phones/apple-iphone-xs-max/gold/02.webp", - "img/phones/apple-iphone-xs-max/gold/03.webp", - "img/phones/apple-iphone-xs-max/gold/04.webp" + "/img/phones/apple-iphone-xs-max/gold/00.webp", + "/img/phones/apple-iphone-xs-max/gold/01.webp", + "/img/phones/apple-iphone-xs-max/gold/02.webp", + "/img/phones/apple-iphone-xs-max/gold/03.webp", + "/img/phones/apple-iphone-xs-max/gold/04.webp" ], "description": [ { @@ -3273,11 +3273,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "silver", "images": [ - "img/phones/apple-iphone-xs-max/silver/00.webp", - "img/phones/apple-iphone-xs-max/silver/01.webp", - "img/phones/apple-iphone-xs-max/silver/02.webp", - "img/phones/apple-iphone-xs-max/silver/03.webp", - "img/phones/apple-iphone-xs-max/silver/04.webp" + "/img/phones/apple-iphone-xs-max/silver/00.webp", + "/img/phones/apple-iphone-xs-max/silver/01.webp", + "/img/phones/apple-iphone-xs-max/silver/02.webp", + "/img/phones/apple-iphone-xs-max/silver/03.webp", + "/img/phones/apple-iphone-xs-max/silver/04.webp" ], "description": [ { @@ -3321,11 +3321,11 @@ "colorsAvailable": ["spacegray", "gold", "silver"], "color": "spacegray", "images": [ - "img/phones/apple-iphone-xs-max/spacegray/00.webp", - "img/phones/apple-iphone-xs-max/spacegray/01.webp", - "img/phones/apple-iphone-xs-max/spacegray/02.webp", - "img/phones/apple-iphone-xs-max/spacegray/03.webp", - "img/phones/apple-iphone-xs-max/spacegray/04.webp" + "/img/phones/apple-iphone-xs-max/spacegray/00.webp", + "/img/phones/apple-iphone-xs-max/spacegray/01.webp", + "/img/phones/apple-iphone-xs-max/spacegray/02.webp", + "/img/phones/apple-iphone-xs-max/spacegray/03.webp", + "/img/phones/apple-iphone-xs-max/spacegray/04.webp" ], "description": [ { @@ -3368,11 +3368,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "midnight", "images": [ - "img/phones/apple-iphone-14/midnight/00.webp", - "img/phones/apple-iphone-14/midnight/01.webp", - "img/phones/apple-iphone-14/midnight/02.webp", - "img/phones/apple-iphone-14/midnight/03.webp", - "img/phones/apple-iphone-14/midnight/04.webp" + "/img/phones/apple-iphone-14/midnight/00.webp", + "/img/phones/apple-iphone-14/midnight/01.webp", + "/img/phones/apple-iphone-14/midnight/02.webp", + "/img/phones/apple-iphone-14/midnight/03.webp", + "/img/phones/apple-iphone-14/midnight/04.webp" ], "description": [ { @@ -3415,11 +3415,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "midnight", "images": [ - "img/phones/apple-iphone-14/midnight/00.webp", - "img/phones/apple-iphone-14/midnight/01.webp", - "img/phones/apple-iphone-14/midnight/02.webp", - "img/phones/apple-iphone-14/midnight/03.webp", - "img/phones/apple-iphone-14/midnight/04.webp" + "/img/phones/apple-iphone-14/midnight/00.webp", + "/img/phones/apple-iphone-14/midnight/01.webp", + "/img/phones/apple-iphone-14/midnight/02.webp", + "/img/phones/apple-iphone-14/midnight/03.webp", + "/img/phones/apple-iphone-14/midnight/04.webp" ], "description": [ { @@ -3462,11 +3462,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "midnight", "images": [ - "img/phones/apple-iphone-14/midnight/00.webp", - "img/phones/apple-iphone-14/midnight/01.webp", - "img/phones/apple-iphone-14/midnight/02.webp", - "img/phones/apple-iphone-14/midnight/03.webp", - "img/phones/apple-iphone-14/midnight/04.webp" + "/img/phones/apple-iphone-14/midnight/00.webp", + "/img/phones/apple-iphone-14/midnight/01.webp", + "/img/phones/apple-iphone-14/midnight/02.webp", + "/img/phones/apple-iphone-14/midnight/03.webp", + "/img/phones/apple-iphone-14/midnight/04.webp" ], "description": [ { @@ -3509,11 +3509,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "yellow", "images": [ - "img/phones/apple-iphone-14/yellow/00.webp", - "img/phones/apple-iphone-14/yellow/01.webp", - "img/phones/apple-iphone-14/yellow/02.webp", - "img/phones/apple-iphone-14/yellow/03.webp", - "img/phones/apple-iphone-14/yellow/04.webp" + "/img/phones/apple-iphone-14/yellow/00.webp", + "/img/phones/apple-iphone-14/yellow/01.webp", + "/img/phones/apple-iphone-14/yellow/02.webp", + "/img/phones/apple-iphone-14/yellow/03.webp", + "/img/phones/apple-iphone-14/yellow/04.webp" ], "description": [ { @@ -3556,11 +3556,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "yellow", "images": [ - "img/phones/apple-iphone-14/yellow/00.webp", - "img/phones/apple-iphone-14/yellow/01.webp", - "img/phones/apple-iphone-14/yellow/02.webp", - "img/phones/apple-iphone-14/yellow/03.webp", - "img/phones/apple-iphone-14/yellow/04.webp" + "/img/phones/apple-iphone-14/yellow/00.webp", + "/img/phones/apple-iphone-14/yellow/01.webp", + "/img/phones/apple-iphone-14/yellow/02.webp", + "/img/phones/apple-iphone-14/yellow/03.webp", + "/img/phones/apple-iphone-14/yellow/04.webp" ], "description": [ { @@ -3603,11 +3603,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "yellow", "images": [ - "img/phones/apple-iphone-14/yellow/00.webp", - "img/phones/apple-iphone-14/yellow/01.webp", - "img/phones/apple-iphone-14/yellow/02.webp", - "img/phones/apple-iphone-14/yellow/03.webp", - "img/phones/apple-iphone-14/yellow/04.webp" + "/img/phones/apple-iphone-14/yellow/00.webp", + "/img/phones/apple-iphone-14/yellow/01.webp", + "/img/phones/apple-iphone-14/yellow/02.webp", + "/img/phones/apple-iphone-14/yellow/03.webp", + "/img/phones/apple-iphone-14/yellow/04.webp" ], "description": [ { @@ -3650,11 +3650,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "purple", "images": [ - "img/phones/apple-iphone-14/purple/00.webp", - "img/phones/apple-iphone-14/purple/01.webp", - "img/phones/apple-iphone-14/purple/02.webp", - "img/phones/apple-iphone-14/purple/03.webp", - "img/phones/apple-iphone-14/purple/04.webp" + "/img/phones/apple-iphone-14/purple/00.webp", + "/img/phones/apple-iphone-14/purple/01.webp", + "/img/phones/apple-iphone-14/purple/02.webp", + "/img/phones/apple-iphone-14/purple/03.webp", + "/img/phones/apple-iphone-14/purple/04.webp" ], "description": [ { @@ -3697,11 +3697,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "purple", "images": [ - "img/phones/apple-iphone-14/purple/00.webp", - "img/phones/apple-iphone-14/purple/01.webp", - "img/phones/apple-iphone-14/purple/02.webp", - "img/phones/apple-iphone-14/purple/03.webp", - "img/phones/apple-iphone-14/purple/04.webp" + "/img/phones/apple-iphone-14/purple/00.webp", + "/img/phones/apple-iphone-14/purple/01.webp", + "/img/phones/apple-iphone-14/purple/02.webp", + "/img/phones/apple-iphone-14/purple/03.webp", + "/img/phones/apple-iphone-14/purple/04.webp" ], "description": [ { @@ -3744,11 +3744,11 @@ "colorsAvailable": ["midnight", "yellow", "purple"], "color": "purple", "images": [ - "img/phones/apple-iphone-14/purple/00.webp", - "img/phones/apple-iphone-14/purple/01.webp", - "img/phones/apple-iphone-14/purple/02.webp", - "img/phones/apple-iphone-14/purple/03.webp", - "img/phones/apple-iphone-14/purple/04.webp" + "/img/phones/apple-iphone-14/purple/00.webp", + "/img/phones/apple-iphone-14/purple/01.webp", + "/img/phones/apple-iphone-14/purple/02.webp", + "/img/phones/apple-iphone-14/purple/03.webp", + "/img/phones/apple-iphone-14/purple/04.webp" ], "description": [ { @@ -3791,11 +3791,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "spaceblack", "images": [ - "img/phones/apple-iphone-14-pro/spaceblack/00.webp", - "img/phones/apple-iphone-14-pro/spaceblack/01.webp", - "img/phones/apple-iphone-14-pro/spaceblack/02.webp", - "img/phones/apple-iphone-14-pro/spaceblack/03.webp", - "img/phones/apple-iphone-14-pro/spaceblack/04.webp" + "/img/phones/apple-iphone-14-pro/spaceblack/00.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/01.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/02.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/03.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/04.webp" ], "description": [ { @@ -3838,11 +3838,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "spaceblack", "images": [ - "img/phones/apple-iphone-14-pro/spaceblack/00.webp", - "img/phones/apple-iphone-14-pro/spaceblack/01.webp", - "img/phones/apple-iphone-14-pro/spaceblack/02.webp", - "img/phones/apple-iphone-14-pro/spaceblack/03.webp", - "img/phones/apple-iphone-14-pro/spaceblack/04.webp" + "/img/phones/apple-iphone-14-pro/spaceblack/00.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/01.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/02.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/03.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/04.webp" ], "description": [ { @@ -3885,11 +3885,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "spaceblack", "images": [ - "img/phones/apple-iphone-14-pro/spaceblack/00.webp", - "img/phones/apple-iphone-14-pro/spaceblack/01.webp", - "img/phones/apple-iphone-14-pro/spaceblack/02.webp", - "img/phones/apple-iphone-14-pro/spaceblack/03.webp", - "img/phones/apple-iphone-14-pro/spaceblack/04.webp" + "/img/phones/apple-iphone-14-pro/spaceblack/00.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/01.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/02.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/03.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/04.webp" ], "description": [ { @@ -3932,11 +3932,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "spaceblack", "images": [ - "img/phones/apple-iphone-14-pro/spaceblack/00.webp", - "img/phones/apple-iphone-14-pro/spaceblack/01.webp", - "img/phones/apple-iphone-14-pro/spaceblack/02.webp", - "img/phones/apple-iphone-14-pro/spaceblack/03.webp", - "img/phones/apple-iphone-14-pro/spaceblack/04.webp" + "/img/phones/apple-iphone-14-pro/spaceblack/00.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/01.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/02.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/03.webp", + "/img/phones/apple-iphone-14-pro/spaceblack/04.webp" ], "description": [ { @@ -3979,10 +3979,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-12/black/00.webp", - "img/phones/apple-iphone-12/black/01.webp", - "img/phones/apple-iphone-12/black/02.webp", - "img/phones/apple-iphone-12/black/03.webp" + "/img/phones/apple-iphone-12/black/00.webp", + "/img/phones/apple-iphone-12/black/01.webp", + "/img/phones/apple-iphone-12/black/02.webp", + "/img/phones/apple-iphone-12/black/03.webp" ], "description": [ { @@ -4024,10 +4024,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-12/black/00.webp", - "img/phones/apple-iphone-12/black/01.webp", - "img/phones/apple-iphone-12/black/02.webp", - "img/phones/apple-iphone-12/black/03.webp" + "/img/phones/apple-iphone-12/black/00.webp", + "/img/phones/apple-iphone-12/black/01.webp", + "/img/phones/apple-iphone-12/black/02.webp", + "/img/phones/apple-iphone-12/black/03.webp" ], "description": [ { @@ -4069,10 +4069,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "black", "images": [ - "img/phones/apple-iphone-12/black/00.webp", - "img/phones/apple-iphone-12/black/01.webp", - "img/phones/apple-iphone-12/black/02.webp", - "img/phones/apple-iphone-12/black/03.webp" + "/img/phones/apple-iphone-12/black/00.webp", + "/img/phones/apple-iphone-12/black/01.webp", + "/img/phones/apple-iphone-12/black/02.webp", + "/img/phones/apple-iphone-12/black/03.webp" ], "description": [ { @@ -4114,10 +4114,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-12/purple/00.webp", - "img/phones/apple-iphone-12/purple/01.webp", - "img/phones/apple-iphone-12/purple/02.webp", - "img/phones/apple-iphone-12/purple/03.webp" + "/img/phones/apple-iphone-12/purple/00.webp", + "/img/phones/apple-iphone-12/purple/01.webp", + "/img/phones/apple-iphone-12/purple/02.webp", + "/img/phones/apple-iphone-12/purple/03.webp" ], "description": [ { @@ -4159,10 +4159,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-12/purple/00.webp", - "img/phones/apple-iphone-12/purple/01.webp", - "img/phones/apple-iphone-12/purple/02.webp", - "img/phones/apple-iphone-12/purple/03.webp" + "/img/phones/apple-iphone-12/purple/00.webp", + "/img/phones/apple-iphone-12/purple/01.webp", + "/img/phones/apple-iphone-12/purple/02.webp", + "/img/phones/apple-iphone-12/purple/03.webp" ], "description": [ { @@ -4204,10 +4204,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "purple", "images": [ - "img/phones/apple-iphone-12/purple/00.webp", - "img/phones/apple-iphone-12/purple/01.webp", - "img/phones/apple-iphone-12/purple/02.webp", - "img/phones/apple-iphone-12/purple/03.webp" + "/img/phones/apple-iphone-12/purple/00.webp", + "/img/phones/apple-iphone-12/purple/01.webp", + "/img/phones/apple-iphone-12/purple/02.webp", + "/img/phones/apple-iphone-12/purple/03.webp" ], "description": [ { @@ -4249,10 +4249,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-12/red/00.webp", - "img/phones/apple-iphone-12/red/01.webp", - "img/phones/apple-iphone-12/red/02.webp", - "img/phones/apple-iphone-12/red/03.webp" + "/img/phones/apple-iphone-12/red/00.webp", + "/img/phones/apple-iphone-12/red/01.webp", + "/img/phones/apple-iphone-12/red/02.webp", + "/img/phones/apple-iphone-12/red/03.webp" ], "description": [ { @@ -4294,10 +4294,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-12/red/00.webp", - "img/phones/apple-iphone-12/red/01.webp", - "img/phones/apple-iphone-12/red/02.webp", - "img/phones/apple-iphone-12/red/03.webp" + "/img/phones/apple-iphone-12/red/00.webp", + "/img/phones/apple-iphone-12/red/01.webp", + "/img/phones/apple-iphone-12/red/02.webp", + "/img/phones/apple-iphone-12/red/03.webp" ], "description": [ { @@ -4339,10 +4339,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "red", "images": [ - "img/phones/apple-iphone-12/red/00.webp", - "img/phones/apple-iphone-12/red/01.webp", - "img/phones/apple-iphone-12/red/02.webp", - "img/phones/apple-iphone-12/red/03.webp" + "/img/phones/apple-iphone-12/red/00.webp", + "/img/phones/apple-iphone-12/red/01.webp", + "/img/phones/apple-iphone-12/red/02.webp", + "/img/phones/apple-iphone-12/red/03.webp" ], "description": [ { @@ -4384,10 +4384,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-12/white/00.webp", - "img/phones/apple-iphone-12/white/01.webp", - "img/phones/apple-iphone-12/white/02.webp", - "img/phones/apple-iphone-12/white/03.webp" + "/img/phones/apple-iphone-12/white/00.webp", + "/img/phones/apple-iphone-12/white/01.webp", + "/img/phones/apple-iphone-12/white/02.webp", + "/img/phones/apple-iphone-12/white/03.webp" ], "description": [ { @@ -4429,10 +4429,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-12/white/00.webp", - "img/phones/apple-iphone-12/white/01.webp", - "img/phones/apple-iphone-12/white/02.webp", - "img/phones/apple-iphone-12/white/03.webp" + "/img/phones/apple-iphone-12/white/00.webp", + "/img/phones/apple-iphone-12/white/01.webp", + "/img/phones/apple-iphone-12/white/02.webp", + "/img/phones/apple-iphone-12/white/03.webp" ], "description": [ { @@ -4474,10 +4474,10 @@ "colorsAvailable": ["black", "white", "purple", "red"], "color": "white", "images": [ - "img/phones/apple-iphone-12/white/00.webp", - "img/phones/apple-iphone-12/white/01.webp", - "img/phones/apple-iphone-12/white/02.webp", - "img/phones/apple-iphone-12/white/03.webp" + "/img/phones/apple-iphone-12/white/00.webp", + "/img/phones/apple-iphone-12/white/01.webp", + "/img/phones/apple-iphone-12/white/02.webp", + "/img/phones/apple-iphone-12/white/03.webp" ], "description": [ { @@ -4519,10 +4519,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "midnight", "images": [ - "img/phones/apple-iphone-13-mini/midnight/00.webp", - "img/phones/apple-iphone-13-mini/midnight/01.webp", - "img/phones/apple-iphone-13-mini/midnight/02.webp", - "img/phones/apple-iphone-13-mini/midnight/03.webp" + "/img/phones/apple-iphone-13-mini/midnight/00.webp", + "/img/phones/apple-iphone-13-mini/midnight/01.webp", + "/img/phones/apple-iphone-13-mini/midnight/02.webp", + "/img/phones/apple-iphone-13-mini/midnight/03.webp" ], "description": [ { @@ -4564,10 +4564,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "midnight", "images": [ - "img/phones/apple-iphone-13-mini/midnight/00.webp", - "img/phones/apple-iphone-13-mini/midnight/01.webp", - "img/phones/apple-iphone-13-mini/midnight/02.webp", - "img/phones/apple-iphone-13-mini/midnight/03.webp" + "/img/phones/apple-iphone-13-mini/midnight/00.webp", + "/img/phones/apple-iphone-13-mini/midnight/01.webp", + "/img/phones/apple-iphone-13-mini/midnight/02.webp", + "/img/phones/apple-iphone-13-mini/midnight/03.webp" ], "description": [ { @@ -4609,10 +4609,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "midnight", "images": [ - "img/phones/apple-iphone-13-mini/midnight/00.webp", - "img/phones/apple-iphone-13-mini/midnight/01.webp", - "img/phones/apple-iphone-13-mini/midnight/02.webp", - "img/phones/apple-iphone-13-mini/midnight/03.webp" + "/img/phones/apple-iphone-13-mini/midnight/00.webp", + "/img/phones/apple-iphone-13-mini/midnight/01.webp", + "/img/phones/apple-iphone-13-mini/midnight/02.webp", + "/img/phones/apple-iphone-13-mini/midnight/03.webp" ], "description": [ { @@ -4654,10 +4654,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "pink", "images": [ - "img/phones/apple-iphone-13-mini/pink/00.webp", - "img/phones/apple-iphone-13-mini/pink/01.webp", - "img/phones/apple-iphone-13-mini/pink/02.webp", - "img/phones/apple-iphone-13-mini/pink/03.webp" + "/img/phones/apple-iphone-13-mini/pink/00.webp", + "/img/phones/apple-iphone-13-mini/pink/01.webp", + "/img/phones/apple-iphone-13-mini/pink/02.webp", + "/img/phones/apple-iphone-13-mini/pink/03.webp" ], "description": [ { @@ -4699,10 +4699,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "pink", "images": [ - "img/phones/apple-iphone-13-mini/pink/00.webp", - "img/phones/apple-iphone-13-mini/pink/01.webp", - "img/phones/apple-iphone-13-mini/pink/02.webp", - "img/phones/apple-iphone-13-mini/pink/03.webp" + "/img/phones/apple-iphone-13-mini/pink/00.webp", + "/img/phones/apple-iphone-13-mini/pink/01.webp", + "/img/phones/apple-iphone-13-mini/pink/02.webp", + "/img/phones/apple-iphone-13-mini/pink/03.webp" ], "description": [ { @@ -4744,10 +4744,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "pink", "images": [ - "img/phones/apple-iphone-13-mini/pink/00.webp", - "img/phones/apple-iphone-13-mini/pink/01.webp", - "img/phones/apple-iphone-13-mini/pink/02.webp", - "img/phones/apple-iphone-13-mini/pink/03.webp" + "/img/phones/apple-iphone-13-mini/pink/00.webp", + "/img/phones/apple-iphone-13-mini/pink/01.webp", + "/img/phones/apple-iphone-13-mini/pink/02.webp", + "/img/phones/apple-iphone-13-mini/pink/03.webp" ], "description": [ { @@ -4789,10 +4789,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "white", "images": [ - "img/phones/apple-iphone-13-mini/white/00.webp", - "img/phones/apple-iphone-13-mini/white/01.webp", - "img/phones/apple-iphone-13-mini/white/02.webp", - "img/phones/apple-iphone-13-mini/white/03.webp" + "/img/phones/apple-iphone-13-mini/white/00.webp", + "/img/phones/apple-iphone-13-mini/white/01.webp", + "/img/phones/apple-iphone-13-mini/white/02.webp", + "/img/phones/apple-iphone-13-mini/white/03.webp" ], "description": [ { @@ -4834,10 +4834,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "white", "images": [ - "img/phones/apple-iphone-13-mini/white/00.webp", - "img/phones/apple-iphone-13-mini/white/01.webp", - "img/phones/apple-iphone-13-mini/white/02.webp", - "img/phones/apple-iphone-13-mini/white/03.webp" + "/img/phones/apple-iphone-13-mini/white/00.webp", + "/img/phones/apple-iphone-13-mini/white/01.webp", + "/img/phones/apple-iphone-13-mini/white/02.webp", + "/img/phones/apple-iphone-13-mini/white/03.webp" ], "description": [ { @@ -4879,10 +4879,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "white", "images": [ - "img/phones/apple-iphone-13-mini/white/00.webp", - "img/phones/apple-iphone-13-mini/white/01.webp", - "img/phones/apple-iphone-13-mini/white/02.webp", - "img/phones/apple-iphone-13-mini/white/03.webp" + "/img/phones/apple-iphone-13-mini/white/00.webp", + "/img/phones/apple-iphone-13-mini/white/01.webp", + "/img/phones/apple-iphone-13-mini/white/02.webp", + "/img/phones/apple-iphone-13-mini/white/03.webp" ], "description": [ { @@ -4924,10 +4924,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "blue", "images": [ - "img/phones/apple-iphone-13-mini/blue/00.webp", - "img/phones/apple-iphone-13-mini/blue/01.webp", - "img/phones/apple-iphone-13-mini/blue/02.webp", - "img/phones/apple-iphone-13-mini/blue/03.webp" + "/img/phones/apple-iphone-13-mini/blue/00.webp", + "/img/phones/apple-iphone-13-mini/blue/01.webp", + "/img/phones/apple-iphone-13-mini/blue/02.webp", + "/img/phones/apple-iphone-13-mini/blue/03.webp" ], "description": [ { @@ -4969,10 +4969,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "blue", "images": [ - "img/phones/apple-iphone-13-mini/blue/00.webp", - "img/phones/apple-iphone-13-mini/blue/01.webp", - "img/phones/apple-iphone-13-mini/blue/02.webp", - "img/phones/apple-iphone-13-mini/blue/03.webp" + "/img/phones/apple-iphone-13-mini/blue/00.webp", + "/img/phones/apple-iphone-13-mini/blue/01.webp", + "/img/phones/apple-iphone-13-mini/blue/02.webp", + "/img/phones/apple-iphone-13-mini/blue/03.webp" ], "description": [ { @@ -5014,10 +5014,10 @@ "colorsAvailable": ["midnight", "white", "blue", "pink"], "color": "blue", "images": [ - "img/phones/apple-iphone-13-mini/blue/00.webp", - "img/phones/apple-iphone-13-mini/blue/01.webp", - "img/phones/apple-iphone-13-mini/blue/02.webp", - "img/phones/apple-iphone-13-mini/blue/03.webp" + "/img/phones/apple-iphone-13-mini/blue/00.webp", + "/img/phones/apple-iphone-13-mini/blue/01.webp", + "/img/phones/apple-iphone-13-mini/blue/02.webp", + "/img/phones/apple-iphone-13-mini/blue/03.webp" ], "description": [ { @@ -5059,10 +5059,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "sierrablue", "images": [ - "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" + "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" ], "description": [ { @@ -5110,10 +5110,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "sierrablue", "images": [ - "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" + "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" ], "description": [ { @@ -5161,10 +5161,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "sierrablue", "images": [ - "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" + "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" ], "description": [ { @@ -5212,10 +5212,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "sierrablue", "images": [ - "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", - "img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" + "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/01.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/02.webp", + "/img/phones/apple-iphone-13-pro-max/sierrablue/03.webp" ], "description": [ { @@ -5258,10 +5258,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "graphite", "images": [ - "img/phones/apple-iphone-13-pro-max/graphite/00.webp", - "img/phones/apple-iphone-13-pro-max/graphite/01.webp", - "img/phones/apple-iphone-13-pro-max/graphite/02.webp", - "img/phones/apple-iphone-13-pro-max/graphite/03.webp" + "/img/phones/apple-iphone-13-pro-max/graphite/00.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/01.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/02.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/03.webp" ], "description": [ { @@ -5309,10 +5309,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "graphite", "images": [ - "img/phones/apple-iphone-13-pro-max/graphite/00.webp", - "img/phones/apple-iphone-13-pro-max/graphite/01.webp", - "img/phones/apple-iphone-13-pro-max/graphite/02.webp", - "img/phones/apple-iphone-13-pro-max/graphite/03.webp" + "/img/phones/apple-iphone-13-pro-max/graphite/00.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/01.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/02.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/03.webp" ], "description": [ { @@ -5360,10 +5360,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "graphite", "images": [ - "img/phones/apple-iphone-13-pro-max/graphite/00.webp", - "img/phones/apple-iphone-13-pro-max/graphite/01.webp", - "img/phones/apple-iphone-13-pro-max/graphite/02.webp", - "img/phones/apple-iphone-13-pro-max/graphite/03.webp" + "/img/phones/apple-iphone-13-pro-max/graphite/00.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/01.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/02.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/03.webp" ], "description": [ { @@ -5411,10 +5411,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "graphite", "images": [ - "img/phones/apple-iphone-13-pro-max/graphite/00.webp", - "img/phones/apple-iphone-13-pro-max/graphite/01.webp", - "img/phones/apple-iphone-13-pro-max/graphite/02.webp", - "img/phones/apple-iphone-13-pro-max/graphite/03.webp" + "/img/phones/apple-iphone-13-pro-max/graphite/00.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/01.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/02.webp", + "/img/phones/apple-iphone-13-pro-max/graphite/03.webp" ], "description": [ { @@ -5457,10 +5457,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "gold", "images": [ - "img/phones/apple-iphone-13-pro-max/gold/00.webp", - "img/phones/apple-iphone-13-pro-max/gold/01.webp", - "img/phones/apple-iphone-13-pro-max/gold/02.webp", - "img/phones/apple-iphone-13-pro-max/gold/03.webp" + "/img/phones/apple-iphone-13-pro-max/gold/00.webp", + "/img/phones/apple-iphone-13-pro-max/gold/01.webp", + "/img/phones/apple-iphone-13-pro-max/gold/02.webp", + "/img/phones/apple-iphone-13-pro-max/gold/03.webp" ], "description": [ { @@ -5508,10 +5508,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "gold", "images": [ - "img/phones/apple-iphone-13-pro-max/gold/00.webp", - "img/phones/apple-iphone-13-pro-max/gold/01.webp", - "img/phones/apple-iphone-13-pro-max/gold/02.webp", - "img/phones/apple-iphone-13-pro-max/gold/03.webp" + "/img/phones/apple-iphone-13-pro-max/gold/00.webp", + "/img/phones/apple-iphone-13-pro-max/gold/01.webp", + "/img/phones/apple-iphone-13-pro-max/gold/02.webp", + "/img/phones/apple-iphone-13-pro-max/gold/03.webp" ], "description": [ { @@ -5559,10 +5559,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "gold", "images": [ - "img/phones/apple-iphone-13-pro-max/gold/00.webp", - "img/phones/apple-iphone-13-pro-max/gold/01.webp", - "img/phones/apple-iphone-13-pro-max/gold/02.webp", - "img/phones/apple-iphone-13-pro-max/gold/03.webp" + "/img/phones/apple-iphone-13-pro-max/gold/00.webp", + "/img/phones/apple-iphone-13-pro-max/gold/01.webp", + "/img/phones/apple-iphone-13-pro-max/gold/02.webp", + "/img/phones/apple-iphone-13-pro-max/gold/03.webp" ], "description": [ { @@ -5610,10 +5610,10 @@ "colorsAvailable": ["graphite", "gold", "sierrablue"], "color": "gold", "images": [ - "img/phones/apple-iphone-13-pro-max/gold/00.webp", - "img/phones/apple-iphone-13-pro-max/gold/01.webp", - "img/phones/apple-iphone-13-pro-max/gold/02.webp", - "img/phones/apple-iphone-13-pro-max/gold/03.webp" + "/img/phones/apple-iphone-13-pro-max/gold/00.webp", + "/img/phones/apple-iphone-13-pro-max/gold/01.webp", + "/img/phones/apple-iphone-13-pro-max/gold/02.webp", + "/img/phones/apple-iphone-13-pro-max/gold/03.webp" ], "description": [ { @@ -5656,11 +5656,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-14-pro/gold/00.webp", - "img/phones/apple-iphone-14-pro/gold/01.webp", - "img/phones/apple-iphone-14-pro/gold/02.webp", - "img/phones/apple-iphone-14-pro/gold/03.webp", - "img/phones/apple-iphone-14-pro/gold/04.webp" + "/img/phones/apple-iphone-14-pro/gold/00.webp", + "/img/phones/apple-iphone-14-pro/gold/01.webp", + "/img/phones/apple-iphone-14-pro/gold/02.webp", + "/img/phones/apple-iphone-14-pro/gold/03.webp", + "/img/phones/apple-iphone-14-pro/gold/04.webp" ], "description": [ { @@ -5703,11 +5703,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-14-pro/gold/00.webp", - "img/phones/apple-iphone-14-pro/gold/01.webp", - "img/phones/apple-iphone-14-pro/gold/02.webp", - "img/phones/apple-iphone-14-pro/gold/03.webp", - "img/phones/apple-iphone-14-pro/gold/04.webp" + "/img/phones/apple-iphone-14-pro/gold/00.webp", + "/img/phones/apple-iphone-14-pro/gold/01.webp", + "/img/phones/apple-iphone-14-pro/gold/02.webp", + "/img/phones/apple-iphone-14-pro/gold/03.webp", + "/img/phones/apple-iphone-14-pro/gold/04.webp" ], "description": [ { @@ -5750,11 +5750,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-14-pro/gold/00.webp", - "img/phones/apple-iphone-14-pro/gold/01.webp", - "img/phones/apple-iphone-14-pro/gold/02.webp", - "img/phones/apple-iphone-14-pro/gold/03.webp", - "img/phones/apple-iphone-14-pro/gold/04.webp" + "/img/phones/apple-iphone-14-pro/gold/00.webp", + "/img/phones/apple-iphone-14-pro/gold/01.webp", + "/img/phones/apple-iphone-14-pro/gold/02.webp", + "/img/phones/apple-iphone-14-pro/gold/03.webp", + "/img/phones/apple-iphone-14-pro/gold/04.webp" ], "description": [ { @@ -5797,11 +5797,11 @@ "colorsAvailable": ["spaceblack", "gold"], "color": "gold", "images": [ - "img/phones/apple-iphone-14-pro/gold/00.webp", - "img/phones/apple-iphone-14-pro/gold/01.webp", - "img/phones/apple-iphone-14-pro/gold/02.webp", - "img/phones/apple-iphone-14-pro/gold/03.webp", - "img/phones/apple-iphone-14-pro/gold/04.webp" + "/img/phones/apple-iphone-14-pro/gold/00.webp", + "/img/phones/apple-iphone-14-pro/gold/01.webp", + "/img/phones/apple-iphone-14-pro/gold/02.webp", + "/img/phones/apple-iphone-14-pro/gold/03.webp", + "/img/phones/apple-iphone-14-pro/gold/04.webp" ], "description": [ { diff --git a/public/api/products.json b/public/api/products.json index 41ecb5e5a6f..b9316e0ccf8 100644 --- a/public/api/products.json +++ b/public/api/products.json @@ -11,7 +11,7 @@ "color": "black", "ram": "2GB", "year": 2016, - "image": "img/phones/apple-iphone-7/black/00.webp" + "image": "/img/phones/apple-iphone-7/black/00.webp" }, { "id": 2, @@ -25,7 +25,7 @@ "color": "black", "ram": "3GB", "year": 2016, - "image": "img/phones/apple-iphone-7-plus/black/00.webp" + "image": "/img/phones/apple-iphone-7-plus/black/00.webp" }, { "id": 3, @@ -39,7 +39,7 @@ "color": "gold", "ram": "2GB", "year": 2017, - "image": "img/phones/apple-iphone-8/gold/00.webp" + "image": "/img/phones/apple-iphone-8/gold/00.webp" }, { "id": 4, @@ -53,7 +53,7 @@ "color": "black", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/black/00.webp" + "image": "/img/phones/apple-iphone-11/black/00.webp" }, { "id": 5, @@ -67,7 +67,7 @@ "color": "yellow", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/yellow/00.webp" + "image": "/img/phones/apple-iphone-11/yellow/00.webp" }, { "id": 6, @@ -81,7 +81,7 @@ "color": "green", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/green/00.webp" + "image": "/img/phones/apple-iphone-11/green/00.webp" }, { "id": 7, @@ -95,7 +95,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro/gold/00.webp" }, { "id": 8, @@ -109,7 +109,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp" }, { "id": 9, @@ -123,7 +123,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro/silver/00.webp" }, { "id": 10, @@ -137,7 +137,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp" }, { "id": 11, @@ -151,7 +151,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/gold/00.webp" }, { "id": 12, @@ -165,7 +165,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp" }, { "id": 13, @@ -179,7 +179,7 @@ "color": "red", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/red/00.webp" + "image": "/img/phones/apple-iphone-xr/red/00.webp" }, { "id": 14, @@ -193,7 +193,7 @@ "color": "white", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/white/00.webp" + "image": "/img/phones/apple-iphone-xr/white/00.webp" }, { "id": 15, @@ -207,7 +207,7 @@ "color": "spacegray", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs/spacegray/00.webp" + "image": "/img/phones/apple-iphone-xs/spacegray/00.webp" }, { "id": 16, @@ -221,7 +221,7 @@ "color": "gold", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/gold/00.webp" + "image": "/img/phones/apple-iphone-xs-max/gold/00.webp" }, { "id": 17, @@ -235,7 +235,7 @@ "color": "silver", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/silver/00.webp" + "image": "/img/phones/apple-iphone-xs-max/silver/00.webp" }, { "id": 18, @@ -249,7 +249,7 @@ "color": "gold", "ram": "2GB", "year": 2016, - "image": "img/phones/apple-iphone-7/gold/00.webp" + "image": "/img/phones/apple-iphone-7/gold/00.webp" }, { "id": 19, @@ -263,7 +263,7 @@ "color": "silver", "ram": "3GB", "year": 2016, - "image": "img/phones/apple-iphone-7-plus/silver/00.webp" + "image": "/img/phones/apple-iphone-7-plus/silver/00.webp" }, { "id": 20, @@ -277,7 +277,7 @@ "color": "spacegray", "ram": "2GB", "year": 2017, - "image": "img/phones/apple-iphone-8/spacegray/00.webp" + "image": "/img/phones/apple-iphone-8/spacegray/00.webp" }, { "id": 21, @@ -291,7 +291,7 @@ "color": "green", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/green/00.webp" + "image": "/img/phones/apple-iphone-11/green/00.webp" }, { "id": 22, @@ -305,7 +305,7 @@ "color": "purple", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/purple/00.webp" + "image": "/img/phones/apple-iphone-11/purple/00.webp" }, { "id": 23, @@ -319,7 +319,7 @@ "color": "yellow", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/yellow/00.webp" + "image": "/img/phones/apple-iphone-11/yellow/00.webp" }, { "id": 24, @@ -333,7 +333,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro/gold/00.webp" }, { "id": 25, @@ -347,7 +347,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro/spacegray/00.webp" }, { "id": 26, @@ -361,7 +361,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/silver/00.webp" }, { "id": 27, @@ -375,7 +375,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" }, { "id": 28, @@ -389,7 +389,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/silver/00.webp" }, { "id": 29, @@ -403,7 +403,7 @@ "color": "white", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/white/00.webp" + "image": "/img/phones/apple-iphone-xr/white/00.webp" }, { "id": 30, @@ -417,7 +417,7 @@ "color": "coral", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/coral/00.webp" + "image": "/img/phones/apple-iphone-xr/coral/00.webp" }, { "id": 31, @@ -431,7 +431,7 @@ "color": "gold", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs/gold/00.webp" + "image": "/img/phones/apple-iphone-xs/gold/00.webp" }, { "id": 32, @@ -445,7 +445,7 @@ "color": "spacegray", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs/spacegray/00.webp" + "image": "/img/phones/apple-iphone-xs/spacegray/00.webp" }, { "id": 33, @@ -459,7 +459,7 @@ "color": "silver", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/silver/00.webp" + "image": "/img/phones/apple-iphone-xs-max/silver/00.webp" }, { "id": 34, @@ -473,7 +473,7 @@ "color": "gold", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/gold/00.webp" + "image": "/img/phones/apple-iphone-xs-max/gold/00.webp" }, { "id": 35, @@ -487,7 +487,7 @@ "color": "rosegold", "ram": "2GB", "year": 2016, - "image": "img/phones/apple-iphone-7/rosegold/00.webp" + "image": "/img/phones/apple-iphone-7/rosegold/00.webp" }, { "id": 36, @@ -501,7 +501,7 @@ "color": "purple", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/purple/00.webp" + "image": "/img/phones/apple-iphone-11/purple/00.webp" }, { "id": 37, @@ -515,7 +515,7 @@ "color": "red", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/red/00.webp" + "image": "/img/phones/apple-iphone-11/red/00.webp" }, { "id": 38, @@ -529,7 +529,7 @@ "color": "black", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/black/00.webp" + "image": "/img/phones/apple-iphone-11/black/00.webp" }, { "id": 39, @@ -543,7 +543,7 @@ "color": "red", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/red/00.webp" + "image": "/img/phones/apple-iphone-11/red/00.webp" }, { "id": 40, @@ -557,7 +557,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp" }, { "id": 41, @@ -571,7 +571,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro/silver/00.webp" }, { "id": 42, @@ -585,7 +585,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro/gold/00.webp" }, { "id": 43, @@ -599,7 +599,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" }, { "id": 44, @@ -613,7 +613,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/spacegray/00.webp" }, { "id": 45, @@ -627,7 +627,7 @@ "color": "coral", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/coral/00.webp" + "image": "/img/phones/apple-iphone-xr/coral/00.webp" }, { "id": 46, @@ -641,7 +641,7 @@ "color": "red", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/red/00.webp" + "image": "/img/phones/apple-iphone-xr/red/00.webp" }, { "id": 47, @@ -655,7 +655,7 @@ "color": "gold", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs/gold/00.webp" + "image": "/img/phones/apple-iphone-xs/gold/00.webp" }, { "id": 48, @@ -669,7 +669,7 @@ "color": "spacegray", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/spacegray/00.webp" + "image": "/img/phones/apple-iphone-xs-max/spacegray/00.webp" }, { "id": 49, @@ -683,7 +683,7 @@ "color": "rosegold", "ram": "3GB", "year": 2016, - "image": "img/phones/apple-iphone-7-plus/rosegold/00.webp" + "image": "/img/phones/apple-iphone-7-plus/rosegold/00.webp" }, { "id": 50, @@ -697,7 +697,7 @@ "color": "white", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/white/00.webp" + "image": "/img/phones/apple-iphone-11/white/00.webp" }, { "id": 51, @@ -711,7 +711,7 @@ "color": "green", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/green/00.webp" + "image": "/img/phones/apple-iphone-11/green/00.webp" }, { "id": 52, @@ -725,7 +725,7 @@ "color": "white", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/white/00.webp" + "image": "/img/phones/apple-iphone-11/white/00.webp" }, { "id": 53, @@ -739,7 +739,7 @@ "color": "black", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/black/00.webp" + "image": "/img/phones/apple-iphone-11/black/00.webp" }, { "id": 54, @@ -753,7 +753,7 @@ "color": "white", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/white/00.webp" + "image": "/img/phones/apple-iphone-11/white/00.webp" }, { "id": 55, @@ -767,7 +767,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro/spacegray/00.webp" }, { "id": 56, @@ -781,7 +781,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro/midnightgreen/00.webp" }, { "id": 57, @@ -795,7 +795,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/gold/00.webp" }, { "id": 58, @@ -809,7 +809,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/silver/00.webp" }, { "id": 59, @@ -823,7 +823,7 @@ "color": "midnightgreen", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/midnightgreen/00.webp" }, { "id": 60, @@ -837,7 +837,7 @@ "color": "yellow", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/yellow/00.webp" + "image": "/img/phones/apple-iphone-xr/yellow/00.webp" }, { "id": 61, @@ -851,7 +851,7 @@ "color": "silver", "ram": "2GB", "year": 2016, - "image": "img/phones/apple-iphone-7/silver/00.webp" + "image": "/img/phones/apple-iphone-7/silver/00.webp" }, { "id": 62, @@ -865,7 +865,7 @@ "color": "purple", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/purple/00.webp" + "image": "/img/phones/apple-iphone-11/purple/00.webp" }, { "id": 63, @@ -879,7 +879,7 @@ "color": "gold", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-11-pro-max/gold/00.webp" }, { "id": 64, @@ -893,7 +893,7 @@ "color": "yellow", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/yellow/00.webp" + "image": "/img/phones/apple-iphone-11/yellow/00.webp" }, { "id": 65, @@ -907,7 +907,7 @@ "color": "spacegray", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/spacegray/00.webp" + "image": "/img/phones/apple-iphone-11-pro/spacegray/00.webp" }, { "id": 66, @@ -921,7 +921,7 @@ "color": "silver", "ram": "2GB", "year": 2017, - "image": "img/phones/apple-iphone-8/silver/00.webp" + "image": "/img/phones/apple-iphone-8/silver/00.webp" }, { "id": 67, @@ -935,7 +935,7 @@ "color": "red", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11/red/00.webp" + "image": "/img/phones/apple-iphone-11/red/00.webp" }, { "id": 68, @@ -949,7 +949,7 @@ "color": "spacegray", "ram": "4GB", "year": 2018, - "image": "img/phones/apple-iphone-xs-max/spacegray/00.webp" + "image": "/img/phones/apple-iphone-xs-max/spacegray/00.webp" }, { "id": 69, @@ -963,7 +963,7 @@ "color": "gold", "ram": "3GB", "year": 2016, - "image": "img/phones/apple-iphone-7-plus/gold/00.webp" + "image": "/img/phones/apple-iphone-7-plus/gold/00.webp" }, { "id": 70, @@ -977,7 +977,7 @@ "color": "silver", "ram": "4GB", "year": 2019, - "image": "img/phones/apple-iphone-11-pro/silver/00.webp" + "image": "/img/phones/apple-iphone-11-pro/silver/00.webp" }, { "id": 71, @@ -991,7 +991,7 @@ "color": "yellow", "ram": "3GB", "year": 2018, - "image": "img/phones/apple-iphone-xr/yellow/00.webp" + "image": "/img/phones/apple-iphone-xr/yellow/00.webp" }, { "id": 72, @@ -1005,7 +1005,7 @@ "color": "midnight", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/midnight/00.webp" + "image": "/img/phones/apple-iphone-14/midnight/00.webp" }, { "id": 73, @@ -1019,7 +1019,7 @@ "color": "midnight", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/midnight/00.webp" + "image": "/img/phones/apple-iphone-14/midnight/00.webp" }, { "id": 74, @@ -1033,7 +1033,7 @@ "color": "midnight", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/midnight/00.webp" + "image": "/img/phones/apple-iphone-14/midnight/00.webp" }, { "id": 75, @@ -1047,7 +1047,7 @@ "color": "yellow", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/yellow/00.webp" + "image": "/img/phones/apple-iphone-14/yellow/00.webp" }, { "id": 76, @@ -1061,7 +1061,7 @@ "color": "yellow", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/yellow/00.webp" + "image": "/img/phones/apple-iphone-14/yellow/00.webp" }, { "id": 77, @@ -1075,7 +1075,7 @@ "color": "yellow", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/yellow/00.webp" + "image": "/img/phones/apple-iphone-14/yellow/00.webp" }, { "id": 78, @@ -1089,7 +1089,7 @@ "color": "purple", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/purple/00.webp" + "image": "/img/phones/apple-iphone-14/purple/00.webp" }, { "id": 79, @@ -1103,7 +1103,7 @@ "color": "purple", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/purple/00.webp" + "image": "/img/phones/apple-iphone-14/purple/00.webp" }, { "id": 80, @@ -1117,7 +1117,7 @@ "color": "purple", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14/purple/00.webp" + "image": "/img/phones/apple-iphone-14/purple/00.webp" }, { "id": 81, @@ -1131,7 +1131,7 @@ "color": "spaceblack", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/spaceblack/00.webp" + "image": "/img/phones/apple-iphone-14-pro/spaceblack/00.webp" }, { "id": 82, @@ -1145,7 +1145,7 @@ "color": "spaceblack", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/spaceblack/00.webp" + "image": "/img/phones/apple-iphone-14-pro/spaceblack/00.webp" }, { "id": 83, @@ -1159,7 +1159,7 @@ "color": "spaceblack", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/spaceblack/00.webp" + "image": "/img/phones/apple-iphone-14-pro/spaceblack/00.webp" }, { "id": 84, @@ -1173,7 +1173,7 @@ "color": "spaceblack", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/spaceblack/00.webp" + "image": "/img/phones/apple-iphone-14-pro/spaceblack/00.webp" }, { "id": 85, @@ -1187,7 +1187,7 @@ "color": "purple", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/purple/00.webp" + "image": "/img/phones/apple-iphone-12/purple/00.webp" }, { "id": 86, @@ -1201,7 +1201,7 @@ "color": "purple", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/purple/00.webp" + "image": "/img/phones/apple-iphone-12/purple/00.webp" }, { "id": 87, @@ -1215,7 +1215,7 @@ "color": "purple", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/purple/00.webp" + "image": "/img/phones/apple-iphone-12/purple/00.webp" }, { "id": 88, @@ -1229,7 +1229,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/white/00.webp" + "image": "/img/phones/apple-iphone-12/white/00.webp" }, { "id": 89, @@ -1243,7 +1243,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/white/00.webp" + "image": "/img/phones/apple-iphone-12/white/00.webp" }, { "id": 90, @@ -1257,7 +1257,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/white/00.webp" + "image": "/img/phones/apple-iphone-12/white/00.webp" }, { "id": 91, @@ -1271,7 +1271,7 @@ "color": "red", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/red/00.webp" + "image": "/img/phones/apple-iphone-12/red/00.webp" }, { "id": 92, @@ -1285,7 +1285,7 @@ "color": "red", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/red/00.webp" + "image": "/img/phones/apple-iphone-12/red/00.webp" }, { "id": 93, @@ -1299,7 +1299,7 @@ "color": "red", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/red/00.webp" + "image": "/img/phones/apple-iphone-12/red/00.webp" }, { "id": 94, @@ -1313,7 +1313,7 @@ "color": "black", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/black/00.webp" + "image": "/img/phones/apple-iphone-12/black/00.webp" }, { "id": 95, @@ -1327,7 +1327,7 @@ "color": "black", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/black/00.webp" + "image": "/img/phones/apple-iphone-12/black/00.webp" }, { "id": 96, @@ -1341,7 +1341,7 @@ "color": "black", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-12/black/00.webp" + "image": "/img/phones/apple-iphone-12/black/00.webp" }, { "id": 97, @@ -1355,7 +1355,7 @@ "color": "blue", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/blue/00.webp" + "image": "/img/phones/apple-iphone-13-mini/blue/00.webp" }, { "id": 98, @@ -1369,7 +1369,7 @@ "color": "blue", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/blue/00.webp" + "image": "/img/phones/apple-iphone-13-mini/blue/00.webp" }, { "id": 99, @@ -1383,7 +1383,7 @@ "color": "blue", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/blue/00.webp" + "image": "/img/phones/apple-iphone-13-mini/blue/00.webp" }, { "id": 100, @@ -1397,7 +1397,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/white/00.webp" + "image": "/img/phones/apple-iphone-13-mini/white/00.webp" }, { "id": 101, @@ -1411,7 +1411,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/white/00.webp" + "image": "/img/phones/apple-iphone-13-mini/white/00.webp" }, { "id": 102, @@ -1425,7 +1425,7 @@ "color": "white", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/white/00.webp" + "image": "/img/phones/apple-iphone-13-mini/white/00.webp" }, { "id": 103, @@ -1439,7 +1439,7 @@ "color": "pink", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/pink/00.webp" + "image": "/img/phones/apple-iphone-13-mini/pink/00.webp" }, { "id": 104, @@ -1453,7 +1453,7 @@ "color": "pink", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/pink/00.webp" + "image": "/img/phones/apple-iphone-13-mini/pink/00.webp" }, { "id": 105, @@ -1467,7 +1467,7 @@ "color": "pink", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/pink/00.webp" + "image": "/img/phones/apple-iphone-13-mini/pink/00.webp" }, { "id": 106, @@ -1481,7 +1481,7 @@ "color": "midnight", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/midnight/00.webp" + "image": "/img/phones/apple-iphone-13-mini/midnight/00.webp" }, { "id": 107, @@ -1495,7 +1495,7 @@ "color": "midnight", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/midnight/00.webp" + "image": "/img/phones/apple-iphone-13-mini/midnight/00.webp" }, { "id": 108, @@ -1509,7 +1509,7 @@ "color": "midnight", "ram": "4GB", "year": 2020, - "image": "img/phones/apple-iphone-13-mini/midnight/00.webp" + "image": "/img/phones/apple-iphone-13-mini/midnight/00.webp" }, { "id": 109, @@ -1523,7 +1523,7 @@ "color": "sierrablue", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" }, { "id": 110, @@ -1537,7 +1537,7 @@ "color": "sierrablue", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" }, { "id": 111, @@ -1551,7 +1551,7 @@ "color": "sierrablue", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" }, { "id": 112, @@ -1565,7 +1565,7 @@ "color": "sierrablue", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/sierrablue/00.webp" }, { "id": 113, @@ -1579,7 +1579,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/gold/00.webp" }, { "id": 114, @@ -1593,7 +1593,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/gold/00.webp" }, { "id": 115, @@ -1607,7 +1607,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/gold/00.webp" }, { "id": 116, @@ -1621,7 +1621,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/gold/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/gold/00.webp" }, { "id": 117, @@ -1635,7 +1635,7 @@ "color": "graphite", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/graphite/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/graphite/00.webp" }, { "id": 118, @@ -1649,7 +1649,7 @@ "color": "graphite", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/graphite/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/graphite/00.webp" }, { "id": 119, @@ -1663,7 +1663,7 @@ "color": "graphite", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/graphite/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/graphite/00.webp" }, { "id": 120, @@ -1677,7 +1677,7 @@ "color": "graphite", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-13-pro-max/graphite/00.webp" + "image": "/img/phones/apple-iphone-13-pro-max/graphite/00.webp" }, { "id": 121, @@ -1691,7 +1691,7 @@ "color": "space gray", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-3/space-gray/00.webp" }, { "id": 122, @@ -1705,7 +1705,7 @@ "color": "space gray", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-3/space-gray/00.webp" }, { "id": 123, @@ -1719,7 +1719,7 @@ "color": "gold", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/gold/00.webp" + "image": "/img/accessories/apple-watch-series-3/gold/00.webp" }, { "id": 124, @@ -1733,7 +1733,7 @@ "color": "gold", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/gold/00.webp" + "image": "/img/accessories/apple-watch-series-3/gold/00.webp" }, { "id": 125, @@ -1747,7 +1747,7 @@ "color": "silver", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/silver/00.webp" + "image": "/img/accessories/apple-watch-series-3/silver/00.webp" }, { "id": 126, @@ -1761,7 +1761,7 @@ "color": "silver", "ram": "768MB", "year": 2017, - "image": "img/accessories/apple-watch-series-3/silver/00.webp" + "image": "/img/accessories/apple-watch-series-3/silver/00.webp" }, { "id": 127, @@ -1775,7 +1775,7 @@ "color": "space gray", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-6/space-gray/00.webp" }, { "id": 128, @@ -1789,7 +1789,7 @@ "color": "space gray", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-6/space-gray/00.webp" }, { "id": 129, @@ -1803,7 +1803,7 @@ "color": "silver", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/silver/00.webp" + "image": "/img/accessories/apple-watch-series-6/silver/00.webp" }, { "id": 130, @@ -1817,7 +1817,7 @@ "color": "silver", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/silver/00.webp" + "image": "/img/accessories/apple-watch-series-6/silver/00.webp" }, { "id": 131, @@ -1831,7 +1831,7 @@ "color": "gold", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/gold/00.webp" + "image": "/img/accessories/apple-watch-series-6/gold/00.webp" }, { "id": 132, @@ -1845,7 +1845,7 @@ "color": "gold", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/gold/00.webp" + "image": "/img/accessories/apple-watch-series-6/gold/00.webp" }, { "id": 133, @@ -1859,7 +1859,7 @@ "color": "blue", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/blue/00.webp" + "image": "/img/accessories/apple-watch-series-6/blue/00.webp" }, { "id": 134, @@ -1873,7 +1873,7 @@ "color": "blue", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/blue/00.webp" + "image": "/img/accessories/apple-watch-series-6/blue/00.webp" }, { "id": 135, @@ -1887,7 +1887,7 @@ "color": "red", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/red/00.webp" + "image": "/img/accessories/apple-watch-series-6/red/00.webp" }, { "id": 136, @@ -1901,7 +1901,7 @@ "color": "red", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-series-6/red/00.webp" + "image": "/img/accessories/apple-watch-series-6/red/00.webp" }, { "id": 137, @@ -1915,7 +1915,7 @@ "color": "silver", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/silver/00.webp" + "image": "/img/accessories/apple-watch-series-5/silver/00.webp" }, { "id": 138, @@ -1929,7 +1929,7 @@ "color": "silver", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/silver/00.webp" + "image": "/img/accessories/apple-watch-series-5/silver/00.webp" }, { "id": 139, @@ -1943,7 +1943,7 @@ "color": "gold", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/gold/00.webp" + "image": "/img/accessories/apple-watch-series-5/gold/00.webp" }, { "id": 140, @@ -1957,7 +1957,7 @@ "color": "gold", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/gold/00.webp" + "image": "/img/accessories/apple-watch-series-5/gold/00.webp" }, { "id": 141, @@ -1971,7 +1971,7 @@ "color": "space-gray", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-5/space-gray/00.webp" }, { "id": 142, @@ -1985,7 +1985,7 @@ "color": "space-gray", "ram": "1GB", "year": 2019, - "image": "img/accessories/apple-watch-series-5/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-5/space-gray/00.webp" }, { "id": 143, @@ -1999,7 +1999,7 @@ "color": "silver", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/silver/00.webp" + "image": "/img/accessories/apple-watch-series-4/silver/00.webp" }, { "id": 144, @@ -2013,7 +2013,7 @@ "color": "silver", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/silver/00.webp" + "image": "/img/accessories/apple-watch-series-4/silver/00.webp" }, { "id": 145, @@ -2027,7 +2027,7 @@ "color": "gold", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/gold/00.webp" + "image": "/img/accessories/apple-watch-series-4/gold/00.webp" }, { "id": 146, @@ -2041,7 +2041,7 @@ "color": "gold", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/gold/00.webp" + "image": "/img/accessories/apple-watch-series-4/gold/00.webp" }, { "id": 147, @@ -2055,7 +2055,7 @@ "color": "space-gray", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-4/space-gray/00.webp" }, { "id": 148, @@ -2069,7 +2069,7 @@ "color": "space-gray", "ram": "0.75GB", "year": 2019, - "image": "img/accessories/apple-watch-series-4/space-gray/00.webp" + "image": "/img/accessories/apple-watch-series-4/space-gray/00.webp" }, { "id": 149, @@ -2083,7 +2083,7 @@ "color": "silver", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/silver/00.webp" + "image": "/img/accessories/apple-watch-se/silver/00.webp" }, { "id": 150, @@ -2097,7 +2097,7 @@ "color": "silver", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/silver/00.webp" + "image": "/img/accessories/apple-watch-se/silver/00.webp" }, { "id": 151, @@ -2111,7 +2111,7 @@ "color": "gold", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/gold/00.webp" + "image": "/img/accessories/apple-watch-se/gold/00.webp" }, { "id": 152, @@ -2125,7 +2125,7 @@ "color": "gold", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/gold/00.webp" + "image": "/img/accessories/apple-watch-se/gold/00.webp" }, { "id": 153, @@ -2139,7 +2139,7 @@ "color": "space gray", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/space-gray/00.webp" + "image": "/img/accessories/apple-watch-se/space-gray/00.webp" }, { "id": 154, @@ -2153,7 +2153,7 @@ "color": "space gray", "ram": "1GB", "year": 2020, - "image": "img/accessories/apple-watch-se/space-gray/00.webp" + "image": "/img/accessories/apple-watch-se/space-gray/00.webp" }, { "id": 155, @@ -2164,7 +2164,7 @@ "fullPrice": 799, "price": 749, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2178,7 +2178,7 @@ "fullPrice": 799, "price": 749, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2192,7 +2192,7 @@ "fullPrice": 829, "price": 799, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2206,7 +2206,7 @@ "fullPrice": 829, "price": 799, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2220,7 +2220,7 @@ "fullPrice": 869, "price": 819, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2234,7 +2234,7 @@ "fullPrice": 869, "price": 819, "color": "silver", - "image": "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2248,7 +2248,7 @@ "fullPrice": 899, "price": 879, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2262,7 +2262,7 @@ "fullPrice": 899, "price": 879, "color": "silver", - "image": "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2276,7 +2276,7 @@ "fullPrice": 999, "price": 939, "color": "spacegray", - "image": "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2290,7 +2290,7 @@ "fullPrice": 999, "price": 939, "color": "silver", - "image": "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "image": "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", "screen": "11' Liquid Retina", "ram": "8GB", "year": 2021 @@ -2304,7 +2304,7 @@ "fullPrice": 749, "price": 699, "color": "rose gold", - "image": "img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2318,7 +2318,7 @@ "fullPrice": 599, "price": 549, "color": "rose gold", - "image": "img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2332,7 +2332,7 @@ "fullPrice": 749, "price": 699, "color": "silver", - "image": "img/tablets/apple-ipad-air-4th-gen/silver/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/silver/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2346,7 +2346,7 @@ "fullPrice": 599, "price": 549, "color": "silver", - "image": "img/tablets/apple-ipad-air-4th-gen/silver/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/silver/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2360,7 +2360,7 @@ "fullPrice": 749, "price": 699, "color": "green", - "image": "img/tablets/apple-ipad-air-4th-gen/green/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/green/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2374,7 +2374,7 @@ "fullPrice": 599, "price": 549, "color": "green", - "image": "img/tablets/apple-ipad-air-4th-gen/green/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/green/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2388,7 +2388,7 @@ "fullPrice": 749, "price": 699, "color": "sky-blue", - "image": "img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2402,7 +2402,7 @@ "fullPrice": 599, "price": 549, "color": "sky-blue", - "image": "img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", + "image": "/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", "screen": "10.9' Liquid Retina", "ram": "4GB", "year": 2020 @@ -2416,7 +2416,7 @@ "fullPrice": 649, "price": 599, "color": "spacegray", - "image": "img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2430,7 +2430,7 @@ "fullPrice": 499, "price": 469, "color": "spacegray", - "image": "img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2444,7 +2444,7 @@ "fullPrice": 649, "price": 599, "color": "starlight", - "image": "img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2458,7 +2458,7 @@ "fullPrice": 499, "price": 469, "color": "starlight", - "image": "img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2472,7 +2472,7 @@ "fullPrice": 649, "price": 599, "color": "pink", - "image": "img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2486,7 +2486,7 @@ "fullPrice": 499, "price": 469, "color": "pink", - "image": "img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", + "image": "/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", "screen": "8.3' Liquid Retina", "ram": "4GB", "year": 2021 @@ -2500,7 +2500,7 @@ "fullPrice": 429, "price": 399, "color": "gold", - "image": "img/tablets/apple-ipad-10-2-2020/gold/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/gold/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2514,7 +2514,7 @@ "fullPrice": 329, "price": 299, "color": "gold", - "image": "img/tablets/apple-ipad-10-2-2020/gold/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/gold/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2528,7 +2528,7 @@ "fullPrice": 429, "price": 399, "color": "silver", - "image": "img/tablets/apple-ipad-10-2-2020/silver/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/silver/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2542,7 +2542,7 @@ "fullPrice": 329, "price": 299, "color": "silver", - "image": "img/tablets/apple-ipad-10-2-2020/silver/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/silver/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2556,7 +2556,7 @@ "fullPrice": 429, "price": 399, "color": "spacegray", - "image": "img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2570,7 +2570,7 @@ "fullPrice": 329, "price": 299, "color": "spacegray", - "image": "img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", "screen": "10.2' Retina", "ram": "3GB", "year": 2020 @@ -2584,7 +2584,7 @@ "fullPrice": 549, "price": 499, "color": "silver", - "image": "img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2598,7 +2598,7 @@ "fullPrice": 549, "price": 499, "color": "silver", - "image": "img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2612,7 +2612,7 @@ "fullPrice": 549, "price": 499, "color": "spacegray", - "image": "img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2626,7 +2626,7 @@ "fullPrice": 549, "price": 499, "color": "spacegray", - "image": "img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2640,7 +2640,7 @@ "fullPrice": 549, "price": 499, "color": "gold", - "image": "img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2654,7 +2654,7 @@ "fullPrice": 549, "price": 499, "color": "gold", - "image": "img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", + "image": "/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", "screen": "7.9' Retina", "ram": "3GB", "year": 2019 @@ -2671,7 +2671,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-14-pro/gold/00.webp" }, { "id": 192, @@ -2685,7 +2685,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-14-pro/gold/00.webp" }, { "id": 193, @@ -2699,7 +2699,7 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-14-pro/gold/00.webp" }, { "id": 194, @@ -2713,6 +2713,6 @@ "color": "gold", "ram": "6GB", "year": 2022, - "image": "img/phones/apple-iphone-14-pro/gold/00.webp" + "image": "/img/phones/apple-iphone-14-pro/gold/00.webp" } ] \ No newline at end of file diff --git a/public/api/tablets.json b/public/api/tablets.json index dc555396f72..c9abcfd8976 100644 --- a/public/api/tablets.json +++ b/public/api/tablets.json @@ -11,9 +11,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" ], "description": [ { @@ -58,9 +58,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" ], "description": [ { @@ -105,9 +105,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" ], "description": [ { @@ -152,9 +152,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" ], "description": [ { @@ -199,9 +199,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", - "img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/spacegray/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/spacegray/02.webp" ], "description": [ { @@ -246,9 +246,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "silver", "images": [ - "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/01.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/02.webp" ], "description": [ { @@ -293,9 +293,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "silver", "images": [ - "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/01.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/02.webp" ], "description": [ { @@ -340,9 +340,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "silver", "images": [ - "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/01.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/02.webp" ], "description": [ { @@ -387,9 +387,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "silver", "images": [ - "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/01.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/02.webp" ], "description": [ { @@ -434,9 +434,9 @@ "colorsAvailable": ["spacegray", "silver"], "color": "silver", "images": [ - "img/tablets/apple-ipad-pro-11-2021/silver/00.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/01.webp", - "img/tablets/apple-ipad-pro-11-2021/silver/02.webp" + "/img/tablets/apple-ipad-pro-11-2021/silver/00.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/01.webp", + "/img/tablets/apple-ipad-pro-11-2021/silver/02.webp" ], "description": [ { @@ -481,10 +481,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "rose gold", "images": [ - "img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp" ], "description": [ { @@ -529,10 +529,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "rose gold", "images": [ - "img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp", - "img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/rose-gold/03.webp" ], "description": [ { @@ -577,10 +577,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "silver", "images": [ - "img/tablets/apple-ipad-air-4th-gen/silver/00.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/01.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/02.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/silver/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/03.webp" ], "description": [ { @@ -625,10 +625,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "silver", "images": [ - "img/tablets/apple-ipad-air-4th-gen/silver/00.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/01.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/02.webp", - "img/tablets/apple-ipad-air-4th-gen/silver/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/silver/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/silver/03.webp" ], "description": [ { @@ -673,10 +673,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "green", "images": [ - "img/tablets/apple-ipad-air-4th-gen/green/00.webp", - "img/tablets/apple-ipad-air-4th-gen/green/01.webp", - "img/tablets/apple-ipad-air-4th-gen/green/02.webp", - "img/tablets/apple-ipad-air-4th-gen/green/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/green/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/03.webp" ], "description": [ { @@ -721,10 +721,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "green", "images": [ - "img/tablets/apple-ipad-air-4th-gen/green/00.webp", - "img/tablets/apple-ipad-air-4th-gen/green/01.webp", - "img/tablets/apple-ipad-air-4th-gen/green/02.webp", - "img/tablets/apple-ipad-air-4th-gen/green/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/green/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/green/03.webp" ], "description": [ { @@ -769,10 +769,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "sky blue", "images": [ - "img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp" ], "description": [ { @@ -817,10 +817,10 @@ "colorsAvailable": ["rose gold", "silver", "green", "sky blue"], "color": "sky blue", "images": [ - "img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp", - "img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp" + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/00.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/01.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/02.webp", + "/img/tablets/apple-ipad-air-4th-gen/sky-blue/03.webp" ], "description": [ { @@ -865,9 +865,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp" ], "description": [ { @@ -912,9 +912,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/spacegray/02.webp" ], "description": [ { @@ -959,9 +959,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "starlight", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp" ], "description": [ { @@ -1006,9 +1006,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "starlight", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/starlight/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/starlight/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/starlight/02.webp" ], "description": [ { @@ -1053,9 +1053,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "pink", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/pink/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/pink/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/pink/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/pink/02.webp" ], "description": [ { @@ -1100,9 +1100,9 @@ "colorsAvailable": ["spacegray", "starlight", "pink"], "color": "pink", "images": [ - "img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", - "img/tablets/apple-ipad-mini-6th-gen/pink/01.webp", - "img/tablets/apple-ipad-mini-6th-gen/pink/02.webp" + "/img/tablets/apple-ipad-mini-6th-gen/pink/00.webp", + "/img/tablets/apple-ipad-mini-6th-gen/pink/01.webp", + "/img/tablets/apple-ipad-mini-6th-gen/pink/02.webp" ], "description": [ { @@ -1147,10 +1147,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "gold", "images": [ - "img/tablets/apple-ipad-10-2-2020/gold/00.webp", - "img/tablets/apple-ipad-10-2-2020/gold/01.webp", - "img/tablets/apple-ipad-10-2-2020/gold/02.webp", - "img/tablets/apple-ipad-10-2-2020/gold/03.webp" + "/img/tablets/apple-ipad-10-2-2020/gold/00.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/01.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/02.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/03.webp" ], "description": [ { @@ -1195,10 +1195,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "gold", "images": [ - "img/tablets/apple-ipad-10-2-2020/gold/00.webp", - "img/tablets/apple-ipad-10-2-2020/gold/01.webp", - "img/tablets/apple-ipad-10-2-2020/gold/02.webp", - "img/tablets/apple-ipad-10-2-2020/gold/03.webp" + "/img/tablets/apple-ipad-10-2-2020/gold/00.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/01.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/02.webp", + "/img/tablets/apple-ipad-10-2-2020/gold/03.webp" ], "description": [ { @@ -1243,10 +1243,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "silver", "images": [ - "img/tablets/apple-ipad-10-2-2020/silver/00.webp", - "img/tablets/apple-ipad-10-2-2020/silver/01.webp", - "img/tablets/apple-ipad-10-2-2020/silver/02.webp", - "img/tablets/apple-ipad-10-2-2020/silver/03.webp" + "/img/tablets/apple-ipad-10-2-2020/silver/00.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/01.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/02.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/03.webp" ], "description": [ { @@ -1291,10 +1291,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "silver", "images": [ - "img/tablets/apple-ipad-10-2-2020/silver/00.webp", - "img/tablets/apple-ipad-10-2-2020/silver/01.webp", - "img/tablets/apple-ipad-10-2-2020/silver/02.webp", - "img/tablets/apple-ipad-10-2-2020/silver/03.webp" + "/img/tablets/apple-ipad-10-2-2020/silver/00.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/01.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/02.webp", + "/img/tablets/apple-ipad-10-2-2020/silver/03.webp" ], "description": [ { @@ -1339,10 +1339,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/01.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/02.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/03.webp" + "/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/01.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/02.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/03.webp" ], "description": [ { @@ -1387,10 +1387,10 @@ "colorsAvailable": ["gold", "silver", "spacegray"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/01.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/02.webp", - "img/tablets/apple-ipad-10-2-2020/spacegray/03.webp" + "/img/tablets/apple-ipad-10-2-2020/spacegray/00.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/01.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/02.webp", + "/img/tablets/apple-ipad-10-2-2020/spacegray/03.webp" ], "description": [ { @@ -1435,8 +1435,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "silver", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/silver/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/silver/01.webp" ], "description": [ { @@ -1481,8 +1481,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "silver", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/silver/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/silver/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/silver/01.webp" ], "description": [ { @@ -1527,8 +1527,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp" ], "description": [ { @@ -1573,8 +1573,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "spacegray", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/spacegray/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/spacegray/01.webp" ], "description": [ { @@ -1619,8 +1619,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "gold", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/gold/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/gold/01.webp" ], "description": [ { @@ -1665,8 +1665,8 @@ "colorsAvailable": ["silver", "spacegray", "gold"], "color": "gold", "images": [ - "img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", - "img/tablets/apple-ipad-mini-5th-gen/gold/01.webp" + "/img/tablets/apple-ipad-mini-5th-gen/gold/00.webp", + "/img/tablets/apple-ipad-mini-5th-gen/gold/01.webp" ], "description": [ { diff --git a/public/img/Logo.png b/public/img/Logo.png new file mode 100644 index 00000000000..5102e2cf845 Binary files /dev/null and b/public/img/Logo.png differ diff --git a/public/img/Logo@2x.png b/public/img/Logo@2x.png new file mode 100644 index 00000000000..922a6ae47b2 Binary files /dev/null and b/public/img/Logo@2x.png differ diff --git a/public/img/banner-Iphone14.png b/public/img/banner-Iphone14.png new file mode 100644 index 00000000000..d183b816d88 Binary files /dev/null and b/public/img/banner-Iphone14.png differ diff --git a/src/App.scss b/src/App.scss index 71bc413aade..1caad99833d 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1 +1,9 @@ -// not empty +.App { + min-height: 100vh; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} diff --git a/src/App.tsx b/src/App.tsx index 372e4b42066..4950a0fc2fa 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,55 @@ import './App.scss'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import { CartProvider } from './context/CartContext'; +import { FavoritesProvider } from './context/FavoritesContext'; +import { Header } from './components/Header'; +import { Footer } from './components/Footer'; +import { HomePage } from './modules/HomePage'; +import { ProductsPage } from './modules/ProductsPage'; +import { ProductDetailsPage } from './modules/ProductDetailsPage'; +import { CartPage } from './modules/CartPage'; +import { FavoritesPage } from './modules/FavoritesPage'; +import { NotFoundPage } from './modules/NotFoundPage'; + +const basename = (() => { + const base = import.meta.env.BASE_URL || '/'; + + return base.startsWith('http') ? new URL(base).pathname : base; +})(); export const App = () => ( -
-

Product Catalog

-
+ + + +
+
+
+ + } /> + } + /> + } + /> + } + /> + } + /> + } /> + } /> + } /> + +
+
+
+
+
); diff --git a/src/components/Footer/Footer.module.scss b/src/components/Footer/Footer.module.scss new file mode 100644 index 00000000000..bcd05460a64 --- /dev/null +++ b/src/components/Footer/Footer.module.scss @@ -0,0 +1,91 @@ +.footer { + background: #f8f9fa; + border-top: 1px solid #e9ecef; + margin-top: auto; + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + } + + .top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; + } + + .logo { + font-size: 24px; + font-weight: bold; + color: #000; + display: flex; + align-items: center; + gap: 8px; + + i { + font-size: 28px; + color: #89939A; + } + + span { + font-size: 20px; + } + } + + .contacts { + display: flex; + gap: 80px; + } + + .contactLink { + color: #89939A; + text-decoration: none; + font-weight: 500; + + &:hover { + text-decoration: underline; + } + } + + .actions { + display: flex; + gap: 80px; + } + + .githubLink { + color: #89939A; + text-decoration: none; + font-weight: 500; + + &:hover { + text-decoration: underline; + } + } + + .backToTop { + // background: #666; + color: #89939A; + border: none; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; + transition: background 0.3s; + + &:hover { + background: white; + } + } + + .bottom { + text-align: center; + } + + .rights { + margin: 0; + color: #666; + font-size: 14px; + } +} diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx new file mode 100644 index 00000000000..a186960d6f9 --- /dev/null +++ b/src/components/Footer/Footer.tsx @@ -0,0 +1,54 @@ +import React from 'react'; +import styles from './Footer.module.scss'; + +export const Footer: React.FC = () => { + const scrollToTop = () => { + window.scrollTo({ top: 0, behavior: 'smooth' }); + }; + + return ( + + ); +}; diff --git a/src/components/Footer/index.ts b/src/components/Footer/index.ts new file mode 100644 index 00000000000..ddcc5a9cd18 --- /dev/null +++ b/src/components/Footer/index.ts @@ -0,0 +1 @@ +export * from './Footer'; diff --git a/src/components/Header/Header.module.scss b/src/components/Header/Header.module.scss new file mode 100644 index 00000000000..e149a6b3b94 --- /dev/null +++ b/src/components/Header/Header.module.scss @@ -0,0 +1,90 @@ +.header { + position: sticky; + top: 0; + background: white; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + z-index: 1000; + font-family: montserrat, sans-serif; + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; + display: flex; + align-items: center; + justify-content: space-between; + height: 60px; + } + + .logo { + font-size: 24px; + font-weight: bold; + text-decoration: none; + color: #313237; + display: flex; + align-items: center; + gap: 8px; + + i { + font-size: 28px; + color: #313237; + + } + + span { + font-size: 20px; + text-align: end; + } + } + + .nav { + display: flex; + gap: 30px; + + .navLink { + text-decoration: none; + color: #333; + font-weight: 500; + padding: 10px 0; + transition: color 0.3s; + + &:hover, + &.active { + color: #313237; + } + } + } + + .actions { + display: flex; + gap: 20px; + + .iconLink { + position: relative; + text-decoration: none; + color: #333; + font-size: 20px; + transition: color 0.3s; + + &:hover { + color: #007bff; + } + + .badge { + position: absolute; + top: -8px; + right: -8px; + background: #007bff; + color: white; + border-radius: 50%; + width: 18px; + height: 18px; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + font-weight: bold; + } + } + } +} diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx new file mode 100644 index 00000000000..f2ddb6695ea --- /dev/null +++ b/src/components/Header/Header.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import { useCart } from '../../context/CartContext'; +import { useFavorites } from '../../context/FavoritesContext'; +import styles from './Header.module.scss'; + +export const Header: React.FC = () => { + const { getTotalQuantity } = useCart(); + const { favorites } = useFavorites(); + const location = useLocation(); + + const isActive = (path: string) => location.pathname === path; + + return ( +
+
+ + {/* */} + {/* NICE GADGETS */} + + + + + +
+ + + {favorites.length > 0 && ( + {favorites.length} + )} + + + + {getTotalQuantity() > 0 && ( + {getTotalQuantity()} + )} + +
+
+
+ ); +}; diff --git a/src/components/Header/index.ts b/src/components/Header/index.ts new file mode 100644 index 00000000000..266dec8a1bc --- /dev/null +++ b/src/components/Header/index.ts @@ -0,0 +1 @@ +export * from './Header'; diff --git a/src/components/PicturesSlider/PicturesSlider.module.scss b/src/components/PicturesSlider/PicturesSlider.module.scss new file mode 100644 index 00000000000..55fc969de68 --- /dev/null +++ b/src/components/PicturesSlider/PicturesSlider.module.scss @@ -0,0 +1,129 @@ +.slider { + position: relative; + width: 100%; + height: 400px; + overflow: hidden; + margin-bottom: 40px; + + .prevButton, + .nextButton { + position: absolute; + top: 0; + width: 70px; + height: 100%; + background: rgba(0, 0, 0, 0.15); + color: white; + border: none; + display: flex; + align-items: center; + justify-content: center; + font-size: 28px; + cursor: pointer; + z-index: 10; + transition: background 0.3s; + } + + .prevButton { + left: 0; + } + + .nextButton { + right: 0; + } + + .prevButton:hover, + .nextButton:hover { + background: rgba(0, 0, 0, 0.28); + } + + .imageContainer { + position: relative; + width: 100%; + height: 100%; + + .image { + width: 100%; + height: 100%; + object-fit: cover; + } + + .overlay { + position: absolute; + top: 50%; + left: 6%; + transform: translateY(-50%); + max-width: 420px; + padding: 20px; + display: flex; + align-items: flex-start; + } + + .overlayCard { + background: rgba(0, 0, 0, 0.65); + border: 1px solid rgba(255, 255, 255, 0.08); + backdrop-filter: blur(12px); + border-radius: 24px; + padding: 36px 30px; + color: #fff; + } + + .label { + margin: 0 0 16px; + font-size: 2rem; + line-height: 1.1; + font-weight: 700; + color: #8c7bff; + } + + .caption { + margin: 0 0 26px; + font-size: 1rem; + line-height: 1.6; + opacity: 0.8; + } + + .ctaButton { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 14px 30px; + border-radius: 999px; + border: 1px solid rgba(255, 255, 255, 0.18); + background: rgba(255, 255, 255, 0.08); + color: #fff; + cursor: pointer; + font-size: 0.85rem; + letter-spacing: 0.05em; + text-transform: uppercase; + transition: background 0.3s, transform 0.2s; + } + + .ctaButton:hover { + background: rgba(255, 255, 255, 0.16); + transform: translateY(-1px); + } + } + + .dots { + position: absolute; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + display: flex; + gap: 10px; + + .dot { + width: 12px; + height: 12px; + border-radius: 50%; + border: none; + background: rgba(255, 255, 255, 0.5); + cursor: pointer; + transition: background 0.3s; + + &.active { + background: white; + } + } + } +} diff --git a/src/components/PicturesSlider/PicturesSlider.tsx b/src/components/PicturesSlider/PicturesSlider.tsx new file mode 100644 index 00000000000..f86e9ee1042 --- /dev/null +++ b/src/components/PicturesSlider/PicturesSlider.tsx @@ -0,0 +1,84 @@ +import React, { useState, useEffect } from 'react'; +import styles from './PicturesSlider.module.scss'; + +const slides = [ + { + image: `${import.meta.env.BASE_URL}img/banner-Iphone14.png`, + label: 'Now available in our store! 👌', + caption: 'Be the first!', + button: 'ORDER NOW', + }, + { + image: `${import.meta.env.BASE_URL}img/banner-phones.png`, + }, + { + image: `${import.meta.env.BASE_URL}img/banner-tablets.png`, + }, +]; + +export const PicturesSlider: React.FC = () => { + const [currentImage, setCurrentImage] = useState(0); + + useEffect(() => { + const interval = setInterval(() => { + setCurrentImage(prev => (prev + 1) % slides.length); + }, 5000); + + return () => clearInterval(interval); + }, []); + + const goToImage = (index: number) => { + setCurrentImage(index); + }; + + const nextImage = () => { + setCurrentImage(prev => (prev + 1) % slides.length); + }; + + const prevImage = () => { + setCurrentImage(prev => (prev - 1 + slides.length) % slides.length); + }; + + const currentSlide = slides[currentImage]; + + return ( +
+ +
+ {`Slide + + {currentSlide.label && ( +
+
+

{currentSlide.label}

+

{currentSlide.caption}

+ +
+
+ )} +
+ + +
+ {slides.map((_, index) => ( +
+
+ ); +}; diff --git a/src/components/PicturesSlider/index.ts b/src/components/PicturesSlider/index.ts new file mode 100644 index 00000000000..81a373f3aa1 --- /dev/null +++ b/src/components/PicturesSlider/index.ts @@ -0,0 +1 @@ +export * from './PicturesSlider'; diff --git a/src/components/ProductCard/ProductCard.module.scss b/src/components/ProductCard/ProductCard.module.scss new file mode 100644 index 00000000000..71b950155e0 --- /dev/null +++ b/src/components/ProductCard/ProductCard.module.scss @@ -0,0 +1,141 @@ +.productCard { + border: 1px solid #e9ecef; + border-radius: 8px; + background: white; + overflow: hidden; + transition: all 0.3s; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + + &:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); + } + + .imageLink { + display: block; + text-decoration: none; + + .image { + width: 100%; + height: 200px; + object-fit: contain; + background: #f8f9fa; + transition: transform 0.3s; + + &:hover { + transform: scale(1.1); + } + } + } + + .content { + padding: 16px; + } + + .titleLink { + text-decoration: none; + color: inherit; + } + + .title { + font-size: 16px; + font-weight: 600; + margin: 0 0 12px; + line-height: 1.4; + transition: color 0.3s; + + .titleLink:hover & { + color: Gray / Primary; + } + } + + .price { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 12px; + + .currentPrice { + font-size: 18px; + font-weight: bold; + color: Gray / Primary; + } + + .oldPrice { + font-size: 14px; + color: #6c757d; + text-decoration: line-through; + } + + .discount { + background: #dc3545; + color: white; + padding: 2px 6px; + border-radius: 4px; + font-size: 12px; + font-weight: bold; + } + } + + .specs { + margin-bottom: 16px; + + .spec { + display: flex; + justify-content: space-between; + margin-bottom: 4px; + + .specLabel { + color: #6c757d; + font-size: 14px; + } + + .specValue { + font-weight: 500; + font-size: 14px; + } + } + } + + .actions { + display: flex; + gap: 8px; + + .cartButton { + flex: 1; + background: #313237; + color: white; + border: none; + padding: 10px; + border-radius: 4px; + cursor: pointer; + font-weight: 500; + transition: background 0.3s; + + &:hover { + background: #313237; + } + } + + .favoriteButton { + background: none; + border: 1px solid #dee2e6; + padding: 10px; + border-radius: 4px; + cursor: pointer; + color: #6c757d; + transition: all 0.3s; + + &:hover { + border-color: #dc3545; + color: #dc3545; + } + + &.active { + background: #dc3545; + border-color: #dc3545; + color: white; + } + } + } +} diff --git a/src/components/ProductCard/ProductCard.tsx b/src/components/ProductCard/ProductCard.tsx new file mode 100644 index 00000000000..67b45fe6e4b --- /dev/null +++ b/src/components/ProductCard/ProductCard.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import { Product } from '../../types'; +import { useCart } from '../../context/CartContext'; +import { useFavorites } from '../../context/FavoritesContext'; +import styles from './ProductCard.module.scss'; + +interface ProductCardProps { + product: Product; +} + +export const ProductCard: React.FC = ({ product }) => { + const { addToCart } = useCart(); + const { addToFavorites, removeFromFavorites, isFavorite } = useFavorites(); + + const handleAddToCart = () => { + addToCart(product); + }; + + const handleToggleFavorite = () => { + if (isFavorite(product.itemId)) { + removeFromFavorites(product.itemId); + } else { + addToFavorites(product); + } + }; + + const discount = product.fullPrice - product.price; + const discountPercentage = Math.round((discount / product.fullPrice) * 100); + + return ( +
+ + {product.name} + + +
+ +

{product.name}

+ + +
+ ${product.price} + {discount > 0 && ( + <> + ${product.fullPrice} + -{discountPercentage}% + + )} +
+ +
+
+ Screen + {product.screen} +
+
+ Capacity + {product.capacity} +
+
+ RAM + {product.ram} +
+
+ +
+ + +
+
+
+ ); +}; diff --git a/src/components/ProductCard/index.ts b/src/components/ProductCard/index.ts new file mode 100644 index 00000000000..7ce031c3820 --- /dev/null +++ b/src/components/ProductCard/index.ts @@ -0,0 +1 @@ +export * from './ProductCard'; diff --git a/src/components/ProductsSlider/ProductsSlider.module.scss b/src/components/ProductsSlider/ProductsSlider.module.scss new file mode 100644 index 00000000000..6590f8b002f --- /dev/null +++ b/src/components/ProductsSlider/ProductsSlider.module.scss @@ -0,0 +1,77 @@ +.productsSlider { + margin-bottom: 40px; + + h2 { + font-size: 24px; + margin-bottom: 20px; + text-align: center; + } + + .sliderContainer { + position: relative; + display: flex; + align-items: center; + + .prevButton { + background: #f8f9fa; + border: 1px solid #dee2e6; + width: 40px; + height: 40px; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + z-index: 10; + transition: all 0.3s; + margin-right: 10px; + + &:hover { + background: #007bff; + color: white; + border-color: #007bff; + } + } + + .nextButton { + background: #f8f9fa; + border: 1px solid #dee2e6; + width: 40px; + height: 40px; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + z-index: 10; + transition: all 0.3s; + margin-left: 10px; + + &:hover { + background: #007bff; + color: white; + border-color: #007bff; + } + } + + .slider { + flex: 1; + display: flex; + gap: 20px; + overflow-x: auto; + scroll-behavior: smooth; + padding: 10px 0; + + &::-webkit-scrollbar { + display: none; + } + + .productItem { + flex-shrink: 0; + width: 250px; + } + } + } +} diff --git a/src/components/ProductsSlider/ProductsSlider.tsx b/src/components/ProductsSlider/ProductsSlider.tsx new file mode 100644 index 00000000000..75680cb05d7 --- /dev/null +++ b/src/components/ProductsSlider/ProductsSlider.tsx @@ -0,0 +1,49 @@ +import React, { useRef } from 'react'; +import { Product } from '../../types'; +import { ProductCard } from '../ProductCard'; +import styles from './ProductsSlider.module.scss'; + +interface ProductsSliderProps { + title: string; + products: Product[]; +} + +export const ProductsSlider: React.FC = ({ + title, + products, +}) => { + const sliderRef = useRef(null); + + const scrollLeft = () => { + if (sliderRef.current) { + sliderRef.current.scrollBy({ left: -300, behavior: 'smooth' }); + } + }; + + const scrollRight = () => { + if (sliderRef.current) { + sliderRef.current.scrollBy({ left: 300, behavior: 'smooth' }); + } + }; + + return ( +
+

{title}

+
+ +
+ {products.map(product => ( +
+ +
+ ))} +
+ +
+
+ ); +}; diff --git a/src/components/ProductsSlider/index.ts b/src/components/ProductsSlider/index.ts new file mode 100644 index 00000000000..68d3ea00125 --- /dev/null +++ b/src/components/ProductsSlider/index.ts @@ -0,0 +1 @@ +export * from './ProductsSlider'; diff --git a/src/context/CartContext.tsx b/src/context/CartContext.tsx new file mode 100644 index 00000000000..2f554fb4046 --- /dev/null +++ b/src/context/CartContext.tsx @@ -0,0 +1,107 @@ +import React, { + createContext, + useContext, + useState, + useEffect, + ReactNode, +} from 'react'; +import { CartItem, Product } from '../types'; + +interface CartContextType { + cart: CartItem[]; + addToCart: (product: Product) => void; + removeFromCart: (id: string) => void; + updateQuantity: (id: string, quantity: number) => void; + clearCart: () => void; + getTotalQuantity: () => number; + getTotalPrice: () => number; +} + +const CartContext = createContext(undefined); + +export const useCart = () => { + const context = useContext(CartContext); + + if (!context) { + throw new Error('useCart must be used within a CartProvider'); + } + + return context; +}; + +interface CartProviderProps { + children: ReactNode; +} + +export const CartProvider: React.FC = ({ children }) => { + const [cart, setCart] = useState([]); + + useEffect(() => { + const storedCart = localStorage.getItem('cart'); + + if (storedCart) { + setCart(JSON.parse(storedCart)); + } + }, []); + + useEffect(() => { + localStorage.setItem('cart', JSON.stringify(cart)); + }, [cart]); + + const addToCart = (product: Product) => { + setCart(prevCart => { + const existingItem = prevCart.find(item => item.id === product.itemId); + + if (existingItem) { + return prevCart; // Already in cart + } + + return [...prevCart, { id: product.itemId, quantity: 1, product }]; + }); + }; + + const removeFromCart = (id: string) => { + setCart(prevCart => prevCart.filter(item => item.id !== id)); + }; + + const updateQuantity = (id: string, quantity: number) => { + if (quantity <= 0) { + return; + } + + setCart(prevCart => + prevCart.map(item => (item.id === id ? { ...item, quantity } : item)), + ); + }; + + const clearCart = () => { + setCart([]); + }; + + const getTotalQuantity = () => { + return cart.reduce((total, item) => total + item.quantity, 0); + }; + + const getTotalPrice = () => { + return cart.reduce( + (total, item) => total + item.product.price * item.quantity, + 0, + ); + }; + + return ( + + {children} + + ); +}; diff --git a/src/context/FavoritesContext.tsx b/src/context/FavoritesContext.tsx new file mode 100644 index 00000000000..5502d3bdf83 --- /dev/null +++ b/src/context/FavoritesContext.tsx @@ -0,0 +1,84 @@ +import React, { + createContext, + useContext, + useState, + useEffect, + ReactNode, +} from 'react'; +import { Product } from '../types'; + +interface FavoritesContextType { + favorites: Product[]; + addToFavorites: (product: Product) => void; + removeFromFavorites: (id: string) => void; + isFavorite: (id: string) => boolean; +} + +const FavoritesContext = createContext( + undefined, +); + +export const useFavorites = () => { + const context = useContext(FavoritesContext); + + if (!context) { + throw new Error('useFavorites must be used within a FavoritesProvider'); + } + + return context; +}; + +interface FavoritesProviderProps { + children: ReactNode; +} + +export const FavoritesProvider: React.FC = ({ + children, +}) => { + const [favorites, setFavorites] = useState([]); + + useEffect(() => { + const storedFavorites = localStorage.getItem('favorites'); + + if (storedFavorites) { + setFavorites(JSON.parse(storedFavorites)); + } + }, []); + + useEffect(() => { + localStorage.setItem('favorites', JSON.stringify(favorites)); + }, [favorites]); + + const addToFavorites = (product: Product) => { + setFavorites(prevFavorites => { + if (prevFavorites.find(fav => fav.itemId === product.itemId)) { + return prevFavorites; // Already favorite + } + + return [...prevFavorites, product]; + }); + }; + + const removeFromFavorites = (id: string) => { + setFavorites(prevFavorites => + prevFavorites.filter(fav => fav.itemId !== id), + ); + }; + + const isFavorite = (id: string) => { + return favorites.some(fav => fav.itemId === id); + }; + + return ( + + {children} + + ); +}; diff --git a/src/modules/CartPage/CartPage.module.scss b/src/modules/CartPage/CartPage.module.scss new file mode 100644 index 00000000000..063cc754fdc --- /dev/null +++ b/src/modules/CartPage/CartPage.module.scss @@ -0,0 +1,212 @@ +.cartPage { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.backButton { + display: flex; + align-items: center; + gap: 8px; + background: none; + border: none; + color: #0f3460; + font-size: 16px; + cursor: pointer; + padding: 0; + margin-bottom: 24px; + transition: color 0.3s; + + &:hover { + color: #1a5490; + } + + i { + font-size: 14px; + } +} + +.pageTitle { + font-size: 36px; + font-weight: 600; + margin: 0 0 32px; + color: #111; +} + +.emptyContainer { + text-align: center; + padding: 60px 20px; + + h1 { + margin: 0 0 24px; + font: monserrat, sans-serif; + color: #313237; + font-size: 48px; + } +} + +.empty { + font-size: 18px; + color: #6c757d; +} + +.cartContainer { + display: grid; + grid-template-columns: 1fr 360px; + gap: 40px; +} + +.cartItemsList { + display: flex; + flex-direction: column; + gap: 16px; +} + +.cartItem { + display: flex; + align-items: center; + gap: 16px; + padding: 16px; + border: 1px solid #e9ecef; + border-radius: 12px; + background: white; + + .removeButton { + background: none; + border: none; + color: #666; + font-size: 18px; + cursor: pointer; + padding: 0; + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + transition: color 0.3s; + + &:hover { + color: #dc3545; + } + } + + .itemImage { + width: 80px; + height: 80px; + object-fit: contain; + background: #f8f9fa; + border-radius: 8px; + flex-shrink: 0; + } + + .itemDetails { + flex: 1; + + h3 { + margin: 0; + font-size: 14px; + color: #222; + line-height: 1.4; + } + } + + .quantityControls { + display: flex; + align-items: center; + gap: 8px; + border: 1px solid #dee2e6; + border-radius: 8px; + padding: 4px; + + button { + background: none; + border: none; + width: 28px; + height: 28px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: #222; + font-size: 16px; + font-weight: 500; + transition: background 0.3s; + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + &:hover:not(:disabled) { + background: #f0f0f0; + } + } + + span { + font-weight: 500; + min-width: 24px; + text-align: center; + color: #222; + font-size: 14px; + } + } + + .itemPrice { + font-weight: 600; + font-size: 18px; + color: #222; + min-width: 70px; + text-align: right; + } +} + +.cartSummary { + display: flex; + flex-direction: column; + gap: 24px; + padding: 24px; + background: #f8f9fa; + border-radius: 12px; + height: fit-content; + position: sticky; + top: 20px; + + .totalPrice { + font-size: 32px; + font-weight: 600; + color: #222; + } + + .totalText { + font-size: 14px; + color: #666; + } + + .checkoutButton { + background: #222; + color: white; + border: none; + padding: 14px 24px; + border-radius: 8px; + font-size: 16px; + font-weight: 500; + cursor: pointer; + transition: background 0.3s; + + &:hover { + background: #111; + } + } +} + +@media (max-width: 960px) { + .cartContainer { + grid-template-columns: 1fr; + } + + .cartSummary { + position: relative; + top: auto; + } +} + diff --git a/src/modules/CartPage/CartPage.tsx b/src/modules/CartPage/CartPage.tsx new file mode 100644 index 00000000000..4027966fe8a --- /dev/null +++ b/src/modules/CartPage/CartPage.tsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useCart } from '../../context/CartContext'; +import styles from './CartPage.module.scss'; + +export const CartPage: React.FC = () => { + const navigate = useNavigate(); + const { cart, removeFromCart, updateQuantity, clearCart, getTotalPrice } = + useCart(); + + const handleCheckout = () => { + const confirmed = window.confirm( + 'Checkout is not implemented yet. Do you want to clear the Cart?', + ); + + if (confirmed) { + clearCart(); + } + }; + + if (cart.length === 0) { + return ( +
+ +
+

Cart

+

Your cart is empty

+
+
+ ); + } + + return ( +
+ + +

Cart

+ +
+
+ {cart.map(item => ( +
+ + + {item.product.name} + +
+

{item.product.name}

+
+ {item.product.capacity} + {item.product.color} +
+
+ +
+ + {item.quantity} + +
+ +
${item.product.price}
+
+ ))} +
+ +
+
${getTotalPrice()}
+
+ Total for {cart.length} item{cart.length !== 1 ? 's' : ''} +
+ +
+
+
+ ); +}; diff --git a/src/modules/CartPage/index.ts b/src/modules/CartPage/index.ts new file mode 100644 index 00000000000..90c010237a0 --- /dev/null +++ b/src/modules/CartPage/index.ts @@ -0,0 +1 @@ +export * from './CartPage'; diff --git a/src/modules/FavoritesPage/FavoritesPage.module.scss b/src/modules/FavoritesPage/FavoritesPage.module.scss new file mode 100644 index 00000000000..95f7753c569 --- /dev/null +++ b/src/modules/FavoritesPage/FavoritesPage.module.scss @@ -0,0 +1,26 @@ +.favoritesPage { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + + h1 { + margin-bottom: 30px; + font: monserrat, sans-serif; + color: #313237; + font-size: 48px; + text-align: left; + } + + .empty { + text-align: center; + font-size: 18px; + color: #6c757d; + padding: 50px; + } + + .favoritesGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 20px; + } +} diff --git a/src/modules/FavoritesPage/FavoritesPage.tsx b/src/modules/FavoritesPage/FavoritesPage.tsx new file mode 100644 index 00000000000..42c51b32445 --- /dev/null +++ b/src/modules/FavoritesPage/FavoritesPage.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { useFavorites } from '../../context/FavoritesContext'; +import { ProductCard } from '../../components/ProductCard'; +import styles from './FavoritesPage.module.scss'; + +export const FavoritesPage: React.FC = () => { + const { favorites } = useFavorites(); + + return ( +
+

Favorites

+ + {favorites.length === 0 ? ( +

No favorite products yet

+ ) : ( +
+ {favorites.map(product => ( + + ))} +
+ )} +
+ ); +}; diff --git a/src/modules/FavoritesPage/index.ts b/src/modules/FavoritesPage/index.ts new file mode 100644 index 00000000000..b3a884b1889 --- /dev/null +++ b/src/modules/FavoritesPage/index.ts @@ -0,0 +1 @@ +export * from './FavoritesPage'; diff --git a/src/modules/HomePage/HomePage.module.scss b/src/modules/HomePage/HomePage.module.scss new file mode 100644 index 00000000000..d782f8260c0 --- /dev/null +++ b/src/modules/HomePage/HomePage.module.scss @@ -0,0 +1,122 @@ +.homePage { + padding: 20px; + max-width: 1200px; + margin: 0 auto; + color: #333; + font-family: montserrat, sans-serif; + font-size: 48px; +} + +.visuallyHidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.shopByCategory { + margin: 40px 0; + + h2 { + text-align: center; + font-size: 32px; + margin-bottom: 30px; + color: #222; + } + + .categories { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 20px; + justify-items: center; + } + + .category { + display: flex; + flex-direction: column; + width: 100%; + max-width: 368px; + background: #fff; + border-radius: 24px; + overflow: hidden; + text-decoration: none; + color: inherit; + transition: transform 0.3s ease, box-shadow 0.3s ease; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.08); + } + + .category:hover { + transform: translateY(-10px); + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.12); + } + + .categoryMedia { + position: relative; + width: 100%; + aspect-ratio: 1 / 1; + min-height: 260px; + background: #f5f5f7; + display: flex; + align-items: flex-end; + justify-content: flex-end; + padding: 20px; + box-sizing: border-box; + } + + .categoryMedia img { + width: 75%; + height: 75%; + object-fit: contain; + display: block; + } + + .categoryPhones .categoryMedia { + background: #6D6474; + } + + .categoryTablets .categoryMedia { + background: #A0AEAE; + } + + .categoryAccessories .categoryMedia { + background: #C14A6B; + } + + .categoryDetails { + padding: 20px 24px 28px; + text-align: left; + } + + .categoryDetails h3 { + margin: 0 0 8px; + font-size: 22px; + color: #111; + } + + .categoryDetails p { + margin: 0; + font-size: 14px; + color: #666; + } + + @media (max-width: 960px) { + .categories { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + + @media (max-width: 720px) { + .categories { + grid-template-columns: 1fr; + } + + .shopByCategory { + margin: 30px 0; + } + } +} diff --git a/src/modules/HomePage/HomePage.tsx b/src/modules/HomePage/HomePage.tsx new file mode 100644 index 00000000000..ffad83297e6 --- /dev/null +++ b/src/modules/HomePage/HomePage.tsx @@ -0,0 +1,104 @@ +import React, { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import { Product } from '../../types'; +import { getProducts } from '../../utils/api'; +import { PicturesSlider } from '../../components/PicturesSlider'; +import { ProductsSlider } from '../../components/ProductsSlider'; +import styles from './HomePage.module.scss'; + +const imageBase = import.meta.env.BASE_URL || '/'; + +export const HomePage: React.FC = () => { + const [hotPriceProducts, setHotPriceProducts] = useState([]); + const [brandNewProducts, setBrandNewProducts] = useState([]); + + useEffect(() => { + const fetchProducts = async () => { + const products = await getProducts(); + + // Hot prices: products with discount, sorted by discount amount descending + const hotPrices = products + .filter(p => p.fullPrice > p.price) + .sort((a, b) => b.fullPrice - b.price - (a.fullPrice - a.price)) + .slice(0, 8); + + // Brand new: newest products by year + const brandNew = products.sort((a, b) => b.year - a.year).slice(0, 8); + + setHotPriceProducts(hotPrices); + setBrandNewProducts(brandNew); + }; + + fetchProducts(); + }, []); + + return ( +
+

Product Catalog

+ + + + {hotPriceProducts.length > 0 && ( + + )} + +
+

Shop by category

+
+ +
+ Phones category +
+
+

Mobile phones

+

95 models

+
+ + +
+ Tablets category +
+
+

Tablets

+

24 models

+
+ + +
+ Accessories category +
+
+

Accessories

+

100 models

+
+ +
+
+ + {brandNewProducts.length > 0 && ( + + )} +
+ ); +}; diff --git a/src/modules/HomePage/index.ts b/src/modules/HomePage/index.ts new file mode 100644 index 00000000000..11e53da674c --- /dev/null +++ b/src/modules/HomePage/index.ts @@ -0,0 +1 @@ +export * from './HomePage'; diff --git a/src/modules/NotFoundPage/NotFoundPage.module.scss b/src/modules/NotFoundPage/NotFoundPage.module.scss new file mode 100644 index 00000000000..7c6fb0fb518 --- /dev/null +++ b/src/modules/NotFoundPage/NotFoundPage.module.scss @@ -0,0 +1,32 @@ +.notFoundPage { + display: flex; + align-items: center; + justify-content: center; + min-height: 60vh; + padding: 20px; +} + +.container { + text-align: center; + + h1 { + font-size: 48px; + color: #333; + margin-bottom: 20px; + } + + .homeLink { + display: inline-block; + background: #007bff; + color: white; + padding: 12px 24px; + text-decoration: none; + border-radius: 4px; + font-size: 18px; + transition: background 0.3s; + + &:hover { + background: #0056b3; + } + } +} diff --git a/src/modules/NotFoundPage/NotFoundPage.tsx b/src/modules/NotFoundPage/NotFoundPage.tsx new file mode 100644 index 00000000000..08d11e87a01 --- /dev/null +++ b/src/modules/NotFoundPage/NotFoundPage.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import styles from './NotFoundPage.module.scss'; + +export const NotFoundPage: React.FC = () => { + return ( +
+
+

Page not found

+ + Go to Home + +
+
+ ); +}; diff --git a/src/modules/NotFoundPage/index.ts b/src/modules/NotFoundPage/index.ts new file mode 100644 index 00000000000..6197aa75aa8 --- /dev/null +++ b/src/modules/NotFoundPage/index.ts @@ -0,0 +1 @@ +export * from './NotFoundPage'; diff --git a/src/modules/ProductDetailsPage/ProductDetailsPage.module.scss b/src/modules/ProductDetailsPage/ProductDetailsPage.module.scss new file mode 100644 index 00000000000..f18eac3c79f --- /dev/null +++ b/src/modules/ProductDetailsPage/ProductDetailsPage.module.scss @@ -0,0 +1,408 @@ +.productDetailsPage { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + font: Montserrat, sans-serif; + + .loader, + .error { + text-align: center; + padding: 50px; + } + + .error { + p { + font-size: 18px; + color: #dc3545; + } + } + + .breadcrumbs { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 20px; + font-size: 14px; + color: #6c757d; + + .backButton { + background: #f8f9fa; + border: 1px solid #dee2e6; + padding: 8px 16px; + border-radius: 4px; + cursor: pointer; + margin-right: 16px; + transition: background 0.3s; + + &:hover { + background: #e9ecef; + } + } + } + + .productContent { + display: grid; + grid-template-columns: auto 1fr 380px; + gap: 20px 40px; + margin-bottom: 60px; + align-items: start; + + .productImages { + grid-column: 1 / 2; + grid-row: 1; + display: flex; + gap: 12px; + + .mainImage { + order: 2; + margin-left: 8px; + + img { + width: 380px; + height: 380px; + object-fit: contain; + background: #f8f9fa; + border-radius: 8px; + } + } + + .thumbnailImages { + display: flex; + flex-direction: column; + gap: 10px; + order: 1; + + img { + width: 56px; + height: 56px; + object-fit: cover; + cursor: pointer; + border-radius: 6px; + opacity: 0.6; + transition: opacity 0.3s, border 0.3s; + border: 2px solid transparent; + + &.active { + opacity: 1; + border-color: #313237; + } + + &:hover { + opacity: 1; + border-color: #313237; + } + } + } + } + + .productInfo { + grid-column: 3; + grid-row: 1; + + h1 { + font-size: 28px; + font-weight: 600; + margin-bottom: 16px; + line-height: 1.3; + } + + .price { + margin-bottom: 24px; + display: flex; + align-items: baseline; + gap: 12px; + + .currentPrice { + font-size: 32px; + font-weight: 700; + color: #222; + } + + .oldPrice { + font-size: 18px; + color: #7a7a7a; + text-decoration: line-through; + } + } + + .options { + margin-bottom: 24px; + + .option { + margin-bottom: 24px; + + > span { + display: block; + font-weight: 600; + font-size: 14px; + color: #222; + margin-bottom: 12px; + } + + .colorOptions { + display: flex; + gap: 8px; + flex-wrap: wrap; + } + + .colorOption { + width: 32px; + height: 32px; + border-radius: 50%; + border: 2px solid #e9ecef; + cursor: pointer; + transition: border-color 0.3s, transform 0.2s; + position: relative; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + background: none; + padding: 0; + + &.active { + border-color: #222; + transform: scale(1.1); + } + + &:hover { + border-color: #222; + } + + // Color backgrounds - map common color names + &[title="Black"] { + background: #000; + } + &[title="black"] { + background: #000; + } + &[title="White"] { + background: #fff; + border-color: #ccc; + } + &[title="white"] { + background: #fff; + border-color: #ccc; + } + &[title="Gold"] { + background: #d4af37; + } + &[title="gold"] { + background: #d4af37; + } + &[title="Silver"] { + background: #c0c0c0; + } + &[title="silver"] { + background: #c0c0c0; + } + &[title="Graphite"] { + background: #565656; + } + &[title="graphite"] { + background: #565656; + } + &[title="Blue"] { + background: #1f4788; + } + &[title="blue"] { + background: #1f4788; + } + &[title="Green"] { + background: #2d5016; + } + &[title="green"] { + background: #2d5016; + } + &[title="Purple"] { + background: #9b59b6; + } + &[title="purple"] { + background: #9b59b6; + } + &[title="Red"] { + background: #e74c3c; + } + &[title="red"] { + background: #e74c3c; + } + &[title="Pink"] { + background: #ffb6c1; + } + &[title="pink"] { + background: #ffb6c1; + } + } + + .capacityOptions { + display: flex; + gap: 8px; + flex-wrap: wrap; + } + + .capacityOption { + padding: 8px 14px; + border: 1px solid #e9ecef; + border-radius: 6px; + cursor: pointer; + transition: all 0.3s; + background: white; + font-size: 14px; + + input { + opacity: 0; + width: 0; + height: 0; + margin: 0; + padding: 0; + } + + span { + font-size: 14px; + color: #222; + font-weight: 500; + } + + &:hover { + border-color: #222; + } + + &:has(input:checked) { + border-color: #222; + background: #f5f5f5; + color: #222; + } + } + } + } + + .actions { + display: flex; + gap: 12px; + + .addToCartButton { + flex: 1; + background: #222; + color: white; + border: none; + padding: 14px 20px; + border-radius: 8px; + cursor: pointer; + font-size: 16px; + font-weight: 600; + transition: background 0.3s; + + &:hover { + background: #111; + } + } + + .favoriteButton { + width: 48px; + height: 48px; + background: white; + border: 1px solid #e9ecef; + border-radius: 8px; + cursor: pointer; + font-size: 20px; + color: #666; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; + + &:hover { + border-color: #222; + color: #222; + } + + &.active { + background: #dc3545; + border-color: #dc3545; + color: white; + } + } + } + } + } + + .suggestedProducts h2 { + text-align: center; + font-size: 24px; + margin-bottom: 30px; + } + + .productDetails { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 40px; + margin-bottom: 60px; + + .about { + h2 { + font-size: 24px; + margin-bottom: 20px; + color: #222; + } + + > div { + margin-bottom: 32px; + + h3 { + font-size: 16px; + margin-bottom: 10px; + color: #222; + font-weight: 600; + } + + p { + margin-bottom: 16px; + line-height: 1.7; + color: #6c757d; + font-size: 14px; + } + } + } + + .techSpecs { + h2 { + font-size: 24px; + margin-bottom: 20px; + color: #222; + } + + .specs { + display: grid; + gap: 12px; + + .spec { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 0; + border-bottom: 1px solid #e9ecef; + + .specName { + font-size: 14px; + color: #6c757d; + font-weight: 500; + } + + .specValue { + font-size: 14px; + color: #222; + font-weight: 600; + } + } + } + } + } + + .suggestedProducts { + .suggestedGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 20px; + } + } +} diff --git a/src/modules/ProductDetailsPage/ProductDetailsPage.tsx b/src/modules/ProductDetailsPage/ProductDetailsPage.tsx new file mode 100644 index 00000000000..214f40eaa6f --- /dev/null +++ b/src/modules/ProductDetailsPage/ProductDetailsPage.tsx @@ -0,0 +1,343 @@ +import React, { useState, useEffect } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import { Product, ProductDetails } from '../../types'; +import { + getProductDetailsById, + getProductVariant, + getSuggestedProducts, +} from '../../utils/api'; +import { ProductCard } from '../../components/ProductCard'; +import { useCart } from '../../context/CartContext'; +import { useFavorites } from '../../context/FavoritesContext'; +import styles from './ProductDetailsPage.module.scss'; + +export const ProductDetailsPage: React.FC = () => { + const { productId } = useParams<{ productId: string }>(); + const navigate = useNavigate(); + const { addToCart } = useCart(); + const { addToFavorites, removeFromFavorites, isFavorite } = useFavorites(); + const [product, setProduct] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [selectedImage, setSelectedImage] = useState(0); + const [selectedColor, setSelectedColor] = useState(''); + const [selectedCapacity, setSelectedCapacity] = useState(''); + const [suggestedProducts, setSuggestedProducts] = useState([]); + + useEffect(() => { + const fetchProduct = async () => { + if (!productId) { + return; + } + + try { + setLoading(true); + const productData = await getProductDetailsById(productId); + + if (productData) { + setProduct(productData); + setSelectedColor(productData.color); + setSelectedCapacity(productData.capacity); + // Fetch suggested products + const suggested = await getSuggestedProducts(productId); + + setSuggestedProducts(suggested); + } else { + setError('Product was not found'); + } + } catch (err) { + setError('Something went wrong'); + } finally { + setLoading(false); + } + }; + + fetchProduct(); + }, [productId]); + + // const handleBack = () => { + // navigate(-1); + // }; + + const handleAddToCart = () => { + if (product) { + // Convert ProductDetails to Product for cart + const cartProduct: Product = { + id: 0, // Not used + category: product.category, + itemId: product.id, + name: product.name, + fullPrice: product.priceRegular, + price: product.priceDiscount, + screen: product.screen, + capacity: selectedCapacity || product.capacity, + color: selectedColor || product.color, + ram: product.ram, + year: 2023, // Not available + image: product.images[0], + }; + + addToCart(cartProduct); + } + }; + + const handleColorSelect = async (color: string) => { + if (!product) { + return; + } + + if (product.color === color) { + return; + } + + const capacity = selectedCapacity || product.capacity; + const variant = await getProductVariant( + product.category, + product.namespaceId, + capacity, + color, + ); + + if (variant) { + navigate(`/product/${variant.id}`); + } + }; + + const handleCapacitySelect = async (capacity: string) => { + if (!product) { + return; + } + + if (product.capacity === capacity) { + return; + } + + const color = selectedColor || product.color; + const variant = await getProductVariant( + product.category, + product.namespaceId, + capacity, + color, + ); + + if (variant) { + navigate(`/product/${variant.id}`); + } + }; + + const handleToggleFavorite = () => { + if (product) { + if (isFavorite(product.id)) { + removeFromFavorites(product.id); + } else { + // Convert to Product for favorites + const favProduct: Product = { + id: 0, + category: product.category, + itemId: product.id, + name: product.name, + fullPrice: product.priceRegular, + price: product.priceDiscount, + screen: product.screen, + capacity: product.capacity, + color: product.color, + ram: product.ram, + year: 2023, + image: product.images[0], + }; + + addToFavorites(favProduct); + } + } + }; + + if (loading) { + return
Loading...
; + } + + if (error || !product) { + return ( +
+

{error || 'Product was not found'}

+
+ ); + } + + return ( +
+ + +
+
+
+ {product.name} +
+
+ {product.images.map((image, index) => ( + {`${product.name} setSelectedImage(index)} + /> + ))} +
+
+ +
+

{product.name}

+ +
+ + ${product.priceDiscount} + + ${product.priceRegular} +
+ +
+
+ Color: +
+ {product.colorsAvailable.map(color => ( +
+
+ +
+ Capacity: +
+ {product.capacityAvailable.map(capacity => { + const capacityInputId = `capacity-${product.id}-${capacity}`; + + return ( + + ); + })} +
+
+
+ +
+ + +
+
+
+ +
+
+

About

+ {product.description.map((desc, index) => ( +
+

{desc.title}

+ {desc.text.map((text, i) => ( +

{text}

+ ))} +
+ ))} +
+ +
+

Tech specs

+
+
+ Screen + {product.screen} +
+
+ Resolution + {product.resolution} +
+
+ Processor + {product.processor} +
+
+ RAM + {product.ram} +
+
+ Camera + {product.camera} +
+
+ Zoom + {product.zoom} +
+
+ Cell + + {product.cell.join(', ')} + +
+
+ +
+ + +
+
+
+ +
+

You may also like

+
+ {suggestedProducts.map(suggestedProduct => ( + + ))} +
+
+
+ ); +}; diff --git a/src/modules/ProductDetailsPage/index.ts b/src/modules/ProductDetailsPage/index.ts new file mode 100644 index 00000000000..6615089e5ec --- /dev/null +++ b/src/modules/ProductDetailsPage/index.ts @@ -0,0 +1 @@ +export * from './ProductDetailsPage'; diff --git a/src/modules/ProductsPage/ProductsPage.module.scss b/src/modules/ProductsPage/ProductsPage.module.scss new file mode 100644 index 00000000000..8e8d953da4c --- /dev/null +++ b/src/modules/ProductsPage/ProductsPage.module.scss @@ -0,0 +1,128 @@ +.productsPage { + max-width: 1200px; + margin: 0 auto; + padding: 20px; + color: #313237; + font: monserrat, sans-serif; + h1 { + text-align: center; + margin-bottom: 30px; + } + + .loader, + .error { + text-align: center; + padding: 50px; + } + + .error button { + background: #313237; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + margin-top: 10px; + } + + .pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 20px; + margin-top: 30px; + } + + .pagination button { + background: #313237; + color: white; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + transition: background 0.3s; + } + + .pagination button:disabled { + background: #ccc; + cursor: not-allowed; + } + + .error button:hover { + background: #313237; + } + + .pagination button:hover:not(:disabled) { + background: #313237; + } + + .pagination span { + font-weight: 500; + } + + .searchResults { + text-align: center; + margin-bottom: 20px; + font-weight: 500; + } + + .controls { + display: flex; + justify-content: start; + align-items: flex-start; + margin-bottom: 30px; + flex-wrap: wrap; + gap: 20px; + + .search { + flex: 1; + min-width: 200px; + + input { + width: 100%; + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 16px; + } + } + + .sort, + .perPage { + display: flex; + align-items: center; + gap: 10px; + + label { + font-weight: 500; + } + + select { + padding: 8px 12px; + border: 1px solid #ddd; + border-radius: 4px; + background: white; + } + } + } + + .productsGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: 20px; + margin-bottom: 40px; + } + + .productCard { + border: 1px solid #e9ecef; + border-radius: 8px; + padding: 20px; + background: white; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + transition: transform 0.3s; + + &:hover { + transform: translateY(-2px); + } + } +} diff --git a/src/modules/ProductsPage/ProductsPage.tsx b/src/modules/ProductsPage/ProductsPage.tsx new file mode 100644 index 00000000000..ac0dfd82faa --- /dev/null +++ b/src/modules/ProductsPage/ProductsPage.tsx @@ -0,0 +1,253 @@ +import React, { + useState, + useEffect, + useMemo, + // useCallback, + // useRef, +} from 'react'; +import { useSearchParams } from 'react-router-dom'; +import { Product, SortOption, PerPageOption } from '../../types'; +import { getProducts } from '../../utils/api'; +import { ProductCard } from '../../components/ProductCard'; +// import { debounce } from '../../utils/debounce'; +import styles from './ProductsPage.module.scss'; + +interface ProductsPageProps { + category: 'phones' | 'tablets' | 'accessories'; +} + +export const ProductsPage: React.FC = ({ category }) => { + const [searchParams, setSearchParams] = useSearchParams(); + const [products, setProducts] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const sort = (searchParams.get('sort') as SortOption) || 'age'; + const perPageParam = searchParams.get('perPage'); + const perPage: PerPageOption = + perPageParam === 'all' + ? 'all' + : (parseInt(perPageParam || '16', 10) as 4 | 8 | 16); + const pageParam = searchParams.get('page') || '1'; + const page = parseInt(pageParam, 10) || 1; + const query = searchParams.get('query') || ''; + + useEffect(() => { + const fetchProducts = async () => { + try { + setLoading(true); + const allProducts = await getProducts(); + const filteredProducts = allProducts.filter( + p => p.category === category, + ); + + setProducts(filteredProducts); + } catch (err) { + setError('Something went wrong'); + } finally { + setLoading(false); + } + }; + + fetchProducts(); + }, [category]); + + const sortedAndFilteredProducts = useMemo(() => { + let filtered = products; + + if (query) { + filtered = filtered.filter(p => + p.name.toLowerCase().includes(query.toLowerCase()), + ); + } + + switch (sort) { + case 'age': + filtered.sort((a, b) => b.year - a.year); + break; + case 'title': + filtered.sort((a, b) => a.name.localeCompare(b.name)); + break; + case 'price': + filtered.sort((a, b) => a.price - b.price); + break; + } + + return filtered; + }, [products, sort, query]); + + const totalPages = + perPage === 'all' + ? 1 + : Math.ceil(sortedAndFilteredProducts.length / perPage); + + // Validate page: if current page > totalPages, reset to 1 + const validPage = page > totalPages ? 1 : page; + + const startIndex = perPage === 'all' ? 0 : (validPage - 1) * perPage; + const endIndex = + perPage === 'all' ? sortedAndFilteredProducts.length : startIndex + perPage; + const displayedProducts = sortedAndFilteredProducts.slice( + startIndex, + endIndex, + ); + + // Reset page if it became invalid + useEffect(() => { + if (page !== validPage) { + const params = new URLSearchParams(searchParams); + + params.set('page', validPage.toString()); + setSearchParams(params, { replace: true }); + } + }, [page, validPage, searchParams, setSearchParams]); + + const handleSortChange = (newSort: SortOption) => { + const params = new URLSearchParams(searchParams); + + params.set('sort', newSort); + params.set('page', '1'); // Reset to first page + setSearchParams(params); + }; + + const handlePerPageChange = (newPerPage: PerPageOption) => { + const params = new URLSearchParams(searchParams); + + params.set('perPage', newPerPage.toString()); + params.set('page', '1'); // Reset to first page + setSearchParams(params); + }; + + const handlePageChange = (newPage: number) => { + const params = new URLSearchParams(searchParams); + + params.set('page', newPage.toString()); + setSearchParams(params); + }; + + // const debouncedSearchRef = useRef( + // debounce((newQuery: string) => { + // const params = new URLSearchParams(searchParams); + + // if (newQuery) { + // params.set('query', newQuery); + // } else { + // params.delete('query'); + // } + + // params.set('page', '1'); + // setSearchParams(params); + // }, 500), + // ); + + // const handleSearchChange = useCallback((newQuery: string) => { + // debouncedSearchRef.current(newQuery); + // }, []); + + if (loading) { + return
Loading...
; + } + + if (error) { + return ( +
+

{error}

+ +
+ ); + } + + const categoryTitles = { + phones: 'Phones', + tablets: 'Tablets', + accessories: 'Accessories', + }; + + return ( +
+

{categoryTitles[category]}

+ + {query && ( +

+ {sortedAndFilteredProducts.length === 0 + ? `There are no ${category} matching the query` + : `${sortedAndFilteredProducts.length} ${category} found`} +

+ )} + + {!query && sortedAndFilteredProducts.length === 0 && ( +

There are no {category} yet

+ )} + + {sortedAndFilteredProducts.length > 0 && ( + <> +
+ {/*
+ handleSearchChange(e.target.value)} + /> +
*/} + +
+ + +
+ +
+ + +
+
+ +
+ {displayedProducts.map(product => ( + + ))} +
+ + {perPage !== 'all' && totalPages > 1 && ( +
+ + + Page {validPage} of {totalPages} + + +
+ )} + + )} +
+ ); +}; diff --git a/src/modules/ProductsPage/index.ts b/src/modules/ProductsPage/index.ts new file mode 100644 index 00000000000..8e350f20bf9 --- /dev/null +++ b/src/modules/ProductsPage/index.ts @@ -0,0 +1 @@ +export * from './ProductsPage'; diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 00000000000..10c921d4eea --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,49 @@ +export interface Product { + id: number; + category: string; + itemId: string; + name: string; + fullPrice: number; + price: number; + screen: string; + capacity: string; + color: string; + ram: string; + year: number; + image: string; +} + +export interface ProductDetails { + id: string; + category: string; + namespaceId: string; + name: string; + capacityAvailable: string[]; + capacity: string; + priceRegular: number; + priceDiscount: number; + colorsAvailable: string[]; + color: string; + images: string[]; + description: { + title: string; + text: string[]; + }[]; + screen: string; + resolution: string; + processor: string; + ram: string; + camera: string; + zoom: string; + cell: string[]; +} + +export interface CartItem { + id: string; + quantity: number; + product: Product; +} + +export type SortOption = 'age' | 'title' | 'price'; + +export type PerPageOption = 4 | 8 | 16 | 'all'; diff --git a/src/utils/api.ts b/src/utils/api.ts new file mode 100644 index 00000000000..3cf7b794b10 --- /dev/null +++ b/src/utils/api.ts @@ -0,0 +1,164 @@ +import { Product, ProductDetails } from '../types'; + +const BASE_URL = import.meta.env.BASE_URL || '/'; +const API_BASE = `${BASE_URL}api`; + +const fixImagePath = (imagePath: string): string => { + // Remove leading slash and prepend with base URL + return `${BASE_URL}${imagePath.replace(/^\//, '')}`; +}; + +export const getProducts = async (): Promise => { + const response = await fetch(`${API_BASE}/products.json`); + + if (!response.ok) { + throw new Error('Failed to fetch products'); + } + + const products = await response.json(); + + return products.map((product: Product) => ({ + ...product, + image: fixImagePath(product.image), + })); +}; + +export const getPhones = async (): Promise => { + const response = await fetch(`${API_BASE}/phones.json`); + + if (!response.ok) { + throw new Error('Failed to fetch phones'); + } + + const phones = await response.json(); + + return phones.map((phone: ProductDetails) => ({ + ...phone, + images: phone.images?.map(fixImagePath) || [], + })); +}; + +export const getTablets = async (): Promise => { + const response = await fetch(`${API_BASE}/tablets.json`); + + if (!response.ok) { + throw new Error('Failed to fetch tablets'); + } + + const tablets = await response.json(); + + return tablets.map((tablet: ProductDetails) => ({ + ...tablet, + images: tablet.images?.map(fixImagePath) || [], + })); +}; + +export const getAccessories = async (): Promise => { + const response = await fetch(`${API_BASE}/accessories.json`); + + if (!response.ok) { + throw new Error('Failed to fetch accessories'); + } + + const accessories = await response.json(); + + return accessories.map((accessory: ProductDetails) => ({ + ...accessory, + images: accessory.images?.map(fixImagePath) || [], + })); +}; + +export const getProductDetails = async ( + category: string, + productId: string, +): Promise => { + let products: ProductDetails[]; + + switch (category) { + case 'phones': + products = await getPhones(); + break; + case 'tablets': + products = await getTablets(); + break; + case 'accessories': + products = await getAccessories(); + break; + default: + return null; + } + + return products.find(product => product.id === productId) || null; +}; + +export const getProductVariant = async ( + category: string, + namespaceId: string, + capacity: string, + color: string, +): Promise => { + let products: ProductDetails[]; + + switch (category) { + case 'phones': + products = await getPhones(); + break; + case 'tablets': + products = await getTablets(); + break; + case 'accessories': + products = await getAccessories(); + break; + default: + return null; + } + + const normalizedCapacity = capacity.toLowerCase(); + const normalizedColor = color.toLowerCase(); + + return ( + products.find( + product => + product.namespaceId === namespaceId && + product.capacity.toLowerCase() === normalizedCapacity && + product.color.toLowerCase() === normalizedColor, + ) || null + ); +}; + +export const getSuggestedProducts = async ( + currentProductId: string, + limit: number = 8, +): Promise => { + const products = await getProducts(); + // Simple random selection excluding current product + const filtered = products.filter(p => p.itemId !== currentProductId); + const shuffled = filtered.sort(() => 0.5 - Math.random()); + + return shuffled.slice(0, limit); +}; + +export const getProductDetailsById = async ( + productId: string, +): Promise => { + // Try phones first + let products = await getPhones(); + let product = products.find(p => p.id === productId); + + if (product) { + return product; + } + + // Try tablets + products = await getTablets(); + product = products.find(p => p.id === productId); + if (product) { + return product; + } + + // Try accessories + products = await getAccessories(); + product = products.find(p => p.id === productId); + + return product || null; +}; diff --git a/src/utils/debounce.ts b/src/utils/debounce.ts new file mode 100644 index 00000000000..ccc016780f0 --- /dev/null +++ b/src/utils/debounce.ts @@ -0,0 +1,11 @@ +export const debounce = unknown>( + func: T, + delay: number, +): ((...args: Parameters) => void) => { + let timeoutId: ReturnType; + + return (...args: Parameters) => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => func(...args), delay); + }; +}; diff --git a/tsconfig.json b/tsconfig.json index cfb168bb26c..de473b4a5df 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ ], "compilerOptions": { "sourceMap": false, + "ignoreDeprecations": "6.0", "types": ["node", "cypress"] } } diff --git a/vite.config.ts b/vite.config.ts index 5a33944a9b4..7199c45103e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,5 +3,6 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ + base: '/react_phone-catalog/', plugins: [react()], })