diff --git a/workloads/ecommerce/README.md b/workloads/ecommerce/README.md index e56bd80..677f49e 100644 --- a/workloads/ecommerce/README.md +++ b/workloads/ecommerce/README.md @@ -1,52 +1,14 @@ -# Ari Shopping Frontend v2 +# Ari Shopping Frontend v2.1 -Frontend profesional y dinámico para `apps-registry/workloads/ecommerce/`. +Versión basada en 17 productos reales del archivo exportado por `ari_shopping1`. -## Incluye -- Home responsive. -- Catálogo JSON con búsqueda, categorías y ordenamiento. -- Favoritos y carrito persistentes. -- Pedido por WhatsApp o fallback a Instagram. -- Nginx con `/healthz`. -- CSV -> JSON -> WebP automático. -- Workflow diario opcional para Gitea Actions. +- Estética cercana al Frontend v1. +- Imágenes propias normalizadas a WebP 1400 × 1400. +- Hero y categorías con material real de Ari Shopping. +- Pedidos por WhatsApp mediante `https://wa.link/rvcqqc`. +- Sin precios inventados: `Consultar disponibilidad`. +- Catálogo editable desde `catalog-source.csv`. -## Configuración -Edita `workloads/ecommerce/data/store.json` y configura: -```json -"whatsappNumber": "57XXXXXXXXXX" -``` - -## Instalar en apps-registry -```bash -cd ari-shopping-frontend-v2 -APPS_REPO=/DATA/AppData/k3d-lab/git/apps-registry ./tools-install-v2.sh -``` -El instalador conserva `frontend.yaml`, `service.yaml`, `ingress.yaml` y `kustomization.yaml`. - -## Build workflow -El workflow actual debe observar `workloads/ecommerce/**`; revisa `workflow-snippets/build-paths-update.yaml.txt`. - -## Catálogo automático -Edita `catalog-source.csv`. Para imágenes propias o autorizadas, coloca URLs separadas por `|` en `image_urls` y ejecuta: -```bash -cd workloads/ecommerce -python3 -m pip install -r tools/requirements.txt -python3 tools/catalog_sync.py --download-images -``` -Las imágenes se normalizan a 1200x1200 WebP. - -Solo deben usarse imágenes propias, de proveedor o con autorización. - -## Prueba local -```bash -cd workloads/ecommerce -python3 -m http.server 8080 -``` - -## Docker -```bash -docker build -t ari-shopping-frontend:v2 workloads/ecommerce -docker run --rm -p 8080:80 ari-shopping-frontend:v2 -curl http://127.0.0.1:8080/healthz -``` +`data/external-image-sources.json` contiene páginas oficiales de Mattel y +Disney Store como referencias. Sus imágenes no están incluidas y solo deben +usarse con autorización del fabricante o proveedor. diff --git a/workloads/ecommerce/assets/css/styles.css b/workloads/ecommerce/assets/css/styles.css index 447552c..7f8ad0f 100644 --- a/workloads/ecommerce/assets/css/styles.css +++ b/workloads/ecommerce/assets/css/styles.css @@ -1,5 +1 @@ - -:root{--ink:#241b2d;--muted:#746a7a;--pink:#ff3f7f;--purple:#7c3aed;--soft:#f8f4f8;--line:#e9e1eb;--shadow:0 20px 55px rgba(47,28,55,.12)}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;color:var(--ink);font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif}body.lock{overflow:hidden}a{text-decoration:none;color:inherit}button,input,select{font:inherit}.shell{width:min(calc(100% - 32px),1240px);margin:auto}.announcement{padding:9px;text-align:center;color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));font-size:13px}header{position:sticky;top:0;z-index:20;background:#ffffffed;border-bottom:1px solid var(--line);backdrop-filter:blur(16px)}.head{min-height:84px;display:grid;grid-template-columns:190px 1fr auto auto;gap:18px;align-items:center}.head img{width:175px}.search{display:flex;align-items:center;gap:9px;padding:0 16px;min-height:48px;border:1px solid var(--line);border-radius:999px;background:var(--soft)}.search input{width:100%;border:0;outline:0;background:transparent}.ig,.cart{padding:12px 16px;border:1px solid var(--line);border-radius:999px;background:#fff}.cart{cursor:pointer}.cart b{display:inline-grid;place-items:center;min-width:23px;height:23px;margin-left:6px;border-radius:50%;color:#fff;background:var(--ink)}.hero{min-height:600px;display:grid;grid-template-columns:1.05fr .95fr;gap:48px;align-items:center;padding:70px 0}.eyebrow{color:#d91f60;font-size:12px;font-weight:850;letter-spacing:.12em;text-transform:uppercase}.hero h1{margin:15px 0 20px;font-size:clamp(48px,6.4vw,82px);line-height:.98;letter-spacing:-.055em}.hero p{max-width:650px;color:var(--muted);font-size:18px;line-height:1.7}.heroActions{display:flex;gap:12px;flex-wrap:wrap;margin-top:28px}.btn{display:inline-flex;align-items:center;justify-content:center;min-height:47px;padding:0 20px;border:0;border-radius:999px;font-weight:800;cursor:pointer}.primary{color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));box-shadow:0 12px 27px #ff3f7f38}.ghost{background:var(--soft);border:1px solid var(--line)}.light{background:#fff}.art{min-height:480px;display:grid;place-items:center;border-radius:42px;background:radial-gradient(circle at 75% 18%,#fff,transparent 25%),linear-gradient(135deg,#ffd8e7,#e8ddff 55%,#cef6ed);box-shadow:var(--shadow)}.art>div{width:70%;padding:38px;border:1px solid #ffffffb0;border-radius:32px;background:#ffffffb5;transform:rotate(-6deg);box-shadow:var(--shadow);backdrop-filter:blur(12px)}.art small,.art span{display:block;color:var(--muted)}.art strong{display:block;margin:12px 0 28px;font-size:42px;line-height:1.02}.benefits{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-bottom:100px}.benefits article{display:flex;gap:14px;padding:24px;border:1px solid var(--line);border-radius:22px}.benefits b{width:38px;height:38px;display:grid;place-items:center;border-radius:50%;color:#fff;background:var(--ink)}.benefits span strong,.benefits span small{display:block}.benefits span small{margin-top:5px;color:var(--muted)}.catalog{padding-bottom:110px}.sectionTitle{display:flex;justify-content:space-between;align-items:end;gap:24px}.sectionTitle h2,.instagram h2{margin:8px 0;font-size:clamp(34px,4vw,52px);letter-spacing:-.04em}.sectionTitle p{color:var(--muted)}.sectionTitle select{min-height:46px;padding:0 14px;border:1px solid var(--line);border-radius:12px;background:#fff}.categories{display:flex;gap:9px;overflow:auto;padding:18px 0 24px}.chip{flex:0 0 auto;padding:10px 16px;border:1px solid var(--line);border-radius:999px;background:#fff;cursor:pointer;font-weight:750}.chip.active{color:#fff;background:var(--ink)}.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.card{overflow:hidden;border:1px solid var(--line);border-radius:22px;background:#fff;transition:.25s}.card:hover{transform:translateY(-5px);box-shadow:var(--shadow)}.media{position:relative;aspect-ratio:1;background:var(--soft);overflow:hidden}.media img{width:100%;height:100%;object-fit:cover}.badges{position:absolute;z-index:2;top:12px;left:12px;display:flex;gap:5px}.badge{padding:6px 9px;border-radius:999px;color:#fff;background:var(--purple);font-size:10px;font-weight:850}.badge.sale{background:var(--pink)}.wish{position:absolute;z-index:2;right:12px;top:12px;width:40px;height:40px;border:1px solid #fff;border-radius:50%;background:#ffffffd9;font-size:23px;cursor:pointer}.wish.active{color:var(--pink)}.body{padding:18px}.body>.category{color:var(--muted);font-weight:700}.body h3{margin:8px 0;font-size:17px}.body p{min-height:42px;color:var(--muted);font-size:13px;line-height:1.55}.price{display:flex;align-items:baseline;gap:8px}.price strong{font-size:20px}.price del{color:#9e929f;font-size:13px}.body .add{width:100%;margin-top:15px}.empty{padding:60px;text-align:center;border:1px dashed var(--line);border-radius:22px;background:var(--soft)}.instagram{padding:80px 0;color:#fff;background:linear-gradient(110deg,#24152b,#6d1a55,#4a2b85)}.instagram>.shell{display:flex;align-items:center;justify-content:space-between;gap:30px}.instagram .eyebrow{color:#ffafca}footer{padding:50px 0 25px;color:#c9bdcd;background:#1c1521}.foot{display:flex;align-items:center;justify-content:space-between;gap:25px}.foot img{width:170px;border-radius:15px}.overlay{position:fixed;z-index:50;inset:0;background:#1c152199;backdrop-filter:blur(3px)}.drawer{position:fixed;z-index:60;top:0;right:0;width:min(430px,100%);height:100dvh;display:grid;grid-template-rows:auto 1fr auto;background:#fff;transform:translateX(105%);transition:.25s;box-shadow:-30px 0 80px #1c152144}.drawer.open{transform:none}.drawerHead,.drawerFoot{padding:22px;border-bottom:1px solid var(--line)}.drawerHead{display:flex;justify-content:space-between;align-items:center}.drawerHead h2{margin:4px 0}.drawerHead button{width:42px;height:42px;border:1px solid var(--line);border-radius:50%;background:#fff;font-size:25px}.drawerBody{overflow:auto;padding:14px 22px}.drawerFoot{border-top:1px solid var(--line);border-bottom:0}.drawerFoot>div{display:flex;justify-content:space-between;margin-bottom:14px}.drawerFoot>div strong{font-size:24px}.drawerFoot small{display:block;margin-top:12px;color:var(--muted);text-align:center}.full{width:100%}.link{width:100%;padding:12px;border:0;background:transparent;color:#d91f60;cursor:pointer}.line{display:grid;grid-template-columns:74px 1fr auto;gap:11px;padding:13px 0;border-bottom:1px solid var(--line)}.line img{width:74px;height:74px;border-radius:13px}.line small{display:block;color:var(--muted);margin:5px 0}.qty{display:flex;align-items:center;gap:8px}.qty button{border:1px solid var(--line);border-radius:50%;background:#fff}.remove{border:0;background:transparent;font-size:20px}.drawerEmpty{padding:60px 10px;text-align:center;color:var(--muted)}.toast{position:fixed;z-index:90;right:18px;bottom:18px;padding:14px 18px;border-radius:14px;color:#fff;background:var(--ink);box-shadow:var(--shadow)} -@media(max-width:1000px){.grid{grid-template-columns:repeat(3,1fr)}.hero{grid-template-columns:1fr 1fr}.head{grid-template-columns:160px 1fr auto}.ig{display:none}.benefits{grid-template-columns:1fr}} -@media(max-width:760px){.head{grid-template-columns:1fr auto;padding:10px 0}.head img{width:150px}.search{grid-column:1/-1;grid-row:2}.hero{grid-template-columns:1fr;padding:50px 0}.art{min-height:360px}.grid{grid-template-columns:repeat(2,1fr)}.sectionTitle{align-items:stretch;flex-direction:column}.instagram>.shell,.foot{align-items:flex-start;flex-direction:column}} -@media(max-width:480px){.shell{width:min(calc(100% - 22px),1240px)}.hero h1{font-size:48px}.art>div{width:80%;padding:26px}.art strong{font-size:34px}.grid{gap:10px}.body{padding:13px}.body h3{font-size:14px}.body p{display:none}.price strong{font-size:16px}.foot img{width:150px}} +:root{--ink:#17111c;--muted:#756d78;--pink:#ff3f86;--pink-dark:#e32270;--purple:#9c39ef;--soft:#faf7fb;--line:#ece5ee;--white:#fff;--shadow:0 18px 55px rgba(40,24,48,.10);--shell:1240px}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;color:var(--ink);background:#fff;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}body.locked{overflow:hidden}button,input,select{font:inherit}button{color:inherit}a{color:inherit;text-decoration:none}img{display:block;max-width:100%}.shell{width:min(calc(100% - 36px),var(--shell));margin-inline:auto}.skip-link{position:fixed;z-index:999;left:10px;top:10px;padding:10px 15px;color:#fff;background:#111;transform:translateY(-150%)}.skip-link:focus{transform:none}.announcement{height:34px;display:flex;align-items:center;justify-content:center;gap:34px;padding:0 16px;color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));font-size:12px}.announcement strong{text-transform:uppercase;letter-spacing:.06em}.site-header{position:sticky;z-index:80;top:0;background:rgba(255,255,255,.95);border-bottom:1px solid var(--line);backdrop-filter:blur(18px)}.header-shell{min-height:82px;display:grid;grid-template-columns:205px 1fr auto;align-items:center;gap:28px}.brand img{width:190px}.main-nav{display:flex;justify-content:center;gap:27px}.main-nav button{border:0;padding:10px 0;background:transparent;color:#6f6672;cursor:pointer;font-size:13px}.main-nav button:hover{color:var(--pink-dark)}.header-actions{display:flex;align-items:center;gap:9px}.search-open{width:43px;height:43px;display:grid;place-items:center;border:1px solid var(--line);border-radius:50%;background:#fff;cursor:pointer}.search-open svg{width:20px;fill:none;stroke:currentColor;stroke-width:1.8}.cart-button{height:43px;display:flex;align-items:center;gap:9px;padding:0 14px;border:0;border-radius:999px;color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));cursor:pointer;font-weight:800}.cart-button strong{width:23px;height:23px;display:grid;place-items:center;border-radius:50%;background:#fff;color:var(--ink);font-size:11px}.search-panel{padding:0 0 18px}.search-panel label{display:block;margin-bottom:7px;font-size:12px;font-weight:800;color:var(--pink-dark);text-transform:uppercase;letter-spacing:.08em}.search-panel>div{display:flex;gap:8px}.search-panel input{width:100%;height:48px;padding:0 16px;border:1px solid var(--line);border-radius:999px;outline:0;background:var(--soft)}.search-panel button{padding:0 18px;border:0;border-radius:999px;background:var(--ink);color:#fff;cursor:pointer}.hero{min-height:650px;display:grid;grid-template-columns:.9fr 1.1fr;align-items:center;gap:65px;padding-block:70px}.eyebrow{display:inline-block;color:var(--pink-dark);font-size:11px;font-weight:900;letter-spacing:.12em;text-transform:uppercase}.hero h1{max-width:620px;margin:16px 0 22px;font-size:clamp(48px,6vw,82px);line-height:.98;letter-spacing:-.055em}.hero h1 em{display:block;color:var(--pink);font-family:Georgia,serif;font-weight:400}.hero-copy>p{max-width:580px;margin:0;color:var(--muted);font-size:17px;line-height:1.7}.hero-actions{display:flex;align-items:center;gap:20px;margin-top:30px}.button{min-height:47px;display:inline-flex;align-items:center;justify-content:center;padding:0 22px;border:0;border-radius:999px;cursor:pointer;font-weight:850}.button.primary{color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));box-shadow:0 12px 30px rgba(255,63,134,.22)}.button.text{padding:0;background:transparent}.button.white{background:#fff}.button.full{width:100%}.hero-image{position:relative}.hero-image img{width:100%;border-radius:34px}.hero-note{position:absolute;right:4%;bottom:7%;padding:12px 16px;border-radius:14px;background:rgba(255,255,255,.9);box-shadow:var(--shadow);font-size:12px;font-weight:800}.service-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;padding-bottom:100px}.service-strip article{display:flex;gap:14px;align-items:center;padding:20px 0;border-top:1px solid var(--line)}.service-strip i{width:32px;height:32px;display:grid;place-items:center;border-radius:50%;color:var(--pink);background:#fff0f6;font-style:normal;font-weight:900}.service-strip strong,.service-strip span{display:block}.service-strip strong{font-size:13px}.service-strip span{margin-top:4px;color:var(--muted);font-size:12px}.category-section,.products-section{padding-bottom:110px}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:25px;margin-bottom:28px}.section-heading h2{margin:8px 0;font-size:clamp(34px,4.4vw,58px);line-height:1;letter-spacing:-.045em}.section-heading p{margin:0;color:var(--muted)}.section-heading>a{color:var(--pink-dark);font-size:13px;font-weight:800}.category-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.category-card{position:relative;min-height:390px;overflow:hidden;display:flex;flex-direction:column;justify-content:end;align-items:start;padding:25px;border:0;border-radius:25px;color:#fff;background-image:linear-gradient(180deg,transparent 40%,rgba(16,8,20,.8)),var(--image);background-size:cover;background-position:center;cursor:pointer;text-align:left;transition:.25s ease}.category-card:hover{transform:translateY(-6px);box-shadow:var(--shadow)}.category-card span{font-size:23px;font-weight:900}.category-card small{margin-top:4px;color:#eee3f0}.products-heading{margin-bottom:20px}.product-toolbar{display:flex;align-items:center;justify-content:space-between;gap:20px;margin-bottom:25px}.filter-chips{display:flex;gap:8px;overflow:auto;padding:4px 0}.filter-chip{flex:0 0 auto;padding:9px 15px;border:1px solid var(--line);border-radius:999px;background:#fff;cursor:pointer;font-size:12px;font-weight:800}.filter-chip.active{color:#fff;border-color:var(--ink);background:var(--ink)}.product-toolbar select{height:42px;padding:0 12px;border:1px solid var(--line);border-radius:12px;background:#fff}.product-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}.product-card{min-width:0;overflow:hidden;border:1px solid var(--line);border-radius:23px;background:#fff;transition:.25s ease}.product-card:hover{transform:translateY(-5px);box-shadow:var(--shadow)}.product-image{width:100%;aspect-ratio:1/1;overflow:hidden;border:0;padding:0;background:var(--soft);cursor:pointer}.product-image img{width:100%;height:100%;object-fit:cover;transition:.35s ease}.product-card:hover .product-image img{transform:scale(1.025)}.product-info{padding:16px}.product-meta{display:flex;justify-content:space-between;gap:8px;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.05em}.product-name{width:100%;display:block;margin:9px 0 8px;border:0;padding:0;background:transparent;text-align:left;cursor:pointer;font-size:16px;font-weight:900;line-height:1.25}.product-name:hover{color:var(--pink-dark)}.product-description{height:56px;overflow:hidden;margin:0;color:var(--muted);font-size:12px;line-height:1.55}.product-bottom{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:15px}.product-bottom>strong{font-size:12px}.add-button{min-width:94px;height:38px;border:0;border-radius:999px;color:#fff;background:linear-gradient(90deg,var(--pink),var(--purple));cursor:pointer;font-weight:850;font-size:12px}.empty-state{padding:70px;text-align:center;border:1px dashed var(--line);border-radius:25px;background:var(--soft)}.social-band{padding:78px 0;color:#fff;background:#65195e}.social-band>.shell{display:flex;align-items:center;justify-content:space-between;gap:30px}.social-band .eyebrow{color:#ffb5d0}.social-band h2{max-width:820px;margin:10px 0 0;font-size:clamp(34px,4vw,54px);line-height:1;letter-spacing:-.04em}footer{color:#dbd2de;background:#1b1320}.footer-main{min-height:120px;display:grid;grid-template-columns:220px 1fr auto;align-items:center;gap:25px}.footer-main img{width:190px;filter:brightness(0) invert(1)}.footer-main p{margin:0;text-align:center;font-size:13px}.footer-main span{font-size:11px}.overlay{position:fixed;z-index:100;inset:0;background:rgba(24,14,28,.55);backdrop-filter:blur(4px)}.cart-drawer{position:fixed;z-index:110;top:0;right:0;width:min(430px,100%);height:100dvh;display:grid;grid-template-rows:auto 1fr auto;background:#fff;box-shadow:-25px 0 70px rgba(20,10,25,.2);transform:translateX(105%);transition:.25s ease}.cart-drawer.open{transform:none}.cart-drawer>header{display:flex;justify-content:space-between;align-items:center;padding:22px;border-bottom:1px solid var(--line)}.cart-drawer h2{margin:5px 0}.cart-drawer header button,.dialog-close{width:42px;height:42px;border:1px solid var(--line);border-radius:50%;background:#fff;font-size:24px;cursor:pointer}.cart-items{overflow:auto;padding:12px 22px}.cart-line{display:grid;grid-template-columns:70px 1fr auto;gap:12px;padding:13px 0;border-bottom:1px solid var(--line)}.cart-line img{width:70px;height:70px;border-radius:13px;object-fit:cover}.cart-line strong{display:block;font-size:13px}.cart-line small{display:block;margin-top:5px;color:var(--muted)}.cart-line button{border:0;background:transparent;cursor:pointer}.qty{display:flex;align-items:center;gap:6px;margin-top:9px}.qty button{width:27px;height:27px;border-radius:50%;background:var(--soft)}.cart-footer{padding:20px 22px;border-top:1px solid var(--line)}.cart-footer small{display:block;margin-top:12px;color:var(--muted);text-align:center}.clear-cart{width:100%;margin-top:12px;border:0;background:transparent;color:var(--pink-dark);cursor:pointer}.cart-empty{padding:60px 10px;text-align:center;color:var(--muted)}dialog{width:min(940px,calc(100% - 26px));max-height:92dvh;padding:0;border:0;border-radius:28px;box-shadow:0 35px 100px rgba(25,10,30,.32)}dialog::backdrop{background:rgba(20,10,24,.6);backdrop-filter:blur(4px)}.dialog-close{position:sticky;z-index:4;top:14px;float:right;margin:14px 14px -56px 0}.dialog-layout{display:grid;grid-template-columns:1.05fr .95fr}.dialog-layout>img{width:100%;height:100%;min-height:580px;object-fit:cover}.dialog-copy{padding:60px 45px 45px}.dialog-copy h2{margin:10px 0 16px;font-size:39px;line-height:1.05;letter-spacing:-.04em}.dialog-copy p{color:var(--muted);line-height:1.7}.detail-list{display:grid;gap:9px;margin:22px 0;padding:18px;border-radius:18px;background:var(--soft)}.detail-list span{font-size:13px}.detail-list strong{display:inline-block;min-width:95px}.dialog-actions{display:grid;gap:10px;margin-top:22px}.toast-region{position:fixed;z-index:200;right:18px;bottom:18px;display:grid;gap:8px}.toast{max-width:350px;padding:14px 17px;border-radius:14px;color:#fff;background:var(--ink);box-shadow:var(--shadow)}@media(max-width:1040px){.header-shell{grid-template-columns:180px 1fr auto}.main-nav{gap:15px}.category-grid,.product-grid{grid-template-columns:repeat(2,1fr)}.hero{gap:35px}}@media(max-width:800px){.announcement span{display:none}.header-shell{grid-template-columns:1fr auto}.main-nav{grid-column:1/-1;grid-row:2;justify-content:start;overflow:auto;padding-bottom:10px}.hero{grid-template-columns:1fr;padding-top:50px}.service-strip{grid-template-columns:1fr}.category-grid{grid-template-columns:repeat(2,1fr)}.footer-main{grid-template-columns:1fr;text-align:center;padding-block:30px}.footer-main img{margin:auto}.dialog-layout{grid-template-columns:1fr}.dialog-layout>img{min-height:390px}.dialog-copy{padding:30px 25px}}@media(max-width:560px){.shell{width:min(calc(100% - 24px),var(--shell))}.hero h1{font-size:49px}.hero-actions{align-items:flex-start;flex-direction:column}.category-card{min-height:260px;padding:18px}.category-card span{font-size:19px}.product-grid{gap:10px}.product-info{padding:12px}.product-name{font-size:14px}.product-description{display:none}.product-bottom{align-items:stretch;flex-direction:column}.add-button{width:100%}.section-heading,.product-toolbar,.social-band>.shell{align-items:flex-start;flex-direction:column}.social-band{padding:55px 0}.cart-button span{display:none}} \ No newline at end of file diff --git a/workloads/ecommerce/assets/img/brand/ari-shopping-profile.webp b/workloads/ecommerce/assets/img/brand/ari-shopping-profile.webp new file mode 100644 index 0000000..a093bb2 Binary files /dev/null and b/workloads/ecommerce/assets/img/brand/ari-shopping-profile.webp differ diff --git a/workloads/ecommerce/assets/img/brand/logo.svg b/workloads/ecommerce/assets/img/brand/logo.svg index ca5e95e..4bae693 100644 --- a/workloads/ecommerce/assets/img/brand/logo.svg +++ b/workloads/ecommerce/assets/img/brand/logo.svg @@ -1 +1,8 @@ -AriShopping \ No newline at end of file + +Ari Shopping + + +ARI +Ari Shopping +DETALLES PARA DISFRUTAR + \ No newline at end of file diff --git a/workloads/ecommerce/assets/img/categories/figuras.webp b/workloads/ecommerce/assets/img/categories/figuras.webp new file mode 100644 index 0000000..7aca683 Binary files /dev/null and b/workloads/ecommerce/assets/img/categories/figuras.webp differ diff --git a/workloads/ecommerce/assets/img/categories/marvel.webp b/workloads/ecommerce/assets/img/categories/marvel.webp new file mode 100644 index 0000000..bbe9297 Binary files /dev/null and b/workloads/ecommerce/assets/img/categories/marvel.webp differ diff --git a/workloads/ecommerce/assets/img/categories/mochilas.webp b/workloads/ecommerce/assets/img/categories/mochilas.webp new file mode 100644 index 0000000..bbe9297 Binary files /dev/null and b/workloads/ecommerce/assets/img/categories/mochilas.webp differ diff --git a/workloads/ecommerce/assets/img/categories/peluches.webp b/workloads/ecommerce/assets/img/categories/peluches.webp new file mode 100644 index 0000000..6e6e6e7 Binary files /dev/null and b/workloads/ecommerce/assets/img/categories/peluches.webp differ diff --git a/workloads/ecommerce/assets/img/hero/hero-products.webp b/workloads/ecommerce/assets/img/hero/hero-products.webp new file mode 100644 index 0000000..df06514 Binary files /dev/null and b/workloads/ecommerce/assets/img/hero/hero-products.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-001-toy-story-5-rex.webp b/workloads/ecommerce/assets/img/products/ari-001-toy-story-5-rex.webp new file mode 100644 index 0000000..fd0c3d3 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-001-toy-story-5-rex.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp b/workloads/ecommerce/assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp new file mode 100644 index 0000000..7f6f78a Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-003-toy-story-5-jessie.webp b/workloads/ecommerce/assets/img/products/ari-003-toy-story-5-jessie.webp new file mode 100644 index 0000000..dccb33b Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-003-toy-story-5-jessie.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-004-toy-story-5-woody.webp b/workloads/ecommerce/assets/img/products/ari-004-toy-story-5-woody.webp new file mode 100644 index 0000000..75e59f7 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-004-toy-story-5-woody.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-005-intensamente-furia.webp b/workloads/ecommerce/assets/img/products/ari-005-intensamente-furia.webp new file mode 100644 index 0000000..46164b1 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-005-intensamente-furia.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-006-intensamente-tristeza.webp b/workloads/ecommerce/assets/img/products/ari-006-intensamente-tristeza.webp new file mode 100644 index 0000000..a86b6fd Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-006-intensamente-tristeza.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-007-minnie-y-mickey-mouse.webp b/workloads/ecommerce/assets/img/products/ari-007-minnie-y-mickey-mouse.webp new file mode 100644 index 0000000..6ad2c7f Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-007-minnie-y-mickey-mouse.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-008-angel-lilo-y-stitch.webp b/workloads/ecommerce/assets/img/products/ari-008-angel-lilo-y-stitch.webp new file mode 100644 index 0000000..9631bc9 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-008-angel-lilo-y-stitch.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp b/workloads/ecommerce/assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp new file mode 100644 index 0000000..da427a8 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-dis.webp b/workloads/ecommerce/assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-dis.webp new file mode 100644 index 0000000..3420468 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-dis.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-mo.webp b/workloads/ecommerce/assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-mo.webp new file mode 100644 index 0000000..d9fc4e9 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-mo.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-y-.webp b/workloads/ecommerce/assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-y-.webp new file mode 100644 index 0000000..a6309c7 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-y-.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-013-mochila-pequena-bob-esponja.webp b/workloads/ecommerce/assets/img/products/ari-013-mochila-pequena-bob-esponja.webp new file mode 100644 index 0000000..56eec13 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-013-mochila-pequena-bob-esponja.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-estam.webp b/workloads/ecommerce/assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-estam.webp new file mode 100644 index 0000000..6b768dd Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-estam.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disney.webp b/workloads/ecommerce/assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disney.webp new file mode 100644 index 0000000..f83a586 Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disney.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ultra.webp b/workloads/ecommerce/assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ultra.webp new file mode 100644 index 0000000..d8e6bbf Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ultra.webp differ diff --git a/workloads/ecommerce/assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america-d.webp b/workloads/ecommerce/assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america-d.webp new file mode 100644 index 0000000..d190e7c Binary files /dev/null and b/workloads/ecommerce/assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america-d.webp differ diff --git a/workloads/ecommerce/assets/js/app.js b/workloads/ecommerce/assets/js/app.js index e33db6b..77a5f57 100644 --- a/workloads/ecommerce/assets/js/app.js +++ b/workloads/ecommerce/assets/js/app.js @@ -1 +1 @@ -(()=>{"use strict";const $=(s,r=document)=>r.querySelector(s),$$=(s,r=document)=>[...r.querySelectorAll(s)];const S={products:[],store:null,category:"Todos",query:"",sort:"featured",cart:JSON.parse(localStorage.getItem("ari-cart-v2")||"{}"),wish:JSON.parse(localStorage.getItem("ari-wish-v2")||"[]")};const E={grid:$("#grid"),cat:$("#categories"),search:$("#search"),sort:$("#sort"),summary:$("#summary"),empty:$("#empty"),drawer:$("#drawer"),overlay:$("#overlay"),items:$("#cartItems"),count:$("#cartCount"),total:$("#cartTotal"),toast:$("#toast"),card:$("#card")};const money=v=>new Intl.NumberFormat(S.store?.locale||"es-CO",{style:"currency",currency:S.store?.currency||"COP",maximumFractionDigits:0}).format(v);const norm=v=>String(v||"").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"");const p=id=>S.products.find(x=>x.id===id);function save(){localStorage.setItem("ari-cart-v2",JSON.stringify(S.cart));localStorage.setItem("ari-wish-v2",JSON.stringify(S.wish))}function toast(m){E.toast.textContent=m;E.toast.hidden=false;setTimeout(()=>E.toast.hidden=true,2600)}function categories(){E.cat.innerHTML=["Todos",...new Set(S.products.map(x=>x.category))].map(x=>``).join("")}function list(){let q=norm(S.query),a=S.products.filter(x=>x.available!==false&&(S.category==="Todos"||x.category===S.category)&&(!q||norm([x.name,x.category,x.description,...(x.tags||[])].join(" ")).includes(q)));a.sort((x,y)=>S.sort==="asc"?x.price-y.price:S.sort==="desc"?y.price-x.price:S.sort==="new"?Number(y.new)-Number(x.new):Number(y.featured)-Number(x.featured));return a}function render(){let a=list();E.grid.innerHTML="";E.summary.textContent=`${a.length} producto${a.length===1?"":"s"} disponible${a.length===1?"":"s"}`;E.empty.hidden=!!a.length;a.forEach(x=>{let f=E.card.content.cloneNode(true),c=$(".card",f),img=$("img",f),w=$(".wish",f);img.src=x.images?.[0]||"assets/img/brand/favicon.svg";img.alt=x.name;$(".category",f).textContent=x.category;$("h3",f).textContent=x.name;$(".price strong",f).textContent=money(x.price);let d=$(".price del",f);x.compareAtPrice>x.price?d.textContent=money(x.compareAtPrice):d.remove();$(".body p",f).textContent=x.description;if(x.new)$(".badges",f).insertAdjacentHTML("beforeend",'Nuevo');if(x.compareAtPrice>x.price)$(".badges",f).insertAdjacentHTML("beforeend",`-${Math.round((1-x.price/x.compareAtPrice)*100)}%`);w.classList.toggle("active",S.wish.includes(x.id));w.textContent=S.wish.includes(x.id)?"♥":"♡";w.onclick=()=>{S.wish=S.wish.includes(x.id)?S.wish.filter(i=>i!==x.id):[...S.wish,x.id];save();render();toast(S.wish.includes(x.id)?"Guardado en favoritos":"Eliminado de favoritos")};$(".add",f).onclick=()=>add(x.id);E.grid.append(f)});cart()}function add(id){S.cart[id]=(S.cart[id]||0)+1;save();cart();toast(`${p(id).name} agregado`)}function cart(){let a=Object.entries(S.cart).map(([id,q])=>({x:p(id),q})).filter(i=>i.x),n=a.reduce((s,i)=>s+i.q,0),t=a.reduce((s,i)=>s+i.x.price*i.q,0);E.count.textContent=n;E.total.textContent=money(t);E.items.innerHTML=a.length?a.map(i=>`
${i.x.name}${money(i.x.price)}
${i.q}
`).join(""):'
Tu carrito está vacío.
';$$('[data-d]',E.items).forEach(b=>b.onclick=()=>{let id=b.closest('[data-id]').dataset.id;S.cart[id]+=Number(b.dataset.d);if(S.cart[id]<=0)delete S.cart[id];save();cart()});$$('.remove',E.items).forEach(b=>b.onclick=()=>{delete S.cart[b.closest('[data-id]').dataset.id];save();cart()})}function open(){E.drawer.classList.add("open");E.overlay.hidden=false;document.body.classList.add("lock")}function close(){E.drawer.classList.remove("open");E.overlay.hidden=true;document.body.classList.remove("lock")}function order(){let a=Object.entries(S.cart).map(([id,q])=>({x:p(id),q})).filter(i=>i.x);if(!a.length)return;let total=a.reduce((s,i)=>s+i.x.price*i.q,0),m=[`Hola ${S.store.brand} 👋`,`Quiero confirmar disponibilidad:`,"",...a.map(i=>`• ${i.q} x ${i.x.name} — ${money(i.x.price*i.q)}`),"",`Total estimado: ${money(total)}`,"","Nombre:","Ciudad:"].join("\n"),num=String(S.store.whatsappNumber||"").replace(/\D/g,"");if(num)window.open(`https://wa.me/${num}?text=${encodeURIComponent(m)}`,"_blank");else navigator.clipboard.writeText(m).then(()=>toast("Pedido copiado. Configura WhatsApp en data/store.json"))}async function init(){let [st,pr]=await Promise.all([fetch("data/store.json",{cache:"no-store"}).then(r=>r.json()),fetch("data/products.json",{cache:"no-store"}).then(r=>r.json())]);S.store=st;S.products=pr.products||[];categories();render()}E.search.oninput=e=>{S.query=e.target.value;render()};E.sort.onchange=e=>{S.sort=e.target.value;render()};E.cat.onclick=e=>{let b=e.target.closest('[data-c]');if(!b)return;S.category=b.dataset.c;categories();render()};$("#cartOpen").onclick=open;$("#cartClose").onclick=close;E.overlay.onclick=close;$("#clearCart").onclick=()=>{S.cart={};save();cart()};$("#checkout").onclick=order;init().catch(e=>{console.error(e);E.summary.textContent="Error cargando catálogo"})})(); \ No newline at end of file +(()=>{"use strict";const KEY="ari-shopping-cart-v2-1";const state={store:null,products:[],category:"Todos",collection:"",query:"",sort:"featured",cart:read()};const $=(s,r=document)=>r.querySelector(s),$$=(s,r=document)=>[...r.querySelectorAll(s)];const e={grid:$("#productGrid"),tpl:$("#productTemplate"),chips:$("#filterChips"),sort:$("#sortSelect"),summary:$("#catalogSummary"),empty:$("#emptyState"),reset:$("#resetButton"),searchOpen:$("#searchOpen"),searchPanel:$("#searchPanel"),searchInput:$("#searchInput"),searchClose:$("#searchClose"),cartBtn:$("#cartButton"),drawer:$("#cartDrawer"),cartClose:$("#cartClose"),cartItems:$("#cartItems"),cartCount:$("#cartCount"),checkout:$("#checkoutButton"),clear:$("#clearCart"),overlay:$("#overlay"),dialog:$("#productDialog"),dialogClose:$("#dialogClose"),dialogContent:$("#dialogContent"),toast:$("#toastRegion"),availability:$("#availabilityLink")};function read(){try{return JSON.parse(localStorage.getItem(KEY))||{}}catch{return{}}}function save(){localStorage.setItem(KEY,JSON.stringify(state.cart))}function norm(v){return String(v||"").toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").trim()}function esc(v){return String(v??"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}async function load(){try{state.store=await(await fetch("data/store.json",{cache:"no-store"})).json();state.products=(await(await fetch(state.store.catalogUrl,{cache:"no-store"})).json()).products||[];e.availability.href=state.store.whatsappUrl;renderFilters();renderAll()}catch(err){console.error(err);e.summary.textContent="No se pudo cargar el catálogo.";e.empty.hidden=false}}function cats(){return["Todos",...new Set(state.products.map(p=>p.category))]}function renderFilters(){e.chips.innerHTML=cats().map(c=>``).join("")}function filtered(){const q=norm(state.query);return state.products.filter(p=>{if(state.category!=="Todos"&&p.category!==state.category)return false;if(state.collection&&p.collection!==state.collection)return false;if(!q)return true;return norm([p.name,p.category,p.collection,p.description,p.dimensions].join(" ")).includes(q)}).sort((a,b)=>state.sort==="name"?a.name.localeCompare(b.name,"es"):state.sort==="newest"?Number(!!b.new)-Number(!!a.new):Number(!!b.featured)-Number(!!a.featured)||Number(!!b.new)-Number(!!a.new)||a.name.localeCompare(b.name,"es"))}function renderProducts(){const list=filtered();e.grid.innerHTML="";e.empty.hidden=!!list.length;e.summary.textContent=`${list.length} producto${list.length===1?"":"s"} reales de Ari Shopping`;list.forEach(p=>{const f=e.tpl.content.cloneNode(true),card=$(".product-card",f);card.dataset.productId=p.id;const img=$("img",f);img.src=p.images[0];img.alt=p.name;$(".product-category",f).textContent=p.category;$(".product-collection",f).textContent=p.collection;$(".product-name",f).textContent=p.name;$(".product-description",f).textContent=p.description;$$(".product-open",f).forEach(b=>b.addEventListener("click",()=>openProduct(p.id)));$(".add-button",f).addEventListener("click",()=>add(p.id));e.grid.appendChild(f)})}function byId(id){return state.products.find(p=>p.id===id)}function add(id){const p=byId(id);if(!p)return;state.cart[id]=Number(state.cart[id]||0)+1;save();renderCart();toast(`${p.name} agregado al pedido.`)}function update(id,q){if(q<=0)delete state.cart[id];else state.cart[id]=q;save();renderCart()}function entries(){return Object.entries(state.cart).map(([id,q])=>({product:byId(id),quantity:Number(q)})).filter(x=>x.product&&x.quantity>0)}function renderCart(){const list=entries();e.cartCount.textContent=String(list.reduce((s,x)=>s+x.quantity,0));if(!list.length){e.cartItems.innerHTML='
Tu selección está vacía

Agrega productos para preparar el pedido.

';e.checkout.disabled=true;return}e.checkout.disabled=false;e.cartItems.innerHTML=list.map(({product:p,quantity:q})=>`
${esc(p.name)}${esc(p.collection)} · Consultar precio
${q}
`).join("");$$("[data-change]",e.cartItems).forEach(b=>b.addEventListener("click",()=>{const id=b.closest("[data-product-id]").dataset.productId;update(id,Number(state.cart[id])+Number(b.dataset.change))}));$$("[data-remove]",e.cartItems).forEach(b=>b.addEventListener("click",()=>update(b.closest("[data-product-id]").dataset.productId,0)))}function orderText(list){return["Hola Ari Shopping 👋","Quiero consultar disponibilidad para:","",...list.map(({product:p,quantity:q})=>`• ${q} x ${p.name}`),"","Nombre:","Ciudad:","Forma de entrega:"].join("\n")}async function checkout(){const list=entries();if(!list.length)return;try{await navigator.clipboard.writeText(orderText(list));toast("Pedido copiado. Se abrirá WhatsApp.")}catch{toast("Se abrirá WhatsApp para continuar.")}window.open(state.store.whatsappUrl,"_blank","noopener")}function openProduct(id){const p=byId(id);if(!p)return;e.dialogContent.innerHTML=`
${esc(p.name)}
${esc(p.category)} · ${esc(p.collection)}

${esc(p.name)}

${esc(p.description)}

Precio Consultar disponibilidadEntrega Coordinar con Ari Shopping${p.dimensions?`Medidas ${esc(p.dimensions)}`:""}
Consultar por WhatsApp
`;$("[data-dialog-add]",e.dialogContent).addEventListener("click",()=>{add(id);e.dialog.close();openCart()});e.dialog.showModal()}function filter(category="Todos",collection=""){state.category=category;state.collection=collection;renderFilters();renderProducts();$("#productos").scrollIntoView({behavior:"smooth"})}function reset(){state.category="Todos";state.collection="";state.query="";e.searchInput.value="";renderFilters();renderProducts()}function openCart(){e.drawer.classList.add("open");e.drawer.setAttribute("aria-hidden","false");e.overlay.hidden=false;document.body.classList.add("locked")}function closeCart(){e.drawer.classList.remove("open");e.drawer.setAttribute("aria-hidden","true");e.overlay.hidden=true;document.body.classList.remove("locked")}function toast(m){const n=document.createElement("div");n.className="toast";n.textContent=m;e.toast.appendChild(n);setTimeout(()=>n.remove(),3200)}function renderAll(){renderProducts();renderCart()}e.chips.addEventListener("click",ev=>{const b=ev.target.closest("[data-filter-category]");if(b)filter(b.dataset.filterCategory)});$$("[data-category]").forEach(b=>b.addEventListener("click",()=>filter(b.dataset.category)));$$("[data-collection]").forEach(b=>b.addEventListener("click",()=>filter("Todos",b.dataset.collection)));$$("[data-nav-category]").forEach(b=>b.addEventListener("click",()=>filter(b.dataset.navCategory)));$$("[data-nav-collection]").forEach(b=>b.addEventListener("click",()=>filter("Todos",b.dataset.navCollection)));e.sort.addEventListener("change",ev=>{state.sort=ev.target.value;renderProducts()});e.reset.addEventListener("click",reset);e.searchOpen.addEventListener("click",()=>{e.searchPanel.hidden=false;e.searchInput.focus()});e.searchClose.addEventListener("click",()=>e.searchPanel.hidden=true);e.searchInput.addEventListener("input",ev=>{state.query=ev.target.value;renderProducts()});e.cartBtn.addEventListener("click",openCart);e.cartClose.addEventListener("click",closeCart);e.overlay.addEventListener("click",closeCart);e.checkout.addEventListener("click",checkout);e.clear.addEventListener("click",()=>{state.cart={};save();renderCart()});e.dialogClose.addEventListener("click",()=>e.dialog.close());document.addEventListener("keydown",ev=>{if(ev.key==="Escape")closeCart()});load()})(); \ No newline at end of file diff --git a/workloads/ecommerce/catalog-source.csv b/workloads/ecommerce/catalog-source.csv index 6439d46..9497761 100644 --- a/workloads/ecommerce/catalog-source.csv +++ b/workloads/ecommerce/catalog-source.csv @@ -1,9 +1,18 @@ -id,name,category,price,compare_at_price,description,tags,featured,new,available,stock,image_urls,source_name,source_url -ari-001,Bolso Crossbody Aura,Accesorios,89900,109900,Bolso compacto de uso diario con correa ajustable.,accesorios|bolso,true,true,true,9,,Catálogo inicial Ari Shopping, -ari-002,Set Glow Skincare,Belleza,74900,89900,Rutina esencial de cuidado facial para una apariencia luminosa.,belleza|set,true,false,true,10,,Catálogo inicial Ari Shopping, -ari-003,Reloj Minimal Rose,Accesorios,119900,149900,Diseño minimalista con correa suave y detalle metálico.,accesorios|reloj,false,false,true,11,,Catálogo inicial Ari Shopping, -ari-004,Audífonos Mini Pods,Tecnología,99900,129900,Audífonos inalámbricos con estuche de carga portátil.,tecnología|audífonos,true,true,true,12,,Catálogo inicial Ari Shopping, -ari-005,Organizador Vanity,Hogar,64900,79900,"Organizador para maquillaje, accesorios y artículos personales.",hogar|organizador,false,false,true,13,,Catálogo inicial Ari Shopping, -ari-006,Kit Brochas Essential,Belleza,59900,74900,Brochas suaves para una rutina de maquillaje completa.,belleza|kit,false,true,true,14,,Catálogo inicial Ari Shopping, -ari-007,Termo Trend 1.2L,Hogar,84900,99900,"Termo de gran capacidad con tapa, pitillo y asa.",hogar|termo,true,false,true,15,,Catálogo inicial Ari Shopping, -ari-008,Smart Band Active,Tecnología,109900,139900,Pulsera inteligente para actividad diaria y notificaciones.,tecnología|smart,true,false,true,16,,Catálogo inicial Ari Shopping, +id,name,category,collection,description,dimensions,price,available,featured,new,image,source_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 “,Aprox. 11 pulgadas,,true,true,false,assets/img/products/ari-005-intensamente-furia.webp,17872853505541489 +ari-006-intensamente-tristeza,Intensamente Tristeza,Peluches,Intensamente,Intensamente Tristeza Disney Aprox 11 “,Aprox. 11 pulgadas,,true,true,false,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 “,Aprox. 15 pulgadas,,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 “,Aprox. 13 pulgadas,,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-dis,"Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples ",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-dis.webp,18111649603646835 +ari-011-mochila-escolar-de-spider-man-de-disney-mo,"Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila lig",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-mo.webp,18087568414880256 +ari-012-disney-mochila-de-poliester-ultraligera-y-,"Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dime",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-y-.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-estam,"Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos",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-estam.webp,18119703688604702 +ari-015-mochila-escolar-estilo-britanico-de-disney,"Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochil",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-disney.webp,18558512062005705 +ari-016-disney-mochila-iron-man-de-poliester-ultra,"Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46",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-ultra.webp,17862794898572444 +ari-017-mochila-de-disney-marvel-capitan-america-d,"Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras",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-d.webp,17977485617974392 diff --git a/workloads/ecommerce/data/external-image-sources.json b/workloads/ecommerce/data/external-image-sources.json new file mode 100644 index 0000000..17fec9e --- /dev/null +++ b/workloads/ecommerce/data/external-image-sources.json @@ -0,0 +1,42 @@ +{ + "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" + } + ] +} diff --git a/workloads/ecommerce/data/products.json b/workloads/ecommerce/data/products.json index b49ae2c..aa8a6fc 100644 --- a/workloads/ecommerce/data/products.json +++ b/workloads/ecommerce/data/products.json @@ -1,190 +1,398 @@ { - "version": "2.0.0", - "updatedAt": "2026-07-18T00:00:00-05:00", + "version": "2.1.0", + "updatedAt": "2026-07-19T18:18:43.430634+00:00", "currency": "COP", + "pricingMode": "consult", "products": [ { - "id": "ari-001", - "name": "Bolso Crossbody Aura", - "category": "Accesorios", - "price": 89900, - "compareAtPrice": 109900, + "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, - "description": "Bolso compacto de uso diario con correa ajustable.", - "tags": [ - "accesorios", - "bolso" - ], + "stockText": "Disponible para confirmar", "images": [ - "assets/img/products/ari-001.svg" + "assets/img/products/ari-001-toy-story-5-rex.webp" ], - "stock": 9, - "available": true, "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18085705364648339", + "capturedAt": "2026-07-16T15:58:50+00:00" } }, { - "id": "ari-002", - "name": "Set Glow Skincare", - "category": "Belleza", - "price": 74900, - "compareAtPrice": 89900, - "featured": true, - "new": false, - "description": "Rutina esencial de cuidado facial para una apariencia luminosa.", - "tags": [ - "belleza", - "set" - ], - "images": [ - "assets/img/products/ari-002.svg" - ], - "stock": 10, + "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, - "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" - } - }, - { - "id": "ari-003", - "name": "Reloj Minimal Rose", - "category": "Accesorios", - "price": 119900, - "compareAtPrice": 149900, - "featured": false, - "new": false, - "description": "Diseño minimalista con correa suave y detalle metálico.", - "tags": [ - "accesorios", - "reloj" - ], - "images": [ - "assets/img/products/ari-003.svg" - ], - "stock": 11, - "available": true, - "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" - } - }, - { - "id": "ari-004", - "name": "Audífonos Mini Pods", - "category": "Tecnología", - "price": 99900, - "compareAtPrice": 129900, "featured": true, "new": true, - "description": "Audífonos inalámbricos con estuche de carga portátil.", - "tags": [ - "tecnología", - "audífonos" - ], + "stockText": "Disponible para confirmar", "images": [ - "assets/img/products/ari-004.svg" + "assets/img/products/ari-002-toy-story-5-buzz-lightyear.webp" ], - "stock": 12, - "available": true, "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17992282196809499", + "capturedAt": "2026-06-25T18:02:24+00:00" } }, { - "id": "ari-005", - "name": "Organizador Vanity", - "category": "Hogar", - "price": 64900, - "compareAtPrice": 79900, - "featured": false, - "new": false, - "description": "Organizador para maquillaje, accesorios y artículos personales.", - "tags": [ - "hogar", - "organizador" - ], - "images": [ - "assets/img/products/ari-005.svg" - ], - "stock": 13, + "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, - "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" - } - }, - { - "id": "ari-006", - "name": "Kit Brochas Essential", - "category": "Belleza", - "price": 59900, - "compareAtPrice": 74900, - "featured": false, + "featured": true, "new": true, - "description": "Brochas suaves para una rutina de maquillaje completa.", - "tags": [ - "belleza", - "kit" - ], + "stockText": "Disponible para confirmar", "images": [ - "assets/img/products/ari-006.svg" + "assets/img/products/ari-003-toy-story-5-jessie.webp" ], - "stock": 14, - "available": true, "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18095236400246225", + "capturedAt": "2026-06-25T18:01:25+00:00" } }, { - "id": "ari-007", - "name": "Termo Trend 1.2L", - "category": "Hogar", - "price": 84900, - "compareAtPrice": 99900, - "featured": true, - "new": false, - "description": "Termo de gran capacidad con tapa, pitillo y asa.", - "tags": [ - "hogar", - "termo" - ], - "images": [ - "assets/img/products/ari-007.svg" - ], - "stock": 15, + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-004-toy-story-5-woody.webp" + ], "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17928025740357011", + "capturedAt": "2026-06-25T17:58:48+00:00" } }, { - "id": "ari-008", - "name": "Smart Band Active", - "category": "Tecnología", - "price": 109900, - "compareAtPrice": 139900, + "id": "ari-005-intensamente-furia", + "name": "Intensamente Furia", + "category": "Peluches", + "collection": "Intensamente", + "description": "Intensamente Furia Disney Aprox 11 “", + "dimensions": "Aprox. 11 pulgadas", + "price": null, + "priceText": "Consultar disponibilidad", + "available": true, "featured": true, "new": false, - "description": "Pulsera inteligente para actividad diaria y notificaciones.", - "tags": [ - "tecnología", - "smart" - ], + "stockText": "Disponible para confirmar", "images": [ - "assets/img/products/ari-008.svg" + "assets/img/products/ari-005-intensamente-furia.webp" ], - "stock": 16, - "available": true, "source": { - "type": "demo", - "name": "Catálogo inicial Ari Shopping" + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17872853505541489", + "capturedAt": "2026-02-19T17:58:49+00:00" + } + }, + { + "id": "ari-006-intensamente-tristeza", + "name": "Intensamente Tristeza", + "category": "Peluches", + "collection": "Intensamente", + "description": "Intensamente Tristeza Disney Aprox 11 “", + "dimensions": "Aprox. 11 pulgadas", + "price": null, + "priceText": "Consultar disponibilidad", + "available": true, + "featured": true, + "new": false, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-006-intensamente-tristeza.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17869884192555816", + "capturedAt": "2026-02-19T17:57:56+00:00" + } + }, + { + "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": "Aprox. 15 pulgadas", + "price": null, + "priceText": "Consultar disponibilidad", + "available": true, + "featured": true, + "new": false, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-007-minnie-y-mickey-mouse.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18116898613530808", + "capturedAt": "2026-02-19T17:55:57+00:00" + } + }, + { + "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": "Aprox. 13 pulgadas", + "price": null, + "priceText": "Consultar disponibilidad", + "available": true, + "featured": true, + "new": false, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-008-angel-lilo-y-stitch.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18161192263375119", + "capturedAt": "2026-02-19T17:52:50+00:00" + } + }, + { + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-009-mochilas-disney-coleccion-marvel.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18137839804491353", + "capturedAt": "2026-01-29T03:07:00+00:00" + } + }, + { + "id": "ari-010-mochila-ligera-y-resistente-al-agua-de-dis", + "name": "Mochila ligera y resistente al agua de Disney Frozen, mochila escolar y de viaje con múltiples ", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-010-mochila-ligera-y-resistente-al-agua-de-dis.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18111649603646835", + "capturedAt": "2026-01-28T22:41:44+00:00" + } + }, + { + "id": "ari-011-mochila-escolar-de-spider-man-de-disney-mo", + "name": "Mochila escolar de Spider-Man de Disney, moda estudiantil, libro de gran capacidad, mochila lig", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-011-mochila-escolar-de-spider-man-de-disney-mo.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18087568414880256", + "capturedAt": "2026-01-28T22:40:27+00:00" + } + }, + { + "id": "ari-012-disney-mochila-de-poliester-ultraligera-y-", + "name": "Disney Mochila de poliéster ultraligera y transpirable, de gran tamaño y múltiples colores Dime", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-012-disney-mochila-de-poliester-ultraligera-y-.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18077075042356897", + "capturedAt": "2026-01-28T22:39:36+00:00" + } + }, + { + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-013-mochila-pequena-bob-esponja.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17891585106407663", + "capturedAt": "2026-01-26T21:29:12+00:00" + } + }, + { + "id": "ari-014-mochila-casual-de-gran-capacidad-con-estam", + "name": "Mochila casual de gran capacidad con estampado de Bob Esponja, unisex, bolsa escolar de dibujos", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-014-mochila-casual-de-gran-capacidad-con-estam.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18119703688604702", + "capturedAt": "2026-01-26T01:33:29+00:00" + } + }, + { + "id": "ari-015-mochila-escolar-estilo-britanico-de-disney", + "name": "Mochila escolar estilo britanico de Disney con protección de la columna vertebral, nueva mochil", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-015-mochila-escolar-estilo-britanico-de-disney.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "18558512062005705", + "capturedAt": "2026-01-26T01:32:17+00:00" + } + }, + { + "id": "ari-016-disney-mochila-iron-man-de-poliester-ultra", + "name": "Disney Mochila Iron Man, de poliéster ultraligera y transpirable, de gran tamaño dimensiones 46", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-016-disney-mochila-iron-man-de-poliester-ultra.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17862794898572444", + "capturedAt": "2026-01-26T01:27:38+00:00" + } + }, + { + "id": "ari-017-mochila-de-disney-marvel-capitan-america-d", + "name": "Mochila de Disney Marvel Capitán America, de gran capacidad, ligera y resistente a salpicaduras", + "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, + "stockText": "Disponible para confirmar", + "images": [ + "assets/img/products/ari-017-mochila-de-disney-marvel-capitan-america-d.webp" + ], + "source": { + "type": "instagram-export", + "account": "ari_shopping1", + "fbid": "17977485617974392", + "capturedAt": "2026-01-26T01:24:48+00:00" } } ] diff --git a/workloads/ecommerce/data/store.json b/workloads/ecommerce/data/store.json index e15b8b2..33fb01f 100644 --- a/workloads/ecommerce/data/store.json +++ b/workloads/ecommerce/data/store.json @@ -1,10 +1,14 @@ { - "version": "2.0.0", + "version": "2.1.0", "brand": "Ari Shopping", - "tagline": "Detalles que enamoran, compras que disfrutas.", + "tagline": "Variedad de productos y marcas en un solo lugar.", "instagramUrl": "https://www.instagram.com/ari_shopping1/", - "whatsappNumber": "", - "locale": "es-CO", + "facebookUrl": "https://www.facebook.com/arishopping1imp/", + "whatsappUrl": "https://wa.link/rvcqqc", + "deliveryText": "Envíos seguros", + "paymentText": "Pagos fáciles", + "supportText": "Atención personalizada", + "catalogUrl": "data/products.json", "currency": "COP", - "catalogUrl": "data/products.json" + "locale": "es-CO" } diff --git a/workloads/ecommerce/index.html b/workloads/ecommerce/index.html index 79b2900..4af5932 100644 --- a/workloads/ecommerce/index.html +++ b/workloads/ecommerce/index.html @@ -1,11 +1,76 @@ -Ari Shopping -
Envíos nacionales · Atención personalizada · Precios en COP
-
Ari ShoppingInstagram
-
Ari Shopping · Colección destacada

Detalles que hacen tu día más especial.

Una experiencia de compra moderna, cercana y rápida. Descubre novedades, favoritos y productos seleccionados para ti.

Nuevos favoritosEstilo para cada momentoDesde $59.900
-
01Compra simpleAgrega y envía tu pedido.
02Catálogo dinámicoProductos desde una fuente central.
03Atención directaConfirma disponibilidad antes de pagar.
- -
Comunidad Ari Shopping

Novedades y promociones en Instagram.

@ari_shopping1
- - - - \ No newline at end of file + + + + + + + + Ari Shopping + + + + + + +
Envíos segurosAtención personalizadaPedidos por WhatsApp
+ +
+
+
+ Nueva colección +

Encuentra ese detalle que hace el día más especial.

+

Juguetes, personajes, peluches y mochilas seleccionados para sorprender. Compra fácil y recibe atención personalizada.

+ +
+
Productos Toy Story de Ari ShoppingProductos reales de Ari Shopping
+
+
+
Envíos segurosCoordina tu entrega con nosotros.
+
Pagos fácilesConfirma disponibilidad antes de pagar.
+
Atención cercanaTe ayudamos a elegir el producto ideal.
+
+
+
Explora la tienda

Compra por categoría

Encuentra rápidamente lo que estás buscando.

Ver todo →
+
+ + + + +
+
+
+
Catálogo real

Productos destacados

Cargando productos...

Consultar disponibilidad →
+
+
+ +
+
Comunidad Ari Shopping

Novedades y promociones en Instagram.

@ari_shopping1
+
+ + + +
+
+ + + diff --git a/workloads/ecommerce/tools/catalog_sync.py b/workloads/ecommerce/tools/catalog_sync.py index ae24094..365b5fd 100644 --- a/workloads/ecommerce/tools/catalog_sync.py +++ b/workloads/ecommerce/tools/catalog_sync.py @@ -1,36 +1,29 @@ #!/usr/bin/env python3 from __future__ import annotations -import argparse,csv,hashlib,io,json,re,sys,urllib.request -from datetime import datetime,timezone +import csv, json +from datetime import datetime, timezone from pathlib import Path -try: - from PIL import Image,ImageOps -except ImportError: - Image=ImageOps=None -ROOT=Path(__file__).resolve().parents[1];OUT=ROOT/'data/products.json';IMG=ROOT/'assets/img/products' -def b(v,d=False): return str(v or '').strip().lower() in {'1','true','yes','si','sí'} if str(v or '').strip() else d -def n(v,d=0): - try:return int(float(str(v or '').strip())) - except:return d -def slug(v):return re.sub(r'[^a-zA-Z0-9_-]+','-',v.strip()).strip('-').lower() or hashlib.sha256(v.encode()).hexdigest()[:12] -def download(url): - req=urllib.request.Request(url,headers={'User-Agent':'AriShoppingCatalogSync/2.0'});data=urllib.request.urlopen(req,timeout=25).read(12*1024*1024+1) - if len(data)>12*1024*1024:raise ValueError('Imagen demasiado grande') - return data -def image(data,dst): - if Image is None:raise RuntimeError('Instala Pillow') - im=ImageOps.exif_transpose(Image.open(io.BytesIO(data))).convert('RGB');canvas=Image.new('RGB',(1200,1200),'white');im.thumbnail((1080,1080),Image.Resampling.LANCZOS);canvas.paste(im,((1200-im.width)//2,(1200-im.height)//2));canvas.save(dst,'WEBP',quality=86,method=6) -def main(): - ap=argparse.ArgumentParser();ap.add_argument('--source',type=Path,default=ROOT/'catalog-source.csv');ap.add_argument('--download-images',action='store_true');a=ap.parse_args();items=[] - with a.source.open(encoding='utf-8-sig') as f: - for row in csv.DictReader(f): - pid=slug(row.get('id') or row['name']);imgs=[];urls=[u.strip() for u in row.get('image_urls','').split('|') if u.strip()] - if a.download_images: - for i,u in enumerate(urls,1): - try:dst=IMG/f'{pid}-{i}.webp';image(download(u),dst);imgs.append(str(dst.relative_to(ROOT)).replace('\\','/')) - except Exception as e:print(f'AVISO {pid}: {e}',file=sys.stderr) - if not imgs: - local=IMG/f'{pid}.svg';imgs=[str(local.relative_to(ROOT)).replace('\\','/')] if local.exists() else urls - items.append({'id':pid,'name':row['name'].strip(),'category':row.get('category','Otros').strip(),'price':n(row.get('price')),'compareAtPrice':n(row.get('compare_at_price')),'featured':b(row.get('featured')),'new':b(row.get('new')),'description':row.get('description','').strip(),'tags':[t.strip() for t in row.get('tags','').split('|') if t.strip()],'images':imgs,'stock':n(row.get('stock')),'available':b(row.get('available'),True),'source':{'type':'authorized-feed','name':row.get('source_name','Fuente autorizada'),'url':row.get('source_url','')}}) - OUT.write_text(json.dumps({'version':'2.0.0','updatedAt':datetime.now(timezone.utc).isoformat(),'currency':'COP','products':items},ensure_ascii=False,indent=2)+'\n');print(f'OK: {len(items)} productos') +ROOT=Path(__file__).resolve().parents[1] +SOURCE=ROOT/'catalog-source.csv' +OUTPUT=ROOT/'data/products.json' +def boolean(v:str)->bool:return str(v).strip().lower() in {'1','true','yes','si','sí'} +def main()->int: + products=[] + with SOURCE.open(newline='',encoding='utf-8-sig') as handle: + for row in csv.DictReader(handle): + raw=(row.get('price') or '').strip() + price=int(float(raw)) if raw else None + 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':price,'priceText':'Consultar disponibilidad' if price is None else '', + 'available':boolean(row['available']),'featured':boolean(row['featured']), + 'new':boolean(row['new']),'stockText':'Disponible para confirmar', + 'images':[row['image'].strip()], + 'source':{'type':'instagram-export','account':'ari_shopping1','fbid':row['source_fbid'].strip()} + }) + OUTPUT.write_text(json.dumps({'version':'2.1.0','updatedAt':datetime.now(timezone.utc).isoformat(),'currency':'COP','pricingMode':'consult','products':products},ensure_ascii=False,indent=2)+'\n',encoding='utf-8') + print(f'OK: {len(products)} productos escritos en {OUTPUT}') + return 0 if __name__=='__main__':raise SystemExit(main())