Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Una sola app Angular 20 con un único menú: arroces al wok, comidas rápidas, asados y bebidas, todo en una sola página, con un solo carrito y un solo horario de atención. El pedido se arma en WhatsApp y se envía a la cocina responsable (ver "Cómo funciona el pedido" más abajo).
Este proyecto es independiente de
carta-caribe-wokycarta-rm(los dos repos de una sola línea cada uno). No los reemplaza ni los modifica.
Diseño 100% responsive (móvil, tablet y escritorio). Precios en pesos colombianos. Cocina oculta — solo servicio a domicilio.
npm install
npm start
Abre http://localhost:4200 — verás la carta completa directamente en /.
npm run build
El sitio queda en dist/carta-unificada/browser/. Es 100% estático: se
puede subir a Netlify, Vercel, GitHub Pages, Firebase Hosting, etc.
src/app/data/empresa.config.tsEMPRESA tiene los datos del negocio (nombre, logo, moneda, saludo de
WhatsApp, cobertura de delivery) y el horario único de atención:
horario: {
defecto: { abre: '11:00', cierra: '23:00' },
},
horario.excepciones acepta días concretos (0=domingo … 6=sábado;
null = cerrado).
COCINAS define las dos cocinas que preparan el pedido y su WhatsApp — ver
la sección "Cómo funciona el pedido".
src/app/data/menu.data.tsPLATOS: cada plato tiene categoria: 'arroces', 'comidas-rapidas'
o 'asados' (asados se preparan en la cocina de Pamer).ADICIONES y BEBIDAS: se muestran igual para todo el menú.Los campos de cada plato (precio, imagen, etiquetas, ingredientes,
variantes, etc.) funcionan igual que en los proyectos de una sola línea —
ver sus README para el detalle de cada campo.
En public/img/ solo va el logo (logo-nuevo.jpg). Todas las fotos de
los platos se alojan en Cloudinary (ver más abajo): en menu.data.ts se
referencian con cloudinaryUrl('<public-id>'). Para cambiar una foto, súbela
de nuevo a Cloudinary con el mismo Public ID.
Los arroces se dejaron sin imagen a propósito: en producción, las
fotos son lo que más tarda en cargar (peso del archivo + una petición de
red por plato), y es la sección con más platos de la carta. Sin imagen,
la tarjeta muestra automáticamente las iniciales del plato sobre un fondo
degradado — cero peso, carga instantánea, sin "salto" de layout mientras
carga.
Si más adelante quieres traer las fotos de vuelta sin repetir el problema de velocidad:
public/), para que solo
pesen la primera vez que cada cliente entra.loading="lazy" en las fotos de las tarjetas, así que
solo se descargan las que el cliente realmente llega a ver al hacer
scroll — no hace falta tocar nada ahí.destacado: true) en vez de a los 12 platos de una vez.En resumen: dejar imagen vacío (como está ahora) es la opción más rápida
posible porque no descarga nada; comprimir a WebP/AVIF chico es la mejor
alternativa si prefieres mostrar fotos igual.
En vez de guardar los archivos en public/img/ (lo que infla el repo y el
build), puedes subirlos a Cloudinary (plan free: 25 GB) y solo guardar
la URL en menu.data.ts. Cloudinary además optimiza cada foto a WebP/AVIF
y la redimensiona automáticamente — no necesitas Squoosh ni TinyPNG.
Crea una cuenta gratis en https://cloudinary.com y copia tu Cloud name (aparece en el dashboard, arriba a la izquierda).
Pégalo en EMPRESA.cloudinaryCloudName (src/app/data/empresa.config.ts).
Sube cada foto desde el dashboard de Cloudinary (Media Library → Upload). El "Public ID" que le pongas (por defecto, el nombre del archivo sin extensión) es lo que usarás en el código.
En menu.data.ts, importa el helper y úsalo en vez de la ruta local:
import { cloudinaryUrl } from '../utils/cloudinary';
// ...
imagen: cloudinaryUrl('hamburguesa-clasica'),
Eso arma https://res.cloudinary.com/<cloud-name>/image/upload/w_700,f_auto,q_auto/hamburguesa-clasica,
ya con ancho fijo (700px) y formato/calidad automáticos.
Si prefieres no depender de una cuenta externa, la alternativa 100% gratis
y sin límites reales es subir las fotos a un repo público de GitHub y
servirlas por jsDelivr: https://cdn.jsdelivr.net/gh/usuario/repo@main/ruta.jpg
(en ese caso comprime tú mismo antes, como se explica arriba).
COCINAS en
empresa.config.ts:
localStorage, clave
carta-unificada-carrito).src/app/
data/ empresa.config.ts (negocio + cocinas) y menu.data.ts (menú)
models/ tipos TypeScript (Dish, ExtraItem, CartItem, CocinaConfig)
services/ MenuService y CartService
pipes/ precio (formato $ 00.000)
components/ site-header, dish-card, dish-section, extra-list, cart-drawer, dish-detail
pages/ menu-page (la carta completa)
utils/ horario (abierto/cerrado), moneda (formato de precio) y cocina (a qué cocina va cada plato)
app.routes.ts '/' — el menú unificado