feat(industries): build 5-page Industries section
Implements the Industries hub + 4 detail pages (Police, Special Forces, Military, Firefighters) following the same data + partial + custom template pattern as Solutions. - inc/industries-data.php: 4 industries keyed by slug, copy verbatim from PDF Strategie & Contenu D.7-D.10. - template-parts/industry-detail.php: hero + section iterator + shared conversion banner. Hero differs from Solution's: eyebrow + tagline-as-H1 (no trademark concat), no upsell block. - templates/page-industry-detail.php: Custom Template assigned to the 4 child pages, looks up slug in industries-data. - templates/page-industries-overview.php: Hub /industries/ with 4 cards. 5 pages seeded by one-shot mu-plugin (asterion-seed-industries.php in LocalWP) and verified HTTP 200: /industries/ 55 KB /industries/police/ 63 KB /industries/special-forces/ 62 KB /industries/military/ 60 KB /industries/firefighters/ 60 KB Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
245
wp-content/themes/asterion-bricks/inc/industries-data.php
Normal file
245
wp-content/themes/asterion-bricks/inc/industries-data.php
Normal file
@@ -0,0 +1,245 @@
|
||||
<?php
|
||||
/**
|
||||
* Asterion Bricks — Industries data
|
||||
*
|
||||
* Source of truth for the 4 industry pages (Police, Special Forces, Military,
|
||||
* Firefighters). Copy lifted verbatim from PDF Strategie & Contenu D.7-D.10.
|
||||
*
|
||||
* Same section schema as inc/solutions-data.php : prose | cards | list | cta.
|
||||
*
|
||||
* @package AsterionBricks
|
||||
*/
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
return [
|
||||
|
||||
/* ========================================================== */
|
||||
/* POLICE — national & municipal */
|
||||
/* ========================================================== */
|
||||
'police' => [
|
||||
'eyebrow' => 'National & Municipal',
|
||||
'title' => 'Police',
|
||||
'tagline' => "Police training, when the schedule won't bend.",
|
||||
'meta_title' => 'VR Training for Police — National & Municipal | Asterion VR',
|
||||
'meta_description' => 'Vehicle stops, identity checks, urban CQB, de-escalation, riot containment. The VR training platform built for contemporary policing.',
|
||||
'hero_lead' => 'Your officers train less than the doctrine demands. Live-fire ranges are saturated. Live exercises are rare and expensive. PROSERVE puts a saturated range, an urban CQB course, and a de-escalation rehearsal hall in the same facility you already run — and lets your officers use them every shift.',
|
||||
'ctas' => [
|
||||
['label' => 'Request a Demo for police use', 'href' => '/request-demo/', 'variant' => 'primary'],
|
||||
],
|
||||
'sections' => [
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'The reality',
|
||||
'title' => 'The training deficit, in numbers.',
|
||||
'items' => [
|
||||
'French regulation requires 90 cartridges fired per officer per year. The actual median sits between 10 and 15.',
|
||||
'A live-fire exercise costs 5 to 7 times more than the equivalent simulated exercise (RAND Corporation, 2021).',
|
||||
'Only 12% of police exercises integrate physiological stressors comparable to real conditions (National Police Foundation, 2021).',
|
||||
'Tactical errors under stress increase by 40% compared to baseline conditions (Journal of Experimental Psychology, 2020).',
|
||||
'42% of intervention errors are linked to insufficient realistic preparation (National Institute of Justice, 2022).',
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'cards',
|
||||
'eyebrow' => 'What PROSERVE does for police',
|
||||
'title' => 'What PROSERVE delivers.',
|
||||
'items' => [
|
||||
['title' => 'Volume — train every shift, not every quarter', 'body' => 'With MY PROSERVE in 9 m² of station floor, every officer can drill marksmanship, vehicle stops, and identity checks between two patrols. The legal floor becomes the daily floor.'],
|
||||
['title' => 'Realism — under stress, with real recoil', 'body' => 'Unreal Engine 5 rendering. Physical ballistic simulation. Real-recoil weapons. AI civilians who panic, freeze, run, comply, or escalate. Urban environments — supermarkets, residential apartments, transit stations, parking decks — with day, night, and emergency-light conditions.'],
|
||||
['title' => 'Decision-making — judgment and the law', 'body' => 'Many of our scenarios force the trainee to choose: shoot, hold, communicate, retreat. Every decision is recorded, replayable, and discussable in the AAR. Training the body is one thing. Training the decision is another.'],
|
||||
['title' => 'Data — measurable progress per officer', 'body' => 'Reaction time, precision, civilian collateral, target identification accuracy. Per-officer dashboards over time. Unit-level statistics for command. Evidence to support training decisions, deployments, and audits.'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Police-relevant scenarios',
|
||||
'title' => 'Scenarios designed with police instructors.',
|
||||
'items' => [
|
||||
'Vehicle stop with cooperative, evasive, or armed driver',
|
||||
'Identity check escalating to violent resistance',
|
||||
'CQB entry into a residential apartment',
|
||||
'Active shooter in a supermarket',
|
||||
'Hostage situation in a small business',
|
||||
'Crowd containment with isolated aggressor',
|
||||
'Domestic violence intervention',
|
||||
'Fugitive pursuit through a parking deck',
|
||||
'Static guard duties at sensitive facilities',
|
||||
],
|
||||
'cta' => ['label' => 'See the full scenario library', 'href' => '/technology/scenarios/'],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Configurations',
|
||||
'title' => 'Recommended configurations for police.',
|
||||
'items' => [
|
||||
'MY PROSERVE — for police municipale, station-floor continuous training, regional rollouts.',
|
||||
'PROSERVE FLEX — for tactical units, mobile gendarmerie, BAC, K9 handlers.',
|
||||
'PROSERVE ACADEMY — for police academies and regional training centres.',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
/* ========================================================== */
|
||||
/* SPECIAL FORCES */
|
||||
/* ========================================================== */
|
||||
'special-forces' => [
|
||||
'eyebrow' => 'Tactical units',
|
||||
'title' => 'Special Forces',
|
||||
'tagline' => 'Special forces train differently. Their simulation should, too.',
|
||||
'meta_title' => 'VR Training for Special Forces & Tactical Units | Asterion VR',
|
||||
'meta_description' => 'Hostage rescue, dynamic entries, sniper-spotter coordination, hostile crowd extraction. Built for the units where every error has a name.',
|
||||
'hero_lead' => 'PROSERVE was built in close partnership with serving and former tactical operators. It rejects the generic FPS-style simulator. The ballistics are physical. The recoil is real. The civilians act on personality, not script. The instructor sees what no one else can. And every session ends with a frame-by-frame after-action review.',
|
||||
'ctas' => [
|
||||
['label' => 'Request a T&E Kit', 'href' => '/request-te-kit/', 'variant' => 'primary'],
|
||||
],
|
||||
'sections' => [
|
||||
[
|
||||
'type' => 'prose',
|
||||
'eyebrow' => 'Why this matters',
|
||||
'title' => 'Why generic simulators fail tactical units.',
|
||||
'body' => "Most VR training tools were built for entertainment first, training second. They look right at thirty meters and break apart at three. PROSERVE was engineered the other way: ballistic physics first, AI behavior second, photoreal rendering third. Because tactical units don't grade themselves on visuals. They grade themselves on the call they made under contact.",
|
||||
],
|
||||
[
|
||||
'type' => 'cards',
|
||||
'eyebrow' => 'Capabilities tactical units care about',
|
||||
'title' => 'Capabilities specifically built for elite units.',
|
||||
'items' => [
|
||||
['title' => 'Cooperative team scenarios', 'body' => 'Up to 16 operators in the same scenario. Avatars whose role-specific appearance signals function: point, breach, security, sniper, K9, command. Voice communication is proximity-natural. Hand signals are visible.'],
|
||||
['title' => 'Bespoke scenarios on demand', 'body' => 'PROSERVE+ produces custom environments — your specific buildings, your area of operations, your high-value targets. From specification to delivery: one to three months per environment.'],
|
||||
['title' => 'Real-weapon integration', 'body' => "Use your service weapon firing blanks, fitted with our UWeD. Or use a high-fidelity gas-blowback replica. Either way, recoil, sound, and tracking remain coherent. Shot detection is dual-channel (sound + recoil) to avoid false positives from a teammate's fire."],
|
||||
['title' => 'AI adversaries with personality', 'body' => 'Our autonomous agents have vision, hearing, and configurable personality — courage, caution, aggressiveness. They flee, take cover, change targets, coordinate. They do not run on scripts. The same scenario is never identical twice.'],
|
||||
['title' => 'Instructor cockpit', 'body' => "From a separate room, the instructor walks through walls, watches the engagement from any angle, switches into any operator's first-person view, toggles shot trace and field-of-view overlays, manipulates the scenario without pausing it."],
|
||||
['title' => 'Frame-level AAR', 'body' => "Replay any session in top-down tactical, free-camera, or any operator's first-person view. Speed control, pause, frame-by-frame. Field of view of every trainee, shot trace, hit location, reaction time. Compare runs to runs, operators to operators, unit to historical baseline."],
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Sample doctrine drills',
|
||||
'title' => 'Sample doctrine drills.',
|
||||
'items' => [
|
||||
'Dynamic entry on a multi-room residence with hostages and unknowns',
|
||||
'Hostage rescue in a moving vehicle',
|
||||
'Counter-piracy entry on a vessel with hostile crew',
|
||||
'Sniper-spotter coordination on a long-range engagement',
|
||||
'VIP extraction from a hostile crowd',
|
||||
'Counter-IED awareness in a vehicle convoy',
|
||||
'Counter-drone intercept (with PROSERVE+ counter-UAS module)',
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Configurations',
|
||||
'title' => 'Recommended configurations.',
|
||||
'items' => [
|
||||
'PROSERVE FLEX — for forward deployment, on-site training, partner-force training programs.',
|
||||
'PROSERVE ACADEMY — for permanent training facilities, doctrine R&D, joint-services exercises.',
|
||||
'PROSERVE+ — bespoke environments, custom adversary doctrine, country-specific weapon profiles.',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
/* ========================================================== */
|
||||
/* MILITARY */
|
||||
/* ========================================================== */
|
||||
'military' => [
|
||||
'eyebrow' => 'Armed forces',
|
||||
'title' => 'Military',
|
||||
'tagline' => 'Military VR training. Sovereign. Modular. Field-deployable.',
|
||||
'meta_title' => 'Military VR Training — Asterion VR | Sovereign, Modular, Field-Ready',
|
||||
'meta_description' => 'MOUT, convoy escort, FOB defense, IED awareness, joint drills. French-engineered, GDPR-native, fully offline-capable VR training.',
|
||||
'hero_lead' => 'PROSERVE supports modern military training across infantry, urban operations, convoy escort, and joint drills. The platform is designed in France, runs entirely on-premise, and operates without any internet connection. Your data, your scenarios, your operators — never leave your network.',
|
||||
'ctas' => [
|
||||
['label' => 'Request a Quote', 'href' => '/request-quote/', 'variant' => 'primary'],
|
||||
],
|
||||
'sections' => [
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Why sovereignty matters',
|
||||
'title' => 'Sovereignty by design.',
|
||||
'items' => [
|
||||
'Engineered and produced in France — not a relabeled foreign platform.',
|
||||
'On-premise compute — no cloud dependency, no foreign data jurisdiction.',
|
||||
'Operates fully offline — your training scenarios, your unit data, your AAR videos never leave your network.',
|
||||
'GDPR-native — designed under European data protection by default.',
|
||||
'Custom development under sovereign-clearable conditions on request.',
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'cards',
|
||||
'eyebrow' => 'Military capabilities',
|
||||
'title' => 'Military-grade capabilities.',
|
||||
'items' => [
|
||||
['title' => 'MOUT — Military Operations on Urban Terrain', 'body' => 'CQB on residential, commercial, industrial, and government building interiors. Bespoke environments replicating actual mission geometry available through PROSERVE+.'],
|
||||
['title' => 'Convoy escort', 'body' => 'Vehicle-mounted weapon training, IED-proximity awareness, immediate action drills under contact.'],
|
||||
['title' => 'FOB and base defense', 'body' => 'Static and dynamic perimeter defense scenarios. Counter-infiltration drills. Coordinated response to multi-vector threats.'],
|
||||
['title' => 'Joint operation drills', 'body' => 'Multi-team scenarios with up to 16 operators in the same simulation. Mixed-role exercises (infantry + special forces + command). Inter-services coordination.'],
|
||||
['title' => 'Counter-drone training', 'body' => 'PROSERVE+ counter-UAS module for the detection, identification, and intercept of hostile drones in operational environments.'],
|
||||
['title' => 'Live-data capture and AAR', 'body' => 'Per-operator and per-unit performance dashboards, exportable for command-level review and after-action analysis.'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Configurations',
|
||||
'title' => 'Recommended configurations.',
|
||||
'items' => [
|
||||
'PROSERVE FLEX — for forward operating bases, deployable training cells, mobile training teams.',
|
||||
'PROSERVE ACADEMY — for garrison training centres and doctrine schools.',
|
||||
'PROSERVE+ — bespoke environments and adversary doctrine.',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
/* ========================================================== */
|
||||
/* FIREFIGHTERS */
|
||||
/* ========================================================== */
|
||||
'firefighters' => [
|
||||
'eyebrow' => 'Emergency services',
|
||||
'title' => 'Firefighters',
|
||||
'tagline' => 'Train the worst day. Safely. Repeatedly.',
|
||||
'meta_title' => 'VR Training for Firefighters & Emergency Services | Asterion VR',
|
||||
'meta_description' => 'Structure fires, hazmat, multi-casualty triage, confined-space rescue. Train the worst day, safely, repeatedly, at one-tenth the cost.',
|
||||
'hero_lead' => "Real fire is loud, hot, and finite. You can't rehearse a chemical leak the right way, you can't run a multi-casualty extraction every Tuesday, and you can't put recruits through a confined-space rescue at full scale. PROSERVE for firefighters and emergency services lets your crews drill the rare, the dangerous, and the irreversible — as often as needed.",
|
||||
'ctas' => [
|
||||
['label' => 'Request a Demo for fire & emergency', 'href' => '/request-demo/', 'variant' => 'primary'],
|
||||
],
|
||||
'sections' => [
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'The case for VR in fire training',
|
||||
'title' => 'The economics of fire training.',
|
||||
'items' => [
|
||||
'Live-fire exercises require purpose-built training structures, environmental compliance, and significant logistics.',
|
||||
'Rare scenarios (industrial accidents, NRBC, mass-casualty triage) are nearly impossible to rehearse at full scale.',
|
||||
'VR sessions cost a fraction of an equivalent live exercise — and can run multiple times per day, with consistent fidelity.',
|
||||
'AAR is video-recorded, replayable, and measurable — not relying on instructor recall.',
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'cards',
|
||||
'eyebrow' => 'Capabilities for fire & emergency',
|
||||
'title' => 'Capabilities built for first responders.',
|
||||
'items' => [
|
||||
['title' => 'Structure fires', 'body' => 'Residential, commercial, and industrial structure-fire scenarios with smoke, heat-haze visual effects, dynamic fire spread, and victim location uncertainty. Practice search-and-rescue patterns, ventilation decisions, and command communication.'],
|
||||
['title' => 'Hazmat & NRBC', 'body' => 'Chemical, radiological, and biological scenarios that cannot be rehearsed with real materials. Practice donning, decontamination, perimeter establishment, and specialized equipment use.'],
|
||||
['title' => 'Confined-space and high-angle rescue', 'body' => 'Train rope work, confined-space entry, and casualty extraction in geometry that mirrors real intervention contexts.'],
|
||||
['title' => 'Multi-casualty triage', 'body' => 'Practice mass-casualty triage at scale. AI casualties with realistic injury presentations and time-dependent deterioration.'],
|
||||
['title' => 'Industrial accidents', 'body' => 'Custom scenarios via PROSERVE+ that replicate the specific industrial sites in your area of operation — refineries, chemical plants, transport hubs.'],
|
||||
['title' => 'Joint exercises with police', 'body' => 'Fire-police-medical joint scenarios. Same scenario, mixed avatars, real-time inter-services coordination drills.'],
|
||||
],
|
||||
],
|
||||
[
|
||||
'type' => 'list',
|
||||
'eyebrow' => 'Configurations',
|
||||
'title' => 'Recommended configurations.',
|
||||
'items' => [
|
||||
'PROSERVE FLEX — for SDIS regional training cells and on-site continuous training.',
|
||||
'PROSERVE ACADEMY — for national and regional firefighter schools.',
|
||||
'PROSERVE+ — local industrial site replicas, NRBC scenarios, joint multi-services exercises.',
|
||||
],
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -0,0 +1,130 @@
|
||||
<?php
|
||||
/**
|
||||
* Asterion Bricks — Industry detail partial
|
||||
*
|
||||
* Renders one industry page (Police / Special Forces / Military / Firefighters)
|
||||
* from data passed via `set_query_var('av_industry', $industry_data)`.
|
||||
*
|
||||
* Section types : prose | cards | list | cta (same as solution-detail).
|
||||
*
|
||||
* Hero differs from solution-detail : eyebrow + H1 (tagline) only — no
|
||||
* trademark concat, no upsell block.
|
||||
*
|
||||
* @package AsterionBricks
|
||||
*/
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
$industry = get_query_var('av_industry');
|
||||
if (! is_array($industry)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$home_url = home_url('/');
|
||||
?>
|
||||
|
||||
<!-- HERO -->
|
||||
<section class="av-hero" aria-labelledby="industry-headline">
|
||||
<div class="av-hero__media" aria-hidden="true">
|
||||
<div style="width:100%;height:100%;background:
|
||||
radial-gradient(ellipse at 50% 40%, rgba(11,31,58,0.4), transparent 65%),
|
||||
linear-gradient(135deg, #081427 0%, #0B1F3A 50%, #1F3252 100%);"></div>
|
||||
</div>
|
||||
<div class="av-container">
|
||||
<div class="av-hero__inner">
|
||||
<p class="av-hero__eyebrow"><?php echo esc_html($industry['eyebrow']); ?></p>
|
||||
<h1 id="industry-headline" class="av-hero__headline"><?php echo esc_html($industry['tagline']); ?></h1>
|
||||
<p class="av-hero__sub"><?php echo esc_html($industry['hero_lead']); ?></p>
|
||||
<div class="av-hero__ctas">
|
||||
<?php foreach ($industry['ctas'] as $cta) :
|
||||
$variant = ($cta['variant'] === 'primary') ? 'av-btn--primary' : 'av-btn--secondary av-btn--on-dark';
|
||||
?>
|
||||
<a href="<?php echo esc_url($home_url . ltrim($cta['href'], '/')); ?>" class="av-btn <?php echo esc_attr($variant); ?> av-btn--lg">
|
||||
<?php echo esc_html($cta['label']); ?>
|
||||
</a>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- SECTIONS -->
|
||||
<?php
|
||||
foreach ($industry['sections'] as $idx => $section) :
|
||||
$is_dark = ($idx % 2 === 1);
|
||||
$section_class = 'av-section' . ($is_dark ? ' av-section--dark' : '');
|
||||
?>
|
||||
<section class="<?php echo esc_attr($section_class); ?>" data-av-reveal>
|
||||
<div class="av-container">
|
||||
<div class="av-section__head">
|
||||
<span class="av-eyebrow<?php echo $is_dark ? ' av-eyebrow--gold' : ''; ?>"><?php echo esc_html($section['eyebrow']); ?></span>
|
||||
<h2 class="av-section__title"><?php echo esc_html($section['title']); ?></h2>
|
||||
<?php if (! empty($section['lead'])) : ?>
|
||||
<p class="av-section__lead"><?php echo esc_html($section['lead']); ?></p>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<?php if ($section['type'] === 'prose' && ! empty($section['body'])) : ?>
|
||||
<p class="av-section__lead" style="max-width:72ch;font-size:var(--text-body-lg);">
|
||||
<?php echo esc_html($section['body']); ?>
|
||||
</p>
|
||||
|
||||
<?php elseif ($section['type'] === 'cards' && ! empty($section['items'])) : ?>
|
||||
<div class="av-grid-3">
|
||||
<?php foreach ($section['items'] as $card) : ?>
|
||||
<article class="av-card<?php echo $is_dark ? ' is-on-dark' : ''; ?> av-card--feature">
|
||||
<div class="av-card__body">
|
||||
<h3 class="av-card__title" style="font-size:var(--text-h4);"><?php echo esc_html($card['title']); ?></h3>
|
||||
<p class="av-card__excerpt"><?php echo esc_html($card['body']); ?></p>
|
||||
</div>
|
||||
</article>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
|
||||
<?php elseif ($section['type'] === 'list' && ! empty($section['items'])) : ?>
|
||||
<ul style="list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:var(--space-3);max-width:72ch;font-size:var(--text-body-lg);line-height:var(--leading-body-lg);<?php echo $is_dark ? 'color:var(--color-text-on-dark-muted);' : 'color:var(--color-text-secondary);'; ?>">
|
||||
<?php foreach ($section['items'] as $item) : ?>
|
||||
<li style="padding-left:var(--space-6);position:relative;">
|
||||
<span aria-hidden="true" style="position:absolute;left:0;top:0.6em;width:8px;height:8px;background:var(--color-brand-gold);border-radius:50%;"></span>
|
||||
<?php echo esc_html($item); ?>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php if (! empty($section['cta'])) : ?>
|
||||
<p style="margin-top:var(--space-8);">
|
||||
<a href="<?php echo esc_url($home_url . ltrim($section['cta']['href'], '/')); ?>" class="av-link<?php echo $is_dark ? ' av-link--on-dark' : ''; ?> av-link--with-arrow">
|
||||
<?php echo esc_html($section['cta']['label']); ?>
|
||||
</a>
|
||||
</p>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<!-- CONVERSION BANNER (shared) -->
|
||||
<section class="av-conversion-banner">
|
||||
<div class="av-container">
|
||||
<div class="av-conversion-banner__head">
|
||||
<h2 class="av-conversion-banner__title">Train like the threat is now.</h2>
|
||||
<p class="av-conversion-banner__lead">Three paths into the platform — pick the one that fits where you are.</p>
|
||||
</div>
|
||||
<div class="av-conversion-banner__grid">
|
||||
<div class="av-conversion-banner__card">
|
||||
<h3 class="av-conversion-banner__card-title">Request a Demo</h3>
|
||||
<p class="av-conversion-banner__card-desc">A 30-minute tailored session with our team.</p>
|
||||
<a href="<?php echo esc_url($home_url . 'request-demo/'); ?>" class="av-btn av-btn--primary av-btn--md">Schedule a demo</a>
|
||||
</div>
|
||||
<div class="av-conversion-banner__card">
|
||||
<h3 class="av-conversion-banner__card-title">Request a T&E Kit</h3>
|
||||
<p class="av-conversion-banner__card-desc">A PROSERVE case on loan at your facility for 5 to 10 days.</p>
|
||||
<a href="<?php echo esc_url($home_url . 'request-te-kit/'); ?>" class="av-btn av-btn--on-dark av-btn--secondary av-btn--md">Request the kit</a>
|
||||
</div>
|
||||
<div class="av-conversion-banner__card">
|
||||
<h3 class="av-conversion-banner__card-title">Request a Quote</h3>
|
||||
<p class="av-conversion-banner__card-desc">A detailed quote and deployment plan within 5 working days.</p>
|
||||
<a href="<?php echo esc_url($home_url . 'request-quote/'); ?>" class="av-btn av-btn--on-dark av-btn--secondary av-btn--md">Get a quote</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* Template Name: Industries Overview
|
||||
*
|
||||
* Hub page /industries/ — lists the 4 industries as cards.
|
||||
*
|
||||
* @package AsterionBricks
|
||||
*/
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
get_header();
|
||||
$home_url = home_url('/');
|
||||
|
||||
$industries = [
|
||||
[
|
||||
'eyebrow' => 'National & Municipal',
|
||||
'title' => 'Police',
|
||||
'excerpt' => 'Vehicle stops, identity checks, urban CQB, de-escalation, riot containment. Built for the realities of contemporary policing.',
|
||||
'href' => '/industries/police/',
|
||||
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
|
||||
],
|
||||
[
|
||||
'eyebrow' => 'Tactical units',
|
||||
'title' => 'Special Forces',
|
||||
'excerpt' => 'Hostage rescue, dynamic entries, hostile crowd extraction, sniper-spotter coordination. Built for the units where every error has a name.',
|
||||
'href' => '/industries/special-forces/',
|
||||
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
|
||||
],
|
||||
[
|
||||
'eyebrow' => 'Armed forces',
|
||||
'title' => 'Military',
|
||||
'excerpt' => 'MOUT, convoy escort, FOB defense, IED awareness, joint operation drills. Built for armed forces that deploy fast and adapt faster.',
|
||||
'href' => '/industries/military/',
|
||||
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
|
||||
],
|
||||
[
|
||||
'eyebrow' => 'Emergency services',
|
||||
'title' => 'Firefighters',
|
||||
'excerpt' => "Structure fires, hazmat, multi-casualty triage, confined-space rescue, industrial accidents. Built for first responders who can't rehearse the worst day at full scale.",
|
||||
'href' => '/industries/firefighters/',
|
||||
'gradient' => 'linear-gradient(135deg,#1F3252,#0B1F3A)',
|
||||
],
|
||||
];
|
||||
?>
|
||||
|
||||
<section class="av-hero" aria-labelledby="industries-headline">
|
||||
<div class="av-hero__media" aria-hidden="true">
|
||||
<div style="width:100%;height:100%;background:
|
||||
radial-gradient(ellipse at 50% 40%, rgba(11,31,58,0.4), transparent 65%),
|
||||
linear-gradient(135deg, #081427 0%, #0B1F3A 50%, #1F3252 100%);"></div>
|
||||
</div>
|
||||
<div class="av-container">
|
||||
<div class="av-hero__inner">
|
||||
<p class="av-hero__eyebrow"><?php esc_html_e('Industries', 'asterion-bricks'); ?></p>
|
||||
<h1 id="industries-headline" class="av-hero__headline">Built with operators, for operators.</h1>
|
||||
<p class="av-hero__sub">
|
||||
PROSERVE™ is not a generic VR platform repackaged for the public sector. Every scenario, every weapon profile, every instructor metric was specified by serving and former operators in close partnership with our engineering team.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="av-section" data-av-reveal>
|
||||
<div class="av-container">
|
||||
<div class="av-grid-4" style="grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));">
|
||||
<?php foreach ($industries as $i) : ?>
|
||||
<article class="av-card">
|
||||
<a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" class="av-card__media" aria-hidden="true" tabindex="-1" style="background:<?php echo esc_attr($i['gradient']); ?>;display:block;"></a>
|
||||
<div class="av-card__body">
|
||||
<span class="av-card__eyebrow"><?php echo esc_html($i['eyebrow']); ?></span>
|
||||
<h2 class="av-card__title"><a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" style="color:inherit;text-decoration:none;"><?php echo esc_html($i['title']); ?></a></h2>
|
||||
<p class="av-card__excerpt"><?php echo esc_html($i['excerpt']); ?></p>
|
||||
<div class="av-card__cta">
|
||||
<a href="<?php echo esc_url($home_url . ltrim($i['href'], '/')); ?>" class="av-link av-link--with-arrow"><?php echo esc_html($i['title']); ?> training</a>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php get_footer(); ?>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
/**
|
||||
* Template Name: Industry Detail
|
||||
*
|
||||
* Custom page template for /industries/police/, /industries/special-forces/,
|
||||
* /industries/military/, /industries/firefighters/.
|
||||
*
|
||||
* Looks up the page slug in inc/industries-data.php and hands the matched
|
||||
* tier off to template-parts/industry-detail.php.
|
||||
*
|
||||
* @package AsterionBricks
|
||||
*/
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
$slug = get_post_field('post_name', get_queried_object_id());
|
||||
$data = include AV_THEME_DIR . '/inc/industries-data.php';
|
||||
|
||||
if (! isset($data[$slug])) {
|
||||
get_header();
|
||||
echo '<section class="av-section"><div class="av-container">';
|
||||
echo '<h1>' . esc_html(get_the_title()) . '</h1>';
|
||||
echo '<p>' . esc_html__('Industry data not found for slug:', 'asterion-bricks') . ' ' . esc_html($slug) . '</p>';
|
||||
echo '</div></section>';
|
||||
get_footer();
|
||||
return;
|
||||
}
|
||||
|
||||
get_header();
|
||||
set_query_var('av_industry', $data[$slug]);
|
||||
get_template_part('template-parts/industry-detail');
|
||||
get_footer();
|
||||
Reference in New Issue
Block a user