尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 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