diff --git a/README.md b/README.md
index 5979e6c..5640948 100644
--- a/README.md
+++ b/README.md
@@ -62,31 +62,46 @@ Puis dans WP Admin → Apparence → Thèmes, activer **Asterion Bricks** (le ch
---
+## Approche
+
+**Bricks-first, child theme minimaliste.** Le rendu de chaque page est piloté par Bricks Builder (Templates pour header/footer/archives + pages éditées dans le builder). Le child theme se contente d'apporter le design system (tokens CSS), Inter self-hosté (RGPD) et les Custom Post Types. Voir `wp-content/themes/asterion-bricks/README.md` pour le détail.
+
+Une session de PHP-rendering plus traditionnelle a été archivée dans la branche Git `archive/session-2-php-templates` ainsi que dans `RESTART-PLAN.md` à la racine. Ne pas réintroduire ce pattern sans relire ces deux sources.
+
## Structure du repo
```
WP2026/
├── BRIEF-Claude-Code.md # brief projet (lecture obligatoire)
├── README.md # ce fichier
+├── RESTART-PLAN.md # historique de la décision Bricks-first
├── MISSING-ASSETS.md # tracking des visuels/medias manquants
├── *.pdf # 2 livrables stratégie + design (sources de vérité)
-├── ThirdParty/ # gitignored — ZIP plugins commerciaux à déposer manuellement
+├── ThirdParty/ # gitignored — ZIP plugins commerciaux
│ ├── bricks.*.zip
│ └── sitepress-multilingual-cms.*.zip
+├── content-source/ # copy EN extrait du PDF (référence + génération)
+│ ├── solutions-data.php
+│ ├── industries-data.php
+│ ├── technology-data.php
+│ ├── editorial-data.php
+│ ├── forms-data.php
+│ └── README.md
└── wp-content/
└── themes/
- └── asterion-bricks/ # le child theme — coeur du travail
- ├── style.css # en-tête WP + import tokens
- ├── functions.php # hooks, registers, queries
- ├── theme.json # tokens globaux (Gutenberg + Bricks)
- ├── assets/
- │ ├── css/ # tokens.css, components.css, utilities.css
- │ ├── js/ # vanilla JS, defer
- │ ├── fonts/ # Inter + Inter Display self-hosted (RGPD)
- │ └── img/
- ├── templates/ # exports Bricks JSON (versionnés)
- ├── inc/ # CPT, ACF field groups, SEO schema
- └── README.md
+ └── asterion-bricks/ # child theme minimaliste, voir son README
+ ├── style.css
+ ├── functions.php
+ ├── theme.json
+ ├── README.md
+ ├── inc/
+ │ └── cpt.php
+ └── assets/
+ ├── css/
+ │ ├── tokens.css # design system, source de vérité
+ │ └── utilities.css # skip-link, sr-only, focus-visible
+ ├── fonts/ # Inter Variable self-hosté
+ └── img/
```
---
diff --git a/content-source/README.md b/content-source/README.md
new file mode 100644
index 0000000..eb7789a
--- /dev/null
+++ b/content-source/README.md
@@ -0,0 +1,52 @@
+# Content source — copy reference
+
+PHP arrays of all the textual content authored in the Strategy & Content PDF (`Asterion-VR_Refonte-2026_Strategie-et-Contenu.pdf`, sections D.1 to D.29). Each file holds the EN copy for one site section, keyed by page slug.
+
+These files are **not** loaded at runtime. They serve two purposes:
+
+1. **Reference while building Bricks pages** — open the file matching the page you're editing and copy/paste the EN copy into the Bricks elements (Heading, Basic Text, Button…).
+2. **Source for programmatic generation** — once a Bricks archetype template is built and validated visually, a one-shot script can iterate over the data here, clone the template, swap in each variant's strings, and create the WP page programmatically. This avoids rebuilding the same layout 4–6 times for similar pages (e.g. the 4 industry detail pages).
+
+## Files
+
+| File | Pages covered |
+|---|---|
+| `solutions-data.php` | `/solutions/my-proserve/`, `/solutions/proserve-flex/`, `/solutions/proserve-academy/`, `/solutions/customization/` |
+| `industries-data.php` | `/industries/police/`, `/industries/special-forces/`, `/industries/military/`, `/industries/firefighters/` |
+| `technology-data.php` | 6 technology pillars under `/technology/` |
+| `editorial-data.php` | Why Asterion, About, Customers hub, Trust, Partners |
+| `forms-data.php` | Conversion forms (Demo, T&E Kit, Quote, Contact) |
+
+## Schema
+
+Every entry follows roughly the same shape :
+
+```php
+'slug-of-page' => [
+ 'eyebrow' => 'Small overline above the H1',
+ 'title' => 'Short page title',
+ 'tagline' => 'Hero H1',
+ 'meta_title' => 'For
+ OpenGraph',
+ 'meta_description' => 'For meta description',
+ 'hero_lead' => 'Long sub-headline under the H1',
+ 'ctas' => [['label' => '...', 'href' => '/...', 'variant' => 'primary'], …],
+ 'sections' => [
+ ['type' => 'prose' , 'eyebrow' => '…', 'title' => '…', 'body' => '…'],
+ ['type' => 'cards' , 'eyebrow' => '…', 'title' => '…', 'items' => [['title' => '…', 'body' => '…'], …]],
+ ['type' => 'list' , 'eyebrow' => '…', 'title' => '…', 'items' => ['line 1', 'line 2', …]],
+ ['type' => 'cta' , 'eyebrow' => '…', 'title' => '…', 'body' => '…', 'ctas' => […]],
+ ],
+],
+```
+
+`forms-data.php` deviates slightly — see its inline header comment.
+
+## Why we keep these in PHP arrays (vs JSON / YAML / Markdown)
+
+- They were extracted programmatically from the PDF and were already used by the previous PHP-rendering approach. Keeping the format means zero re-extraction work.
+- A future PHP migration script will `include $file_path` and use the returned array directly — no parsing layer required.
+- For the human reading them while building in Bricks, plain PHP arrays are perfectly readable.
+
+## French translations
+
+These files are **EN only**. The FR translations will live inside WordPress, written by the linguist via WPML's Translation Editor against each Bricks-edited page.
diff --git a/wp-content/themes/asterion-bricks/inc/editorial-data.php b/content-source/editorial-data.php
similarity index 100%
rename from wp-content/themes/asterion-bricks/inc/editorial-data.php
rename to content-source/editorial-data.php
diff --git a/wp-content/themes/asterion-bricks/inc/forms-data.php b/content-source/forms-data.php
similarity index 100%
rename from wp-content/themes/asterion-bricks/inc/forms-data.php
rename to content-source/forms-data.php
diff --git a/wp-content/themes/asterion-bricks/inc/industries-data.php b/content-source/industries-data.php
similarity index 100%
rename from wp-content/themes/asterion-bricks/inc/industries-data.php
rename to content-source/industries-data.php
diff --git a/wp-content/themes/asterion-bricks/inc/solutions-data.php b/content-source/solutions-data.php
similarity index 100%
rename from wp-content/themes/asterion-bricks/inc/solutions-data.php
rename to content-source/solutions-data.php
diff --git a/wp-content/themes/asterion-bricks/inc/technology-data.php b/content-source/technology-data.php
similarity index 100%
rename from wp-content/themes/asterion-bricks/inc/technology-data.php
rename to content-source/technology-data.php
diff --git a/wp-content/themes/asterion-bricks/README.md b/wp-content/themes/asterion-bricks/README.md
index 18808fd..338d34a 100644
--- a/wp-content/themes/asterion-bricks/README.md
+++ b/wp-content/themes/asterion-bricks/README.md
@@ -1,53 +1,84 @@
-# Asterion Bricks — Child theme
+# Asterion Bricks — Child theme (minimalist, Bricks-first)
-Custom WordPress child theme for **asterionvr.com**, built on top of [Bricks Builder](https://bricksbuilder.io). Tactical-cinematic design system for the PROSERVE XR training platform.
+Custom WordPress child theme for **asterionvr.com**, built on top of [Bricks Builder](https://bricksbuilder.io). The whole site is rendered by Bricks Templates and Bricks-edited pages — this theme exists only to give Bricks a design system, GDPR-compliant fonts, and the project's Custom Post Types.
-## Structure
+## What this theme does
+
+- 🎨 Loads `assets/css/tokens.css` on the public frontend AND inside the Bricks builder iframe — so every `--color-*`, `--space-*`, `--font-*` variable defined there is available to Bricks elements via the **CSS Class** field or **Custom CSS** panel.
+- 🔤 Self-hosts Inter Variable (latin subset) for RGPD compliance, with a `` injected on every page.
+- 📰 Registers two Custom Post Types — `case_study` (slug `/customers/`) and `scenario` (slug `/scenarios/`) — plus the shared `industry` taxonomy.
+- 📐 Adds three image sizes : `av-hero` (2400×1350), `av-card` (800×600), `av-thumb` (400×300).
+- 🌐 Ships an `asterion-bricks` text domain for future i18n.
+
+## What this theme does NOT do (intentionally)
+
+- ❌ No `header.php` / `footer.php` / `page.php` / `front-page.php` / `index.php`. Bricks Templates (Header / Footer / Single — Page) drive every screen.
+- ❌ No Custom Page Templates (`templates/page-*.php`). Pages render through their Bricks data (`_bricks_page_content_2` post meta).
+- ❌ No PHP renderers, Gutenberg block helpers, shortcodes. Content lives in Bricks data and WPML translations.
+
+If you find yourself adding any of the above back, stop and revisit `RESTART-PLAN.md` at the repo root — there are usually better Bricks-native alternatives.
+
+## File map
```
asterion-bricks/
-├── style.css # WP theme metadata only (CSS lives in assets/css/)
-├── functions.php # enqueues, theme support, includes
-├── theme.json # Gutenberg color/typo palette
-├── assets/
-│ ├── css/
-│ │ ├── tokens.css # design tokens — source of truth
-│ │ ├── utilities.css # CSS reset + utility classes (.av-container, etc.)
-│ │ └── components.css # component styles (buttons, cards, header, footer…)
-│ ├── js/
-│ │ └── main.js # vanilla JS, defer-loaded
-│ ├── fonts/ # self-hosted Inter (RGPD)
-│ └── img/ # static visuals
-├── templates/ # Bricks template JSON exports (versioned)
-└── inc/
- ├── cpt.php # custom post types: case_study, scenario
- └── seo.php # Schema.org JSON-LD overrides
+├── style.css # WP theme metadata only
+├── functions.php # enqueue tokens, preload font, theme support, CPT include
+├── theme.json # Gutenberg color/typo palette aligned with tokens.css
+├── README.md # this file
+├── inc/
+│ └── cpt.php # case_study, scenario, industry taxonomy
+└── assets/
+ ├── css/
+ │ ├── tokens.css # design system source of truth (single file, big)
+ │ └── utilities.css # skip-link, sr-only, focus-visible, reduced motion
+ ├── fonts/
+ │ ├── Inter-Variable.woff2
+ │ └── Inter-Variable-Italic.woff2
+ └── img/
```
-## Conventions
+Total : ~10 files, < 700 lines of code (with tokens.css being the lion's share).
-- **CSS prefix** : `av-` (asterion-vr) on every custom selector to avoid collision with Bricks classes.
-- **BEM-light** naming : `.av-card`, `.av-card--feature`, `.av-card__icon`, `.av-card.is-loading`.
-- **Zero hardcoded values** — every color, spacing, radius and duration goes through `tokens.css`.
-- **JS** : vanilla, defer-loaded, prefer `IntersectionObserver` over scroll listeners.
-- **A11y** : keyboard reachable, `:focus-visible` outline, ARIA where needed, contrast ≥ 4.5:1, `prefers-reduced-motion` respected.
+## Where the content copy lives
+
+The textual copy from the Strategy & Content PDF (page-by-page EN copy, deliverable D.1 to D.29) lives at the repo root in `/content-source/`. Those are PHP arrays keyed by page slug — they are not loaded at runtime. Their job is twofold:
+- **Reference** when building a Bricks page : copy/paste the appropriate strings into the Bricks elements as you build.
+- **Source for programmatic generation** when we replicate a Bricks-built archetype across its variants (e.g. the 4 industry detail pages, the 6 technology pillars).
## Activation
-1. Ensure Bricks parent is installed at `wp-content/themes/bricks/`.
-2. WP Admin → Appearance → Themes → activate **Asterion Bricks**.
+1. Install Bricks parent theme (`wp-content/themes/bricks/`) — the ZIP lives in `ThirdParty/`.
+2. Install + activate WPML core (also in `ThirdParty/`).
+3. WP Admin → Appearance → Themes → activate **Asterion Bricks**.
+4. WP Admin → Bricks → Settings → check **Page** in « Builder access · Post types ».
-## Performance budget (per BRIEF section 9)
+## Tokens to know
-| Asset | Budget |
-|-----------------|-------------------------------|
-| HTML initial | < 100 KB gzipped |
-| CSS total | < 50 KB gzipped |
-| JS initial | < 200 KB gzipped |
-| Hero video | < 2 MB |
-| Hero poster | < 150 KB |
-| LCP / CLS / TBT | < 2.5s / < 0.1 / < 200ms |
+The full design system lives in `assets/css/tokens.css`. The most-referenced tokens:
+
+| Variable | Value |
+|---|---|
+| `--color-brand-navy` | `#0B1F3A` |
+| `--color-brand-gold` | `#C9A45A` |
+| `--color-text-primary` | `#0B1F3A` |
+| `--font-display` | Inter Display fallback to Inter |
+| `--font-body` | Inter |
+| `--space-1..32` | 8-pt grid (4px → 128px) |
+| `--container-max` | 1280px |
+| `--ease-default` | `cubic-bezier(0.16, 1, 0.3, 1)` |
+| `--shadow-sm`/`--shadow-md`/`--shadow-lg` | navy-tinted elevation |
+
+Reference them inside Bricks via Custom CSS:
+
+```css
+%root% {
+ background: var(--color-brand-navy);
+ color: var(--color-text-on-dark);
+ padding-block: var(--space-20);
+}
+```
## License
-GPL v2 or later. Same as WordPress core.
+GPL v2 or later, matching WordPress core.
diff --git a/wp-content/themes/asterion-bricks/assets/css/components.css b/wp-content/themes/asterion-bricks/assets/css/components.css
deleted file mode 100644
index 69779a7..0000000
--- a/wp-content/themes/asterion-bricks/assets/css/components.css
+++ /dev/null
@@ -1,1300 +0,0 @@
-/**
- * Asterion Bricks — Components
- *
- * Component-level styles, layered on top of tokens + utilities.
- * Loaded last in the cascade.
- *
- * Naming : `.av-` base, `.av---`,
- * `.av-__`, `.av-.is-`.
- *
- * Reference : Design Handoff Specification, section 3.
- *
- * Index :
- * 1. Buttons .av-btn
- * 2. Links .av-link
- * 3. Forms .av-input / .av-label / .av-select / .av-textarea
- * 4. Cards .av-card and variants
- * 5. Stat callout .av-stat
- * 6. Header & navigation .av-header / .av-nav / .av-megamenu / .av-drawer
- * 7. Footer .av-footer
- * 8. Hero .av-hero
- * 9. Logo strip .av-logo-strip
- * 10. Eyebrow / overline .av-eyebrow
- * 11. Section titles .av-section__title / .av-section__lead
- * 12. Conversion banner .av-conversion-banner
- * 13. Reveal animation [data-av-reveal]
- */
-
-
-/* ============================================================================
- 1. Buttons (Design Handoff section 3.1)
- ============================================================================ */
-
-.av-btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: var(--space-2);
- padding: 0 var(--space-5);
- height: 44px;
- font-family: var(--font-body);
- font-size: var(--text-body-md);
- font-weight: var(--font-weight-semibold);
- line-height: 1;
- text-decoration: none;
- border: var(--border-default) solid transparent;
- border-radius: var(--radius-sm);
- cursor: pointer;
- user-select: none;
- white-space: nowrap;
- transition:
- background-color var(--duration-fast) var(--ease-default),
- color var(--duration-fast) var(--ease-default),
- transform var(--duration-fast) var(--ease-default),
- box-shadow var(--duration-default) var(--ease-default),
- border-color var(--duration-fast) var(--ease-default);
-}
-
-.av-btn:disabled,
-.av-btn.is-disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; }
-.av-btn.is-loading { cursor: wait; }
-
-.av-btn--sm { height: 32px; padding: 0 var(--space-3); font-size: var(--text-body-sm); }
-.av-btn--md { height: 44px; padding: 0 var(--space-5); }
-.av-btn--lg { height: 52px; padding: 0 1.75rem; font-size: var(--text-body-lg); }
-.av-btn--xl { height: 60px; padding: 0 2.25rem; font-size: var(--text-h4); font-weight: var(--font-weight-bold); }
-
-.av-btn--primary {
- background-color: var(--color-brand-gold);
- color: var(--color-brand-navy);
- border-color: var(--color-brand-gold);
-}
-.av-btn--primary:hover,
-.av-btn--primary:focus-visible {
- background-color: var(--color-brand-gold-soft);
- border-color: var(--color-brand-gold-soft);
- transform: translateY(-1px);
- box-shadow: var(--shadow-glow-gold);
-}
-.av-btn--primary:active { transform: translateY(0); filter: brightness(0.92); box-shadow: none; }
-
-.av-btn--secondary {
- background-color: transparent;
- color: var(--color-brand-navy);
- border-color: var(--color-brand-navy);
-}
-.av-btn--secondary:hover,
-.av-btn--secondary:focus-visible {
- background-color: var(--color-brand-navy);
- color: var(--color-text-on-dark);
-}
-
-.av-btn--ghost {
- background-color: transparent;
- color: var(--color-brand-navy);
- border-color: transparent;
-}
-.av-btn--ghost:hover,
-.av-btn--ghost:focus-visible {
- background-color: var(--color-bg-subtle);
-}
-
-.av-btn--on-dark.av-btn--secondary {
- color: var(--color-text-on-dark);
- border-color: var(--color-text-on-dark);
-}
-.av-btn--on-dark.av-btn--secondary:hover,
-.av-btn--on-dark.av-btn--secondary:focus-visible {
- background-color: var(--color-text-on-dark);
- color: var(--color-brand-navy);
-}
-.av-btn--on-dark.av-btn--ghost { color: var(--color-text-on-dark); }
-.av-btn--on-dark.av-btn--ghost:hover,
-.av-btn--on-dark.av-btn--ghost:focus-visible {
- background-color: var(--color-bg-dark-elevated);
-}
-
-.av-btn--destructive {
- background-color: var(--color-alert-red);
- color: var(--color-text-on-dark);
- border-color: var(--color-alert-red);
-}
-.av-btn--destructive:hover,
-.av-btn--destructive:focus-visible { filter: brightness(1.08); }
-
-
-/* ============================================================================
- 2. Links (Design Handoff section 3.2)
- ============================================================================ */
-
-.av-link {
- color: var(--color-brand-navy);
- text-decoration: none;
- transition: color var(--duration-fast) var(--ease-default);
-}
-.av-link:hover {
- color: var(--color-brand-gold);
- text-decoration: underline;
- text-decoration-thickness: 1px;
- text-underline-offset: 4px;
-}
-.av-link--on-dark { color: var(--color-text-on-dark); }
-.av-link--on-dark:hover { color: var(--color-brand-gold); }
-
-.av-link--with-arrow {
- display: inline-flex;
- align-items: center;
- gap: var(--space-2);
- font-weight: var(--font-weight-semibold);
-}
-.av-link--with-arrow::after {
- content: "→";
- transition: transform var(--duration-fast) var(--ease-default);
-}
-.av-link--with-arrow:hover::after { transform: translateX(4px); }
-
-
-/* ============================================================================
- 3. Forms — to be filled when conversion templates are built
- ============================================================================ */
-
-.av-input, .av-textarea, .av-select {
- display: block;
- width: 100%;
- height: 44px;
- padding: 10px 12px;
- font-family: inherit;
- font-size: var(--text-body-md);
- color: var(--color-text-primary);
- background-color: var(--color-bg-default);
- border: var(--border-thin) solid var(--color-border-default);
- border-radius: var(--radius-sm);
- transition: border-color var(--duration-fast) var(--ease-default);
-}
-.av-textarea { height: auto; min-height: 96px; resize: vertical; }
-.av-input:focus,
-.av-textarea:focus,
-.av-select:focus {
- border-color: var(--color-info);
- border-width: var(--border-default);
- outline: none;
- padding: 9px 11px; /* compensate for 1px extra border */
-}
-.av-input.is-error,
-.av-textarea.is-error { border-color: var(--color-error); border-width: var(--border-default); }
-.av-input.is-success { border-color: var(--color-success); border-width: var(--border-default); }
-.av-input:disabled { background: var(--color-bg-subtle); color: var(--color-text-muted); }
-
-.av-label {
- display: block;
- font-size: var(--text-body-md);
- font-weight: var(--font-weight-semibold);
- color: var(--color-text-primary);
- margin-bottom: var(--space-2);
-}
-.av-label__required { color: var(--color-error); margin-left: var(--space-1); }
-
-.av-helper {
- display: block;
- margin-top: var(--space-2);
- font-size: var(--text-body-sm);
- color: var(--color-text-muted);
-}
-.av-helper.is-error { color: var(--color-error); }
-
-
-/* ============================================================================
- 4. Cards (Design Handoff section 3.4)
- ============================================================================ */
-
-.av-card {
- display: flex;
- flex-direction: column;
- background-color: var(--color-bg-elevated);
- border-radius: var(--radius-md);
- box-shadow: var(--shadow-sm);
- overflow: hidden;
- transition:
- box-shadow var(--duration-default) var(--ease-default),
- transform var(--duration-default) var(--ease-default);
-}
-.av-card:hover {
- box-shadow: var(--shadow-md);
- transform: translateY(-2px);
-}
-.av-card.is-on-dark {
- background-color: var(--color-bg-dark-elevated);
- color: var(--color-text-on-dark);
-}
-
-.av-card__media {
- display: block;
- aspect-ratio: 4 / 3;
- background-color: var(--color-bg-subtle);
- overflow: hidden;
-}
-.av-card__media img,
-.av-card__media video {
- width: 100%;
- height: 100%;
- object-fit: cover;
- transition: transform var(--duration-default) var(--ease-default);
-}
-.av-card:hover .av-card__media img { transform: scale(1.04); }
-
-.av-card__body {
- display: flex;
- flex-direction: column;
- flex: 1;
- padding: var(--space-6);
- gap: var(--space-3);
-}
-@media (min-width: 768px) {
- .av-card__body { padding: var(--space-8); }
-}
-
-.av-card__eyebrow {
- font-family: var(--font-body);
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
-}
-.av-card.is-on-dark .av-card__eyebrow { color: var(--color-brand-gold); }
-
-.av-card__title {
- font-family: var(--font-display);
- font-size: var(--text-h3);
- line-height: var(--leading-h3);
- font-weight: var(--font-weight-semibold);
- color: var(--color-text-primary);
- letter-spacing: var(--tracking-snug);
-}
-.av-card.is-on-dark .av-card__title { color: var(--color-text-on-dark); }
-
-.av-card__excerpt {
- font-size: var(--text-body-md);
- line-height: var(--leading-body-md);
- color: var(--color-text-secondary);
-}
-.av-card.is-on-dark .av-card__excerpt { color: var(--color-text-on-dark-muted); }
-
-.av-card__cta { margin-top: auto; padding-top: var(--space-4); }
-
-/* Variant : feature card (icon top instead of image) */
-.av-card--feature .av-card__icon {
- width: 48px;
- height: 48px;
- margin-bottom: var(--space-2);
- color: var(--color-brand-gold);
-}
-
-/* Variant : case study (image with overlay) */
-.av-card--case-study .av-card__media { aspect-ratio: 16 / 9; }
-.av-card--case-study .av-card__metric {
- font-family: var(--font-display);
- font-size: var(--text-display-md);
- font-weight: var(--font-weight-bold);
- line-height: var(--leading-display-md);
- color: var(--color-brand-gold);
-}
-
-/* Variant : quote (testimonial) */
-.av-card--quote {
- background-color: var(--color-bg-subtle);
- padding: var(--space-8);
- gap: var(--space-4);
-}
-.av-card--quote::before {
- content: "“";
- font-family: var(--font-display);
- font-size: 4rem;
- font-weight: var(--font-weight-bold);
- line-height: 1;
- color: var(--color-brand-gold);
- margin-bottom: -2.5rem;
-}
-.av-card--quote .av-card__quote {
- font-size: var(--text-body-lg);
- line-height: var(--leading-body-lg);
- color: var(--color-text-primary);
- font-style: italic;
-}
-.av-card--quote .av-card__attribution {
- font-size: var(--text-body-sm);
- color: var(--color-text-muted);
- font-style: normal;
-}
-
-/* Variant : blog */
-.av-card--blog .av-card__media { aspect-ratio: 16 / 9; }
-
-
-/* ============================================================================
- 5. Stat callout (Design Handoff section 3.4 - stat callout component)
- ============================================================================ */
-
-.av-stat {
- display: flex;
- flex-direction: column;
- gap: var(--space-1);
-}
-
-.av-stat__value {
- font-family: var(--font-display);
- font-size: var(--text-display-lg);
- line-height: var(--leading-display-lg);
- font-weight: var(--font-weight-bold);
- color: var(--color-brand-navy);
- letter-spacing: var(--tracking-tight);
-}
-.av-stat--gold .av-stat__value { color: var(--color-brand-gold); }
-.av-stat--on-dark .av-stat__value { color: var(--color-text-on-dark); }
-.av-stat--on-dark.av-stat--gold .av-stat__value { color: var(--color-brand-gold); }
-
-.av-stat__label {
- font-size: var(--text-body-sm);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
-}
-.av-stat--on-dark .av-stat__label { color: var(--color-text-on-dark-muted); }
-
-.av-stat__source {
- font-size: var(--text-overline);
- color: var(--color-text-muted);
-}
-
-
-/* ============================================================================
- 6. Header & navigation (Design Handoff section 3.5)
- ============================================================================ */
-
-.av-header {
- position: sticky;
- top: 0;
- z-index: var(--z-sticky);
- background-color: var(--color-bg-default);
- height: 60px;
- display: flex;
- align-items: center;
- transition: box-shadow var(--duration-fast) var(--ease-default), background-color var(--duration-fast) var(--ease-default);
-}
-@media (min-width: 1024px) {
- .av-header { height: 72px; }
-}
-.av-header.is-scrolled { box-shadow: var(--shadow-sm); }
-
-.av-header__inner {
- display: flex;
- align-items: center;
- justify-content: space-between;
- width: 100%;
- gap: var(--space-6);
-}
-
-.av-header__logo {
- display: flex;
- align-items: center;
- height: 32px;
- font-family: var(--font-display);
- font-weight: var(--font-weight-bold);
- font-size: var(--text-h4);
- color: var(--color-brand-navy);
- letter-spacing: 0.05em;
- text-transform: uppercase;
- text-decoration: none;
- flex-shrink: 0;
-}
-.av-header__logo svg, .av-header__logo img { height: 32px; width: auto; }
-
-.av-nav {
- display: none;
- align-items: center;
- gap: var(--space-6);
- flex: 1;
- justify-content: center;
-}
-@media (min-width: 1024px) {
- .av-nav { display: flex; }
-}
-
-.av-nav__item { position: relative; }
-
-.av-nav__link {
- display: inline-flex;
- align-items: center;
- gap: var(--space-1);
- height: 60px;
- padding: 0 var(--space-2);
- font-size: var(--text-body-md);
- font-weight: var(--font-weight-medium);
- color: var(--color-text-primary);
- text-decoration: none;
- transition: color var(--duration-fast) var(--ease-default);
-}
-.av-nav__link:hover,
-.av-nav__link[aria-expanded="true"] { color: var(--color-brand-gold); }
-.av-nav__link[aria-haspopup="true"]::after {
- content: "▾";
- font-size: 0.7em;
- margin-left: var(--space-1);
- transition: transform var(--duration-fast) var(--ease-default);
-}
-.av-nav__link[aria-expanded="true"]::after { transform: rotate(180deg); }
-
-.av-header__right {
- display: flex;
- align-items: center;
- gap: var(--space-4);
- flex-shrink: 0;
-}
-
-.av-lang-switch {
- display: none;
- align-items: center;
- gap: var(--space-2);
- font-size: var(--text-body-sm);
- font-weight: var(--font-weight-medium);
-}
-@media (min-width: 1024px) { .av-lang-switch { display: inline-flex; } }
-.av-lang-switch__current {
- color: var(--color-brand-navy);
- font-weight: var(--font-weight-semibold);
-}
-.av-lang-switch__other { color: var(--color-text-muted); }
-.av-lang-switch__other:hover { color: var(--color-brand-navy); }
-
-.av-header__cta-mobile-only { display: none; }
-
-
-/* --- Mega menu (desktop only) --- */
-
-.av-megamenu {
- position: absolute;
- top: 100%;
- left: 0;
- right: 0;
- z-index: var(--z-dropdown);
- background-color: var(--color-bg-default);
- box-shadow: var(--shadow-md);
- padding: var(--space-8);
- display: none;
- opacity: 0;
- transform: translateY(-4px);
- transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
-}
-.av-megamenu.is-open {
- display: block;
- opacity: 1;
- transform: translateY(0);
-}
-.av-megamenu__inner {
- max-width: var(--container-max);
- margin-inline: auto;
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- gap: var(--space-8);
-}
-.av-megamenu__col-title {
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
- margin-bottom: var(--space-3);
-}
-.av-megamenu__list { display: flex; flex-direction: column; gap: var(--space-2); }
-.av-megamenu__link {
- font-size: var(--text-body-md);
- color: var(--color-text-primary);
- text-decoration: none;
- font-weight: var(--font-weight-medium);
- padding-block: var(--space-1);
-}
-.av-megamenu__link:hover { color: var(--color-brand-gold); }
-
-
-/* --- Drawer (mobile) --- */
-
-.av-drawer-toggle {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 44px;
- height: 44px;
- padding: 0;
- background: transparent;
- border: none;
- cursor: pointer;
- color: var(--color-brand-navy);
-}
-@media (min-width: 1024px) { .av-drawer-toggle { display: none; } }
-
-.av-drawer {
- position: fixed;
- inset: 0;
- z-index: var(--z-fixed);
- background-color: var(--color-brand-navy);
- color: var(--color-text-on-dark);
- padding: var(--space-6);
- overflow-y: auto;
- transform: translateX(100%);
- transition: transform var(--duration-slow) var(--ease-default);
- visibility: hidden;
-}
-.av-drawer.is-open {
- transform: translateX(0);
- visibility: visible;
-}
-.av-drawer__close {
- position: absolute;
- top: var(--space-6);
- right: var(--space-6);
- width: 44px;
- height: 44px;
- background: transparent;
- border: none;
- color: var(--color-text-on-dark);
- cursor: pointer;
- font-size: 1.5rem;
-}
-.av-drawer__nav { margin-top: var(--space-12); }
-.av-drawer__group { border-bottom: 1px solid var(--color-border-on-dark); }
-.av-drawer__group-title {
- display: flex;
- width: 100%;
- align-items: center;
- justify-content: space-between;
- padding: var(--space-4) 0;
- background: transparent;
- border: none;
- color: var(--color-text-on-dark);
- font-size: var(--text-h4);
- font-weight: var(--font-weight-semibold);
- text-align: left;
- cursor: pointer;
- font-family: inherit;
-}
-.av-drawer__cta-area {
- margin-top: var(--space-12);
- padding-top: var(--space-8);
- border-top: 1px solid var(--color-border-on-dark);
-}
-
-
-/* ============================================================================
- 7. Footer (Design Handoff section 3.5)
- ============================================================================ */
-
-.av-footer {
- background-color: var(--color-brand-navy-deep);
- color: var(--color-text-on-dark);
- padding-block: var(--space-12);
-}
-@media (min-width: 1024px) {
- .av-footer { padding-block: var(--space-20); }
-}
-
-.av-footer__cols {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-10);
-}
-@media (min-width: 768px) {
- .av-footer__cols { grid-template-columns: repeat(2, 1fr); }
-}
-@media (min-width: 1024px) {
- .av-footer__cols { grid-template-columns: 2fr 1fr 1fr 1fr 1.5fr; gap: var(--space-8); }
-}
-
-.av-footer__col-title {
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-brand-gold);
- margin-bottom: var(--space-4);
-}
-
-.av-footer__list { display: flex; flex-direction: column; gap: var(--space-3); }
-.av-footer__list a {
- color: var(--color-text-on-dark-muted);
- font-size: var(--text-body-md);
- text-decoration: none;
- transition: color var(--duration-fast) var(--ease-default);
-}
-.av-footer__list a:hover { color: var(--color-text-on-dark); }
-
-.av-footer__brand p {
- color: var(--color-text-on-dark-muted);
- font-size: var(--text-body-md);
- line-height: var(--leading-body-md);
-}
-.av-footer__brand .av-header__logo {
- color: var(--color-text-on-dark);
- margin-bottom: var(--space-4);
-}
-
-.av-footer__newsletter-form {
- display: flex;
- flex-direction: column;
- gap: var(--space-2);
- margin-top: var(--space-3);
-}
-
-.av-footer__bottom {
- margin-top: var(--space-12);
- padding-top: var(--space-6);
- border-top: 1px solid var(--color-border-on-dark);
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: space-between;
- gap: var(--space-4);
- font-size: var(--text-body-sm);
- color: var(--color-text-on-dark-muted);
-}
-.av-footer__bottom-links { display: flex; flex-wrap: wrap; gap: var(--space-4); }
-.av-footer__bottom-links a {
- color: var(--color-text-on-dark-muted);
- text-decoration: none;
-}
-.av-footer__bottom-links a:hover { color: var(--color-text-on-dark); }
-
-
-/* ============================================================================
- 8. Hero (home + page heroes)
- ============================================================================ */
-
-.av-hero {
- position: relative;
- background-color: var(--color-brand-navy);
- background-image:
- radial-gradient(ellipse at 70% 30%, rgba(201, 164, 90, 0.15), transparent 60%),
- radial-gradient(ellipse at 20% 70%, rgba(31, 91, 168, 0.20), transparent 60%),
- linear-gradient(135deg, var(--color-brand-navy-deep) 0%, var(--color-brand-navy) 50%, var(--color-bg-dark-elevated) 100%);
- color: var(--color-text-on-dark);
- overflow: hidden;
- isolation: isolate;
- min-height: 70vh;
- display: flex;
- align-items: center;
- padding-block: var(--space-20);
-}
-@media (min-width: 1024px) { .av-hero { min-height: 85vh; padding-block: var(--space-32); } }
-
-.av-hero__media {
- position: absolute;
- inset: 0;
- z-index: -1;
- overflow: hidden;
-}
-.av-hero__media::after {
- content: "";
- position: absolute;
- inset: 0;
- background:
- linear-gradient(180deg, rgba(8, 20, 39, 0.55), rgba(11, 31, 58, 0.85));
-}
-.av-hero__media video,
-.av-hero__media img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- display: block;
-}
-
-.av-hero__inner {
- max-width: 800px;
- display: flex;
- flex-direction: column;
- gap: var(--space-6);
-}
-
-.av-hero__eyebrow {
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-brand-gold);
-}
-
-.av-hero__headline {
- font-family: var(--font-display);
- font-size: clamp(2.5rem, 6vw, var(--text-display-xl));
- line-height: var(--leading-display-xl);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-tight);
- color: var(--color-text-on-dark);
- margin: 0;
- max-width: 18ch;
-}
-
-.av-hero__sub {
- font-size: var(--text-body-lg);
- line-height: var(--leading-body-lg);
- color: var(--color-text-on-dark-muted);
- max-width: 60ch;
- margin: 0;
-}
-
-.av-hero__ctas {
- display: flex;
- flex-wrap: wrap;
- gap: var(--space-4);
- margin-top: var(--space-2);
-}
-
-
-/* ============================================================================
- 9. Logo strip (trust bar)
- ============================================================================ */
-
-.av-logo-strip {
- background-color: var(--color-bg-subtle);
- padding-block: var(--space-10);
-}
-.av-logo-strip__intro {
- text-align: center;
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
- margin-bottom: var(--space-6);
-}
-.av-logo-strip__row {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- justify-content: center;
- gap: var(--space-8);
- margin-bottom: var(--space-10);
-}
-.av-logo-strip__logo {
- height: 40px;
- width: 120px;
- background-color: var(--color-bg-elevated);
- border: 1px dashed var(--color-border-default);
- border-radius: var(--radius-sm);
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: var(--text-body-sm);
- color: var(--color-text-muted);
-}
-.av-logo-strip__metrics {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: var(--space-6);
- text-align: center;
-}
-@media (min-width: 768px) {
- .av-logo-strip__metrics { grid-template-columns: repeat(4, 1fr); }
-}
-.av-logo-strip__metric {
- font-size: var(--text-body-sm);
- font-weight: var(--font-weight-semibold);
- color: var(--color-text-secondary);
-}
-
-
-/* ============================================================================
- 10. Eyebrow / overline
- ============================================================================ */
-
-.av-eyebrow {
- display: inline-block;
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
-}
-.av-eyebrow--gold { color: var(--color-brand-gold); }
-
-
-/* ============================================================================
- 11. Section title + lead
- ============================================================================ */
-
-.av-section__title {
- font-family: var(--font-display);
- font-size: clamp(var(--text-h1), 4vw, var(--text-display-md));
- line-height: var(--leading-display-md);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-tight);
- color: var(--color-text-primary);
- margin: 0;
- max-width: 24ch;
-}
-.av-section--dark .av-section__title { color: var(--color-text-on-dark); }
-
-.av-section__lead {
- font-size: var(--text-body-lg);
- line-height: var(--leading-body-lg);
- color: var(--color-text-secondary);
- max-width: 56ch;
- margin: 0;
-}
-.av-section--dark .av-section__lead { color: var(--color-text-on-dark-muted); }
-
-.av-section__head {
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
- margin-bottom: var(--space-10);
- max-width: 720px;
-}
-
-.av-grid-3 {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
-}
-@media (min-width: 768px) { .av-grid-3 { grid-template-columns: repeat(2, 1fr); } }
-@media (min-width: 1024px) { .av-grid-3 { grid-template-columns: repeat(3, 1fr); } }
-
-.av-grid-4 {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
-}
-@media (min-width: 768px) { .av-grid-4 { grid-template-columns: repeat(2, 1fr); } }
-
-
-/* ============================================================================
- 12. Conversion banner (3 CTAs side-by-side, dark)
- ============================================================================ */
-
-.av-conversion-banner {
- background-color: var(--color-brand-navy);
- color: var(--color-text-on-dark);
- padding-block: var(--space-20);
-}
-.av-conversion-banner__head {
- text-align: center;
- margin-bottom: var(--space-12);
-}
-.av-conversion-banner__title {
- font-family: var(--font-display);
- font-size: clamp(var(--text-h1), 5vw, var(--text-display-lg));
- line-height: var(--leading-display-lg);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-tight);
- color: var(--color-text-on-dark);
- margin: 0 auto var(--space-4) auto;
- max-width: 20ch;
-}
-.av-conversion-banner__lead {
- font-size: var(--text-body-lg);
- color: var(--color-text-on-dark-muted);
- max-width: 56ch;
- margin: 0 auto;
-}
-.av-conversion-banner__grid {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
-}
-@media (min-width: 768px) { .av-conversion-banner__grid { grid-template-columns: repeat(3, 1fr); } }
-
-.av-conversion-banner__card {
- display: flex;
- flex-direction: column;
- gap: var(--space-4);
- padding: var(--space-8);
- background-color: var(--color-bg-dark-elevated);
- border: 1px solid var(--color-border-on-dark);
- border-radius: var(--radius-md);
-}
-.av-conversion-banner__card-title {
- font-family: var(--font-display);
- font-size: var(--text-h3);
- font-weight: var(--font-weight-semibold);
- color: var(--color-text-on-dark);
-}
-.av-conversion-banner__card-desc {
- font-size: var(--text-body-md);
- color: var(--color-text-on-dark-muted);
- flex: 1;
-}
-
-
-/* ============================================================================
- 12c. Bricks Builder element overrides — when a Bricks element carries one
- of our `av-*` classes, raise specificity so our design-system rules
- win against Bricks default styles (which use a single `.brxe-*`
- class selector).
- ============================================================================ */
-
-/* Hero — re-apply our layout & background on top of brxe-section. */
-.brxe-section.av-hero {
- position: relative;
- background-color: var(--color-brand-navy);
- /* Use background (shorthand) so .bricks-lazy-hidden's
- `background-image: none !important` doesn't kill the gradient outright;
- the shorthand wins by being declared after the shorthand reset. */
- background:
- radial-gradient(ellipse at 70% 30%, rgba(201, 164, 90, 0.15), transparent 60%),
- radial-gradient(ellipse at 20% 70%, rgba(31, 91, 168, 0.20), transparent 60%),
- linear-gradient(135deg, var(--color-brand-navy-deep) 0%, var(--color-brand-navy) 50%, var(--color-bg-dark-elevated) 100%);
- color: var(--color-text-on-dark);
- min-height: 70vh;
- display: flex;
- align-items: center;
- justify-content: center;
- padding-block: var(--space-20);
-}
-@media (min-width: 1024px) {
- .brxe-section.av-hero { min-height: 85vh; padding-block: var(--space-32); }
-}
-.brxe-container.av-hero__inner {
- width: 100%;
- max-width: var(--container-max);
- margin-inline: auto;
- padding-inline: var(--container-padding-mobile);
- display: flex;
- flex-direction: column;
- gap: var(--space-6);
- align-items: flex-start;
-}
-@media (min-width: 768px) { .brxe-container.av-hero__inner { padding-inline: var(--container-padding-tablet); } }
-@media (min-width: 1280px) { .brxe-container.av-hero__inner { padding-inline: var(--container-padding-desktop); } }
-
-/* Hero typography on Bricks-rendered text-basic + heading. */
-.brxe-text-basic.av-hero__eyebrow {
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-brand-gold);
- margin: 0;
-}
-.brxe-heading.av-hero__headline {
- font-family: var(--font-display);
- font-size: clamp(2.5rem, 6vw, var(--text-display-xl));
- line-height: var(--leading-display-xl);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-tight);
- color: var(--color-text-on-dark);
- margin: 0;
- max-width: 18ch;
-}
-.brxe-text-basic.av-hero__sub {
- font-size: var(--text-body-lg);
- line-height: var(--leading-body-lg);
- color: var(--color-text-on-dark-muted);
- max-width: 60ch;
- margin: 0;
-}
-
-/* Section spacing on Bricks-rendered sections. */
-.brxe-section.av-section {
- padding-block: var(--space-16);
-}
-@media (min-width: 1024px) {
- .brxe-section.av-section { padding-block: var(--space-20); }
-}
-
-/* Plain Bricks container reuses our container width / padding. */
-.brxe-container.av-container {
- max-width: var(--container-max);
- margin-inline: auto;
- padding-inline: var(--container-padding-mobile);
- width: 100%;
-}
-@media (min-width: 768px) { .brxe-container.av-container { padding-inline: var(--container-padding-tablet); } }
-@media (min-width: 1280px) { .brxe-container.av-container { padding-inline: var(--container-padding-desktop); } }
-
-/* Cards grid — Bricks `block` element uses display:flex column by default.
- Force CSS grid back. */
-.brxe-block.av-grid-3 {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
- width: 100%;
-}
-@media (min-width: 768px) { .brxe-block.av-grid-3 { grid-template-columns: repeat(2, 1fr); } }
-@media (min-width: 1024px) { .brxe-block.av-grid-3 { grid-template-columns: repeat(3, 1fr); } }
-
-.brxe-block.av-grid-4 {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
- width: 100%;
-}
-@media (min-width: 768px) { .brxe-block.av-grid-4 { grid-template-columns: repeat(2, 1fr); } }
-@media (min-width: 1280px) { .brxe-block.av-grid-4 { grid-template-columns: repeat(4, 1fr); } }
-
-/* Card design on Bricks block. */
-.brxe-block.av-card {
- background-color: var(--color-bg-elevated);
- border-radius: var(--radius-md);
- box-shadow: var(--shadow-sm);
- overflow: hidden;
- padding: var(--space-6);
- display: flex;
- flex-direction: column;
- gap: var(--space-3);
- transition:
- box-shadow var(--duration-default) var(--ease-default),
- transform var(--duration-default) var(--ease-default);
-}
-@media (min-width: 768px) {
- .brxe-block.av-card { padding: var(--space-8); }
-}
-.brxe-block.av-card:hover {
- box-shadow: var(--shadow-md);
- transform: translateY(-2px);
-}
-.brxe-text-basic.av-card__eyebrow {
- font-size: var(--text-overline);
- font-weight: var(--font-weight-semibold);
- text-transform: uppercase;
- letter-spacing: var(--tracking-overline);
- color: var(--color-text-muted);
- margin: 0;
-}
-.brxe-heading.av-card__title {
- font-family: var(--font-display);
- font-size: var(--text-h3);
- line-height: var(--leading-h3);
- font-weight: var(--font-weight-semibold);
- color: var(--color-text-primary);
- margin: 0;
-}
-.brxe-text-basic.av-card__excerpt {
- font-size: var(--text-body-md);
- line-height: var(--leading-body-md);
- color: var(--color-text-secondary);
- margin: 0;
- flex: 1;
-}
-
-/* Button on Bricks button element. Bricks renders . */
-.brxe-button.av-btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: var(--space-2);
- height: 44px;
- padding: 0 var(--space-5);
- font-family: var(--font-body);
- font-size: var(--text-body-md);
- font-weight: var(--font-weight-semibold);
- line-height: 1;
- text-decoration: none;
- border: var(--border-default) solid transparent;
- border-radius: var(--radius-sm);
- cursor: pointer;
- white-space: nowrap;
- align-self: flex-start;
- transition:
- background-color var(--duration-fast) var(--ease-default),
- color var(--duration-fast) var(--ease-default),
- transform var(--duration-fast) var(--ease-default),
- border-color var(--duration-fast) var(--ease-default);
-}
-.brxe-button.av-btn--md { height: 44px; padding: 0 var(--space-5); }
-.brxe-button.av-btn--lg { height: 52px; padding: 0 1.75rem; font-size: var(--text-body-lg); }
-
-.brxe-button.av-btn--primary {
- background-color: var(--color-brand-gold);
- color: var(--color-brand-navy);
- border-color: var(--color-brand-gold);
-}
-.brxe-button.av-btn--primary:hover,
-.brxe-button.av-btn--primary:focus-visible {
- background-color: var(--color-brand-gold-soft);
- border-color: var(--color-brand-gold-soft);
- transform: translateY(-1px);
-}
-.brxe-button.av-btn--secondary {
- background-color: transparent;
- color: var(--color-brand-navy);
- border-color: var(--color-brand-navy);
-}
-.brxe-button.av-btn--secondary:hover,
-.brxe-button.av-btn--secondary:focus-visible {
- background-color: var(--color-brand-navy);
- color: var(--color-text-on-dark);
-}
-
-
-/* ============================================================================
- 12b. Gutenberg block overrides — neutralize default layout styles when
- a block also carries one of our `av-*` design-system classes. We
- keep our grid / spacing / button rules in charge.
- ============================================================================ */
-
-/* Group blocks: drop the WP layout flow constraints that introduce extra margins. */
-.av-hero.wp-block-group,
-.av-section.wp-block-group,
-.av-card.wp-block-group,
-.av-card__body.wp-block-group,
-.av-container.wp-block-group,
-.av-hero__inner.wp-block-group {
- margin-block: 0;
-}
-
-/* Hero overrides — keep the hero layout we already had. */
-.av-hero.wp-block-group {
- display: flex;
- align-items: center;
- flex-direction: column;
- justify-content: center;
-}
-.av-hero__inner.wp-block-group {
- width: 100%;
-}
-
-/* Container blocks: WP `is-layout-constrained` pads/centers via wp-container-X
- helpers. We keep our own .av-container width/padding. */
-.av-container.wp-block-group {
- max-width: var(--container-max);
- margin-inline: auto;
- padding-inline: var(--container-padding-mobile);
- width: 100%;
-}
-@media (min-width: 768px) { .av-container.wp-block-group { padding-inline: var(--container-padding-tablet); } }
-@media (min-width: 1280px) { .av-container.wp-block-group { padding-inline: var(--container-padding-desktop); } }
-
-/* Columns: WP forces display:flex via .is-layout-flex. We force grid back so
- our 1/2/3/4-col responsive rules win. */
-.av-grid-3.wp-block-columns,
-.av-grid-3.wp-block-columns.is-layout-flex {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
-}
-@media (min-width: 768px) {
- .av-grid-3.wp-block-columns,
- .av-grid-3.wp-block-columns.is-layout-flex { grid-template-columns: repeat(2, 1fr); }
-}
-@media (min-width: 1024px) {
- .av-grid-3.wp-block-columns,
- .av-grid-3.wp-block-columns.is-layout-flex { grid-template-columns: repeat(3, 1fr); }
-}
-
-.av-grid-4.wp-block-columns,
-.av-grid-4.wp-block-columns.is-layout-flex {
- display: grid;
- grid-template-columns: 1fr;
- gap: var(--space-6);
-}
-@media (min-width: 768px) {
- .av-grid-4.wp-block-columns,
- .av-grid-4.wp-block-columns.is-layout-flex { grid-template-columns: repeat(2, 1fr); }
-}
-@media (min-width: 1280px) {
- .av-grid-4.wp-block-columns,
- .av-grid-4.wp-block-columns.is-layout-flex { grid-template-columns: repeat(4, 1fr); }
-}
-
-/* Each column: drop the flex-basis WP applies. */
-.wp-block-columns.av-grid-3 > .wp-block-column,
-.wp-block-columns.av-grid-4 > .wp-block-column {
- flex-basis: auto !important;
- flex-grow: 0 !important;
- min-width: 0 !important;
-}
-
-/* Section spacing — re-apply our padding-block to the migrated section blocks. */
-.av-section.wp-block-group {
- padding-block: var(--space-16);
-}
-@media (min-width: 1024px) {
- .av-section.wp-block-group { padding-block: var(--space-20); }
-}
-
-/* Cards inside a wp-block-column: keep our card design. */
-.av-card.wp-block-group {
- background-color: var(--color-bg-elevated);
- border-radius: var(--radius-md);
- box-shadow: var(--shadow-sm);
- overflow: hidden;
- height: 100%; /* fill the column for visual rhythm */
-}
-.av-card__body.wp-block-group {
- padding: var(--space-6);
- display: flex;
- flex-direction: column;
- gap: var(--space-3);
- height: 100%;
-}
-@media (min-width: 768px) {
- .av-card__body.wp-block-group { padding: var(--space-8); }
-}
-
-/* Buttons row: WP wraps every button in `.wp-block-button` and adds
- `.is-layout-flex` to the parent, which centers and adds gap.
- Strip the WP padding/margin so our `.av-btn` sizing wins. */
-.wp-block-buttons.av-card__cta,
-.wp-block-buttons.av-hero__ctas {
- margin: 0;
- padding: 0;
-}
-.wp-block-button.av-btn {
- margin: 0;
-}
-.wp-block-button.av-btn .wp-block-button__link {
- /* Reset Gutenberg's built-in button skin — let .av-btn rules win. */
- background: transparent;
- color: inherit;
- padding: 0;
- border-radius: 0;
- font-size: inherit;
- font-weight: inherit;
- line-height: 1;
- transition: none;
- text-decoration: none;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 100%;
- /* Inherit our .av-btn padding via the containing flex layout. */
-}
-/* Auto-margin-top to push CTAs to the bottom of cards. */
-.av-card__cta {
- margin-top: auto;
- padding-top: var(--space-4);
-}
-
-/* Eyebrow / overline reset — Gutenberg paragraph defaults could drift. */
-p.av-card__eyebrow,
-p.av-hero__eyebrow {
- margin: 0;
-}
-
-/* WordPress core "global styles" reset noise — collapse the auto block-margin
- that pushes our text away from the hero edges. */
-.wp-block-group.av-hero > .wp-block-group,
-.wp-block-group.av-section > .wp-block-group {
- margin-block: 0;
-}
-
-
-/* ============================================================================
- 13. Reveal animation (scroll-triggered, JS-driven via main.js)
- ============================================================================ */
-
-[data-av-reveal] {
- opacity: 0;
- transform: translateY(16px);
- transition:
- opacity var(--duration-deliberate) var(--ease-default),
- transform var(--duration-deliberate) var(--ease-default);
-}
-[data-av-reveal].is-revealed,
-.no-js [data-av-reveal] {
- opacity: 1;
- transform: translateY(0);
-}
-@media (prefers-reduced-motion: reduce) {
- [data-av-reveal] { opacity: 1; transform: none; transition: none; }
-}
diff --git a/wp-content/themes/asterion-bricks/assets/css/utilities.css b/wp-content/themes/asterion-bricks/assets/css/utilities.css
index dfe7591..da97678 100644
--- a/wp-content/themes/asterion-bricks/assets/css/utilities.css
+++ b/wp-content/themes/asterion-bricks/assets/css/utilities.css
@@ -1,110 +1,13 @@
/**
- * Asterion Bricks — Utilities
+ * Asterion Bricks — Utilities (minimalist)
*
- * Modern CSS reset + reusable utility classes.
- * Loaded after tokens.css, before components.css.
- *
- * Naming : prefix `av-` on every custom class.
+ * Loaded after tokens.css. Holds the small set of helper classes Bricks
+ * Builder cannot easily provide on its own (skip link, screen-reader-only
+ * text, focus ring). Everything else — section padding, container widths,
+ * button design, card styles — is set inside Bricks via tokens.
*/
-/* ============================================================================
- Modern CSS reset (inspired by Andy Bell's modern-css-reset, Josh Comeau)
- ============================================================================ */
-
-*, *::before, *::after { box-sizing: border-box; }
-
-* { margin: 0; padding: 0; }
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- scroll-behavior: smooth;
- text-rendering: optimizeLegibility;
-}
-
-body {
- font-family: var(--font-body);
- font-size: var(--text-body-md);
- line-height: var(--leading-body-md);
- color: var(--color-text-primary);
- background-color: var(--color-bg-default);
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- min-height: 100vh;
-}
-
-img, picture, video, canvas, svg {
- display: block;
- max-width: 100%;
- height: auto;
-}
-
-input, button, textarea, select { font: inherit; color: inherit; }
-
-p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }
-
-a {
- color: inherit;
- text-decoration: none;
-}
-
-ul, ol { list-style: none; }
-
-table { border-collapse: collapse; border-spacing: 0; }
-
-/* ============================================================================
- Heading hierarchy — opinionated defaults consumed when an element
- carries no Bricks-specific class. Bricks may override, that's expected.
- ============================================================================ */
-
-h1 {
- font-family: var(--font-display);
- font-size: var(--text-h1);
- line-height: var(--leading-h1);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-snug);
-}
-h2 {
- font-family: var(--font-display);
- font-size: var(--text-h2);
- line-height: var(--leading-h2);
- font-weight: var(--font-weight-bold);
- letter-spacing: var(--tracking-snug);
-}
-h3 {
- font-family: var(--font-display);
- font-size: var(--text-h3);
- line-height: var(--leading-h3);
- font-weight: var(--font-weight-semibold);
- letter-spacing: var(--tracking-snug);
-}
-h4 {
- font-family: var(--font-display);
- font-size: var(--text-h4);
- line-height: var(--leading-h4);
- font-weight: var(--font-weight-semibold);
-}
-
-p {
- max-width: 72ch; /* prose readability per Design Handoff section 2.2 */
-}
-
-/* ============================================================================
- Focus visible — keyboard accessibility
- Removes outline only when focus came from the mouse; preserves it for keyboard.
- ============================================================================ */
-
-:focus { outline: none; }
-
-:focus-visible {
- outline: var(--focus-ring-width) solid var(--focus-ring-color);
- outline-offset: var(--focus-ring-offset);
-}
-
-/* ============================================================================
- Skip link — first focusable element on every page (a11y)
- ============================================================================ */
-
+/* === A11y skip link — first focusable element on every page === */
.av-skip-link {
position: absolute;
top: -40px;
@@ -114,6 +17,7 @@ p {
color: var(--color-text-on-dark);
font-size: var(--text-body-sm);
font-weight: var(--font-weight-semibold);
+ text-decoration: none;
z-index: var(--z-toast);
border-bottom-right-radius: var(--radius-md);
}
@@ -122,10 +26,7 @@ p {
top: 0;
}
-/* ============================================================================
- Visually hidden — content readable by screen readers, hidden visually
- ============================================================================ */
-
+/* === Visually hidden — readable by screen readers, hidden visually === */
.av-sr-only {
position: absolute;
width: 1px;
@@ -138,77 +39,25 @@ p {
border: 0;
}
-/* ============================================================================
- Container — centred max-width with responsive padding
- ============================================================================ */
-
-.av-container {
- max-width: var(--container-max);
- margin-inline: auto;
- padding-inline: var(--container-padding-mobile);
- width: 100%;
+/* === Focus visible — keyboard accessibility on every focusable element === */
+:focus { outline: none; }
+:focus-visible {
+ outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--color-info));
+ outline-offset: var(--focus-ring-offset, 2px);
}
-@media (min-width: 768px) {
- .av-container { padding-inline: var(--container-padding-tablet); }
-}
-
-@media (min-width: 1280px) {
- .av-container { padding-inline: var(--container-padding-desktop); }
-}
-
-.av-container--narrow {
- max-width: 800px; /* article body */
-}
-
-/* ============================================================================
- Tap target minimum — WCAG AA / Apple HIG (44×44px)
- ============================================================================ */
-
+/* === Touch target minimum (WCAG AA / Apple HIG) === */
.av-tap-target {
- min-width: var(--tap-target-min);
- min-height: var(--tap-target-min);
+ min-width: var(--tap-target-min, 44px);
+ min-height: var(--tap-target-min, 44px);
}
-/* ============================================================================
- Stack helpers — vertical rhythm via owl-selector
- ============================================================================ */
-
-.av-stack > * + * { margin-top: var(--av-stack-gap, var(--space-4)); }
-.av-stack--sm > * + * { margin-top: var(--space-2); }
-.av-stack--md > * + * { margin-top: var(--space-4); }
-.av-stack--lg > * + * { margin-top: var(--space-8); }
-.av-stack--xl > * + * { margin-top: var(--space-12); }
-
-/* ============================================================================
- Section padding helpers (vertical rhythm between page sections)
- ============================================================================ */
-
-.av-section {
- padding-block: var(--space-16);
-}
-@media (min-width: 1024px) {
- .av-section { padding-block: var(--space-20); }
-}
-
-.av-section--hero {
- padding-block: var(--space-24);
-}
-@media (min-width: 1024px) {
- .av-section--hero { padding-block: var(--space-32); }
-}
-
-.av-section--dark {
- background-color: var(--color-bg-dark);
- color: var(--color-text-on-dark);
-}
-
-/* ============================================================================
- Print
- ============================================================================ */
-
-@media print {
- .av-skip-link, .av-no-print { display: none !important; }
- body { color: #000; background: #fff; }
- a::after { content: " (" attr(href) ")"; font-size: 0.8em; }
+/* === Reduced motion — respect user preference === */
+@media (prefers-reduced-motion: reduce) {
+ *, *::before, *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
}
diff --git a/wp-content/themes/asterion-bricks/assets/js/main.js b/wp-content/themes/asterion-bricks/assets/js/main.js
deleted file mode 100644
index 1482fd0..0000000
--- a/wp-content/themes/asterion-bricks/assets/js/main.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/**
- * Asterion Bricks — main JS
- *
- * Vanilla JS, defer-loaded. Wraps everything in DOMContentLoaded.
- * Performance budget : initial bundle < 200 KB gzipped.
- *
- * Modules planned :
- * - Header scroll behavior (background swap after 80px)
- * - Mega menu trigger (hover desktop, click touch, ESC closes)
- * - Mobile drawer (full-screen overlay, accordion sections)
- * - Scroll-triggered fade-in (IntersectionObserver, threshold 0.15)
- * - Stat callouts count-up (1000ms ease-out)
- * - Hero video lazy-load + reduced-motion fallback to poster
- */
-
-(function () {
- 'use strict';
-
- /**
- * Detect reduced motion once and expose a flag for downstream modules.
- * Updated reactively if the user toggles the setting mid-session.
- */
- const reducedMotionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
- let prefersReducedMotion = reducedMotionQuery.matches;
- reducedMotionQuery.addEventListener('change', (e) => {
- prefersReducedMotion = e.matches;
- });
-
- /**
- * Header scroll behavior.
- * After 80px scroll, header gets a `is-scrolled` class
- * (consumed by .av-header.is-scrolled rule in components.css).
- */
- function initHeaderScroll() {
- const header = document.querySelector('.av-header');
- if (!header) return;
-
- let ticking = false;
- const onScroll = () => {
- if (!ticking) {
- window.requestAnimationFrame(() => {
- header.classList.toggle('is-scrolled', window.scrollY > 80);
- ticking = false;
- });
- ticking = true;
- }
- };
- onScroll();
- window.addEventListener('scroll', onScroll, { passive: true });
- }
-
- /**
- * Scroll-triggered fade-in (Design Handoff section 5.3).
- * Sections fade-in + slide-up 16px on entry, threshold 0.15, trigger once.
- * Skipped entirely if user prefers reduced motion.
- */
- function initScrollReveal() {
- if (prefersReducedMotion) return;
-
- const targets = document.querySelectorAll('[data-av-reveal]');
- if (!targets.length) return;
-
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- if (entry.isIntersecting) {
- entry.target.classList.add('is-revealed');
- observer.unobserve(entry.target);
- }
- });
- }, { threshold: 0.15, rootMargin: '0px 0px -10% 0px' });
-
- targets.forEach((target) => observer.observe(target));
- }
-
- /**
- * Stat count-up (Design Handoff section 5.3).
- * Element : target
- * Animates from 0 to target value over duration ms, ease-out.
- */
- function initStatCountUp() {
- if (prefersReducedMotion) return;
-
- const stats = document.querySelectorAll('[data-av-countup]');
- if (!stats.length) return;
-
- const observer = new IntersectionObserver((entries) => {
- entries.forEach((entry) => {
- if (!entry.isIntersecting) return;
- const el = entry.target;
- const target = parseFloat(el.dataset.avCountup) || 0;
- const duration = parseInt(el.dataset.avCountupDuration || '1000', 10);
- const start = performance.now();
-
- const tick = (now) => {
- const elapsed = Math.min((now - start) / duration, 1);
- // ease-out cubic
- const eased = 1 - Math.pow(1 - elapsed, 3);
- el.textContent = Math.round(target * eased).toLocaleString();
- if (elapsed < 1) requestAnimationFrame(tick);
- };
- requestAnimationFrame(tick);
- observer.unobserve(el);
- });
- }, { threshold: 0.5 });
-
- stats.forEach((s) => observer.observe(s));
- }
-
- /**
- * Mobile drawer toggle.
- * Trigger :