@@ -1,4 +0,0 @@
|
||||
.git
|
||||
tools/
|
||||
catalog-source.csv
|
||||
README.md
|
||||
@@ -1,5 +0,0 @@
|
||||
FROM nginx:1.27-alpine
|
||||
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
||||
COPY . /usr/share/nginx/html
|
||||
EXPOSE 80
|
||||
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://127.0.0.1/healthz || exit 1
|
||||
@@ -1,3 +0,0 @@
|
||||
# Ari Shopping Frontend v3.0
|
||||
|
||||
Reconstrucción completa de la tienda. CSS y JavaScript están integrados en `index.html` para impedir que el sitio vuelva a desplegarse sin estilos o sin interacción.
|
||||
@@ -1 +0,0 @@
|
||||
/* CSS integrado en index.html para evitar fallas de carga. */
|
||||
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 33 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><defs><linearGradient id="g"><stop stop-color="#ff3f7f"/><stop offset="1" stop-color="#7c3aed"/></linearGradient></defs><rect width="64" height="64" rx="18" fill="url(#g)"/><path d="M15 48 28 16h8l14 32H39l-3-8H27l-3 8Zm15-17h4l-2-6Z" fill="#fff"/></svg>
|
||||
|
Before Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 153 KiB |
@@ -1,8 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 520 116" role="img" aria-labelledby="title">
|
||||
<title id="title">Ari Shopping</title>
|
||||
<defs><linearGradient id="g" x1="0" x2="1"><stop stop-color="#ff3f86"/><stop offset="1" stop-color="#a139ef"/></linearGradient></defs>
|
||||
<circle cx="55" cy="58" r="44" fill="#17111c"/>
|
||||
<text x="55" y="68" text-anchor="middle" font-family="Georgia,serif" font-size="39" font-style="italic" font-weight="700" fill="#fff">ARI</text>
|
||||
<text x="116" y="56" font-family="Arial,sans-serif" font-size="34" font-weight="850" fill="#211927">Ari Shopping</text>
|
||||
<text x="117" y="83" font-family="Arial,sans-serif" font-size="15" font-weight="700" letter-spacing="2.6" fill="url(#g)">DETALLES PARA DISFRUTAR</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 743 B |
|
Before Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 109 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#f8b4c8"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#7c3aed" opacity=".1"/><g fill="none" stroke="#7c3aed" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M135 130h130l15 140H120l15-140Zm25 10c0-42 80-42 80 0"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Bolso Crossbody Aura</text></svg>
|
||||
|
Before Width: | Height: | Size: 619 B |
|
Before Width: | Height: | Size: 191 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#f7d6bf"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#ff3f7f" opacity=".1"/><g fill="none" stroke="#ff3f7f" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M155 105h90v175h-90zM175 105V72h50v33M175 175h50"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Set Glow Skincare</text></svg>
|
||||
|
Before Width: | Height: | Size: 611 B |
|
Before Width: | Height: | Size: 195 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#f1d2d9"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#9f1239" opacity=".1"/><g fill="none" stroke="#9f1239" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M145 110h110v150H145zM200 185v-25m0 25 22 16"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Reloj Minimal Rose</text></svg>
|
||||
|
Before Width: | Height: | Size: 608 B |
|
Before Width: | Height: | Size: 183 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#d7ddff"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#4f46e5" opacity=".1"/><g fill="none" stroke="#4f46e5" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M126 155h148v115H126zM155 125v66m90-66v66"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Audífonos Mini Pods</text></svg>
|
||||
|
Before Width: | Height: | Size: 607 B |
|
Before Width: | Height: | Size: 150 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#d8f3ea"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#0f766e" opacity=".1"/><g fill="none" stroke="#0f766e" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M115 125h170v150H115zM115 180h170M170 125v150M230 125v150"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Organizador Vanity</text></svg>
|
||||
|
Before Width: | Height: | Size: 621 B |
|
Before Width: | Height: | Size: 164 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#ffe0ef"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#be185d" opacity=".1"/><g fill="none" stroke="#be185d" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M145 275 205 110m-15 165 70-165"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Kit Brochas Essential</text></svg>
|
||||
|
Before Width: | Height: | Size: 598 B |
|
Before Width: | Height: | Size: 167 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#d7f4ff"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#0369a1" opacity=".1"/><g fill="none" stroke="#0369a1" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M145 105h110l-15 175h-80zM165 105V75h90"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Termo Trend 1.2L</text></svg>
|
||||
|
Before Width: | Height: | Size: 601 B |
|
Before Width: | Height: | Size: 139 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"><defs><linearGradient id="b" x2="1" y2="1"><stop stop-color="#dfe7ef"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><rect width="400" height="400" rx="42" fill="url(#b)"/><circle cx="320" cy="80" r="90" fill="#334155" opacity=".1"/><g fill="none" stroke="#334155" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"> <path d="M165 68h70v264h-70zM150 122h100v156H150z"/></g><text x="200" y="352" text-anchor="middle" font-family="Arial" font-size="19" font-weight="700" fill="#2b2131">Smart Band Active</text></svg>
|
||||
|
Before Width: | Height: | Size: 603 B |
|
Before Width: | Height: | Size: 294 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 390 KiB |
|
Before Width: | Height: | Size: 343 KiB |
|
Before Width: | Height: | Size: 521 KiB |
|
Before Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 239 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 56 KiB |
@@ -1 +0,0 @@
|
||||
// JavaScript integrado en index.html para evitar fallas de carga.
|
||||
@@ -1,39 +0,0 @@
|
||||
trigger:
|
||||
- main
|
||||
|
||||
pool:
|
||||
vmImage: 'ubuntu-latest'
|
||||
https://gitea.cruzcloud.net/devops/apps-registry/src/branch/main/workloads/ecommerce
|
||||
variables:
|
||||
# Cambia esto por tu usuario de Gitea
|
||||
registryName: 'gitea.cruzcloud.net'
|
||||
imageName: 'devops/ecommerce-frontend'
|
||||
tag: '$(Build.BuildId)'
|
||||
|
||||
steps:
|
||||
# 1. Construcción de Imagen Docker
|
||||
- task: Docker@2
|
||||
displayName: 'Construir y Subir Imagen a Gitea'
|
||||
inputs:
|
||||
containerRegistry: 'gitea-registry-connection' # Nombre de la conexión que creamos en Azure DevOps
|
||||
repository: '$(imageName)'
|
||||
command: 'buildAndPush'
|
||||
Dockerfile: '**/Dockerfile'
|
||||
tags: |
|
||||
$(tag)
|
||||
latest
|
||||
|
||||
# 2. Actualización GitOps (Notificar a Argo CD)
|
||||
# Esto clona tu repo de despliegue, cambia la imagen y hace commit
|
||||
- script: |
|
||||
git clone https://$(gitea_token)@gitea.cruzcloud.net/devops/apps-registry.git
|
||||
cd apps-registry/workloads/ecommerce
|
||||
sed -i "s|image: .*|image: $(registryName)/$(imageName):$(tag)|g" frontend.yaml
|
||||
git config user.email "[email protected]"
|
||||
git config user.name "Cristian"
|
||||
git add frontend.yaml
|
||||
git commit -m "Auto-update image tag to $(tag)"
|
||||
git push origin main
|
||||
displayName: 'Actualizar GitOps Repo'
|
||||
env:
|
||||
gitea_token: $(GITEA_TOKEN) # Token generado en Gitea configurado como variable secreta
|
||||
@@ -1,33 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: catalog-api-deploy
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: catalog-api
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: catalog-api
|
||||
spec:
|
||||
containers:
|
||||
- name: api
|
||||
image: hashicorp/http-echo:latest # Imagen ligera de prueba para la API
|
||||
args:
|
||||
- "-text=Catálogo de Productos API Funcional"
|
||||
ports:
|
||||
- containerPort: 5678
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: catalog-api-svc
|
||||
spec:
|
||||
selector:
|
||||
app: catalog-api
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 5678
|
||||
@@ -1,18 +0,0 @@
|
||||
id,name,category,collection,description,dimensions,price,available,featured,new,image,fbid
|
||||
ari-001-toy-story-5-rex,Toy Story 5 - Rex,Figuras,Toy Story,Toy Story 5 - Rex,,,True,True,True,assets/img/products/ari-001-toy-story-5-rex.webp,18085705364648339
|
||||
ari-002-toy-story-5-buzz-lightyear,Toy Story 5 - Buzz Lightyear,Figuras,Toy Story,Toy Store 5 - Buzz Lightyear,,,True,True,True,assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp,17992282196809499
|
||||
ari-003-toy-story-5-jessie,Toy Story 5 - Jessie,Figuras,Toy Story,Toy Store 5 - Jessie,,,True,True,True,assets/img/products/ari-003-toy-story-5-jessie.webp,18095236400246225
|
||||
ari-004-toy-story-5-woody,Toy Story 5 - Woody,Figuras,Toy Story,Toy Store 5 - Woody,,,True,True,True,assets/img/products/ari-004-toy-story-5-woody.webp,17928025740357011
|
||||
ari-005-intensamente-furia,Intensamente Furia,Peluches,Intensamente,Intensamente Furia Disney Aprox 11 “ ,,,True,True,True,assets/img/products/ari-005-intensamente-furia.webp,17872853505541489
|
||||
ari-006-intensamente-tristeza,Intensamente Tristeza,Peluches,Intensamente,Intensamente Tristeza Disney Aprox 11 “ ,,,True,True,True,assets/img/products/ari-006-intensamente-tristeza.webp,17869884192555816
|
||||
ari-007-minnie-y-mickey-mouse,Minnie y Mickey Mouse,Peluches,Mickey & Minnie,Minnie y Mickey Mouse Disney 🧸 Edición especial Aprox 15 “ ,,,True,True,False,assets/img/products/ari-007-minnie-y-mickey-mouse.webp,18116898613530808
|
||||
ari-008-angel-lilo-y-stitch,Angel Lilo y Stitch,Peluches,Lilo & Stitch,Angel Lilo y Stitch Disney Aprox 13 “ ,,,True,True,False,assets/img/products/ari-008-angel-lilo-y-stitch.webp,18161192263375119
|
||||
ari-009-mochilas-disney-coleccion-marvel,Mochilas Disney colección Marvel,Mochilas,Marvel,Mochilas Disney colección Marvel ,,,True,False,False,assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp,18137839804491353
|
||||
ari-010-mochila-ligera-y-resistente-al-agua-de-d,"Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples compa",Mochilas,Frozen,"Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples compartimentos y degradado, mochila de poliéster para estudiantes, tamaño pequeño en color rosa y azul celeste",,,True,False,False,assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-d.webp,18111649603646835
|
||||
ari-011-mochila-escolar-de-spider-man-de-disney-,"Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila ligera, ",Mochilas,Marvel,"Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila ligera, antibacteriana y transpirable, resistente a salpicaduras, Dimensiones 28x18x30",28 × 18 × 30 cm,,True,False,False,assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-.webp,18087568414880256
|
||||
ari-012-disney-mochila-de-poliester-ultraligera-,"Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dimension",Mochilas,Disney,"Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dimensiones 39x16x46",39 × 16 × 46 cm,,True,False,False,assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-.webp,18077075042356897
|
||||
ari-013-mochila-pequena-bob-esponja,Mochila pequeña Bob Esponja,Mochilas,Bob Esponja,"Mochila pequeña Bob Esponja disponibles en color blanco, negro y verde",,,True,False,False,assets/img/products/ari-013-mochila-pequena-bob-esponja.webp,17891585106407663
|
||||
ari-014-mochila-casual-de-gran-capacidad-con-est,"Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos anim",Mochilas,Bob Esponja,"Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos animados linda, esencial para volver a la escuela Dimensiones 20 cm x 15 cm x 10 cm ",20 × 15 × 10 cm,,True,False,False,assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-est.webp,18119703688604702
|
||||
ari-015-mochila-escolar-estilo-britanico-de-disn,"Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochila de ",Mochilas,Disney,"Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochila de gran capacidad y ultraligera para el inicio del colegio dimensiones 38 cm x 27 cm x 14.5 cm ","38 × 27 × 14,5 cm",,True,False,False,assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disn.webp,18558512062005705
|
||||
ari-016-disney-mochila-iron-man-de-poliester-ult,"Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46 cm x",Mochilas,Marvel,"Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46 cm x 33 cm x 19 cm ",46 × 33 × 19 cm,,True,False,False,assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ult.webp,17862794898572444
|
||||
ari-017-mochila-de-disney-marvel-capitan-america,"Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras, par",Mochilas,Marvel,"Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras, para estudiantes de secundaria dimensiones 45 cm x 30 cm x 14 cm ",45 × 30 × 14 cm,,True,False,False,assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america.webp,17977485617974392
|
||||
|
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"policy": "reference-only",
|
||||
"note": "Las imágenes externas no están incluidas. Usarlas únicamente con autorización del fabricante o proveedor.",
|
||||
"sources": [
|
||||
{
|
||||
"productMatch": "Toy Story Rex",
|
||||
"provider": "Mattel",
|
||||
"url": "https://shop.mattel.com/products/disney-and-pixar-toy-story-rex-action-figure-dinosaur-jkv17",
|
||||
"use": "Referencia oficial"
|
||||
},
|
||||
{
|
||||
"productMatch": "Toy Story Buzz Lightyear",
|
||||
"provider": "Mattel",
|
||||
"url": "https://shop.mattel.com/en-ca/products/disney-and-pixar-toy-story-buzz-lightyear-action-figure-jkv15-en-ca",
|
||||
"use": "Referencia oficial"
|
||||
},
|
||||
{
|
||||
"productMatch": "Toy Story Jessie",
|
||||
"provider": "Mattel",
|
||||
"url": "https://shop.mattel.com/products/disney-and-pixar-toy-story-jessie-action-figure-jkv16",
|
||||
"use": "Referencia oficial"
|
||||
},
|
||||
{
|
||||
"productMatch": "Toy Story Woody",
|
||||
"provider": "Mattel",
|
||||
"url": "https://shop.mattel.com/en-ca/products/disney-and-pixar-toy-story-woody-action-figure-jkv14-en-ca",
|
||||
"use": "Referencia oficial"
|
||||
},
|
||||
{
|
||||
"productMatch": "Angel Lilo & Stitch",
|
||||
"provider": "Disney Store",
|
||||
"url": "https://www.disneystore.com/characters/disney/angel/",
|
||||
"use": "Confirmar coincidencia exacta"
|
||||
},
|
||||
{
|
||||
"productMatch": "Intensamente Furia y Tristeza",
|
||||
"provider": "Disney Store",
|
||||
"url": "https://www.disneystore.com/movies-shows/pixar/inside-out/",
|
||||
"use": "Confirmar coincidencia exacta"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,262 +0,0 @@
|
||||
{
|
||||
"version": "3.0.0",
|
||||
"updatedAt": "2026-07-19T19:39:12.411122+00:00",
|
||||
"pricingMode": "consult",
|
||||
"products": [
|
||||
{
|
||||
"id": "ari-001-toy-story-5-rex",
|
||||
"name": "Toy Story 5 - Rex",
|
||||
"category": "Figuras",
|
||||
"collection": "Toy Story",
|
||||
"description": "Toy Story 5 - Rex",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-001-toy-story-5-rex.webp",
|
||||
"fbid": "18085705364648339"
|
||||
},
|
||||
{
|
||||
"id": "ari-002-toy-story-5-buzz-lightyear",
|
||||
"name": "Toy Story 5 - Buzz Lightyear",
|
||||
"category": "Figuras",
|
||||
"collection": "Toy Story",
|
||||
"description": "Toy Store 5 - Buzz Lightyear",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp",
|
||||
"fbid": "17992282196809499"
|
||||
},
|
||||
{
|
||||
"id": "ari-003-toy-story-5-jessie",
|
||||
"name": "Toy Story 5 - Jessie",
|
||||
"category": "Figuras",
|
||||
"collection": "Toy Story",
|
||||
"description": "Toy Store 5 - Jessie",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-003-toy-story-5-jessie.webp",
|
||||
"fbid": "18095236400246225"
|
||||
},
|
||||
{
|
||||
"id": "ari-004-toy-story-5-woody",
|
||||
"name": "Toy Story 5 - Woody",
|
||||
"category": "Figuras",
|
||||
"collection": "Toy Story",
|
||||
"description": "Toy Store 5 - Woody",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-004-toy-story-5-woody.webp",
|
||||
"fbid": "17928025740357011"
|
||||
},
|
||||
{
|
||||
"id": "ari-005-intensamente-furia",
|
||||
"name": "Intensamente Furia",
|
||||
"category": "Peluches",
|
||||
"collection": "Intensamente",
|
||||
"description": "Intensamente Furia Disney Aprox 11 “ ",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-005-intensamente-furia.webp",
|
||||
"fbid": "17872853505541489"
|
||||
},
|
||||
{
|
||||
"id": "ari-006-intensamente-tristeza",
|
||||
"name": "Intensamente Tristeza",
|
||||
"category": "Peluches",
|
||||
"collection": "Intensamente",
|
||||
"description": "Intensamente Tristeza Disney Aprox 11 “ ",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": true,
|
||||
"image": "assets/img/products/ari-006-intensamente-tristeza.webp",
|
||||
"fbid": "17869884192555816"
|
||||
},
|
||||
{
|
||||
"id": "ari-007-minnie-y-mickey-mouse",
|
||||
"name": "Minnie y Mickey Mouse",
|
||||
"category": "Peluches",
|
||||
"collection": "Mickey & Minnie",
|
||||
"description": "Minnie y Mickey Mouse Disney 🧸 Edición especial Aprox 15 “ ",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-007-minnie-y-mickey-mouse.webp",
|
||||
"fbid": "18116898613530808"
|
||||
},
|
||||
{
|
||||
"id": "ari-008-angel-lilo-y-stitch",
|
||||
"name": "Angel Lilo y Stitch",
|
||||
"category": "Peluches",
|
||||
"collection": "Lilo & Stitch",
|
||||
"description": "Angel Lilo y Stitch Disney Aprox 13 “ ",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": true,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-008-angel-lilo-y-stitch.webp",
|
||||
"fbid": "18161192263375119"
|
||||
},
|
||||
{
|
||||
"id": "ari-009-mochilas-disney-coleccion-marvel",
|
||||
"name": "Mochilas Disney colección Marvel",
|
||||
"category": "Mochilas",
|
||||
"collection": "Marvel",
|
||||
"description": "Mochilas Disney colección Marvel ",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp",
|
||||
"fbid": "18137839804491353"
|
||||
},
|
||||
{
|
||||
"id": "ari-010-mochila-ligera-y-resistente-al-agua-de-d",
|
||||
"name": "Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples compa",
|
||||
"category": "Mochilas",
|
||||
"collection": "Frozen",
|
||||
"description": "Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples compartimentos y degradado, mochila de poliéster para estudiantes, tamaño pequeño en color rosa y azul celeste",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-d.webp",
|
||||
"fbid": "18111649603646835"
|
||||
},
|
||||
{
|
||||
"id": "ari-011-mochila-escolar-de-spider-man-de-disney-",
|
||||
"name": "Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila ligera, ",
|
||||
"category": "Mochilas",
|
||||
"collection": "Marvel",
|
||||
"description": "Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila ligera, antibacteriana y transpirable, resistente a salpicaduras, Dimensiones 28x18x30",
|
||||
"dimensions": "28 × 18 × 30 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-.webp",
|
||||
"fbid": "18087568414880256"
|
||||
},
|
||||
{
|
||||
"id": "ari-012-disney-mochila-de-poliester-ultraligera-",
|
||||
"name": "Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dimension",
|
||||
"category": "Mochilas",
|
||||
"collection": "Disney",
|
||||
"description": "Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dimensiones 39x16x46",
|
||||
"dimensions": "39 × 16 × 46 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-.webp",
|
||||
"fbid": "18077075042356897"
|
||||
},
|
||||
{
|
||||
"id": "ari-013-mochila-pequena-bob-esponja",
|
||||
"name": "Mochila pequeña Bob Esponja",
|
||||
"category": "Mochilas",
|
||||
"collection": "Bob Esponja",
|
||||
"description": "Mochila pequeña Bob Esponja disponibles en color blanco, negro y verde",
|
||||
"dimensions": "",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-013-mochila-pequena-bob-esponja.webp",
|
||||
"fbid": "17891585106407663"
|
||||
},
|
||||
{
|
||||
"id": "ari-014-mochila-casual-de-gran-capacidad-con-est",
|
||||
"name": "Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos anim",
|
||||
"category": "Mochilas",
|
||||
"collection": "Bob Esponja",
|
||||
"description": "Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos animados linda, esencial para volver a la escuela Dimensiones 20 cm x 15 cm x 10 cm ",
|
||||
"dimensions": "20 × 15 × 10 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-est.webp",
|
||||
"fbid": "18119703688604702"
|
||||
},
|
||||
{
|
||||
"id": "ari-015-mochila-escolar-estilo-britanico-de-disn",
|
||||
"name": "Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochila de ",
|
||||
"category": "Mochilas",
|
||||
"collection": "Disney",
|
||||
"description": "Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochila de gran capacidad y ultraligera para el inicio del colegio dimensiones 38 cm x 27 cm x 14.5 cm ",
|
||||
"dimensions": "38 × 27 × 14,5 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disn.webp",
|
||||
"fbid": "18558512062005705"
|
||||
},
|
||||
{
|
||||
"id": "ari-016-disney-mochila-iron-man-de-poliester-ult",
|
||||
"name": "Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46 cm x",
|
||||
"category": "Mochilas",
|
||||
"collection": "Marvel",
|
||||
"description": "Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46 cm x 33 cm x 19 cm ",
|
||||
"dimensions": "46 × 33 × 19 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ult.webp",
|
||||
"fbid": "17862794898572444"
|
||||
},
|
||||
{
|
||||
"id": "ari-017-mochila-de-disney-marvel-capitan-america",
|
||||
"name": "Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras, par",
|
||||
"category": "Mochilas",
|
||||
"collection": "Marvel",
|
||||
"description": "Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras, para estudiantes de secundaria dimensiones 45 cm x 30 cm x 14 cm ",
|
||||
"dimensions": "45 × 30 × 14 cm",
|
||||
"price": null,
|
||||
"priceText": "Consultar disponibilidad",
|
||||
"available": true,
|
||||
"featured": false,
|
||||
"new": false,
|
||||
"image": "assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america.webp",
|
||||
"fbid": "17977485617974392"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"version": "3.0.0",
|
||||
"brand": "Ari Shopping",
|
||||
"instagramUrl": "https://www.instagram.com/ari_shopping1/",
|
||||
"facebookUrl": "https://www.facebook.com/arishopping1imp/",
|
||||
"whatsappUrl": "https://wa.link/rvcqqc",
|
||||
"catalogUrl": "data/products.json",
|
||||
"currency": "COP",
|
||||
"locale": "es-CO"
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: frontend-deploy
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: frontend
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: frontend
|
||||
spec:
|
||||
imagePullSecrets:
|
||||
- name: gitea-registry-secret
|
||||
containers:
|
||||
- name: web
|
||||
image: gitea.cruzcloud.net/devops/ecommerce-frontend:v1.0.27
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: frontend-svc
|
||||
spec:
|
||||
selector:
|
||||
app: frontend
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
@@ -1,76 +0,0 @@
|
||||
<!doctype html>
|
||||
<html lang="es">
|
||||
<head>
|
||||
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#ff4f9a">
|
||||
<title>Ari Shopping</title><meta name="description" content="Tienda online Ari Shopping"><link rel="icon" href="assets/img/brand/favicon.png" type="image/png">
|
||||
<style>
|
||||
:root{
|
||||
--bg:#f8f7fb;--card:#fff;--ink:#17141d;--muted:#716b78;--line:#e8e2ec;
|
||||
--pink:#ff4f9a;--violet:#8b45e7;--soft:#f4edf8;--shadow:0 18px 50px rgba(35,22,45,.11);
|
||||
--radius:28px;--max:1240px
|
||||
}
|
||||
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}body.lock{overflow:hidden}button,input,select{font:inherit}button{cursor:pointer;color:inherit}a{color:inherit;text-decoration:none}img{display:block;max-width:100%}[hidden]{display:none!important}.wrap{width:min(calc(100% - 32px),var(--max));margin:auto}
|
||||
.topbar{background:linear-gradient(90deg,var(--pink),var(--violet));color:#fff;text-align:center;padding:10px 16px;font-size:12px;font-weight:800;letter-spacing:.03em}
|
||||
.header{position:sticky;top:0;z-index:60;background:rgba(248,247,251,.94);backdrop-filter:blur(18px);border-bottom:1px solid var(--line)}
|
||||
.header-inner{min-height:86px;display:grid;grid-template-columns:260px 1fr auto;align-items:center;gap:24px}.brand{display:flex;align-items:center;gap:14px}.brand img{width:64px;height:64px;border-radius:50%;object-fit:cover;box-shadow:var(--shadow)}.brand strong{display:block;font-size:20px}.brand span{display:block;margin-top:4px;color:var(--muted);font-size:12px}.nav{display:flex;justify-content:center;gap:22px;flex-wrap:wrap}.nav button{border:0;background:transparent;padding:10px 0;color:var(--muted);font-size:14px}.nav button:hover,.nav button.active{color:var(--pink)}.actions{display:flex;gap:10px}.ghost,.cart-btn,.cta,.white,.small-btn{border:0;border-radius:999px;font-weight:800}.ghost{height:44px;padding:0 17px;background:#fff;border:1px solid var(--line)}.cart-btn,.cta,.small-btn{background:linear-gradient(90deg,var(--pink),var(--violet));color:#fff;box-shadow:0 10px 24px rgba(255,79,154,.2)}.cart-btn{height:46px;padding:0 18px}.cart-btn b{display:inline-grid;place-items:center;margin-left:8px;min-width:24px;height:24px;padding:0 6px;border-radius:999px;background:#fff;color:var(--ink);font-size:12px}.search{display:grid;grid-template-columns:1fr auto;gap:10px;padding-bottom:16px}.search input{height:50px;border:1px solid var(--line);border-radius:999px;padding:0 18px;background:#fff;outline:none}.search input:focus{border-color:var(--pink);box-shadow:0 0 0 4px rgba(255,79,154,.1)}
|
||||
.hero{padding:64px 0 70px;display:grid;grid-template-columns:.95fr 1.05fr;gap:50px;align-items:center}.eyebrow{color:var(--pink);font-size:11px;font-weight:900;text-transform:uppercase;letter-spacing:.14em}.hero h1{margin:14px 0 20px;font-size:clamp(50px,6.2vw,84px);line-height:.96;letter-spacing:-.06em}.hero h1 em{display:block;color:var(--pink);font-family:Georgia,serif;font-weight:400}.hero p{max-width:560px;color:var(--muted);font-size:17px;line-height:1.75}.hero-actions{display:flex;gap:14px;margin-top:28px;align-items:center}.cta,.white{min-height:50px;padding:0 22px;display:inline-flex;align-items:center;justify-content:center}.white{background:#fff;border:1px solid var(--line)}.hero-media{position:relative;padding:18px;border-radius:36px;background:linear-gradient(145deg,#f3e3fb,#e9f8f1);box-shadow:var(--shadow)}.hero-media img{width:100%;border-radius:28px}.hero-badge{position:absolute;right:34px;bottom:34px;padding:12px 16px;background:rgba(255,255,255,.92);border-radius:16px;font-size:12px;font-weight:800;box-shadow:var(--shadow)}
|
||||
.trust{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:90px}.trust article{display:flex;gap:14px;align-items:center;padding:22px;background:#fff;border:1px solid var(--line);border-radius:22px}.trust i{width:38px;height:38px;display:grid;place-items:center;border-radius:50%;background:#fff0f7;color:var(--pink);font-style:normal;font-weight:900}.trust strong,.trust span{display:block}.trust span{color:var(--muted);font-size:13px;margin-top:4px}
|
||||
.section{padding-bottom:96px}.section-head{display:flex;justify-content:space-between;align-items:end;gap:24px;margin-bottom:26px}.section-head h2{margin:8px 0;font-size:clamp(34px,4vw,54px);line-height:1;letter-spacing:-.05em}.section-head p{margin:0;color:var(--muted)}.section-head a{color:var(--pink);font-weight:800}
|
||||
.category-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.category-card{padding:0;border:0;background:#fff;border-radius:26px;overflow:hidden;box-shadow:var(--shadow);text-align:left;transition:.2s}.category-card:hover{transform:translateY(-5px)}.category-card img{width:100%;aspect-ratio:4/5;object-fit:cover}.category-card div{padding:17px 18px 20px}.category-card strong{display:block;font-size:19px}.category-card span{display:block;color:var(--muted);font-size:13px;margin-top:5px}
|
||||
.toolbar{display:flex;justify-content:space-between;gap:18px;align-items:center;margin-bottom:24px}.chips{display:flex;gap:8px;flex-wrap:wrap}.chip{border:1px solid var(--line);border-radius:999px;padding:10px 15px;background:#fff;font-size:13px;font-weight:800}.chip.active{background:var(--ink);color:#fff;border-color:var(--ink)}.toolbar select{height:44px;border:1px solid var(--line);border-radius:14px;background:#fff;padding:0 12px}.product-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.product{background:#fff;border:1px solid var(--line);border-radius:24px;overflow:hidden;box-shadow:0 9px 28px rgba(35,22,45,.07);display:flex;flex-direction:column}.product-media{border:0;padding:0;background:#fff}.product-media img{width:100%;aspect-ratio:1/1;object-fit:cover}.product-body{padding:17px;display:flex;flex-direction:column;gap:11px;flex:1}.labels{display:flex;gap:7px;flex-wrap:wrap}.label{padding:6px 9px;border-radius:999px;background:var(--soft);color:var(--muted);font-size:11px;font-weight:800}.product-title{padding:0;border:0;background:transparent;text-align:left;font-size:18px;font-weight:900;line-height:1.2}.product-desc{margin:0;color:var(--muted);font-size:13px;line-height:1.55;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}.product-footer{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:auto}.product-footer strong{font-size:12px}.small-btn{height:40px;padding:0 15px}.empty{padding:40px;background:#fff;border:1px dashed var(--line);border-radius:24px;text-align:center}
|
||||
.social{background:linear-gradient(135deg,#65165d,#1a1122);color:#fff;padding:72px 0}.social-inner{display:flex;justify-content:space-between;align-items:center;gap:24px}.social h2{font-size:clamp(34px,4vw,54px);line-height:1;letter-spacing:-.04em;margin:10px 0 0;max-width:760px}.footer{background:#16101c;color:#fff}.footer-inner{min-height:116px;display:flex;justify-content:space-between;align-items:center;gap:20px}.footer-brand{display:flex;align-items:center;gap:14px}.footer-brand img{width:64px;height:64px;border-radius:50%;object-fit:cover}.footer-brand strong,.footer-brand span{display:block}.footer-brand span{color:#d7cddd;font-size:13px;margin-top:4px}.footer small{color:#d7cddd}
|
||||
.backdrop{position:fixed;inset:0;z-index:90;background:rgba(22,12,28,.58);backdrop-filter:blur(4px)}.drawer{position:fixed;z-index:95;top:0;right:0;width:min(430px,100%);height:100dvh;background:#fff;display:grid;grid-template-rows:auto 1fr auto;transform:translateX(105%);transition:.22s;box-shadow:-24px 0 70px rgba(20,10,25,.2)}.drawer.open{transform:none}.drawer-head,.drawer-foot{padding:22px;border-bottom:1px solid var(--line)}.drawer-head{display:flex;justify-content:space-between;align-items:center}.drawer-head h3{margin:8px 0 0;font-size:28px}.drawer-body{padding:18px 22px;overflow:auto}.drawer-foot{border-top:1px solid var(--line);border-bottom:0;display:grid;gap:10px}.full{width:100%}.cart-empty{text-align:center;color:var(--muted);padding:35px 15px}.cart-line{display:grid;grid-template-columns:70px 1fr auto;gap:11px;margin-bottom:15px}.cart-line img{width:70px;height:70px;border-radius:14px;object-fit:cover}.cart-line strong,.cart-line small{display:block}.cart-line small{color:var(--muted);margin-top:5px}.qty{display:flex;gap:7px;align-items:center;margin-top:9px}.qty button{width:28px;height:28px;border-radius:50%;border:1px solid var(--line);background:#fff}.remove{border:0;background:transparent;color:var(--pink);font-weight:800}.dialog{width:min(920px,calc(100% - 24px));padding:0;border:0;border-radius:28px;box-shadow:0 30px 90px rgba(20,10,25,.3)}.dialog::backdrop{background:rgba(22,12,28,.58);backdrop-filter:blur(4px)}.dialog-close{position:absolute;right:14px;top:14px;width:42px;height:42px;border:0;border-radius:50%;background:#fff;font-size:26px}.dialog-grid{display:grid;grid-template-columns:1fr .95fr}.dialog-grid>img{width:100%;height:100%;min-height:520px;object-fit:cover}.dialog-copy{padding:42px 34px 34px}.dialog-copy h3{font-size:38px;line-height:1.04;letter-spacing:-.04em;margin:12px 0 16px}.dialog-copy p{color:var(--muted);line-height:1.7}.details{display:grid;gap:10px;margin:20px 0}.details div{padding:14px 16px;border:1px solid var(--line);border-radius:18px;background:#faf7fb}.details strong{display:block;color:var(--pink);font-size:11px;text-transform:uppercase;letter-spacing:.1em}.dialog-actions{display:flex;gap:10px;flex-wrap:wrap}
|
||||
@media(max-width:1050px){.header-inner{grid-template-columns:1fr;padding:16px 0}.nav{justify-content:flex-start}.hero,.dialog-grid{grid-template-columns:1fr}.trust,.category-grid,.product-grid{grid-template-columns:repeat(2,1fr)}.section-head,.toolbar,.social-inner,.footer-inner{align-items:flex-start;flex-direction:column}}
|
||||
@media(max-width:620px){.wrap{width:min(calc(100% - 22px),var(--max))}.brand span{display:none}.hero{padding-top:42px}.hero h1{font-size:46px}.hero-actions{align-items:flex-start;flex-direction:column}.trust,.category-grid,.product-grid{grid-template-columns:1fr}.dialog-copy{padding:28px 20px}.dialog-copy h3{font-size:30px}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="topbar">Envíos seguros · Atención personalizada · Pedidos por WhatsApp</div>
|
||||
<header class="header"><div class="wrap header-inner">
|
||||
<a class="brand" href="#inicio"><img src="assets/img/brand/logo-ari.png" alt="Ari Shopping"><div><strong>Ari Shopping</strong><span>Detalles que hacen tu día más especial</span></div></a>
|
||||
<nav class="nav"><button data-nav="Todos">Todos</button><button data-nav="Figuras">Juguetes</button><button data-nav="Peluches">Peluches</button><button data-nav="Mochilas">Mochilas</button><button data-col="Marvel">Marvel</button><button data-col="Toy Story">Toy Story</button></nav>
|
||||
<div class="actions"><button id="searchBtn" class="ghost">Buscar</button><button id="cartBtn" class="cart-btn">Carrito <b id="cartCount">0</b></button></div>
|
||||
</div><div class="wrap search" id="searchRow" hidden><input id="searchInput" type="search" placeholder="Buscar producto o colección…"><button id="searchClose" class="ghost">Cerrar</button></div></header>
|
||||
<main id="inicio">
|
||||
<section class="wrap hero"><div><span class="eyebrow">Nueva colección</span><h1>Encuentra ese detalle que hace el día más <em>especial.</em></h1><p>Juguetes, personajes, peluches y mochilas seleccionados para sorprender. Compra fácil y recibe atención personalizada.</p><div class="hero-actions"><a class="cta" href="#productos">Explorar productos</a><a class="white" href="https://www.instagram.com/ari_shopping1/" target="_blank" rel="noopener">Ver Instagram</a></div></div><div class="hero-media"><img src="assets/img/hero/hero-real.webp" alt="Productos Ari Shopping"><span class="hero-badge">Productos reales de Ari Shopping</span></div></section>
|
||||
<section class="wrap trust"><article><i>↗</i><div><strong>Envíos seguros</strong><span>Coordina tu entrega con nosotros.</span></div></article><article><i>▣</i><div><strong>Pagos fáciles</strong><span>Confirma disponibilidad antes de pagar.</span></div></article><article><i>♥</i><div><strong>Atención cercana</strong><span>Te ayudamos a elegir el producto ideal.</span></div></article></section>
|
||||
<section class="wrap section"><div class="section-head"><div><span class="eyebrow">Explora la tienda</span><h2>Compra por categoría</h2><p>Encuentra rápidamente lo que estás buscando.</p></div><a href="#productos">Ver todo →</a></div><div class="category-grid">
|
||||
<button class="category-card" data-cat="Figuras"><img src="assets/img/categories/figuras.webp" alt="Juguetes"><div><strong>Juguetes</strong><span>Toy Story y personajes</span></div></button>
|
||||
<button class="category-card" data-cat="Peluches"><img src="assets/img/categories/peluches.webp" alt="Peluches"><div><strong>Peluches</strong><span>Personajes para regalar</span></div></button>
|
||||
<button class="category-card" data-cat="Mochilas"><img src="assets/img/categories/mochilas.webp" alt="Mochilas"><div><strong>Bolsos y mochilas</strong><span>Escolares y casuales</span></div></button>
|
||||
<button class="category-card" data-col="Marvel"><img src="assets/img/categories/marvel.webp" alt="Marvel"><div><strong>Marvel</strong><span>Diseños con personalidad</span></div></button></div></section>
|
||||
<section class="wrap section" id="productos"><div class="section-head"><div><span class="eyebrow">Catálogo real</span><h2>Productos destacados</h2><p id="summary">Cargando productos…</p></div><a target="_blank" rel="noopener" href="https://wa.link/rvcqqc">Consultar disponibilidad →</a></div><div class="toolbar"><div id="chips" class="chips"></div><select id="sort"><option value="featured">Destacados</option><option value="new">Más recientes</option><option value="name">Nombre</option></select></div><div id="productGrid" class="product-grid"></div><div id="empty" class="empty" hidden><strong>No encontramos productos</strong><p>Prueba con otra categoría.</p><button id="reset" class="cta">Ver todos</button></div></section>
|
||||
<section class="social"><div class="wrap social-inner"><div><span class="eyebrow" style="color:#ffbad9">Comunidad Ari Shopping</span><h2>Novedades y promociones en Instagram.</h2></div><a class="white" href="https://www.instagram.com/ari_shopping1/" target="_blank" rel="noopener">@ari_shopping1</a></div></section>
|
||||
</main>
|
||||
<footer class="footer"><div class="wrap footer-inner"><div class="footer-brand"><img src="assets/img/brand/logo-ari.png" alt="Ari Shopping"><div><strong>Ari Shopping</strong><span>Detalles que emocionan, compras que disfrutas.</span></div></div><small>Frontend v3.0.0</small></div></footer>
|
||||
<div id="backdrop" class="backdrop" hidden></div><aside id="drawer" class="drawer"><div class="drawer-head"><div><span class="eyebrow">Tu pedido</span><h3>Carrito</h3></div><button id="drawerClose" class="ghost">Cerrar</button></div><div id="cartItems" class="drawer-body"></div><div class="drawer-foot"><button id="checkout" class="cta full">Enviar por WhatsApp</button><button id="clearCart" class="ghost full">Vaciar pedido</button><small>Precio y disponibilidad se confirman directamente con Ari Shopping.</small></div></aside>
|
||||
<dialog id="dialog" class="dialog"><button id="dialogClose" class="dialog-close">×</button><div id="dialogContent"></div></dialog>
|
||||
<template id="productTemplate"><article class="product"><button class="product-media open-product"><img alt=""></button><div class="product-body"><div class="labels"><span class="label cat"></span><span class="label col"></span></div><button class="product-title open-product"></button><p class="product-desc"></p><div class="product-footer"><strong>Consultar</strong><button class="small-btn add">Agregar</button></div></div></article></template>
|
||||
<script>
|
||||
(() => {
|
||||
const state={products:[],store:null,category:'Todos',collection:'',query:'',sort:'featured',cart:JSON.parse(localStorage.getItem('ari-cart-v3')||'{}')};
|
||||
const $=(s,r=document)=>r.querySelector(s), $$=(s,r=document)=>[...r.querySelectorAll(s)];
|
||||
const el={grid:$('#productGrid'),tpl:$('#productTemplate'),chips:$('#chips'),summary:$('#summary'),empty:$('#empty'),sort:$('#sort'),searchBtn:$('#searchBtn'),searchRow:$('#searchRow'),searchInput:$('#searchInput'),searchClose:$('#searchClose'),cartBtn:$('#cartBtn'),cartCount:$('#cartCount'),drawer:$('#drawer'),drawerClose:$('#drawerClose'),backdrop:$('#backdrop'),cartItems:$('#cartItems'),clearCart:$('#clearCart'),checkout:$('#checkout'),dialog:$('#dialog'),dialogClose:$('#dialogClose'),dialogContent:$('#dialogContent'),reset:$('#reset')};
|
||||
const norm=v=>String(v||'').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'');
|
||||
const product=id=>state.products.find(p=>p.id===id), save=()=>localStorage.setItem('ari-cart-v3',JSON.stringify(state.cart));
|
||||
async function init(){const [s,c]=await Promise.all([fetch('data/store.json',{cache:'no-store'}),fetch('data/products.json',{cache:'no-store'})]);state.store=await s.json();state.products=(await c.json()).products||[];render()}
|
||||
function categories(){return ['Todos',...new Set(state.products.map(p=>p.category))]}
|
||||
function filtered(){const q=norm(state.query);return state.products.filter(p=>(state.category==='Todos'||p.category===state.category)&&(!state.collection||p.collection===state.collection)&&(!q||norm(`${p.name} ${p.category} ${p.collection} ${p.description}`).includes(q))).sort((a,b)=>state.sort==='name'?a.name.localeCompare(b.name,'es'):state.sort==='new'?Number(!!b.new)-Number(!!a.new):Number(!!b.featured)-Number(!!a.featured)||a.name.localeCompare(b.name,'es'))}
|
||||
function renderChips(){el.chips.innerHTML=categories().map(c=>`<button class="chip ${state.category===c&&!state.collection?'active':''}" data-chip="${c}">${c}</button>`).join('')}
|
||||
function renderProducts(){const list=filtered();el.summary.textContent=`${list.length} productos disponibles para consultar.`;el.empty.hidden=list.length>0;el.grid.innerHTML='';list.forEach(p=>{const f=el.tpl.content.cloneNode(true);$('img',f).src=p.image;$('img',f).alt=p.name;$('.cat',f).textContent=p.category;$('.col',f).textContent=p.collection;$('.product-title',f).textContent=p.name;$('.product-desc',f).textContent=p.description;$$('.open-product',f).forEach(b=>b.addEventListener('click',()=>openDialog(p.id)));$('.add',f).addEventListener('click',()=>add(p.id));el.grid.appendChild(f)})}
|
||||
function cartEntries(){return Object.entries(state.cart).map(([id,qty])=>({p:product(id),qty:Number(qty)})).filter(x=>x.p&&x.qty>0)}
|
||||
function renderCart(){const list=cartEntries();el.cartCount.textContent=String(list.reduce((s,x)=>s+x.qty,0));if(!list.length){el.cartItems.innerHTML='<div class="cart-empty"><strong>Tu pedido está vacío</strong><p>Agrega productos para consultarlos por WhatsApp.</p></div>';return}el.cartItems.innerHTML=list.map(({p,qty})=>`<article class="cart-line" data-id="${p.id}"><img src="${p.image}" alt="${p.name}"><div><strong>${p.name}</strong><small>${p.collection} · Consultar disponibilidad</small><div class="qty"><button data-minus>−</button><span>${qty}</span><button data-plus>+</button></div></div><button class="remove" data-remove>Quitar</button></article>`).join('');$$('[data-minus]',el.cartItems).forEach(b=>b.addEventListener('click',()=>change(b.closest('[data-id]').dataset.id,-1)));$$('[data-plus]',el.cartItems).forEach(b=>b.addEventListener('click',()=>change(b.closest('[data-id]').dataset.id,1)));$$('[data-remove]',el.cartItems).forEach(b=>b.addEventListener('click',()=>remove(b.closest('[data-id]').dataset.id)))}
|
||||
function render(){renderChips();renderProducts();renderCart()}
|
||||
function add(id){state.cart[id]=Number(state.cart[id]||0)+1;save();renderCart();openDrawer()}
|
||||
function change(id,d){const n=Number(state.cart[id]||0)+d;if(n<=0)delete state.cart[id];else state.cart[id]=n;save();renderCart()}
|
||||
function remove(id){delete state.cart[id];save();renderCart()}
|
||||
function openDrawer(){el.drawer.classList.add('open');el.backdrop.hidden=false;document.body.classList.add('lock')}
|
||||
function closeDrawer(){el.drawer.classList.remove('open');el.backdrop.hidden=true;document.body.classList.remove('lock')}
|
||||
function openDialog(id){const p=product(id);if(!p)return;el.dialogContent.innerHTML=`<div class="dialog-grid"><img src="${p.image}" alt="${p.name}"><div class="dialog-copy"><span class="eyebrow">${p.category} · ${p.collection}</span><h3>${p.name}</h3><p>${p.description}</p><div class="details"><div><strong>Precio</strong><span>Consultar disponibilidad</span></div><div><strong>Entrega</strong><span>Coordinar con Ari Shopping</span></div>${p.dimensions?`<div><strong>Medidas</strong><span>${p.dimensions}</span></div>`:''}</div><div class="dialog-actions"><button id="dialogAdd" class="cta">Agregar al pedido</button><a class="ghost" target="_blank" rel="noopener" href="${state.store.whatsappUrl}">Consultar por WhatsApp</a></div></div></div>`;$('#dialogAdd',el.dialogContent).addEventListener('click',()=>{add(id);el.dialog.close()});el.dialog.showModal()}
|
||||
function checkout(){const list=cartEntries();const msg=['Hola Ari Shopping 👋','Quiero consultar disponibilidad para:','',...list.map(x=>`• ${x.qty} x ${x.p.name}`),'','Nombre:','Ciudad:','Forma de entrega:'].join('\n');window.open(`${state.store.whatsappUrl}?text=${encodeURIComponent(msg)}`,'_blank','noopener')}
|
||||
document.addEventListener('click',ev=>{const nav=ev.target.closest('[data-nav]');if(nav){state.category=nav.dataset.nav;state.collection='';render()}const col=ev.target.closest('[data-col]');if(col){state.category='Todos';state.collection=col.dataset.col;render()}const cat=ev.target.closest('[data-cat]');if(cat){state.category=cat.dataset.cat;state.collection='';render()}const chip=ev.target.closest('[data-chip]');if(chip){state.category=chip.dataset.chip;state.collection='';render()}});
|
||||
el.sort.addEventListener('change',()=>{state.sort=el.sort.value;renderProducts()});el.searchBtn.addEventListener('click',()=>{el.searchRow.hidden=false;el.searchInput.focus()});el.searchClose.addEventListener('click',()=>{el.searchRow.hidden=true;state.query='';el.searchInput.value='';renderProducts()});el.searchInput.addEventListener('input',()=>{state.query=el.searchInput.value;renderProducts()});el.cartBtn.addEventListener('click',openDrawer);el.drawerClose.addEventListener('click',closeDrawer);el.backdrop.addEventListener('click',closeDrawer);el.clearCart.addEventListener('click',()=>{state.cart={};save();renderCart()});el.checkout.addEventListener('click',checkout);el.dialogClose.addEventListener('click',()=>el.dialog.close());el.reset.addEventListener('click',()=>{state.category='Todos';state.collection='';state.query='';render()});
|
||||
init().catch(err=>{console.error(err);el.summary.textContent='No se pudo cargar el catálogo.';el.empty.hidden=false});
|
||||
})();
|
||||
</script>
|
||||
</body></html>
|
||||
@@ -1,26 +0,0 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: ecommerce-ingress
|
||||
annotations:
|
||||
traefik.ingress.kubernetes.io/router.entrypoints: web
|
||||
spec:
|
||||
ingressClassName: traefik
|
||||
rules:
|
||||
- host: shop.cruzcloud.net
|
||||
http:
|
||||
paths:
|
||||
- path: /api/catalog
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: catalog-api-svc
|
||||
port:
|
||||
number: 80
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: frontend-svc
|
||||
port:
|
||||
number: 80
|
||||
@@ -1,7 +0,0 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
namespace: ecommerce
|
||||
resources:
|
||||
- frontend.yaml
|
||||
- catalog-api.yaml
|
||||
- ingress.yaml
|
||||
@@ -1 +0,0 @@
|
||||
server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; charset utf-8; server_tokens off; location = /healthz { access_log off; default_type text/plain; return 200 "ok\n"; } location ~* \.(css|js|svg|png|jpg|jpeg|webp|ico)$ { expires 7d; add_header Cache-Control "public, max-age=604800"; try_files $uri =404; } location ~* \.json$ { expires -1; add_header Cache-Control "no-store"; try_files $uri =404; } location / { try_files $uri $uri/ /index.html; } add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy strict-origin-when-cross-origin always; }
|
||||
@@ -1,37 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
import csv, json
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
SRC = ROOT / 'catalog-source.csv'
|
||||
OUT = ROOT / 'data/products.json'
|
||||
|
||||
def to_bool(v: str) -> bool:
|
||||
return str(v).strip().lower() in {'1','true','yes','si','sí'}
|
||||
|
||||
def main() -> int:
|
||||
products = []
|
||||
with SRC.open(newline='', encoding='utf-8-sig') as handle:
|
||||
for row in csv.DictReader(handle):
|
||||
products.append({
|
||||
'id': row['id'].strip(),
|
||||
'name': row['name'].strip(),
|
||||
'category': row['category'].strip(),
|
||||
'collection': row['collection'].strip(),
|
||||
'description': row['description'].strip(),
|
||||
'dimensions': row['dimensions'].strip(),
|
||||
'price': None,
|
||||
'priceText': 'Consultar disponibilidad',
|
||||
'available': to_bool(row['available']),
|
||||
'featured': to_bool(row['featured']),
|
||||
'new': to_bool(row['new']),
|
||||
'image': row['image'].strip(),
|
||||
'fbid': row['fbid'].strip(),
|
||||
})
|
||||
OUT.write_text(json.dumps({'version':'2.2.0','updatedAt':datetime.now(timezone.utc).isoformat(),'pricingMode':'consult','products':products}, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
print(f'OK: {len(products)} productos escritos en {OUT}')
|
||||
return 0
|
||||
|
||||
if __name__ == '__main__':
|
||||
raise SystemExit(main())
|
||||
@@ -1 +0,0 @@
|
||||
Pillow==11.3.0
|
||||