# Changelog

All notable changes to `@xenterprises/nuxt-x-marketing` are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### BREAKING

- **Removed the `XMarkAffiliate*` component family** — `XMarkAffiliateDisclosure`,
  `XMarkAffiliateProductCard`, `XMarkAffiliateProductGrid`, `XMarkAffiliateProductDetail`,
  and `XMarkAffiliateComparisonTable` (1,462 lines).

  They duplicated components `@xenterprises/nuxt-x-affiliate` already ships, without its
  per-merchant tagging (`xAffiliateContent.merchants`), impression tracking, or
  Product/Offer structured data — so a site using them shipped untagged outbound links
  and no product schema.

  Migrate to `<XAFDisclosure>`, `<XAFProductCard>`, `<XAFRelatedProducts>`,
  `<XAFComparisonTable>`, and (for the detail page) `<XAFHero>` + `<XAFProsCons>` +
  `<XAFVerdict>` + `<XAFSpecsTable>`. Affiliate sites should extend `nuxt-x-affiliate`
  directly — it is now self-contained and ships the site chrome (header, hero, sections,
  cards, footer) that previously required this layer alongside it.

### Changed

- **`app/pages/index.vue`** no longer showcases the removed affiliate components; the
  section and its sample product data were dropped with them. Every other section of the
  demo page is unchanged.

## [1.4.2] - 2026-08-23

### Fixed

- `XFooter/XLegal` drops the nested `main` (same as `XXLegal`).

## [1.4.1] - 2026-08-23

### Fixed

- `UHeader` never SSRs Nuxt UI (empty `title` plus empty `#title` on `XXHeader`, `XHeaderApp`, and Nav variants).
- `XSchema` ships a real JSON-LD template (`schema` prop or `xMarketing` name/url; does not invent a business).
- `XXHeaderNav` and `XHeaderNav` drop `UColorModeImage` (plain light/dark `img`).
- `XXLegal` drops the nested `main` inside the footer.
- Hero background `img` has `fetchpriority="high"`.

## [1.3.0] - 2026-07-24

### BREAKING

- **Blog migrated from Builder.io to Nuxt Content.** Consumers that relied on `NUXT_PUBLIC_BUILDERIO_KEY` and Builder models must migrate posts to `content/blog/*.md` and install the Content peer dependencies.
- **Default app shell rewritten to a config-driven shell.** The layer's `app/app.vue` (previously a hardcoded demo referencing non-existent `XMarkNavbar`/`XMarkFooter`, rendering no navbar/footer) now renders `XHeaderNav` + `XFooter` from `xMarketing.header`/`footer` config plus the consent banner. Consumers without their own `app/app.vue` will see the rendered shell change; the hardcoded newsletter section, dead demo links, and `/logo-white.svg`/`/logo-dark.svg` fallbacks are gone.
- **`xMarketing.name`/`url` defaults changed from placeholders to `undefined`** and both keys are now live: `name` drives the shell title template and `og:site_name` (page titles gain a `| <name>` suffix when set), `url` drives the home page `og:url`. Consumers reading the old placeholder defaults from `appConfig` now get `undefined`.

### Added

- Config-driven default shell with `xMarketing` opt-out switches for header, footer, and consent banner.
- `xMarketing.blog.active` opt-out on the shipped blog pages.
- `xMarketing.name`/`url` wired into shell SEO defaults (title template, `og:site_name`, `og:url`).
- Playground e2e smoke suite (`test:e2e`, plan 17) and lint quality gate.
- Consumer-minimal quickstart docs and plan-18 batteries-included audit.

### Changed

- Exported named `XMarketingConfig` interface for typed `app.config.ts` (plan-21 config-typing convention).
- Peer dependency ranges tightened to caret bounds.

### Fixed

- Widened `better-sqlite3` peer range to `^11.0.0 || ^12.0.0`.
- Default home page references real component names; `UToggle` replaced with `USwitch`.
- Repaired red gates: added `test:run`/`test:coverage` aliases and pinned `vue`.
- Test suite: fixed stale hero title assertion and scoped `h1` queries to main content.
