chore: sync project state

This commit is contained in:
2026-09-01 10:06:25 +02:00
parent b97d0724db
commit 20d50411aa
76 changed files with 2784 additions and 28 deletions
+28 -28
View File
@@ -1,10 +1,10 @@
# AGENTS.md
## Stack and runtime
- Astro 5 SSR with `@astrojs/node` in `standalone` mode.
- Production entrypoint is `node ./dist/server/entry.mjs`.
- Runtime target is Node 20 (`Dockerfile` and `nixpacks.toml` both pin Node 20).
- TypeScript extends `astro/tsconfigs/strict`.
- Astro 5 SSR app with `@astrojs/node` in `standalone` mode (`astro.config.mjs`).
- Production entrypoint is `node ./dist/server/entry.mjs` (`package.json`, `Dockerfile`, `nixpacks.toml`).
- Node 20 is the deployed runtime in both Docker and Nixpacks.
- TypeScript extends `astro/tsconfigs/strict`; `dist` is excluded (`tsconfig.json`).
## Verified commands
- Install deps: `npm install` or `npm ci`
@@ -14,39 +14,39 @@
- Local preview: `npm run preview`
- Production start: `npm run start`
Recommended verification after UI/content changes:
Recommended verification after any page, styling, metadata, or asset change:
1. `npm run check`
2. `npm run build`
There are currently no repo scripts for linting, formatting, or tests, and no CI workflows to rely on.
There are currently no repo scripts for linting, formatting, or tests, and no CI workflows or Husky hooks to catch mistakes for you.
## Real app structure
- File-based routes live in `src/pages/`.
- Main public routes: `index.astro`, `nosotros.astro`, `bodas-reales.astro`, `corporativo-business.astro`, `reuniones-familiares.astro`, `contacto.astro`.
- Legal routes are part of the real surface area: `cookies.astro` and `privacidad.astro`.
- Shared shell is `src/layouts/MainLayout.astro`.
- Current public/legal routes are: `index.astro`, `nosotros.astro`, `bodas-reales.astro`, `corporativo-business.astro`, `reuniones-familiares.astro`, `contacto.astro`, `cookies.astro`, `privacidad.astro`, and `aviso-legal.astro`.
- `src/layouts/MainLayout.astro` is the real app shell for every route.
- Shared UI lives in `src/components/`.
- Global styling is split across `src/styles/tokens.css`, `base.css`, `layout.css`, `components.css`, `utilities.css`, and `animations.css`.
- Global CSS is imported only through `MainLayout.astro` from `src/styles/{tokens,base,layout,components,utilities,animations}.css`.
## Important implementation facts
- `MainLayout.astro` is the real wiring point: it imports all global CSS and mounts `SiteHeader`, `SiteFooter`, `WhatsAppButton`, and `CookieBanner` on every page.
- `MainLayout.astro` also owns global client behavior: reveal-on-scroll, scroll progress bar, reduced-motion handling, and internal-link fade transitions.
- This is a marketing site optimized for WhatsApp lead capture. Keep WhatsApp as the primary CTA and treat the contact form as secondary.
- The contact form in `src/pages/contacto.astro` is presentational only (`method="dialog"`); do not describe or treat it as a working backend submission flow.
- The WhatsApp destination is hardcoded in multiple places (`+34 678 17 15 13` / `34678171513`). If lead routing changes, search for all occurrences instead of updating a single component and assuming coverage.
## Wiring facts agents usually miss
- `MainLayout.astro` owns the canonical URL, OG/Twitter metadata, default JSON-LD, and optional Umami injection via `PUBLIC_UMAMI_URL` + `PUBLIC_UMAMI_WEBSITE_ID`.
- `MainLayout.astro` also mounts `SiteHeader`, `SiteFooter`, `WhatsAppButton`, and `CookieBanner` globally, plus the reveal/scroll-progress/page-transition client behavior.
- The canonical site URL is `https://www.mnqcatering.com` (`astro.config.mjs`).
- This is a marketing site optimized for WhatsApp lead capture. Keep WhatsApp as the primary CTA.
- `src/pages/contacto.astro` currently has **no form at all**. It is a WhatsApp/phone-led contact page with FAQs and coverage text, so do not describe or implement it as an existing form flow unless you are intentionally adding one.
- The WhatsApp destination/phone number is duplicated across layouts, components, and pages. If routing changes, search the whole repo instead of editing one component and assuming coverage.
## Content and design constraints
- Keep the mobile-first approach in base styles and layout decisions.
- Use CSS variables/tokens instead of introducing utility CSS frameworks.
- Keep service pages structurally consistent, but do not clone copy blindly: adapt CTA, gallery, and messaging per service.
- Galleries belong inside each service page, not as a separate gallery page.
- Preserve the premium editorial tone from `DESIGN.md`; gold is an accent, not a dominant fill color.
- Read `DESIGN.md` before making visual changes; it defines the premium editorial tone.
- Gold is an accent, not a dominant fill color.
- Keep the mobile-first approach and use existing CSS tokens/variables instead of adding a utility framework.
- Keep service pages structurally aligned, but adapt copy, CTA, and gallery content per service instead of cloning sections blindly.
- Galleries are embedded inside service pages, not split into a separate gallery route.
## Deployment notes
- Docker and Nixpacks both expect a built SSR app and start with `node ./dist/server/entry.mjs`.
- Runtime env defaults used by deploy config: `HOST=0.0.0.0`, `PORT=4321`, `NODE_ENV=production`.
## Deployment and SEO gotchas
- Docker build flow is `npm ci` -> `npm run build` -> `node ./dist/server/entry.mjs`.
- Runtime defaults used by deploy configs are `HOST=0.0.0.0`, `PORT=4321`, `NODE_ENV=production`.
- Sitemap generation excludes `/cookies/` and `/privacidad/` only. `aviso-legal.astro` sets `robots="noindex,follow"`, but it is **not** filtered out of the sitemap in `astro.config.mjs`.
## Repo-specific gotchas
- Ignore generated/build output: `.astro/` and `dist/`.
- `.gitignore` also excludes `.opencode/`, `.worktrees/`, and local planning artifacts under `docs/plans/`.
- Read `DESIGN.md` before making visual changes; it contains the project’s visual system and tone constraints.
## Ignore / generated output
- Treat `.astro/` and `dist/` as generated output.
- `.gitignore` also excludes `.opencode/`, `.worktrees/`, and `docs/plans/`.