Delete directory 'workloads/ecommerce'
Build and Push Frontend / build (push) Failing after 28s

This commit is contained in:
2026-07-20 00:29:09 +00:00
parent 5faeeb207e
commit 19fca33e4f
62 changed files with 0 additions and 616 deletions
-4
View File
@@ -1,4 +0,0 @@
.git
tools/
catalog-source.csv
README.md
-5
View File
@@ -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
-3
View File
@@ -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. */
Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

-1
View File
@@ -1 +0,0 @@
// JavaScript integrado en index.html para evitar fallas de carga.
-39
View File
@@ -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
-33
View File
@@ -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
-18
View File
@@ -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 id name category collection description dimensions price available featured new image fbid
2 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
3 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
4 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
5 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
6 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
7 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
8 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
9 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
10 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
11 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
12 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
13 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
14 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
15 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
16 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
17 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
18 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"
}
]
}
-262
View File
@@ -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"
}
]
}
-10
View File
@@ -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"
}
-33
View File
@@ -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
-76
View File
@@ -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>
-26
View File
@@ -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
-7
View File
@@ -1,7 +0,0 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ecommerce
resources:
- frontend.yaml
- catalog-api.yaml
- ingress.yaml
-1
View File
@@ -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; }
-37
View File
@@ -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',''}
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