diff --git a/AGENTS.md b/AGENTS.md index a347ee2..52d13cf 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,81 +1,52 @@ # AGENTS.md -## Stack +## 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`. -- **Framework:** Astro 5 -- **Adapter:** `@astrojs/node` -- **Rendering mode:** SSR -- **Runtime target:** Node standalone en VPS con Dokploy -- **Styling:** CSS custom con variables CSS -- **Responsive approach:** mobile-first +## Verified commands +- Install deps: `npm install` or `npm ci` +- Dev server: `npm run dev` +- Type/content check: `npm run check` +- Build: `npm run build` +- Local preview: `npm run preview` +- Production start: `npm run start` -## Arquitectura del producto +Recommended verification after UI/content changes: +1. `npm run check` +2. `npm run build` -Sitio institucional multipágina enfocado en **captación de leads por WhatsApp**. +There are currently no repo scripts for linting, formatting, or tests, and no CI workflows to rely on. -Páginas aprobadas: +## 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`. +- 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`. -- Home -- Nosotros -- Bodas Reales -- Corporativo & Business -- Reuniones Familiares -- Contacto +## 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. -## Comandos +## 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. -Comandos esperados para la implementación del proyecto: +## 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`. -| Acción | Comando | -| --- | --- | -| Instalar dependencias | `npm install` | -| Desarrollo | `npm run dev` | -| Build | `npm run build` | -| Preview / ejecución standalone | `node ./dist/server/entry.mjs` | - -## Convenciones - -1. Priorizar claridad comercial y conversión por WhatsApp. -2. Mantener arquitectura mobile-first desde el CSS base. -3. Usar variables CSS para tokens de color, spacing, tipografía, radios y sombras. -4. Evitar frameworks de utilidades si no aportan valor claro al sistema visual. -5. Mantener consistencia estructural entre páginas de servicio. -6. Las galerías deben vivir dentro de cada servicio, no como página independiente. -7. El formulario de contacto debe ser secundario respecto a WhatsApp. - -## Don'ts - -- No usar `@astrojs/cloudflare` para este proyecto: el deployment objetivo es Dokploy sobre VPS. -- No diseñar desktop-first. -- No mezclar estilos premium editoriales con componentes visualmente ruidosos. -- No usar dorado como color masivo de relleno; usarlo como acento. -- No construir páginas de servicio genéricas copiadas una de otra sin adaptar copy, CTA y galería. - -## Estructura CSS recomendada - -- `src/styles/tokens.css` -- `src/styles/base.css` -- `src/styles/layout.css` -- `src/styles/components.css` -- `src/styles/utilities.css` - -## Skills - -Habilidades especialmente relevantes para este proyecto: - -- `project-docs` -- `brainstorming` -- `responsive-design` -- `visual-design-foundations` -- `interface-design` -- `accessibility-compliance` - -## Nota para futuros agentes - -Antes de implementar: - -1. Leer `README.md` -2. Leer este `AGENTS.md` -3. Leer `DESIGN.md` -4. Respetar el enfoque comercial: WhatsApp primero -5. Respetar el enfoque visual: claro editorial premium +## 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. diff --git a/astro.config.mjs b/astro.config.mjs index b81213d..b46de01 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,9 +1,16 @@ import { defineConfig } from 'astro/config'; import node from '@astrojs/node'; +import sitemap from '@astrojs/sitemap'; export default defineConfig({ + site: 'https://mnq.elkazurrotaberna.es', output: 'server', adapter: node({ mode: 'standalone', }), + integrations: [ + sitemap({ + filter: (page) => !page.endsWith('/cookies/') && !page.endsWith('/privacidad/'), + }), + ], }); diff --git a/docs/seo-audit/Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf b/docs/seo-audit/Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf new file mode 100644 index 0000000..5e3b16e Binary files /dev/null and b/docs/seo-audit/Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf differ diff --git a/docs/seo-audit/combined-seo-priority-roadmap.md b/docs/seo-audit/combined-seo-priority-roadmap.md new file mode 100644 index 0000000..3ef0f44 --- /dev/null +++ b/docs/seo-audit/combined-seo-priority-roadmap.md @@ -0,0 +1,347 @@ +# Combined SEO priority roadmap + +This document combines two sources reviewed on July 19, 2026: +- PageSpeed Insights desktop report for `https://mnq.elkazurrotaberna.es/` +- `docs/seo-audit/Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf` + +It is intentionally split into: +- **Repo-verified issues**: confirmed from the current codebase +- **Production-only checks**: reported by the PDF/PageSpeed but require live-environment validation + +--- + +## Current headline picture +- Performance: **80** +- Accessibility: **96** +- Best Practices: **100** +- SEO: **100** +- External full SEO PDF health score: **39/100** + +Interpretation: +- Lighthouse says the site is technically decent at baseline. +- The PDF surfaces bigger **search readiness / local SEO / entity trust** gaps that Lighthouse does not score deeply. + +--- + +## Tier 1 — Critical fixes + +### 1. Add crawl and discovery files +**Status:** repo-verified missing + +**Missing** +- `robots.txt` +- `sitemap.xml` +- `llms.txt` + +**Why this is critical** +- Search engines and AI crawlers lack explicit discovery and policy signals. +- This is one of the highest-leverage technical SEO fixes on a small site. + +**Files to add / touch** +- `public/robots.txt` +- sitemap generation setup in Astro +- `public/llms.txt` + +**Recommended action** +- Add `robots.txt` with a `Sitemap:` directive. +- Generate a sitemap from the real route set. +- Add a concise `llms.txt` with business summary, services, contact, and canonical domain. + +--- + +### 2. Add missing `
` SEO signals sitewide +**Status:** repo-verified missing + +**Missing** +- canonical tags +- Open Graph tags +- explicit meta robots tags +- JSON-LD / structured data + +**Why this is critical** +- The site currently has content, but weak machine-readable identity. +- Canonicalization and entity markup matter more here than another visual polish pass. + +**Files to touch** +- `src/layouts/MainLayout.astro` +- possibly shared helpers/components if you extract metadata/schema logic + +**Recommended action** +- Add self-referencing canonical tags. +- Add base OG tags (`og:title`, `og:description`, `og:type`, `og:url`, `og:image`). +- Add explicit `meta name="robots"` defaults, with special handling for legal pages if desired. +- Add sitewide JSON-LD for the business plus page-specific schema later. + +--- + +### 3. Fix language/market mismatch +**Status:** repo-verified + +**Current code** +- `src/layouts/MainLayout.astro` uses `lang="es-AR"` + +**Why this is critical** +- The site targets Spain signals (`+34`, RGPD/legal context), not Argentina. +- This mismatch hurts consistency for SEO, accessibility, and AI interpretation. + +**Files to touch** +- `src/layouts/MainLayout.astro` +- any copy using inconsistent register + +**Recommended action** +- Change sitewide language to `es-ES`. +- Standardize tone/register across pages. + +--- + +### 4. Fix the business identity trust gap +**Status:** partially repo-verified + +**Repo-verified issues** +- `eventos@mnqcatering.com` appears in: + - `src/pages/contacto.astro` + - `src/pages/cookies.astro` + - `src/pages/privacidad.astro` +- Corporate client names in `src/pages/corporativo-business.astro` look like placeholders: + - `LUMINA` + - `Nordic Corp` + - `Apex Sol.` + +**Why this is critical** +- A dead email domain or invented-looking client proof is poison for conversions and trust. +- This is not cosmetic. This is credibility. + +**Files to touch** +- `src/pages/contacto.astro` +- `src/pages/cookies.astro` +- `src/pages/privacidad.astro` +- `src/pages/corporativo-business.astro` + +**Recommended action** +- Verify the real contact domain and replace broken email references if needed. +- Remove fabricated-looking client names unless they are real and permissioned. +- Replace them with real logos, real brands, or no claim at all. + +--- + +### 5. Add service-area and local intent signals +**Status:** repo gap strongly supported by PDF; should be treated as high-priority content work + +**Why this is critical** +- The site needs explicit geography/service area to compete for local intent. +- Right now the strongest geo signal appears to be the phone prefix. + +**Recommended action** +- Add a visible service-area section on homepage and contact page. +- Mention real cities/regions served. +- Reflect the same area in JSON-LD (`areaServed`). + +**Likely files to touch** +- `src/pages/index.astro` +- `src/pages/contacto.astro` +- service pages under `src/pages/` + +--- + +## Tier 2 — High-impact SEO and conversion improvements + +### 6. Add `tel:` links and strengthen contact usability +**Status:** repo-verified missing + +**Why** +- The PDF correctly flags phone numbers as plain text. +- Click-to-call is basic conversion hygiene. + +**Files to touch** +- `src/pages/contacto.astro` +- `src/components/SiteFooter.astro` +- any page/header component showing the phone number + +**Recommended action** +- Wrap visible phone numbers in `tel:` links. +- Keep formatting human-readable while normalizing href values. + +--- + +### 7. Add FAQ and schema-backed informational sections +**Status:** supported by PDF; not yet implemented in repo + +**Why** +- The site is heavily CTA-driven but thin on concrete buyer-answer content. +- FAQ helps SEO, AI retrieval, and lead qualification. + +**Recommended action** +- Add short FAQ blocks on main commercial pages. +- Add FAQPage schema only for visible questions/answers. + +**Likely files to touch** +- `src/pages/bodas-reales.astro` +- `src/pages/corporativo-business.astro` +- `src/pages/reuniones-familiares.astro` +- `src/pages/contacto.astro` + +--- + +### 8. Add concrete facts: pricing, capacity, coverage, lead time +**Status:** supported by PDF; likely real gap + +**Why** +- Premium tone without specifics creates trust friction. +- Visitors need qualifying information before filling a form or opening WhatsApp. + +**Recommended action** +- Add readable prose covering: + - capacity ranges + - indicative pricing approach or starting-tier language + - coverage area + - booking lead time + +**Most important page** +- `src/pages/reuniones-familiares.astro` appears weakest per the PDF. + +--- + +## Tier 3 — Performance fixes with clear Lighthouse payoff + +### 9. Remove or reduce render-blocking font requests +**Status:** repo-verified + PageSpeed-supported + +**Files** +- `src/layouts/MainLayout.astro` + +**Current issues** +- external Google Fonts stylesheet request +- external Material Symbols stylesheet request + +**Recommended action** +- reduce font families/weights +- replace icon font with local/inline SVGs if feasible +- self-host fonts if the project keeps them + +**Why** +- Lighthouse reports render-blocking request savings around **1380 ms**. + +--- + +### 10. Fix image delivery and explicit dimensions +**Status:** repo-verified + PageSpeed-supported + +**Files** +- `src/pages/index.astro` +- `src/pages/bodas-reales.astro` +- `src/pages/corporativo-business.astro` +- review also `src/pages/contacto.astro`, `src/pages/nosotros.astro`, `src/pages/reuniones-familiares.astro` + +**Recommended action** +- add explicit `width` and `height` +- make sure above-the-fold assets are not oversized +- keep optimized formats consistent +- use lazy loading for non-hero images + +**Why** +- Lighthouse reports image savings around **1423 KiB**. +- It also flags missing image dimensions. + +--- + +### 11. Recompress and rationalize `public/images/` +**Status:** repo-verified + +**Hotspots** +- several large `.png` files in `public/images/` +- oversized footer/logo assets relative to rendered size + +**Recommended action** +- replace or recompress large PNGs +- prefer lighter WebP variants where acceptable +- remove duplicates not used in production + +**Folders** +- `public/images/` +- `public/images/generated/` + +--- + +### 12. Fix footer contrast +**Status:** repo-verified + Lighthouse-supported + +**Files** +- `src/components/SiteFooter.astro` +- `src/styles/components.css` + +**Current issue** +- footer text uses muted color plus low opacity + +**Recommended action** +- increase contrast on footer copy +- reduce/remove low-opacity muted treatment + +--- + +### 13. Normalize duplicated WhatsApp link labels +**Status:** repo-verified via Lighthouse finding + +**Files** +- `src/components/SiteHeader.astro` +- `src/components/SiteFooter.astro` + +**Recommended action** +- keep the same accessible purpose for identical WhatsApp destinations +- use `aria-label` if visible text differs by context + +--- + +### 14. Replace width animation on the progress bar +**Status:** repo-verified + Lighthouse-supported + +**Files** +- `src/styles/animations.css` +- `src/layouts/MainLayout.astro` + +**Recommended action** +- stop animating `width` +- use `transform: scaleX(...)` with `transform-origin: left` + +--- + +## Tier 4 — Production-only checks to verify before coding against them +These came from the PDF/PageSpeed/live-site observations but are **not provable from the repo alone**. + +### Validate on production +- `www` behavior, redirects, and TLS coverage +- security headers (`HSTS`, `X-Content-Type-Options`, `X-Frame-Options`, `CSP`) +- gzip/brotli compression on HTML/CSS +- cookie banner overlapping the floating WhatsApp CTA +- broken/bleeding UI element near the top-left viewport +- live caching policy for `/images/*` +- whether the contact email domain truly fails resolution +- whether the unrelated parent domain relationship must be clarified publicly + +These should be treated as a separate verification pass against the deployed site. + +--- + +## Suggested implementation order +1. crawl/discovery files (`robots.txt`, sitemap, `llms.txt`) +2. canonical + OG + robots + base JSON-LD in `MainLayout.astro` +3. `lang` correction to `es-ES` +4. email/domain trust fix and corporate-proof cleanup +5. service-area content and `tel:` links +6. FAQ / concrete fact sections on service pages +7. font and image performance fixes +8. footer contrast and smaller accessibility cleanups +9. production header/caching/compression validation + +--- + +## Minimum verification after each implementation batch +1. `npm run check` +2. `npm run build` +3. re-run desktop PageSpeed +4. manually inspect live `` output and generated crawl files + +--- + +## Related files already present +- `docs/seo-audit/Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf` +- `docs/seo-audit/pagespeed-priority-list.md` diff --git a/docs/seo-audit/pagespeed-priority-list.md b/docs/seo-audit/pagespeed-priority-list.md new file mode 100644 index 0000000..69c9f01 --- /dev/null +++ b/docs/seo-audit/pagespeed-priority-list.md @@ -0,0 +1,133 @@ +# PageSpeed priority list + +Source reviewed: +- PageSpeed Insights desktop report for `https://mnq.elkazurrotaberna.es/` +- Existing audit artifact: `Google-SEO-Report-mnq.elkazurrotaberna.es-full.pdf` + +## Scores +- Performance: 80 +- Accessibility: 96 +- Best Practices: 100 +- SEO: 100 + +## Fix first + +### 1. Remove or reduce render-blocking font requests +**Files** +- `src/layouts/MainLayout.astro` + +**Change** +- Reduce Google Fonts weights/families. +- Replace Material Symbols webfont with inline/local SVGs if possible. +- Keep `preconnect` only if those remote font requests remain. +- Re-evaluate the global body fade if it delays perceived first paint. + +**Why** +- Lighthouse reports render-blocking requests with ~1380 ms potential savings. + +--- + +### 2. Add explicit image dimensions and tighten image delivery +**Files** +- `src/pages/index.astro` +- `src/pages/bodas-reales.astro` +- `src/pages/corporativo-business.astro` +- Review also: `src/pages/contacto.astro`, `src/pages/nosotros.astro`, `src/pages/reuniones-familiares.astro` + +**Change** +- Add `width` and `height` to page images. +- Verify above-the-fold images are not larger than their rendered size. +- Keep optimized formats consistent. +- Do not rely on CSS sizing alone for layout stability. + +**Why** +- Lighthouse reports ~1423 KiB image savings. +- It also flags missing explicit image dimensions. + +--- + +### 3. Shrink heavy assets in `public/images/` +**Files / folders** +- `public/images/` +- `public/images/generated/` + +**Change** +- Replace or recompress large `.png` assets where a lighter format is acceptable. +- Prefer existing `.webp` variants where possible. +- Remove unused duplicates. +- Audit especially the heavier files such as `foto-corporativo.png`, `foto-bodas.png`, `foto-canapes.png`, `foto-plato-mnq.png`, and oversized logo assets. + +**Why** +- The current image payload is a major part of the desktop performance loss. + +--- + +### 4. Fix footer contrast +**Files** +- `src/components/SiteFooter.astro` +- `src/styles/components.css` + +**Change** +- Increase footer text contrast. +- Reduce or remove low-opacity muted text in the footer. +- Review `.footer-bottom p`, `.footer-brand p`, and any `text-muted` + `opacity` combinations. + +**Why** +- Lighthouse flags footer contrast issues. + +--- + +### 5. Make WhatsApp links use the same accessible purpose +**Files** +- `src/components/SiteHeader.astro` +- `src/components/SiteFooter.astro` + +**Change** +- Ensure identical WhatsApp destinations use a consistent accessible label. +- If visible text differs by context, normalize it with `aria-label`. + +**Why** +- Lighthouse flags identical links with mismatched purpose/description. + +--- + +### 6. Replace progress bar width animation with transform animation +**Files** +- `src/styles/animations.css` +- related update logic in `src/layouts/MainLayout.astro` + +**Change** +- Stop animating `width` on `.scroll-progress`. +- Use `transform: scaleX(...)` with `transform-origin: left` instead. + +**Why** +- Lighthouse flags non-composited animations. + +--- + +### 7. Trim unused CSS +**Files** +- `src/styles/components.css` +- `src/styles/utilities.css` +- `src/styles/animations.css` +- `src/styles/layout.css` + +**Change** +- Remove unused helpers, stale animations, and dead selectors. + +**Why** +- Lighthouse reports unused CSS, but this is lower priority than fonts and images. + +## Recommended implementation order +1. `src/layouts/MainLayout.astro` +2. image dimensions in page files +3. asset optimization in `public/images/` +4. footer contrast +5. WhatsApp link labeling +6. scroll progress animation +7. CSS cleanup + +## Validation after each batch +1. `npm run check` +2. `npm run build` +3. Re-run desktop PageSpeed diff --git a/package-lock.json b/package-lock.json index f5e4a97..ceed7c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "@astrojs/node": "^9.5.5", + "@astrojs/sitemap": "^3.7.3", "astro": "^5.18.1" }, "devDependencies": { @@ -184,6 +185,26 @@ "node": "18.20.8 || ^20.3.0 || >=22.0.0" } }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.3.tgz", + "integrity": "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA==", + "license": "MIT", + "dependencies": { + "sitemap": "^9.0.0", + "stream-replace-string": "^2.0.0", + "zod": "^4.3.6" + } + }, + "node_modules/@astrojs/sitemap/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@astrojs/telemetry": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", @@ -1704,6 +1725,24 @@ "@types/unist": "*" } }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", @@ -1957,6 +1996,12 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4976,6 +5021,25 @@ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "license": "MIT" }, + "node_modules/sitemap": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-9.0.1.tgz", + "integrity": "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^24.9.2", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/esm/cli.js" + }, + "engines": { + "node": ">=20.19.5", + "npm": ">=10.8.2" + } + }, "node_modules/smol-toml": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", @@ -5016,6 +5080,12 @@ "node": ">= 0.8" } }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -5234,6 +5304,12 @@ "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", diff --git a/package.json b/package.json index 14031d0..40f85c8 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "type": "module", "dependencies": { "@astrojs/node": "^9.5.5", + "@astrojs/sitemap": "^3.7.3", "astro": "^5.18.1" }, "devDependencies": { diff --git a/public/images/logo-secondary.webp b/public/images/logo-secondary.webp new file mode 100644 index 0000000..1926d61 Binary files /dev/null and b/public/images/logo-secondary.webp differ diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..2ba906a --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,7 @@ +MNQ Catering y Evento + +- Canonical domain: https://mnq.elkazurrotaberna.es +- Business type: Premium catering service +- Services: Bodas, eventos corporativos, reuniones familiares +- Primary contact channels: WhatsApp (+34 678 17 15 13), phone (+34 678 17 15 13) +- Key pages: /, /nosotros, /bodas-reales, /corporativo-business, /reuniones-familiares, /contacto diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..d9d1a51 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://mnq.elkazurrotaberna.es/sitemap-index.xml diff --git a/src/components/Icon.astro b/src/components/Icon.astro new file mode 100644 index 0000000..feec12f --- /dev/null +++ b/src/components/Icon.astro @@ -0,0 +1,88 @@ +--- +interface Props { + name: + | 'architecture' + | 'arrow-forward' + | 'auto-awesome' + | 'call' + | 'chat' + | 'history-edu' + | 'language' + | 'local-florist' + | 'restaurant-menu' + | 'verified'; + class?: string; + size?: number; +} + +const { name, class: className, size = 20 } = Astro.props; + +const icons: Record