/*
Theme Name: AmanTec
Description: Custom child theme for amanteckw.com — built on Hello Elementor for use with Elementor Pro, WPForms, and WPML (EN/AR).
Template: hello-elementor
Author: AmanTec
Version: 2.14.25
Text Domain: amantec
*/

/*
DIRECTION CONTRACT — 2026-08-22, /impeccable redesign from user-supplied reference
(Amantec-claude-design/AmanTec Home Offline Reference.html — a rendered React/Tailwind
export, tokens extracted from its live computed styles, not eyeballed from screenshots)

THESIS: credible, quiet authority instead of a loud "cybersecurity dashboard" chassis —
paper-and-ink editorial system with one signature texture (the graph-paper hero grid) and
one signature material (the video-driven hero), not a tech-costume of neon/mono/glow.

OWN-WORLD: off-white paper (#FBFCFC) + near-black ink (#13181A) as the neutral base; teal
(#00747E) as the primary action color (buttons, one solid band); cyan (#16BECF) reserved
for accents (glow washes, headline emphasis) — a deliberate swap from the old cyan-primary
system. Open Sans throughout, sentence-case nav (16px/400, no tracking) replacing the old
uppercase/bold/tracked treatment. 10px button radius. Hairline borders (#E7EBEC) over drop
shadows for structure.

STORY: a visitor should read the header/hero and believe this is a serious, established
regional security partner — not a generated template. Real content only: this redesign
adopts the reference's SYSTEM (color, type, spacing, texture, component grammar), never
its invented copy, IA, or unverified partner — see PRODUCT.md and project memory for the
specific content substitutions made pass by pass.

FIRST VIEWPORT: unchanged from the prior pass by explicit user choice — full-bleed hero
video stays (a deliberate prior decision this redesign does not reverse), header becomes a
glass sticky bar (backdrop-blur, off-white translucent) over it.

FORM: reference-led redesign, not a generated concept — the direction was supplied by the
user as a concrete artifact, so concept-seed.mjs's candidate/dice process does not apply
(new-work.md: "a user- or brief-pinned direction beats the roll, always").

FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review,
the verdict, and DESIGN.md.
*/

/*
DIRECTION CONTRACT ADDENDUM — 2026-08-31, Neo-HUD dual-mode pivot

The paper-and-ink contract above is no longer the whole picture. It is still the correct
default for regular content — card grids, forms, body copy — but every bookend/moment
section (header, hero, trust bar, footer, testimonials, About Us team cards, every inner
page's Page Header band) now runs a dark, cyan-accented "Neo-HUD" treatment instead: the
"not a tech-costume of neon/mono/glow" line above is explicitly no longer true for those
sections — it now IS mono/glow/dark-chrome there, by direct, explicit, section-by-section
user request (built from a Claude Design canvas, "AmanTec Tech Refresh," 3 candidate
directions — the user picked Neo-HUD / Dark Ops after judging a more conservative pass not
bold enough). See DESIGN.md's rewritten Overview + "Neo-HUD Section" component entries and
the `tech_refresh_direction` project memory for the full build log and reasoning.

What did NOT change: teal (#00747E) is still the only button-fill color, in both modes —
cyan's role only expanded to cover text/border/accent on dark grounds, never a fill. Real
navigation and footer link text stays Open Sans sentence-case in both modes — mono is
scoped strictly to Neo-HUD label/data elements (status pill, stat values, footer captions,
nav CTA button text), never real prose or links. Regular content sections were never
proactively converted to Neo-HUD — every dark section exists because it was either already
dark before this pivot or explicitly requested; this is not a "make everything dark now"
rewrite.

One truly universal change, in BOTH modes: every button and bordered box on the site now
uses a clipped diagonal corner (`clip-path`, 10px/12px notch) instead of `border-radius` —
see DESIGN.md's "Shapes" section for the mechanics and the two real bugs hit shipping it
sitewide (border-radius must be zeroed at the source, not left to fight clip-path; a
button's notch targets its inner `.elementor-button` child, not its outer wrapper).
*/

:root {
	--amantec-cyan: #16BECF;
	--amantec-teal: #00747E;
	--amantec-black: #000000;
	--amantec-white: #FFFFFF;
	--amantec-cyan-75: rgba(22, 190, 207, 0.75);
	--amantec-cyan-50: rgba(22, 190, 207, 0.5);
	--amantec-cyan-25: rgba(22, 190, 207, 0.25);
	--amantec-cyan-10: rgba(22, 190, 207, 0.1);
	--amantec-cyan-20: rgba(22, 190, 207, 0.2);

	/* new neutrals from the reference — a refined paper/ink base replacing
	   pure #000/#FFF for page chrome; brand black/white above stay as-is for
	   the logo and existing __globals__ Kit references. */
	--amantec-paper: #FBFCFC;
	--amantec-ink: #13181A;
	--amantec-grid-line: #EAEEEF;
	--amantec-border: #E7EBEC;
	--amantec-border-soft: #D7DDDD;
	--amantec-tint: #F2F5F5;
	--amantec-teal-dark: #005C64;

	--amantec-font-en: 'Open Sans', sans-serif;
	--amantec-font-ar: 'Tajawal', sans-serif;

	/* dropdown-toggle chevron — replaces hello-elementor's factory Unicode
	   glyph ("▾", content-based, font-size-scaled) with a drawn SVG at the
	   same stroke weight/cap style as the arrow above, so both nav icons
	   belong to one consistent icon language instead of one drawn + one
	   Unicode-glyph-as-icon (a craft-floor default this project doesn't earn
	   back — see the 2026-08-30 /impeccable polish pass). */
	--amantec-icon-chevron: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='black'%20stroke-width='2.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpolyline%20points='6%209%2012%2015%2018%209'/%3E%3C/svg%3E");
}

/* !important needed on both: Hello Elementor's own reset.css also targets the
   bare `body` selector with a hardcoded system-font stack (identical (0,0,1)
   specificity to this rule), and reset.css loads after this stylesheet, so it
   was winning the tie — every element that isn't an Elementor widget with its
   own explicit typography (i.e. the entire header/footer template parts,
   present on every page) was silently inheriting the OS system font instead
   of Open Sans/Tajawal, despite "Open Sans throughout" being this system's own
   stated direction above. Elementor-widget text was never affected (each
   widget's typography setting sets font-family directly with higher
   specificity, bypassing inheritance entirely) — this only ever hit plain
   theme markup relying on body's cascade. Found via /impeccable typeset,
   2026-08-30. */
body {
	background: var(--amantec-paper);
	color: var(--amantec-ink);
	font-family: var(--amantec-font-en) !important;
}

body.rtl {
	font-family: var(--amantec-font-ar) !important;
}

/* User directive 2026-08-30: every <p> on the site is 14px, no exceptions —
   this deliberately flattens what DESIGN.md's Typography section previously
   called the "Body" tier (15-19px) down to one fixed size. This rule is the
   DEFAULT for any <p> with no more specific style (e.g. the Home hero's own
   intro paragraph, which has none). Most existing <p> content already
   carries a more-specific inline font-size (Elementor text-editor widgets
   store raw HTML), which wins over this rule regardless of !important
   ordering tricks — those were patched directly to 14px in each page's
   _elementor_data instead of being fought with a blanket !important here.
   See build-scripts/set-all-p-to-14px-2026-08-30.php. */
p {
	font-size: 14px;
}

a {
	color: var(--amantec-teal);
}
a:hover {
	color: var(--amantec-cyan);
}

/* header — Neo-HUD / Dark Ops direction (AmanTec Tech Refresh design
   canvas, Direction A), extended sitewide 2026-08-31 to match the Home
   hero/trust-bar pass. Permanently dark translucent glass at every scroll
   position (not conditionally light) — simplest, most consistent execution
   given the header now needs to hold a reversed/white logo at all times,
   and a persistent dark chrome bar is itself a common, deliberate signature
   of this kind of "tech" site, not a compromise.
   NOT resurrected: the older, separately-retired circuit-rail/node-dot
   header system (repeating-gradient trace line + small dots between nav
   items) — that was a different, earlier build never part of the canvas
   direction the user actually picked, so it stays out. Was previously
   translucent paper + dark ink nav, sentence-case regular-weight, teal-
   primary action button (2026-08-22 redesign) — that system is what THIS
   pass replaces, same as it replaced the circuit-rail one before it. */
.site-header {
	/* !important: hello-elementor's own header-footer.css sets position:relative
	   on the same single-class selector and loads after this stylesheet, so a
	   plain override loses on source order despite equal specificity. */
	position: sticky !important;
	top: 0;
	z-index: 100;
	background: rgba(5, 8, 9, 0.82);
	-webkit-backdrop-filter: saturate(1.4) blur(14px);
	backdrop-filter: saturate(1.4) blur(14px);
	padding-block: 0;
	max-width: none;
	margin-inline: 0;
	padding-inline: 0;
	border-bottom: 1px solid rgba(22, 190, 207, 0.18);
	transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.site-header.at-scrolled {
	border-bottom-color: rgba(22, 190, 207, 0.32);
	box-shadow: 0 4px 20px rgba(0,0,0,0.35);
}
.site-header .header-inner {
	max-width: 1400px;
	margin-inline: auto;
	padding: 20px 20px;
	align-items: center;
}
/* the logo lockup image already bakes in the "Cybersecurity · AI · Resilience"
   slogan (per brand guidelines), so the separate site-description line under
   it in the header is a redundant repeat — hidden here only (footer keeps
   its own tagline, and the logo's alt text below carries the phrase for
   a11y). */
.site-header .site-branding {
	flex-direction: row;
	align-items: center;
	gap: 0;
}
.site-header .site-description {
	display: none;
}
.site-header .custom-logo,
.site-header .site-logo img {
	/* 46px -> 62px (user, 2026-09-01: "logo make slogan readable"). Note the
	   "CYBERSECURITY · AI · RESILIENCE" line is baked into the PNG at ~6.6%
	   of its height, so it only clears ~9px of cap height at a ~140px logo —
	   no header-sized value makes it truly legible. 62px is the largest step
	   the bar takes without the nav and CTA pill losing their relationship. */
	height: 62px;
	width: auto;
	max-width: none;
}
.site-header .site-navigation ul.menu {
	gap: 22px;
}
/* shared base — color, case, transition. Size/weight now split by tier below
   (2026-08-30 /impeccable layout pass): top-level nav carries the primary
   voice, dropdown items a quieter secondary one, replacing the old single
   16px/400 applied uniformly everywhere. */
.site-header .site-navigation ul.menu li a,
.site-header .site-navigation-dropdown ul.menu li a {
	color: #B9C4C6;
	text-transform: none;
	letter-spacing: normal;
	transition: color 0.15s ease-out, background-color 0.2s cubic-bezier(0.16, 1, 0.3, 1);
}
.site-header .site-navigation ul.menu li a:hover,
.site-header .site-navigation ul.menu li.current-menu-item > a {
	color: var(--amantec-cyan);
}
/* top-level tier: 15px/600 — was 16px/400, which read as both oversized next
   to the enlarged logo and visually thin for a primary nav voice. Covers both
   the desktop top bar and mobile's single-tier stacked list (structurally the
   same tier — mobile has no separate "top bar vs. flyout" distinction). */
.site-header .site-navigation > ul.menu > li > a,
.site-header .site-navigation-dropdown > ul.menu > li > a {
	font-size: 14px;
	font-weight: 600;
}
/* hover/current feedback — a soft background-wash pill replaces the old
   center-out underline draw entirely (a genuinely different mechanism, not a
   retuned one): reuses the same neutral tint the dropdown's own item-hover
   already uses (see below), so the whole header now shares one hover
   language instead of two (underline up top, wash inside the flyout).
   Desktop top bar only — :not(:last-child) since Contact Us is already a
   filled pill, and scoped to .site-navigation (not .site-navigation-dropdown)
   since mobile already has its own filled-pill current-page treatment
   further down, which this must not double up with. */
.site-header .site-navigation ul.menu > li:not(:last-child) > a {
	border-radius: 8px;
}
.site-header .site-navigation ul.menu > li:not(:last-child) > a:hover,
.site-header .site-navigation ul.menu > li.current-menu-item:not(:last-child) > a {
	background: rgba(22, 190, 207, 0.08);
}
/* chevron — drawn SVG (see --amantec-icon-chevron), not hello's factory
   Unicode "▾" content glyph, which read as "basic" and didn't reliably
   center against this system's own type scale (its size came from
   font-size:1.5em on a flex box, not an explicit box). align-items:center on
   the li itself (hello's own li{display:flex} never set it, defaulting to
   stretch) is what actually fixes the misalignment — the icon's own explicit
   width/height would still float off-center inside a stretched pseudo-element
   without it. */
.site-header .site-navigation ul.menu > li.menu-item-has-children {
	align-items: center;
}
.site-header .site-navigation ul.menu > li.menu-item-has-children::after {
	content: "";
	display: block;
	width: 13px;
	height: 13px;
	margin-inline-start: 4px;
	background: #7FA3A8;
	-webkit-mask: var(--amantec-icon-chevron) no-repeat center / contain;
	mask: var(--amantec-icon-chevron) no-repeat center / contain;
}
.site-header .site-navigation ul.menu > li.menu-item-has-children:hover::after,
.site-header .site-navigation ul.menu > li.menu-item-has-children:focus-within::after {
	background: var(--amantec-teal);
	transform: rotate(180deg);
}
/* mobile expand affordance — a real <button> injected by mobile-menu-fix.js,
   not a ::after on the row. Two reasons it had to become an element:
   (a) the old ::after was scoped to the FIRST tier only, so the nested
   "Cybersecurity Services and Solutions" row had no arrow at all; and
   (b) that row is a real page as well as a parent, so its label has to stay a
   plain navigating link and the expand needs its own 64px target beside it.
   The button is absolutely positioned over the row's trailing edge; 64px
   matches the row's own height (20px padding + 24px line-height + 20px). */
.site-header .site-navigation-dropdown .amantec-submenu-toggle {
	position: absolute;
	inset-block-start: 0;
	inset-inline-end: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 64px;
	height: 64px;
	padding: 0;
	border: 0;
	background: transparent;
	cursor: pointer;
	/* above the row link's own full-width background, so the tap lands on the
	   toggle rather than the link underneath it. */
	z-index: 1;
}
.site-header .site-navigation-dropdown .amantec-submenu-toggle-icon {
	display: block;
	width: 14px;
	height: 14px;
	background: #7FA3A8;
	-webkit-mask: var(--amantec-icon-chevron) no-repeat center / contain;
	mask: var(--amantec-icon-chevron) no-repeat center / contain;
}
.site-header .site-navigation-dropdown li.elementor-active > .amantec-submenu-toggle .amantec-submenu-toggle-icon {
	background: var(--amantec-cyan);
	transform: rotate(180deg);
}
/* the Contact Us row is a filled teal pill — a chevron there has to read
   against that fill, not against the panel. */
.site-header .site-navigation-dropdown > ul.menu > li:last-child > .amantec-submenu-toggle .amantec-submenu-toggle-icon {
	background: var(--amantec-white);
}
@media (prefers-reduced-motion: no-preference) {
	.site-header .site-navigation ul.menu > li.menu-item-has-children::after,
	.site-header .site-navigation-dropdown .amantec-submenu-toggle-icon {
		transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), background-color 0.15s ease-out;
	}
}
/* nested (3rd-level, sideways-opening) chevron — same drawn icon, static
   -90deg per hello's own rotation for a sideways flyout indicator, replacing
   the same factory Unicode glyph there for one consistent icon language.
   Real alignment bug found here (user: "sub arrow not aligned and small
   too"): this li is a flex row (hello's generic `li{display:flex}`, depth-
   independent) but never had align-items:center — with the icon's own
   explicit 12x12px size, flex's default align-items:stretch can't stretch a
   box that already has a definite size, so it fell back to flex-start
   (top-aligned) instead of centering against the row. The old
   translateY(-50%) was compensating for that wrong baseline rather than
   fixing it, and was calculated against the WRONG box (produced the visible
   floating-near-the-top placement in the screenshot). Fixed at the source
   (align-items:center on the li) and dropped the transform hack entirely —
   only the rotation remains, doing one job. */
.site-header .site-navigation ul.menu li ul li.menu-item-has-children {
	align-items: center;
}
.site-header .site-navigation ul.menu li ul li.menu-item-has-children::after {
	content: "";
	display: block;
	width: 12px;
	height: 12px;
	margin-inline-start: 4px;
	background: #7FA3A8;
	-webkit-mask: var(--amantec-icon-chevron) no-repeat center / contain;
	mask: var(--amantec-icon-chevron) no-repeat center / contain;
	transform: rotate(-90deg);
}
/* dropdown flyout — was a plain white box that hard-cut via display:none/block
   (hello-elementor's own :hover>ul{display:block} rule). Overridden here with
   an always-"display:block", opacity/transform-driven reveal so the open/
   close can actually transition; specificity (.site-header prefix adds a
   class hello's own selectors don't have) wins over both of hello's rules
   without !important. Width is content-fit (was a fixed 280px min-width) —
   hugs the widest row in each flyout instead of a one-size box, per user
   request; "Cybersecurity Services and Solutions" (the longest item) still
   fits on one line since max-content sizes to it directly.
   margin-block-start was 10px: a real, reproducible bug, not cosmetic — that
   margin left a dead strip between the trigger and the flyout that belongs to
   neither element's hover box, so a mouse moving from "Services" down into
   the menu crossed a gap with no :hover coverage and the menu closed before
   it could be reached. 0 margin removes the dead zone entirely (matches the
   reference the user pointed to, which sits the flyout flush under the nav
   too) — the existing translateY(-6px)→0 entrance still reads as a reveal
   without needing a physical gap to animate across. */
.site-header .site-navigation ul.menu li ul {
	display: block;
	width: max-content;
	background: #0B0F10;
	border: 1px solid rgba(22, 190, 207, 0.22);
	border-radius: 10px;
	box-shadow: 0 16px 32px rgba(0,0,0,0.45);
	padding-block: 8px;
	margin-block-start: 0;
	opacity: 0;
	visibility: hidden;
	transform: translateY(-10px);
	pointer-events: none;
}
.site-header .site-navigation ul.menu li:hover > ul,
.site-header .site-navigation ul.menu li:focus-within > ul {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
	pointer-events: auto;
}
@media (prefers-reduced-motion: no-preference) {
	.site-header .site-navigation ul.menu li ul {
		transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
	}
	.site-header .site-navigation ul.menu li:hover > ul,
	.site-header .site-navigation ul.menu li:focus-within > ul {
		/* 0.35s on the way IN (user, 2026-09-02). The way OUT is deliberately
		   left at the 0.15s in the rule above: a menu that takes as long to
		   leave as it took to arrive feels like it is lagging the cursor. */
		transition: opacity 0.35s cubic-bezier(0.16, 1, 0.3, 1), transform 0.35s cubic-bezier(0.16, 1, 0.3, 1), visibility 0.35s;
	}
}

/* Second-level flyout enters from the SIDE, not from above (user, 2026-09-02:
   "the first dropdown level on desktop should fade in slide from top, and
   second level fade slide from right" — then, on seeing it, "second level from
   left not right", so it now emerges from BEHIND its parent panel and settles
   outward rather than flying in from open space).

   Both levels were sharing one translateY entrance, which was wrong for the
   second: that panel opens sideways (hello's own `inset-inline-start: 100%`
   puts it beside its parent row, not under it), so dropping it from above
   moved it across the axis it does not travel on. Matching the entrance to
   the panel's own direction is what makes the two levels read as different
   kinds of thing — a menu that drops, and a branch that extends.

   Specificity: the generic rules above are (0,3,3) base / (0,4,3) hover; the
   extra `li ul` steps here make these (0,3,5) / (0,4,5), so they win on
   weight with no !important. Hovering a second-level row still matches the
   generic ancestor rule too, which is correct — the level-1 panel must stay
   settled at translateY(0) while its child slides in.

   --at-flyout-x, not a hard value: in RTL the third level opens to the LEFT
   (`inset-inline-start` flips), so the entrance has to flip with it or the
   panel would slide in from the wrong side. LTR is -10px (starts tucked
   toward the parent, slides out to the right); RTL is +10px, the mirror. Per
   the project's standing RTL-safe CSS rule, set up now rather than left for
   the WPML pass. */
:root {
	--at-flyout-x: -10px;
}
[dir="rtl"] {
	--at-flyout-x: 10px;
}
.site-header .site-navigation ul.menu li ul li > ul {
	transform: translateX(var(--at-flyout-x));
}
.site-header .site-navigation ul.menu li ul li:hover > ul,
.site-header .site-navigation ul.menu li ul li:focus-within > ul {
	transform: translateX(0);
}
/* dropdown items — third pass (14px/500, down a notch from 15px per user
   request: "dropdown font should be smaller a bit"). Weight (500 vs. the
   top-level tier's 600) still carries the primary/secondary distinction, now
   paired with a real size step too — the earlier "same size, weight-only"
   idea held up structurally but the user wanted it a bit smaller once seen
   at 15px. No row separators (see the prior pass's note below): whitespace +
   hover wash carry the row separation instead. */
/* the li is a flex container (hello's generic li{display:flex}, every
   depth), but a plain <a> flex item without flex-grow only sizes to its own
   text content — hello's own flex-grow:1 only exists on the .menu-item-has-
   children variant (so its anchor shares row space with the sibling ::after
   chevron correctly), so the 4 plain rows' anchors never filled their row.
   The li itself was already full-width (block-level in the dropdown's own
   display:block list), so the earlier full-width attempt was correct about
   the LI but the background was painted on the un-stretched <a> inside it.
   flex-grow:1 here (not width:100%) matches hello's own working mechanism
   and stays sibling-safe for the has-children row — a hard width:100% would
   fight the sibling chevron for space and could overflow the row. */
.site-header .site-navigation ul.menu li ul li a {
	display: block;
	flex-grow: 1;
	box-sizing: border-box;
	padding: 11px 20px;
	font-size: 14px;
	font-weight: 500;
}
.site-header .site-navigation ul.menu li ul li a:hover {
	background: rgba(22, 190, 207, 0.1);
}
/* hello-elementor's own frontend CSS puts a factory border-block-end:1px
   solid #eee directly on this li — removing just our color override (as the
   first attempt did) leaves that unbranded gray line rendering on its own.
   Explicitly clearing it here, not just declining to re-color it. */
.site-header .site-navigation ul.menu li ul li {
	border-block-end: none;
}

/* mobile dropdown's "current page" row inherits hello-elementor's factory
   gray (#55595c) — the desktop nav uses brand color for the same state, so
   extend it here too instead of leaving mobile the least-branded surface. */
.site-header .site-navigation-dropdown ul.menu li.current-menu-item > a {
	background: var(--amantec-teal);
	color: var(--amantec-white);
}
/* mobile row dividers reskinned from hello's generic black-10% line to a
   brand-tinted one, so the reworked rhythm carries into the dropdown too.
   background: hello's own rule sets background:#fff directly on each ROW
   LINK, not just the panel — overriding only the panel's ul.menu background
   above left every plain row rendering its own opaque white square, with
   light-gray text on top of it (unreadable). transparent here lets the
   dark panel bg (and the teal current-page/Contact-Us fills, set
   elsewhere) show through correctly. */
.site-header .site-navigation-dropdown ul.menu li a {
	background: transparent;
	box-shadow: inset 0 -1px 0 rgba(22, 190, 207, 0.16);
}

/* mobile hamburger's default hit area is ~36x30px; bump toward the 44x44px
   comfortable touch-target guideline without growing the visible icon.
   !important: hello-elementor's header-footer.css sets padding on an
   equal-specificity selector (.site-navigation-toggle-holder .site-navigation-toggle,
   2 classes vs our 2 classes) and its load order wins ties. */
.site-header .site-navigation-toggle {
	padding: 0.75rem !important;
	min-width: 44px !important;
	min-height: 44px !important;
	/* !important: same load-order tie as the padding/min-size rules above —
	   hello-elementor's own color:#494c4f on this equal-specificity selector
	   wins ties, and the toggle's bar icons use background-color:currentcolor,
	   so without this override the hamburger renders dark-on-dark and
	   disappears against the new header background. */
	color: #C7D0D2 !important;
}
/* mobile menu panel — hello-elementor's own factory white background
   (.site-navigation-dropdown ul.menu{background:#fff}), not previously
   overridden since the old header/panel were both light already. */
.site-header .site-navigation-dropdown ul.menu {
	background: #0B0F10;
}

/* Contact Us is the header's one conversion action — filled teal pill,
   10px radius, matching the redesign's primary-button system exactly
   (values read from the reference's own computed styles). Targets the last
   top-level nav item by position rather than a menu-item CSS class, since
   none is set on the WP menu item. The trailing arrow (masked SVG, tints via
   currentColor) reads as a forward action instead of a plain label. */
.site-header .site-navigation > ul.menu > li:last-child > a {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	background: var(--amantec-teal);
	color: var(--amantec-white);
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-weight: 700;
	clip-path: polygon(8px 0, 100% 0, 100% 100%, 0 100%, 0 8px);
	padding: 11px 18px;
	margin-inline-start: 8px;
}
.site-header .site-navigation > ul.menu > li:last-child > a:hover {
	background: var(--amantec-teal-dark, #005C64);
	color: var(--amantec-white);
}
/* Contact Us trailing glyph — a CHEVRON, not the shafted arrow (user,
   2026-09-02: "change the arrow in contact us to something like this >").

   It reuses --amantec-icon-chevron rotated a quarter turn rather than adding a
   new right-pointing token, and that is the point: the nav's dropdown
   indicators are drawn from that same mask, so the Contact Us glyph is now
   provably the same stroke weight, cap style and optical size as the chevrons
   it sits beside instead of merely looking close. (The old shafted-arrow token
   it replaced was deleted in the 2026-09-02 cleanup — nothing referenced it.)

   The rotation goes through a custom property because a right-pointing
   chevron must point LEFT in RTL; per the project's standing RTL-safe rule
   that is set up now rather than deferred to the WPML pass. */
:root {
	--at-chevron-forward: -90deg;
}
[dir="rtl"] {
	--at-chevron-forward: 90deg;
}
.site-header .site-navigation > ul.menu > li:last-child > a::after,
.site-header .site-navigation-dropdown > ul.menu > li:last-child > a::after {
	content: "";
	width: 12px;
	height: 12px;
	flex-shrink: 0;
	background: currentColor;
	-webkit-mask: var(--amantec-icon-chevron) no-repeat center / contain;
	mask: var(--amantec-icon-chevron) no-repeat center / contain;
	transform: rotate(var(--at-chevron-forward));
}

/* On MOBILE the glyph is aligned to the submenu chevrons above it (user:
   "on mobile align it to the drop down arrow"). Those live inside
   .amantec-submenu-toggle, a 64px-square button pinned to the row's trailing
   edge, so their 14px icon centres 25px in from that edge — (64 - 14) / 2.
   Contact Us has no toggle (it has no children), and as a flex item its glyph
   was landing on the row's own 20px text padding instead: 6px adrift, which
   in a vertical stack of otherwise-aligned chevrons is exactly the kind of
   gap the eye catches. Positioned from the same edge by the same derived
   number, and sized to match at 14px. */
.site-header .site-navigation-dropdown > ul.menu > li:last-child > a::after {
	position: absolute;
	inset-inline-end: 25px;
	inset-block-start: 50%;
	width: 14px;
	height: 14px;
	transform: translateY(-50%) rotate(var(--at-chevron-forward));
}
.site-header .site-navigation-dropdown > ul.menu > li:last-child > a {
	display: flex;
	align-items: center;
	/* the trailing chevron is absolutely positioned (see above), so there is
	   nothing left for space-between to push apart — the label now sits at
	   the start like every other row's, which is the alignment we wanted. */
	justify-content: flex-start;
	/* containing block for that chevron. Without it the glyph would anchor to
	   the LI instead, which happens to have the same box today — a coincidence
	   this should not quietly depend on. */
	position: relative;
	background: var(--amantec-teal);
	color: var(--amantec-white);
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	text-transform: uppercase;
	letter-spacing: 0.03em;
	font-weight: 700;
}


/* footer — 4-column layout (brand / Company / Services / Get in Touch)
   matching the design reference's structure and proportions (its own
   grid-template-columns measured ~1.4fr : 1fr : 1fr : 1.2fr). Column
   headings originally used a deliberately muted gray, not brand cyan, to
   read as "quiet" — extended to the Neo-HUD direction 2026-08-31 (see
   [[tech_refresh_direction]]): near-black bg matching the hero/trust-bar
   family, cyan hairline border (was a plain white-10% line), monospace
   data-panel labels for headings and contact captions. Nav links and body
   copy stay in the regular font on purpose — mono is reserved for label/
   data elements sitewide (hero stat chips, trust bar, nav CTA), not real
   prose, so real link text and the tagline paragraph stay legible as
   actual words rather than reading as a costume. */
/* Selector is .site-footer.amantec-footer, not .amantec-footer alone, and
   that is the actual fix for "footer needs top padding" (user, 2026-09-01):
   hello-elementor's header-footer.css sets `.site-footer{padding-block-start:
   1rem}` on a single class and loads AFTER this stylesheet, so our
   equal-weight `padding:` shorthand lost the tie and the footer had been
   rendering with 16px of top padding the whole time, never the 64px this rule
   claimed. Two classes (0,2,0) clears it with no !important. See the
   css_specificity_ladder note. */
.site-footer.amantec-footer {
	background: #080B0C;
	color: #C7D0D2;
	padding: 96px 20px 0;
}
.amantec-footer-inner {
	max-width: 1400px;
	margin-inline: auto;
	display: grid;
	grid-template-columns: 1.4fr 1fr 1fr 1.2fr;
	gap: 40px;
	padding-bottom: 52px;
	border-bottom: 1px solid rgba(22, 190, 207, 0.2);
}
.amantec-footer-brand img {
	max-width: 220px;
	height: auto;
	margin-bottom: 15px;
}
.amantec-footer-brand p {
	font-size: 14px;
	line-height: 1.7;
	max-width: 300px;
	color: #9AA3A5;
}
.amantec-footer h3 {
	color: #7FA3A8;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: 12px;
	font-weight: 700;
	margin: 0 0 18px;
}
.amantec-footer-col nav {
	display: flex;
	flex-direction: column;
	gap: 10px;
}
.amantec-footer-col nav a,
.amantec-footer-contact a {
	color: #C6CDCE;
	font-size: 14px;
}
.amantec-footer-col nav a:hover,
.amantec-footer-contact a:hover {
	color: var(--amantec-cyan);
}
.amantec-footer-contact-row {
	margin: 0 0 12px;
	font-size: 15px;
}
.amantec-footer-contact-label {
	display: block;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	font-size: 11px;
	color: #7FA3A8;
	margin-bottom: 2px;
}
.amantec-footer-bottom {
	max-width: 1400px;
	margin-inline: auto;
	padding: 24px 0;
	text-align: center;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 12px;
	color: #6E8A8E;
}
@media (max-width: 900px) {
	.amantec-footer-inner {
		grid-template-columns: 1fr;
	}
	.site-footer.amantec-footer {
		padding-top: 72px;
	}
}

/* ===================== Home page layout pass ===================== */

/* hero */

/* FULL SCREEN since 2026-10-04, desktop and mobile. It was 640px / 480px,
   which on a tall desktop left the next section's heading peeking over the
   fold and on a phone made the video read as a banner rather than as the
   page's opening image.

   Driven through `--min-height`, not `min-height`, and from a selector heavy
   enough to win: Elementor's frontend.min.css carries
   `.e-con { --min-height: initial; min-height: var(--min-height) }` at (0,1,0)
   and loads AFTER the theme, so BOTH the old `min-height: 640px` and a
   same-weight `--min-height` here lose the tie and resolve to 0. The 640px
   had in fact been dead for some time — the hero was only ever as tall as its
   copy plus padding, which is why it looked roughly right and measured wrong.
   `body .elementor-element.elementor-element-herosec1` is (0,2,1) and clears
   it. Same story for `--justify-content`.

   `svh`, not `vh` or `dvh`: `vh` ignores a phone's address bar and crops the
   buttons behind it, `dvh` resizes the hero mid-scroll as the bar hides. `svh`
   is the stable smallest-viewport height, so the whole composition is visible
   at rest. `100vh` first as the fallback for anything that doesn't know `svh`.

   A definite min-height is also what `.at-hero-media` sizes against — see the
   containing-block note below; a viewport unit keeps that guarantee.

   Centering is the container's, so it stays correct at any height. The
   200px/90px padding is deliberately asymmetric and stays: flex centres the
   copy BETWEEN the paddings, which drops it 55px below the geometric middle —
   within 15px of the optical centre of the area left free by the 139px fixed
   header. Measured, not guessed. It also keeps acting as the safe area when
   the copy is taller than the viewport (short landscape phones), since
   min-height is a floor, not a cap. */
body .elementor-element.elementor-element-herosec1 {
	position: relative;
	overflow: hidden;
	--min-height: 100vh;
	--min-height: 100svh;
	--justify-content: center;
}

/* full-bleed video background. Elementor gives every widget wrapper its own
   `position: relative` by default, which becomes the actual containing
   block for an absolutely-positioned child before herosec1 ever gets a
   chance to — and since that wrapper's own height is otherwise 'auto'
   (driven by content), an inset:0 child inside it collapses to 0 height in
   a circular reference. Fix: make the WRAPPER itself the absolutely
   positioned layer (against herosec1, its own nearest positioned ancestor),
   then size .at-hero-media as a normal 100%-of-a-definite-parent box. */
.elementor-element-heromedia1 {
	position: absolute !important;
	inset: 0;
	z-index: 0;
}
.at-hero-media {
	/* Was an inline `background-image:url('http://localhost:8888/…')` inside the
	   pasted HTML widget — an absolute URL frozen into the database. Relative
	   to this stylesheet it is correct on every host, and the widget that
	   replaced that markup emits no inline style at all. */
	background-image: url('assets/video/hero-bg-poster.jpg?v=2');
	background-size: cover;
	background-position: center;
	width: 100%;
	height: 100%;
	background-size: cover;
	background-position: center;
	overflow: hidden;
}
.at-hero-video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: center;
}
.at-hero-overlay {
	position: absolute;
	inset: 0;
	background: linear-gradient(100deg, rgba(0,0,0,0.88) 0%, rgba(0,0,0,0.72) 32%, rgba(0,0,0,0.42) 60%, rgba(0,0,0,0.55) 100%);
}
@media (prefers-reduced-motion: reduce) {
	.at-hero-video {
		display: none;
	}
}
.elementor-element-heroboxed {
	position: relative;
	z-index: 1;
}

/* solution cards + testimonial cards — shared hover-lift, since both are
   now equal-weight bordered cards in a grid rather than the old divided-list
   / staggered-column treatments. */
.elementor-element-solcard0,
.elementor-element-solcard1,
.elementor-element-solcard2,
.elementor-element-solcard3,
.elementor-element-solcard4,
.elementor-element-testicol1,
.elementor-element-testicol2,
.elementor-element-testicol3 {
	position: relative;
	transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}
/* corner index number on each solution card — a catalog tag, not a step
   sequence (craft-floor's ban is on invented section numbers standing in
   for real hierarchy; here it's a small reference mark matching the
   reference screenshot, consistent scale with the numbered-list-marker
   pattern already used in the Human Firewall band).
   Same wrapper-vs-child positioning gotcha as heromedia1/ctaglow earlier in
   this file: an absolutely-positioned span INSIDE the html widget resolved
   against the widget's own wrapper (Elementor's default position:relative
   on every widget wrapper), not the card — and since that wrapper sits in
   normal flex flow after the icon-box widget, the "absolutely positioned"
   number just rendered inline at the bottom instead of the corner. Fix:
   make the WRAPPER itself the positioned element, against the card (its
   own nearest positioned ancestor, set position:relative above). */
.elementor-element-solnum0,
.elementor-element-solnum1,
.elementor-element-solnum2,
.elementor-element-solnum3,
.elementor-element-solnum4 {
	position: absolute !important;
	inset-inline-end: 18px;
	inset-block-start: 16px;
}
.at-solnum {
	font-size: 12px;
	font-weight: 600;
	color: var(--amantec-border-soft);
}
.elementor-element-solcard0:hover,
.elementor-element-solcard1:hover,
.elementor-element-solcard2:hover,
.elementor-element-solcard3:hover,
.elementor-element-solcard4:hover,
.elementor-element-testicol1:hover,
.elementor-element-testicol2:hover,
.elementor-element-testicol3:hover {
	border-color: var(--amantec-border-soft);
	box-shadow: 0 12px 28px rgba(19,24,26,0.06);
}
@media (prefers-reduced-motion: no-preference) {
	.elementor-element-solcard0:hover,
	.elementor-element-solcard1:hover,
	.elementor-element-solcard2:hover,
	.elementor-element-solcard3:hover,
	.elementor-element-solcard4:hover,
	.elementor-element-testicol1:hover,
	.elementor-element-testicol2:hover,
	.elementor-element-testicol3:hover {
		transform: translateY(-3px);
	}
}
.elementor-element-solicon0 .elementor-icon-box-icon,
.elementor-element-solicon1 .elementor-icon-box-icon,
.elementor-element-solicon2 .elementor-icon-box-icon,
.elementor-element-solicon3 .elementor-icon-box-icon,
.elementor-element-solicon4 .elementor-icon-box-icon {
	margin-bottom: 6px;
}
/* Elementor's default description color inherits the never-fully-adopted
   Kit text token at a contrast that fails WCAG AA on white; #4A5456 passes
   at 7.8:1 — AAA, after the 2026-09-24 darkening from #5A6668 — while staying
   a close, muted neutral matching the system. */
.elementor-element-solicon0 .elementor-icon-box-description,
.elementor-element-solicon1 .elementor-icon-box-description,
.elementor-element-solicon2 .elementor-icon-box-description,
.elementor-element-solicon3 .elementor-icon-box-description,
.elementor-element-solicon4 .elementor-icon-box-description {
	color: #4A5456 !important;
	/* needs !important: Elementor's Global Kit generates its own
	   `.elementor-widget-icon-box .elementor-icon-box-description` rule at
	   the SAME (0,2,0) specificity as this one, using the Kit's own "Text"
	   typography var — and that generated CSS loads after this theme
	   stylesheet, so it wins the tie without !important. Confirmed by
	   reading wp-content/uploads/elementor/css/post-21.css directly, not
	   guessed — same class of bug already documented for `.elementor
	   img{height:auto}` and the bare `body` selector elsewhere in this file. */
	font-size: 14px !important;
	line-height: 1.6;
}
.elementor-element-solicon0 .elementor-icon-box-title a,
.elementor-element-solicon1 .elementor-icon-box-title a,
.elementor-element-solicon2 .elementor-icon-box-title a,
.elementor-element-solicon3 .elementor-icon-box-title a,
.elementor-element-solicon4 .elementor-icon-box-title a {
	display: inline-block;
	padding-block: 4px;
	margin-block: -4px;
}

/* Cybersecurity Trainings — 9 program cards, same bordered-card-with-hover-lift
   vocabulary as the Home solution cards above, just a longer element-ID list
   (one program grid, not five). Each card pairs an icon-box (icon/title/
   description) with its own "Contact Us" button, pushed to the card's bottom
   edge via the container's flex_justify_content:space-between so buttons
   line up across a row regardless of description length. */
.elementor-element-traincard0,
.elementor-element-traincard1,
.elementor-element-traincard3,
.elementor-element-traincard4,
.elementor-element-traincard5,
.elementor-element-traincard6,
.elementor-element-traincard7,
.elementor-element-traincard8 {
	position: relative;
	transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}
.elementor-element-traincard0:hover,
.elementor-element-traincard1:hover,
.elementor-element-traincard3:hover,
.elementor-element-traincard4:hover,
.elementor-element-traincard5:hover,
.elementor-element-traincard6:hover,
.elementor-element-traincard7:hover,
.elementor-element-traincard8:hover {
	border-color: var(--amantec-border-soft);
	box-shadow: 0 12px 28px rgba(19,24,26,0.06);
}
@media (prefers-reduced-motion: no-preference) {
	.elementor-element-traincard0:hover,
	.elementor-element-traincard1:hover,
	.elementor-element-traincard3:hover,
	.elementor-element-traincard4:hover,
	.elementor-element-traincard5:hover,
	.elementor-element-traincard6:hover,
	.elementor-element-traincard7:hover,
	.elementor-element-traincard8:hover {
		transform: translateY(-3px);
	}
}
.elementor-element-trainicon0 .elementor-icon-box-icon,
.elementor-element-trainicon1 .elementor-icon-box-icon,
.elementor-element-trainicon3 .elementor-icon-box-icon,
.elementor-element-trainicon4 .elementor-icon-box-icon,
.elementor-element-trainicon5 .elementor-icon-box-icon,
.elementor-element-trainicon6 .elementor-icon-box-icon,
.elementor-element-trainicon7 .elementor-icon-box-icon,
.elementor-element-trainicon8 .elementor-icon-box-icon {
	margin-bottom: 6px;
}
/* same WCAG-contrast + Global-Kit-tie-break fix as the Home solution cards'
   .elementor-icon-box-description rule above — see that comment for why
   !important is required here too. */
.elementor-element-trainicon0 .elementor-icon-box-description,
.elementor-element-trainicon1 .elementor-icon-box-description,
.elementor-element-trainicon3 .elementor-icon-box-description,
.elementor-element-trainicon4 .elementor-icon-box-description,
.elementor-element-trainicon5 .elementor-icon-box-description,
.elementor-element-trainicon6 .elementor-icon-box-description,
.elementor-element-trainicon7 .elementor-icon-box-description,
.elementor-element-trainicon8 .elementor-icon-box-description {
	color: #4A5456 !important;
	font-size: 14px !important;
	line-height: 1.6;
}

/* graph-paper grid texture — the reference's own signature hero background
   (two crossed linear-gradients, 46px cells), relocated here since the hero
   itself deliberately kept the video background instead (explicit user
   choice) rather than dropping the comp's one recognizable texture outright.
   Pure CSS, no image asset, matches the comp's exact technique and values.
   Real bug caught by the mechanical detector: mask-image was first applied
   directly to .elementor-element-statsimpact — but that element also holds
   the real heading and stat cards, and CSS mask-image composites an
   element's ENTIRE rendered output (content included), not just its own
   background layer, the same way opacity<1 would. That faded the actual
   heading text near the top of the section to ~1.2:1 contrast, not just the
   decorative grid. Same "isolate the decorative layer" fix used for the
   hero video overlay and the CTA glow earlier in this file: the texture
   moves to its own ::before pseudo-element behind the content, so the mask
   only ever touches decoration, never real text. */
.elementor-element-statsimpact {
	position: relative;
}
.elementor-element-statsimpact::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	pointer-events: none;
	background-image:
		linear-gradient(var(--amantec-grid-line) 1px, transparent 1px),
		linear-gradient(90deg, var(--amantec-grid-line) 1px, transparent 1px);
	background-size: 46px 46px, 46px 46px;
	-webkit-mask-image: radial-gradient(ellipse 70% 100% at 50% 0%, #000 55%, transparent 100%);
	mask-image: radial-gradient(ellipse 70% 100% at 50% 0%, #000 55%, transparent 100%);
}
.elementor-element-statsimpact > .elementor-element-statsinner {
	position: relative;
	z-index: 1;
}

/* The impact stats' four white cards were replaced 2026-09-01 by the single
   Neo-HUD instrument panel below (`statspanel`), so their equal-width and
   mobile-stacking rules went with them. About Us's own `aboutstatcell*` cards were
   replaced 2026-09-15 by the same stat widget in its `cards` layout, reading
   the shared Impact figures. */


/* partner/client logos — full color, individually bordered cards (matches
   the reference's .plogo card chrome, structurally, using our real logo
   images instead of its text-only placeholder cards). The prior
   grayscale-until-hover treatment suited the old tight logo-wall, where
   dimming kept a dense row of marks quiet; inside individual white cards
   with their own border it reads as a broken/loading state instead, so it's
   dropped here rather than carried forward by default. */
.elementor-element-logowallpartners,
.elementor-element-logowallclients {
	flex-wrap: wrap;
}
/* fixed width+height (not width:auto/max-height alone) + object-fit:contain
   preserves each logo's own aspect ratio inside a deterministic box. Real
   gotcha hit here: width:auto with only a max-height, inside a flex parent,
   leaves the box's width unresolved (flex's default min-width:auto collapse)
   until the image's own intrinsic size is known — but native loading="lazy"
   only fires once the element has a non-zero box to intersect the viewport
   with, so the two create a deadlock and the image never loads at all (not
   a slow-load, a permanent one — confirmed via img.complete staying false
   and naturalWidth staying 0 indefinitely, not just a slow first paint). A
   fixed box is deterministic on first paint regardless of load state, so it
   can't fall into that trap.
   Second gotcha (found 2026-08-29, /impeccable layout pass): this rule and
   Elementor's own core `.elementor img{height:auto;...}` (frontend.min.css)
   are an EXACT specificity tie (0,1,1 vs 0,1,1) — Elementor's stylesheet
   wins the tie by loading later, so every logo silently fell back to its own
   aspect ratio (a 90×160 portrait mark rendering 140×249 next to a 300×50
   wide mark rendering 140×23) despite this rule looking correct. Needs
   !important to actually win — same class of tie-break already documented
   for margin/padding/flex-direction elsewhere in this file. */
.elementor-element-logowallpartners img,
.elementor-element-logowallclients img {
	width: 170px !important;
	height: 60px !important;
	object-fit: contain;
}

/* closing CTA band */
.elementor-element-ctasec {
	position: relative;
	overflow: hidden;
}
/* same wrapper-vs-child positioning fix as .elementor-element-heromedia1 above:
   Elementor gives every widget wrapper its own position:relative by default,
   so an inset:0 child inside ctaglow would resolve against that wrapper, not
   ctasec. Making the wrapper itself the absolutely positioned layer (against
   ctasec, its own nearest positioned ancestor) sidesteps that. */
.elementor-element-ctaglow {
	position: absolute !important;
	inset: 0;
	overflow: hidden;
	pointer-events: none;
	z-index: 0;
}
.elementor-element-ctaglow div {
	position: absolute;
	width: 760px;
	height: 760px;
	max-width: 200vw;
	border-radius: 50%;
	inset-inline-start: 50%;
	top: -40%;
	transform: translateX(-50%);
	background: radial-gradient(circle, var(--amantec-cyan-25), transparent 62%);
}
.elementor-element-ctainner {
	position: relative;
	z-index: 1;
}

/* CTA focal entrance — the page's one closing statement gets the page's one
   other authored motion moment (after the hero video). Thesis: "harder to
   breach" is a statement of resolve/certainty, so the heading resolves INTO
   focus (blur+scale settling to rest) rather than a generic fade-and-rise;
   the existing static glow (above) gets a single brightness pulse timed just
   after, reading as the glow "responding" to the heading landing, not two
   unrelated effects. Default state (no .js-cta-ready class) is fully visible
   — the entrance only ever applies once JS confirms it can also resolve it,
   so a no-JS visitor never sees hidden content (see amantec_cta_reveal_script
   in functions.php, which also skips this entirely under reduced motion). */
.elementor-element-ctasec.js-cta-ready .elementor-element-ctahead1 {
	opacity: 0;
	filter: blur(10px);
	transform: scale(1.045);
	transition: opacity 1100ms cubic-bezier(0.16, 1, 0.3, 1), filter 1100ms cubic-bezier(0.16, 1, 0.3, 1), transform 1100ms cubic-bezier(0.16, 1, 0.3, 1);
}
.elementor-element-ctasec.js-cta-ready .elementor-element-ctasub1,
.elementor-element-ctasec.js-cta-ready .elementor-element-ctabtn1 {
	opacity: 0;
	transform: translateY(10px);
	transition: opacity 700ms cubic-bezier(0.16, 1, 0.3, 1) 320ms, transform 700ms cubic-bezier(0.16, 1, 0.3, 1) 320ms;
}
.elementor-element-ctasec.js-cta-ready.in-view .elementor-element-ctahead1,
.elementor-element-ctasec.js-cta-ready.in-view .elementor-element-ctasub1,
.elementor-element-ctasec.js-cta-ready.in-view .elementor-element-ctabtn1 {
	opacity: 1;
	filter: none;
	transform: none;
}
@keyframes amantec-cta-glow-pulse {
	0% { filter: brightness(1); }
	45% { filter: brightness(1.8); }
	100% { filter: brightness(1); }
}
.elementor-element-ctasec.js-cta-ready.in-view .elementor-element-ctaglow div {
	animation: amantec-cta-glow-pulse 1800ms ease-in-out 150ms;
}
@media (prefers-reduced-motion: reduce) {
	.elementor-element-ctasec.js-cta-ready .elementor-element-ctahead1,
	.elementor-element-ctasec.js-cta-ready .elementor-element-ctasub1,
	.elementor-element-ctasec.js-cta-ready .elementor-element-ctabtn1 {
		opacity: 1 !important;
		filter: none !important;
		transform: none !important;
		transition: none !important;
	}
	.elementor-element-ctasec .elementor-element-ctaglow div {
		animation: none !important;
	}
}

/* testimonial columns are now equal bordered cards (see the shared hover-lift
   rule above with the solution cards) — the old staggered vertical offset
   suited the previous stacked-quote-mark treatment, not this grid. */

/* About Us — Mission/Vision hairline divider. Deliberately NOT set via
   Elementor's own border_width control (which is physical top/right/bottom/
   left, not logical) — this project keeps RTL-safety live even during the
   English-only build phase, so the divider is a plain theme-CSS rule using
   border-inline-start. It is a property Elementor's container system does
   not manage by default, so this plain 1-class selector wins over Elementor's
   generated per-element rule without needing !important (see the documented
   Elementor-vs-theme-CSS specificity gotcha in project memory — margin/
   padding/flex-direction lose that fight, borders not set in the JSON don't). */
.elementor-element-visioncol {
	border-inline-start: 1px solid #E7EBEC;
}
@media (max-width: 767px) {
	.elementor-element-visioncol {
		border-inline-start: none;
		border-block-start: 1px solid #E7EBEC;
	}
}

/* Free Cyber Tools — icon-badge tiles. Elementor's Container element has no
   real "width" control (its only 'width' key is the boxed-content max-width
   slider, gated to content_width:'full' and irrelevant here) and no
   'height' control at all (the real key is 'min_height', not used). Unlike
   the divider rule above, this one DOES need !important: Elementor's own
   static frontend CSS gives every `.e-con` a base `width: 100%` regardless
   of content_width (boxed or full), so a badge left at that default
   stretches to its flex-column parent's full cross-axis width instead of
   staying a fixed 52x52 square — confirmed by testing both content_width
   values and a plain (non-!important) version of this same rule, neither
   of which won the cascade against that base rule. */
.elementor-element-ftcard0badge,
.elementor-element-ftcard1badge,
.elementor-element-ftcard2badge,
.elementor-element-ftcard3badge,
.elementor-element-ftcard4badge,
.elementor-element-ftcard5badge {
	width: 52px !important;
	height: 52px !important;
	flex: 0 0 52px !important;
}

/* News — [amantec_news_grid] shortcode card grid (see functions.php). Plain
   theme CSS, not Elementor JSON, since the shortcode's markup lives outside
   Elementor entirely — no cascade fight like the Free Cyber Tools badges
   above, so no !important needed here. Card sizing/border/radius matches
   the established bordered-card family (icon_card, tool_card, etc.) used
   sitewide; this is the first *whole-card-link* variant since Home's
   Solutions cards. */
.amantec-news-grid {
	display: flex;
	flex-wrap: wrap;
	gap: 20px;
}
.amantec-news-card {
	display: flex;
	flex-direction: column;
	width: calc(33.333% - 13.34px);
	padding: 30px 26px;
	border: 1px solid #E7EBEC;
	border-radius: 10px;
	background: #FFFFFF;
	text-decoration: none;
	transition: box-shadow 0.2s ease, transform 0.2s ease;
}
.amantec-news-card:hover {
	box-shadow: 0 8px 24px rgba(19, 24, 26, 0.08);
	transform: translateY(-3px);
}
/* .amantec-news-date and .amantec-news-excerpt were removed from the
   shortcode's markup on 2026-09-01 (user: "news page no publishing date no
   excerpt"), so their rules are gone with them rather than left behind as
   dead selectors.

   The excerpt carried `flex-grow: 1`, which is what pushed "Read More" down to
   each card's bottom edge and kept the link baselines aligned across a row of
   uneven cards. With the excerpt gone that job moves to the title, or the
   whole row's Read More links stagger to wherever each title happens to end. */
.amantec-news-title {
	margin: 0 0 10px;
	font-size: 19px;
	font-weight: 800;
	line-height: 1.3;
	color: #13181A;
	flex-grow: 1;
}
.amantec-news-readmore {
	margin-top: 18px;
	font-size: 14px;
	font-weight: 700;
	color: #00747E;
}
@media (max-width: 1024px) {
	.amantec-news-card {
		width: calc(50% - 10px);
	}
}
@media (max-width: 767px) {
	.amantec-news-card {
		width: 100%;
	}
}

/* Contact Us — WPForms brand alignment. WPForms Lite's "Modern" markup
   (wpforms-full.min.css) sets its blue #066AAB submit button and near-black
   field borders via its own CSS custom properties (--wpforms-button-
   background-color etc.), and that stylesheet is enqueued AFTER this theme
   stylesheet (confirmed via network request order) — so a plain rule here
   loses the cascade tie even at higher selector specificity. !important is
   needed, same category of fight as the icon-box description color fix and
   the Free Cyber Tools badge sizing fix elsewhere in this file. */
.wpforms-container .wpforms-field input[type="text"],
.wpforms-container .wpforms-field input[type="email"],
.wpforms-container .wpforms-field select,
.wpforms-container .wpforms-field textarea {
	border-color: #D7DDDD !important;
	border-radius: 8px !important;
}
.wpforms-container .wpforms-field input[type="text"]:focus,
.wpforms-container .wpforms-field input[type="email"]:focus,
.wpforms-container .wpforms-field select:focus,
.wpforms-container .wpforms-field textarea:focus {
	border-color: #00747E !important;
}
.wpforms-container button[type="submit"].wpforms-submit {
	background-color: #00747E !important;
	border-radius: 10px !important;
	padding: 11px 22px !important;
	font-weight: 700 !important;
}
.wpforms-container button[type="submit"].wpforms-submit:hover {
	background-color: #005a62 !important;
}

/* Home hero — "Solutions" cyan-glow treatment (AmanTec Tech Refresh design
   canvas, "Main" direction).

   REVERTED 2026-09-02 to a native Heading widget. The note that used to sit
   here said a heading "has no inline-span support for the two-tone word" and
   used that to justify a text-editor holding a pasted <h1> with a full inline
   style block. The premise was wrong — the heading widget's title field
   renders markup, so a class-only <span> works — and the page's primary
   heading spent a fortnight as pasted HTML for no reason.

   Responsive sizes now come from the widget's own typography controls, so the
   `!important` font-size overrides that used to live here are gone with them.
   `.at-accent` is the two-tone word, in both this heading and the closing
   CTA's; the glow is scoped to the hero because only the hero wants it. */
.at-accent {
	color: var(--amantec-cyan);
}
.at-hero-h1 .at-accent {
	text-shadow: 0 0 34px rgba(22, 190, 207, 0.7);
}


/* Home hero — "Neo-HUD / Dark Ops" direction (AmanTec Tech Refresh design
   canvas, Direction A), replacing the plainer Main-direction glow pass
   above. Same wrapper-must-be-the-positioned-layer pattern as
   .elementor-element-heromedia1 / .elementor-element-ctaglow: the widget
   wrapper itself is made position:absolute, not a child div inside it.
   Reused as-is (same id, same rule) on every inner page's Page Header —
   see apply-neohud-inner-headers-2026-08-31.php — Elementor's generated
   class is id-based, so one shared "herogrid1" id picks up this one rule
   on all 13 pages with no per-page duplication. */
.elementor-element-herogrid1 {
	position: absolute !important;
	inset: 0;
	z-index: 1;
	overflow: hidden;
	pointer-events: none;
}
.at-hero-grid {
	position: absolute;
	inset: 0;
	background-image:
		repeating-linear-gradient(0deg, rgba(22,190,207,0.05) 0px, rgba(22,190,207,0.05) 1px, transparent 1px, transparent 42px),
		repeating-linear-gradient(90deg, rgba(22,190,207,0.05) 0px, rgba(22,190,207,0.05) 1px, transparent 1px, transparent 42px);
}
.at-hero-glow {
	position: absolute;
	width: 640px;
	height: 640px;
	right: -160px;
	top: -160px;
	background: radial-gradient(circle, rgba(22,190,207,0.16) 0%, rgba(22,190,207,0) 70%);
}

/* Page Header positioning context — same gotcha as .elementor-element-
   herosec1: Elementor containers don't get position:relative by default
   the way widget wrappers do, so herogrid1's absolute layer needs an
   explicit positioned/clipped ancestor here too. One page's header id per
   selector since each inner page duplicates its own Page Header container
   with its own id (see DESIGN.md's Page Header entry) rather than sharing
   one template part. */
.elementor-element-aboutheader,
.elementor-element-trainheader,
.elementor-element-srvheader,
.elementor-element-gzheader,
.elementor-element-bsheader,
.elementor-element-sphheader,
.elementor-element-grcheader,
.elementor-element-aiheader,
.elementor-element-ftheader,
.elementor-element-opheader,
.elementor-element-newsheader,
.elementor-element-contactheader {
	position: relative;
	overflow: hidden;
}

.at-status-pill {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin: 0 auto 26px;
	padding: 7px 16px;
	border: 1px solid rgba(22,190,207,0.4);
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 12px;
	font-weight: 700;
	letter-spacing: 0.06em;
	color: #16BECF;
}
.at-status-dot {
	width: 6px;
	height: 6px;
	border-radius: 999px;
	background: #16BECF;
	box-shadow: 0 0 8px 2px rgba(22,190,207,0.8);
}
@media (prefers-reduced-motion: no-preference) {
	.at-status-dot { animation: at-status-pulse 2.4s ease-in-out infinite; }
}
@keyframes at-status-pulse {
	0%, 100% { opacity: 1; }
	50% { opacity: 0.35; }
}

/* Hero CTA buttons — clipped-corner, uppercase mono, matching the Neo-HUD
   mockup. Elementor doesn't set clip-path/font-family/text-transform
   itself on the button widget, so this wins without !important. */
.elementor-element-herobtn1 .elementor-button,
.elementor-element-herobtn2 .elementor-button {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
}

/* Trust bar — "Lead-in and flush run" (direction B on the AmanTec Trust Bar
   canvas, chosen by the user 2026-09-01). Replaces the hairline-divided
   data-strip treatment entirely.

   WHY THE OLD ONE WENT. It was a rendering bug, not a style preference. It
   depended on "1px flex_gap + the row's own background showing through =
   dividers", which needed the five cells to split the row evenly via
   `flex: 1 1 0`. That rule never applied: Elementor's
   `.elementor-element { --flex-grow: initial; flex-grow: var(--flex-grow) }`
   is an exact (0,1,0) tie that loads after this stylesheet and wins on
   source order — the same tie already documented for `.elementor
   img{height:auto}`, the icon-box title colour and the solutions grid.
   Measured live: every cell computed `flex: 0 1 auto` and sized to its text
   (741px of content in a 1140px row), so `space-between` scattered them and
   the "1px dividers" rendered as four ~100px teal slabs.

   Direction B removes the mechanism rather than repairing it: no dividers,
   no cell backgrounds, no equal columns. Items sizing to their own content
   is now CORRECT, so the broken `flex: 1 1 0` rule is deleted rather than
   forced — there is nothing left for that reset to break. */

/* RETIRED 2026-10-04: the whole trust band was removed from Home. The ISO
   certification statement had to go (the certificates are ICON Contracting's,
   not AmanTec's), and a band holding a caption and one lone fact was not worth
   keeping, so the `trustbar` section went with it. These rules and the
   `trust-lead` / `trust-fact` / `trust-cert` widgets stay in the theme, unused,
   so the band can be rebuilt without redesigning it — do not restore the old
   "held within the group" certification wording with them.

   The facts group right while the caption stays hard left. All of them are
   siblings in one flex row, and `space-between` would spread the facts apart
   too — so the row is flex-start with a 76px column gap for the rhythm
   between facts, and the caption takes `margin-inline-end: auto` to push the
   group to the far edge. Logical property: RTL is free. */
.elementor-element-tblabel {
	margin-inline-end: auto;
}
.at-tb-lead {
	max-inline-size: 190px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.55;
	color: #7FA3A8;
}
/* Colour stance is inverted from the old strip on purpose: the VALUE is
   white and the label carries the cyan. On #080B0C that is ~19:1 for the
   value, ~8.9:1 for the label and ~6.4:1 for the caption. */
.at-tb-value {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 26px;
	font-weight: 700;
	color: #FFFFFF;
	line-height: 1.15;
}
.at-tb-label {
	margin-top: 9px;
	font-size: 10.5px;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: #16BECF;
}

/* Gap steps down before the row can crowd — without this the row's minimum
   width is 920px (616px of content + four 76px gaps) while the container is
   only 964px at a 1024px viewport, so it overflows just above the 900px
   breakpoint below.
   `!important` on the custom properties, not a two-class selector: the
   container's authored gap lands in Elementor's per-post stylesheet as
   `.elementor-21 .elementor-element.elementor-element-trustbarrow
   { --column-gap: 76px }`, which is (0,3,0) and outranks anything reasonable
   here. Same family of tie that broke this component in the first place,
   one specificity step higher. */
@media (max-width: 1200px) {
	.elementor-element-trustbarrow {
		--column-gap: 44px !important;
	}
}
@media (max-width: 900px) {
	/* Below 900px the caption takes its own full-width line and the four
	   facts fall into a 2-up grid, rather than the old single stacked column
	   which ran the band to five tall rows on a phone. `align-items` is
	   overridden through the same variable Elementor drives it with, since
	   the container's authored `center` would centre the grid ROWS here. */
	.elementor-element-trustbarrow {
		display: grid !important;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		--column-gap: 28px !important;
		--row-gap: 26px !important;
		--align-items: start !important;
	}
	.elementor-element-tblabel {
		grid-column: 1 / -1;
		margin-inline-end: 0;
	}
	.at-tb-lead {
		max-inline-size: none;
	}
}
@media (max-width: 767px) {
	/* 26px mono needs ~130px for "ISO 27001" and the 2-up columns are only
	   133px at 375px — it wrapped to two lines, which pushed that cell's
	   label out of line with the one beside it and made the row ragged.
	   20px fits the longest value on one line at the narrowest column. */
	.at-tb-value {
		font-size: 20px;
	}
	.at-tb-label {
		margin-top: 7px;
		font-size: 10px;
	}
}

/* ===================== Neo-HUD clipped corners — sitewide ===================== */
/* Real bug fix: earlier passes added clip-path to a few buttons as plain
   CSS but never removed the underlying Elementor border_radius SETTING
   those same buttons still carried (border-radius rounds the box before
   clip-path cuts it, so the corner rendered as a muddled rounded arc sitting
   inside the diagonal cut line, not a clean cut). Fixed at the source in
   apply-neohud-clip-corners-2026-08-31.php (every id below now has
   border_radius:0 in its own Elementor settings, not fought here with
   !important — there's no competing value left). This block adds the
   diagonal notch itself, extended to every bordered card/box and button
   found sitewide (see discover-radius-elements-2026-08-31.php's scan),
   not just the hero/nav ones touched in earlier passes.
   Two notch sizes only, not one per former radius value — a consistent cut
   size reads as one deliberate system; 12px for the bigger/former-14px
   cards, 10px for everything else (buttons and most cards). */
.elementor-element-solcard0,
.elementor-element-solcard1,
.elementor-element-solcard2,
.elementor-element-solcard3,
.elementor-element-solcard4,
.elementor-element-taicardlight,
.elementor-element-taicarddark,
.elementor-element-lp1,
.elementor-element-lp2,
.elementor-element-lp3,
.elementor-element-lp4,
.elementor-element-lp5,
.elementor-element-lp6,
.elementor-element-lc1,
.elementor-element-lc2,
.elementor-element-lc3,
.elementor-element-lc4,
.elementor-element-lc5,
.elementor-element-lc6,
.elementor-element-lc7,
.elementor-element-optile0,
.elementor-element-optile1,
.elementor-element-optile2,
.elementor-element-optile3,
.elementor-element-optile4,
.elementor-element-optile5 {
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
.elementor-element-herobtn1,
.elementor-element-herobtn2,
.elementor-element-taibtn1,
.elementor-element-taibtn2,
.elementor-element-ctabtn1,
.elementor-element-testicol1,
.elementor-element-testicol2,
.elementor-element-testicol3,
.elementor-element-teamcard0,
.elementor-element-teamcard1,
.elementor-element-traincard0,
.elementor-element-trainbtn0,
.elementor-element-traincard1,
.elementor-element-trainbtn1,
.elementor-element-traincard3,
.elementor-element-trainbtn3,
.elementor-element-traincard4,
.elementor-element-trainbtn4,
.elementor-element-traincard5,
.elementor-element-trainbtn5,
.elementor-element-traincard6,
.elementor-element-trainbtn6,
.elementor-element-traincard7,
.elementor-element-trainbtn7,
.elementor-element-traincard8,
.elementor-element-trainbtn8,
.elementor-element-srvcard0,
.elementor-element-srvcard1,
.elementor-element-srvcard2,
.elementor-element-srvcard3,
.elementor-element-srvcard4,
.elementor-element-srvcard5,
.elementor-element-srvcard6,
.elementor-element-srvcard7,
.elementor-element-srvctabtn,
.elementor-element-gzcapcard0,
.elementor-element-gzcapcard1,
.elementor-element-gzcapcard2,
.elementor-element-gzcapcard3,
.elementor-element-gzcapcard4,
.elementor-element-gzbencard0,
.elementor-element-gzbencard1,
.elementor-element-gzbencard2,
.elementor-element-gzbencard3,
.elementor-element-bssup0,
.elementor-element-bssup1,
.elementor-element-bssup2,
.elementor-element-bssup3,
.elementor-element-bsoff0,
.elementor-element-bsoff1,
.elementor-element-bsoff2,
.elementor-element-bsoff3,
.elementor-element-sphprod0,
.elementor-element-sphprod1,
.elementor-element-sphprod2,
.elementor-element-sphprod3,
.elementor-element-sphprod4,
.elementor-element-sphprod5,
.elementor-element-sphprod6,
.elementor-element-sphprod7,
.elementor-element-sphprod8,
.elementor-element-sphprod9,
.elementor-element-sphprod10,
.elementor-element-sphprod11,
.elementor-element-sphsol0,
.elementor-element-sphsol1,
.elementor-element-sphsol2,
.elementor-element-sphsol3,
.elementor-element-sphsol4,
.elementor-element-sphsol5,
.elementor-element-grccard0,
.elementor-element-grccard1,
.elementor-element-grccard2,
.elementor-element-grccard3,
.elementor-element-grccard4,
.elementor-element-aicard0,
.elementor-element-aicard1,
.elementor-element-aicard2,
.elementor-element-aicard3,
.elementor-element-aicard4,
.elementor-element-aicard5,
.elementor-element-ftcard0,
.elementor-element-ftcard0badge,
.elementor-element-ftcard0btn,
.elementor-element-ftcard1,
.elementor-element-ftcard1badge,
.elementor-element-ftcard1btn,
.elementor-element-ftcard2,
.elementor-element-ftcard2badge,
.elementor-element-ftcard2btn,
.elementor-element-ftcard3,
.elementor-element-ftcard3badge,
.elementor-element-ftcard3btn,
.elementor-element-ftcard4,
.elementor-element-ftcard4badge,
.elementor-element-ftcard4btn,
.elementor-element-ftcard5,
.elementor-element-ftcard5badge,
.elementor-element-ftcard5btn {
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
}

/* Contact form (WPForms) — same treatment extended to its fields/submit,
   which aren't Elementor elements so they're handled here rather than via
   the discovery script. border-radius:8px/10px (previously set with
   !important in the Contact Us brand-alignment block above) replaced with
   0 + the same 10px notch. */
.wpforms-container .wpforms-field input[type="text"],
.wpforms-container .wpforms-field input[type="email"],
.wpforms-container .wpforms-field select,
.wpforms-container .wpforms-field textarea,
.wpforms-container button[type="submit"].wpforms-submit {
	border-radius: 0 !important;
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
}

/* Nav dropdown flyout panel — same notch, completing the popover's
   consistency with every other box on the site.

   FIXED 2026-09-01: this rule used to put `clip-path` on the panel itself,
   which silently killed the third-level (sideways) submenu. `clip-path`
   clips EVERY descendant, and a sideways flyout sits outside its parent's
   box by definition — measured, the Services panel spans x 752-1068 while
   its nested flyout renders at x 1066-1291, so all but a 2px sliver was
   clipped away. The element was there and hoverable the whole time; it just
   never painted, which is why it read as "the submenu stopped appearing".

   The notch now lives on a `::before` background layer instead, so the panel
   keeps its clipped corner without clipping what's inside it. Two details
   that matter:
   - `isolation: isolate` on the panel, so the layer's `z-index: -1` stays
     inside the panel's own stacking context rather than sliding behind the
     header. The alternative (positioning the rows above the layer with
     `position: relative` on each `li`) would have made each row the
     containing block for the nested flyout and moved it.
   - The panel's own background/border/shadow move to the layer wholesale;
     leaving them on the element would double the border. */
.site-header .site-navigation ul.menu li ul {
	border-radius: 0;
	clip-path: none;
	background: transparent;
	border: 0;
	box-shadow: none;
	isolation: isolate;
}
.site-header .site-navigation ul.menu li ul::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background: #0B0F10;
	border: 1px solid rgba(22, 190, 207, 0.22);
	box-shadow: 0 16px 32px rgba(0, 0, 0, 0.45);
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
	pointer-events: none;
}


/* Button-widget correction: the 19 button ids above (Trainings, Training/AI
   split, About Us "harder to breach" CTA, Cybersecurity Services closing
   CTA, Free Cyber Tools "Learn More") were included in the tier-10 blanket
   rule above using their WRAPPER id alone — that's correct for containers
   (the card's visible border/background paints directly on the wrapper),
   but a button widget's visible box is the CHILD `.elementor-button` link,
   not the wrapper (which has no visible styling of its own). clip-path
   isn't inherited, so the wrapper rule silently did nothing visible on
   these — same root cause as the original hero-button bug, just missed on
   the new ones because the wrapper's own border-radius WAS already zeroed
   (Elementor settings, not this stylesheet) and so looked "fixed" at a
   glance. Same fix as herobtn1/herobtn2's existing dedicated rule: target
   the inner `.elementor-button` explicitly. */
.elementor-element-taibtn1 .elementor-button,
.elementor-element-taibtn2 .elementor-button,
.elementor-element-ctabtn1 .elementor-button,
.elementor-element-srvctabtn .elementor-button,
.elementor-element-trainbtn0 .elementor-button,
.elementor-element-trainbtn1 .elementor-button,
.elementor-element-trainbtn3 .elementor-button,
.elementor-element-trainbtn4 .elementor-button,
.elementor-element-trainbtn5 .elementor-button,
.elementor-element-trainbtn6 .elementor-button,
.elementor-element-trainbtn7 .elementor-button,
.elementor-element-trainbtn8 .elementor-button,
.elementor-element-ftcard0btn .elementor-button,
.elementor-element-ftcard1btn .elementor-button,
.elementor-element-ftcard2btn .elementor-button,
.elementor-element-ftcard3btn .elementor-button,
.elementor-element-ftcard4btn .elementor-button,
.elementor-element-ftcard5btn .elementor-button {
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
}


/* ===================== Home polish pass — 2026-09-01 =====================
   /impeccable polish on Home: header, hero, and page-wide layout rhythm.
   Every defect below was confirmed against the RENDERED page (computed
   styles and measured contrast ratios), not inferred from source. Content
   and settings changes for the same pass live in
   build-scripts/polish-home-2026-09-01.php.
   ========================================================================= */

/* --- Header: the washed-grey bug ---------------------------------------
   `rgba(5,8,9,0.82)` + `backdrop-filter` was written for a bar that sits
   OVER dark content. As a solid strip above a white page body it had
   nothing dark to sample, so it composited to a mid-grey at every scroll
   position — visibly not the near-black DESIGN.md's Navigation entry
   describes, and worst on mobile where the bar is tallest. The glass stays
   (it is doing real work once the bar overlays content on scroll); the base
   fill is raised so the bar reads as Neo-HUD chrome whatever is behind it.
   Sitewide, because the bug is sitewide. */
.site-header {
	background: rgba(8, 11, 12, 0.94);
}

/* --- Header: condense on scroll ---------------------------------------
   The bar was one fixed height at every scroll position. Giving it a
   resting height and a tighter scrolled height is what makes the overlay
   below read as one authored move rather than a background colour
   appearing. Logo and padding are the only things that move — the nav's
   own rhythm is untouched. */
/* Only ONE layout-affecting property animates here — the bar's own
   padding, which is the only honest way to change a bar's height. The logo
   condenses via `transform: scale()` (composited, no layout) rather than a
   second animated `height`, so the class toggle costs one reflow instead of
   two. It is also a discrete state change on a scroll threshold, not a
   per-frame animation. */
.site-header .header-inner {
	padding-block: 22px;
	transition: padding 0.28s cubic-bezier(0.16, 1, 0.3, 1);
}
.site-header .custom-logo,
.site-header .site-logo img {
	transform-origin: left center;
	transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1);
}
.site-header.at-scrolled .header-inner {
	padding-block: 10px;
}
.site-header.at-scrolled .custom-logo,
.site-header.at-scrolled .site-logo img {
	transform: scale(0.84);
}
/* Below 1200px: phones, tablets and small laptops (2026-09-21).
   Hello Elementor caps the header at 500px (576–767), 600px (768–991) and
   800px (992–1199) — theme.css, 500/600/800/1140 steps — and pads it 20px on
   phones, while the page content runs to 30px from each edge at every one of
   these widths. So the logo sat anywhere from 10px outside to ~200px inside
   the headlines' edge. The header now runs the same width as the content
   (30px side inset) at every width below 1200px, so the logo lines up with
   the page.
   992–1199 had a second problem: Hello switches to the full desktop menu at
   992px, and the eight items (~870px) could not fit beside the logo — the
   menu wrapped to a second row and the header grew to ~225px. That range
   uses the hamburger panel instead. Even at full width the eight items only
   fit from ~1135px, so the desktop menu starts at 1200px, where the 1140px
   header is known to hold it.
   `body` prefixes: Hello's rules are (0,2,0) for the width and (0,4,0)
   !important for the toggle/nav display, and its stylesheets load after
   this one. */
@media (max-width: 1199px) {
	body .site-header .header-inner {
		max-width: none;
		padding-inline: 30px;
	}
}
/* 1200px and up (2026-09-21): Hello's 1140px header is already exactly the
   width of the page content (both centre a 1140px column), but its 20px
   side padding pushed the logo 20px in from every headline and pulled the
   menu's last item (Contact Us) 20px short of the content's right edge.
   No side padding here, so both ends line up with the page. It also gives
   the eight-item menu 40px more room. */
@media (min-width: 1200px) {
	body .site-header .header-inner {
		padding-inline: 0;
	}
}
@media (min-width: 992px) and (max-width: 1199px) {
	body .site-header.menu-dropdown-tablet:not(.menu-layout-dropdown) .site-navigation {
		display: none !important;
	}
	body .site-header.menu-dropdown-tablet:not(.menu-layout-dropdown) .site-navigation-toggle-holder {
		display: flex !important;
	}
}
@media (max-width: 767px) {
	/* the mobile bar measured 133px tall — a 46px logo floating in a field
	   of padding with the hamburger stranded opposite it. Logo raised back to
	   48px 2026-09-01 (see the 62px desktop note) while keeping the tightened
	   padding, so the bar gains height from the mark, not from empty space. */
	.site-header .header-inner {
		padding-block: 14px;
	}
	.site-header .custom-logo,
	.site-header .site-logo img {
		height: 48px;
	}
	.site-header.at-scrolled .header-inner {
		padding-block: 8px;
	}
}

/* --- Header: overlay the Home hero -------------------------------------
   `position: fixed` rather than a negative pull-up on the content: fixed
   takes the bar out of flow entirely, so the hero starts at document top
   with no offset arithmetic to keep in sync with the header's real height
   (which is font- and zoom-dependent, so any hard-coded offset would drift).
   Every section below scrolls under it exactly as it did when sticky.
   `at-overlay-header` is added by amantec_body_class() on the front page
   only — see the comment there for why inner pages are excluded. */
body.at-overlay-header .site-header {
	position: fixed !important;
	inset-inline: 0;
	top: 0;
	background: transparent;
	border-bottom-color: transparent;
	transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
}
body.at-overlay-header .site-header.at-scrolled {
	background: rgba(8, 11, 12, 0.9);
	border-bottom-color: rgba(22, 190, 207, 0.32);
}
/* Elementor's generated per-post CSS sets this padding at
   `.elementor-NNN .elementor-element.elementor-element-herosec1`, which
   outranks anything reasonable here — !important matches the tie-break
   pattern already established throughout this file. Top padding now has to
   clear the resting header as well as set the hero's own breathing room.

   2026-10-04, with the hero at 100svh and its content centred: the gap
   between the two paddings is what positions the copy. Flex centres it
   between them, so `padding-top − padding-bottom` shifts it down by half that
   difference, and setting the difference to the header's own height lands the
   copy on the optical centre of the area the fixed header leaves free — at any
   viewport height, which a fixed offset could not do. The header measures 139px
   from 768px up (137px at 600px, 121px at 375px), so desktop takes 230/90 and
   lands dead on centre. Below 767px the difference is pulled back to 100px
   against a 121px header, which sits the copy 10px high on purpose: 150/50 is
   the largest pair that keeps the whole copy block inside a 667px handset
   (the hero itself measures 685px there, so only 18px of its bottom padding
   falls below the fold, not a word of the copy), and a 10px lift costs less
   than making the shortest phones scroll to reach the buttons. Measured at 375x812, 375x667, 768x1024 and
   1024x768. A landscape phone (740x380) is past saving either way — the copy
   alone is taller than the viewport, so the hero runs long and scrolls, which
   is why these paddings are a floor and not a fixed height. */
body.at-overlay-header .elementor-element-herosec1 {
	padding-top: 230px !important;
	padding-bottom: 90px !important;
}
@media (max-width: 767px) {
	body.at-overlay-header .elementor-element-herosec1 {
		padding-top: 150px !important;
		padding-bottom: 50px !important;
	}
}

/* --- Hero: legibility over the video -----------------------------------
   The old overlay was a single diagonal linear-gradient that reached its
   LIGHTEST point (0.42 alpha) at 60% across — directly under the centred
   copy column, and directly over the busiest part of the network-graph
   footage. Recomposed as a scrim that actually tracks the composition: a
   radial holding the copy column, plus a vertical pass that darkens under
   the now-overlaying header and again into the trust bar below, so the
   hero hands off to that dark strip without a seam. */
.at-hero-overlay {
	background:
		radial-gradient(ellipse 64% 60% at 50% 52%, rgba(3, 6, 7, 0.82) 0%, rgba(3, 6, 7, 0.52) 46%, rgba(3, 6, 7, 0) 78%),
		linear-gradient(180deg, rgba(3, 6, 7, 0.88) 0%, rgba(3, 6, 7, 0.34) 24%, rgba(3, 6, 7, 0.42) 66%, rgba(3, 6, 7, 0.92) 100%);
}

/* --- Hero: the status pill was not centred -----------------------------
   `.at-status-pill` is `display:inline-flex` with `margin: 0 auto` — auto
   inline margins do nothing for an inline-level box, so the pill sat hard
   against the container's inline-start edge while the H1, paragraph and
   button row above and below it were all centred. It read as a bug, and at
   1440px it was ~500px adrift of everything else. Centring belongs on the
   parent, where inline-level content actually listens for it. */
.elementor-element-herostatus1 {
	text-align: center;
}
.at-status-pill {
	/* more space below the pill than the H1 gives its own paragraph, so the
	   lead reads as belonging to the headline and the pill reads as separate
	   chrome above it. */
	margin: 0 0 30px;
}

/* --- Hero: lead paragraph measure --------------------------------------
   Measured before the fix: 677 characters, centred across the full 1120px
   content box — ~113 characters per line over 6 lines, against DESIGN.md's
   65-75ch. On mobile it ran to 13 lines. The copy itself was split across
   the sections it belongs to (see the build script); what remains is held
   to a real measure here.

   THE ONE DISCLOSED EXCEPTION TO THE ALL-<p>-IS-14PX RULE.
   The hero lead is 17px (16px under 768px), not 14px. That rule is a
   standing user directive that carries "no exceptions" — this exception was
   offered, declined by default, and then granted directly by the user on
   2026-09-01 after seeing the 14px version live. It exists because this is
   the only <p> on the site sitting directly beneath 70px display type; at
   14px the step between them was a five-fold jump with nothing in between,
   which read as a caption rather than as the headline's own sentence. It is
   NOT a reopening of the body tier: every other <p> on the site, including
   the three section intros this same pass created, is still 14px. Do not
   raise a second one without the same kind of direct instruction.

   The measure has to go on the <p>, not the widget wrapper: Elementor's own
   `.elementor-widget-text-editor` rule sets `max-width:100%` at a
   specificity this can't beat, and max-inline-size IS max-width, so a
   wrapper rule computes straight back to 100%. Note `ch` is relative to the
   element's own font-size, so the 62ch measure holds at 62 characters
   through the size bump — it did not need retuning alongside it. Leading
   tightens from 1.8 to 1.65 because the looser value was compensating for
   the smaller size and is too airy at 17px. */
.elementor-element-11ed3c1 p {
	max-inline-size: 62ch;
	margin-inline: auto;
	/* 17px -> 14px, 2026-09-02: the "every <p> is 14px, no exceptions"
	   directive is now actually enforced sitewide. The measure stays at 62ch
	   because that is a ratio of the font size, not a fixed width, so the line
	   length stays right at the smaller size. */
	line-height: 1.65;
	color: rgba(255, 255, 255, 0.88);
}
@media (max-width: 767px) {
	/* one step down, mirroring the H1's own 70 -> 48 -> 36 ramp. The 62ch cap
	   is deliberately left in place rather than released here: measured at
	   both ends of this range it never binds tighter than the column already
	   does (36ch at 375px, 72ch at 700px), so lifting it would be a rule that
	   changes nothing. */
}
/* More space above the H1 than below it — the paragraph belongs to the
   heading, the pill does not. */
.elementor-element-11ed3c1 {
	margin-top: 22px;
}

/* --- Solution cards: title colour now comes from the fixed kit ---------
   The 2026-09-01 polish pass forced these to ink with !important, because
   the icon-box widgets set no title colour and therefore inherited the
   global kit's `primary` — which was cyan, measuring 2.26:1 on white against
   a 3:1 large-text floor. The kit's `primary` is teal as of
   fix-kit-primary-to-teal-2026-09-01.php, so the inherited value is now
   correct (5.53:1) and the override is gone: these five cards match the 70
   sibling card titles on Trainings / Services / GravityZone / Bitdefender /
   Sophos / GRC / AI GRC instead of being the one page with ink titles.
   Only the hover state still needs a rule. Elementor's own
   `:has(:hover)` sets the title back to kit-primary on hover, which is now
   the SAME teal as its rest state — i.e. no feedback at all on a card that
   is entirely a link. Teal-dark restores the affordance and matches the
   primary button's own hover. */
.elementor-element-solicon0:hover .elementor-icon-box-title,
.elementor-element-solicon1:hover .elementor-icon-box-title,
.elementor-element-solicon2:hover .elementor-icon-box-title,
.elementor-element-solicon3:hover .elementor-icon-box-title,
.elementor-element-solicon4:hover .elementor-icon-box-title,
.elementor-element-solcard0:hover .elementor-icon-box-title,
.elementor-element-solcard1:hover .elementor-icon-box-title,
.elementor-element-solcard2:hover .elementor-icon-box-title,
.elementor-element-solcard3:hover .elementor-icon-box-title,
.elementor-element-solcard4:hover .elementor-icon-box-title {
	color: var(--amantec-teal-dark) !important;
}

/* --- Card index numbers were effectively invisible ---------------------
   #D7DDDD on white measured 1.37:1. It is a quiet catalogue tag, not
   decoration — if it is on the card it should be readable. Reuses the
   Paper muted-text token (6.1:1) and drops a size/adds tracking so it still
   reads as a tag rather than competing with the title. (#4A5456 is the
   Paper-mode muted-ink literal used throughout this file; it has no token
   of its own.) */
.at-solnum {
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.08em;
	color: #4A5456;
}

/* --- Section intros: the relocated hero sentences ----------------------
   Same measure discipline as the hero lead — these are single sentences
   under a 34px heading, so they get a real measure rather than the full
   1320px container. */
.elementor-element-statsintro p,
.elementor-element-taiintro p,
.elementor-element-solintro p {
	max-inline-size: 68ch;
	margin-inline: auto;
}


/* ===================== Impact panel — overdrive, 2026-09-01 ===============
   /impeccable overdrive on the Home Impact section. The problem was an energy
   collapse, not a dull card style: a dark video hero, then the dark trust
   strip, then four small white boxes. The user picked the "dark inset
   instrument panel" direction of three offered — the section stays Paper, so
   DESIGN.md's "don't convert a content section to dark without being asked"
   holds, and only the stat row becomes Neo-HUD. A panel dropped into a light
   band is a bookend moment, which is what Neo-HUD is for.

   Motion brief, also the user's pick: ONE entrance, then completely still.
   No scroll parallax, no ambient loop.
   ========================================================================= */

.at-panel {
	position: relative;
	background: #080B0C;
	border: 1px solid rgba(22, 190, 207, 0.28);
	/* Safe to clip here, unlike the nav flyout: nothing escapes this box, and
	   the sweep below is REQUIRED to be clipped by it. See DESIGN.md Shapes
	   for the rule this is the good side of. */
	border-radius: 0;
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
	overflow: hidden;
	isolation: isolate;
}
.at-panel-grid {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
}
.at-stat {
	padding: 40px 30px 38px;
	border-inline-start: 1px solid rgba(22, 190, 207, 0.16);
}
.at-stat:first-child {
	border-inline-start: 0;
}
.at-stat-num {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 46px;
	font-weight: 700;
	line-height: 1.15;
	color: #FFFFFF;
	letter-spacing: -0.01em;
}
/* Labels are Title-case here, not the uppercase+tracked register the trust
   bar's labels use. Deliberate: these run to 45+ characters ("Hours Spent
   Training Organizations and Individuals") and wrap to three lines, where
   uppercase with 0.1em tracking stops being readable. Same cyan, same role,
   readable at the length this content actually is. */
.at-stat-label {
	margin-top: 14px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.55;
	letter-spacing: 0.01em;
	color: #16BECF;
}

/* --- The odometer ------------------------------------------------------
   Cells are sized in `em`, so the roll distance scales with font-size and the
   strips stay aligned through every breakpoint and any resize mid-animation —
   a px height measured once at build time would not. */
.at-od {
	display: inline-flex;
	align-items: flex-start;
}
.at-od-win {
	display: inline-block;
	overflow: hidden;
	height: 1.15em;
	line-height: 1.15;
}
.at-od-strip {
	display: block;
	transform: translateY(0);
}
.at-od-cell {
	display: block;
	height: 1.15em;
	line-height: 1.15;
	font-variant-numeric: tabular-nums;
}
.at-od-static {
	display: inline-block;
	line-height: 1.15;
}
.at-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* --- The sweep ---------------------------------------------------------
   A single pass of cyan across the readout. Each column's digits begin
   rolling as it crosses them (delays are set in JS), so this reads as one
   instrument powering on rather than as two unrelated effects. */
.at-panel-sweep {
	position: absolute;
	inset-block: 0;
	inset-inline-start: -240px;
	width: 240px;
	z-index: 1;
	pointer-events: none;
	opacity: 0;
	background: linear-gradient(
		90deg,
		rgba(22, 190, 207, 0) 0%,
		rgba(22, 190, 207, 0.10) 40%,
		rgba(22, 190, 207, 0.30) 50%,
		rgba(22, 190, 207, 0.10) 60%,
		rgba(22, 190, 207, 0) 100%
	);
}

/* Hidden state is applied ONLY under `js-at-ready`, which the script adds
   after confirming it can resolve the entrance — so a no-JS visitor never
   meets an invisible panel. Same guard as the closing CTA's reveal. */
.at-panel.js-at-ready {
	opacity: 0;
	transform: translateY(14px);
	transition: opacity 700ms cubic-bezier(0.16, 1, 0.3, 1),
	            transform 700ms cubic-bezier(0.16, 1, 0.3, 1);
}
.at-panel.js-at-ready.is-on {
	opacity: 1;
	transform: none;
}
.at-panel.js-at-ready .at-od-strip {
	/* 20 = two full 0-9 cycles plus the target digit appended by the script. */
	transition: transform 640ms cubic-bezier(0.16, 1, 0.3, 1);
}
.at-panel.js-at-ready.is-on .at-od-strip {
	transform: translateY(calc(-20 * 1.15em));
}
.at-panel.js-at-ready.is-on .at-panel-sweep {
	animation: at-panel-sweep 720ms cubic-bezier(0.4, 0, 0.2, 1) 100ms 1 both;
}
/* The travel distance is the PANEL's width + the bar's own width, set as
   `--at-sweep-x` by the script. It cannot be written in CSS: a percentage in
   `translateX` resolves against the ELEMENT (240px here), not the parent, and
   the `100vw` first written here overshot a 1140px panel by 540px — the panel
   clips the overflow, so the sweep looked finished at ~68% of its duration
   while the last column's digits had not started. The mistimed version read
   as two unrelated effects, which is exactly what this entrance must not be. */
@keyframes at-panel-sweep {
	0%   { opacity: 0; transform: translateX(0); }
	12%  { opacity: 1; }
	86%  { opacity: 1; }
	100% { opacity: 0; transform: translateX(var(--at-sweep-x, 120vw)); }
}

/* --- Responsive --------------------------------------------------------
   2-up at tablet, 1-up on phones. Dividers move with the arrangement: the
   inline border only belongs between columns, so the wrapped rows take a
   block border instead of inheriting an inline one that would sit in the
   wrong place. */
@media (max-width: 1024px) {
	.at-stat-num { font-size: 40px; }
	.at-stat { padding: 34px 26px 32px; }
}
@media (max-width: 900px) {
	.at-panel-grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
	.at-stat:nth-child(2n + 1) {
		border-inline-start: 0;
	}
	.at-stat:nth-child(n + 3) {
		border-block-start: 1px solid rgba(22, 190, 207, 0.16);
	}
}
@media (max-width: 560px) {
	.at-panel-grid {
		grid-template-columns: minmax(0, 1fr);
	}
	.at-stat {
		border-inline-start: 0;
		padding: 28px 22px 26px;
	}
	.at-stat + .at-stat {
		border-block-start: 1px solid rgba(22, 190, 207, 0.16);
	}
	.at-stat-num { font-size: 34px; }
	.at-stat-label { margin-top: 10px; font-size: 12px; }
}


/* ===================== Single news item — 2026-09-01 =====================
   Template: single.php (root of this child theme, so it claims single POSTS
   only and leaves the 13 Elementor pages on the parent's part). Built from a
   reviewed design canvas; layout is the site's existing inner-page
   vocabulary rather than a new one.
   ========================================================================= */

/* hello-elementor's `.site-main` carries a max-width and auto inline margins
   (it is built for a boxed content column). post_class() puts that class on
   this template's <main> too, which left the dark arrival band floating as an
   inset 1140px rectangle with paper either side instead of running full-bleed
   like every other Page Header on the site.
   THREE classes, and the count is the whole point. The parent's rule is
   `body:not([class*="elementor-page-"]) .site-main` in hello's separate
   `theme.css` — an attribute selector inside :not() counts as a class, so it
   is (0,2,1), and theme.css is enqueued AFTER this stylesheet. A plain
   `.amantec-article` (0,1,0) and even `.site-main.amantec-article` (0,2,0)
   both lose to it. Prefixing with the body's own `single-post` class reaches
   (0,3,0), which wins outright with no !important.
   It also sets that max-width inside four `@media (min-width: …)` blocks
   (500/600/800/1140px); media queries add no specificity, so this one
   unconditional rule beats all four without restating a single breakpoint.
   Neutralised rather than dropping `site-main` from post_class(), so anything
   else keyed to that class still applies. */
.single-post .site-main.amantec-article {
	max-width: none;
	width: 100%;
	margin-inline: 0;
	padding: 0;
	background: var(--amantec-paper);
}

/* --- arrival band: the same Page Header pattern as the 12 inner pages --- */
.amantec-article-header {
	position: relative;
	overflow: hidden;
	background: var(--amantec-ink);
	/* 30px sides, not 20px (2026-09-21): the site header's logo and every
	   Elementor page's content sit 30px from the edge below 1200px, and the
	   header now matches them exactly, so articles were the one page type
	   10px off. Above 1200px the 1140px inner column centres either way. */
	padding: 64px 30px 56px;
}
.amantec-article-header__deco {
	position: absolute;
	inset: 0;
	overflow: hidden;
	pointer-events: none;
}
/* Reuses the hero's own decorative classes rather than redefining their
   values — .at-hero-grid and .at-hero-glow are plain classes (only their
   Elementor POSITIONING wrapper was id-scoped), so the one set of tokens
   stays in one place. (A third layer, .at-hero-circuit, was removed sitewide
   on 2026-09-02 at the user's request.) */
/* 1140px, not the 1400px the Page Header's Elementor wrapper reports: that
   wrapper is 1400 wide but the CONTENT inside it resolves to Elementor's
   1140 boxed container, which is where every other headline on the site
   starts (x=150 at a 1440 viewport). Measured off the live inner pages
   rather than read off the wrapper — the two disagree. */
.amantec-article-header__inner {
	position: relative;
	max-width: 1140px;
	margin-inline: auto;
}
.amantec-article-title {
	margin: 0;
	max-inline-size: 980px;
	font-size: 48px;
	font-weight: 800;
	line-height: 1.05;
	letter-spacing: -0.03em;
	color: var(--amantec-white);
	text-wrap: pretty;
}

/* --- the article column ------------------------------------------------ */
.amantec-article-body {
	max-inline-size: 68ch;
	margin-inline: auto;
	padding: 72px 30px 88px;
}
/* 17px, not the sitewide 14px: the user's explicit choice on the design
   canvas, made against a 14px column set side by side at the same measure.
   This is the SECOND disclosed exception to the All-<p>-Is-14px Rule, after
   the Home hero lead, and it is scoped to article bodies — a 600-900 word
   news story is the one content type on this site the 14px rule was never
   written for. Everything outside `.amantec-article-body` is unaffected. */
.amantec-article-body p {
	margin: 0 0 22px;
	/* 17px -> 14px, 2026-09-02, under the sitewide "every <p> is 14px, no
	   exceptions" directive. Flagged to the user at the time: this is the one
	   place on the site where a larger size was doing real work — a news
	   article is long-form reading copy, and 14px justified at this measure is
	   harder to read than 17px was. Reverting is this one value.
	   The 68ch measure below is a ratio of the font size, so the line length
	   stays correct at the smaller size without touching it. */
	font-size: 14px;
	line-height: 1.75;
	color: var(--amantec-ink);
	/* Justified on the user's instruction 2026-09-01. `hyphens` is not
	   optional alongside it: justifying a 68ch column without hyphenation
	   opens visible rivers of white space between words, worst on the mobile
	   column where the measure drops to ~45 characters. The document's
	   `lang="en-US"` (set by WP in header.php) is what lets the browser
	   hyphenate at all — if this template is ever reused for Arabic, revisit
	   both properties together. */
	text-align: justify;
	-webkit-hyphens: auto;
	hyphens: auto;
}
.amantec-article-body p:last-of-type {
	margin-bottom: 0;
}
/* The dateline paragraph, tagged in single.php only when the first paragraph
   really is one (see the detection note there). */
.amantec-article-body p.amantec-article-dateline {
	/* Not justified and not hyphenated: it is one short line where justify
	   can only do harm, and a hyphenated place name would read as an error. */
	text-align: start;
	hyphens: manual;
	margin-bottom: 30px;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1.6;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: #4A5456;
}
/* h2-h4 all appear as section headings across the six real posts (147 uses
   h4 where h2 is meant), so all three are given a real step rather than
   assuming the markup is semantically clean. More space above than below. */
.amantec-article-body h2,
.amantec-article-body h3,
.amantec-article-body h4 {
	margin: 48px 0 16px;
	font-weight: 800;
	line-height: 1.2;
	letter-spacing: -0.02em;
	color: var(--amantec-ink);
	text-wrap: pretty;
}
.amantec-article-body h2 { font-size: 28px; }
.amantec-article-body h3 { font-size: 24px; }
.amantec-article-body h4 { font-size: 21px; }
.amantec-article-body ul,
.amantec-article-body ol {
	margin: 0 0 22px;
	padding-inline-start: 22px;
	font-size: 14px;
	line-height: 1.75;
	color: var(--amantec-ink);
}
.amantec-article-body li {
	margin-bottom: 10px;
}
.amantec-article-body li::marker {
	color: var(--amantec-teal);
}
.amantec-article-body strong {
	font-weight: 700;
	color: var(--amantec-ink);
}
/* One post leads with a 200x200 inline image; keep any image in the column
   contained and never overflowing the measure. */
.amantec-article-body img {
	max-width: 100%;
	height: auto;
	display: block;
	margin: 6px 0 26px;
}
/* Embeds. WordPress's oEmbed drops a bare `<iframe width="800" height="450">`
   straight into a paragraph here — no `wp-block-embed` wrapper, no
   responsive class — so the workshop post's video overhung the 622px reading
   column by 178px. Sized to the column and given the 16:9 ratio its own
   width/height attributes imply; `display: block` also takes it out of the
   inline flow, so the justification on its parent paragraph cannot stretch
   the line it sits on. */
/* :not(twitter-widget): the 16:9 box is for YouTube. X posts render as an
   iframe too, and size their own height from the post's content. */
.amantec-article-body iframe:not([id^="twitter-widget"]) {
	display: block;
	width: 100%;
	max-width: 100%;
	aspect-ratio: 16 / 9;
	height: auto;
	border: 0;
	margin: 6px 0 26px;
}

/* Browser-default link chrome is themed rather than left as-is: the
   underline sits off the baseline and takes the brand color. */
.amantec-article-body a {
	color: var(--amantec-teal);
	text-decoration-thickness: 1px;
	text-underline-offset: 3px;
}
.amantec-article-body a:hover {
	color: var(--amantec-teal-dark);
}

/* --- news-source card (2026-09-21) ---------------------------------------
   The old site links each third-party news story as a card: icon, the
   source's own headline, the outlet underneath. Used in the MoD workshop
   article for Kuwait University's report, which is in Arabic, so the card
   carries lang="ar" dir="rtl" and the Arabic face; the icon then sits on
   the reading-start side (the right). A card is a SURFACE, so it gets the
   one 12px bevel, top-left like every other surface on the site; the icon
   plate is a control and stays square (DESIGN.md Shapes). `a.` prefix: the
   article's own link rule (.amantec-article-body a) would otherwise colour
   and underline the whole card. */
.amantec-article-body p.amantec-article-source-p {
	margin: 8px 0 28px;
	text-align: start;
}
.amantec-article-body a.amantec-article-source {
	display: flex;
	align-items: center;
	gap: 16px;
	padding: 18px 20px;
	background: #FBFCFC;
	border: 1px solid var(--amantec-border-soft);
	color: var(--amantec-ink);
	text-decoration: none;
	font-family: var(--amantec-font-ar);
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
	transition: border-color 0.2s ease-out, background-color 0.2s ease-out;
}
@supports (corner-shape: bevel) {
	.amantec-article-body a.amantec-article-source {
		clip-path: none;
		border-top-left-radius: 12px;
		corner-shape: bevel;
	}
}
.amantec-article-body a.amantec-article-source:hover {
	border-color: rgba(0, 116, 126, 0.45);
	background: #FFFFFF;
	color: var(--amantec-ink);
}
.amantec-article-source__icon {
	flex: none;
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	background: rgba(0, 116, 126, 0.08);
}
.amantec-article-source__icon::before {
	content: "";
	width: 24px;
	height: 24px;
	/* A plain background image, pre-coloured teal — not a CSS mask. The mask
	   version rendered in Chrome but the user saw no icon at all, and a
	   background image is the one way every browser draws. */
	background: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%2300747E'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M15%2018h-5'/%3E%3Cpath%20d='M18%2014h-8'/%3E%3Cpath%20d='M4%2022h16a2%202%200%200%200%202-2V4a2%202%200%200%200-2-2H8a2%202%200%200%200-2%202v16a2%202%200%200%201-4%200v-9a2%202%200%200%201%202-2h2'/%3E%3Crect%20width='8'%20height='4'%20x='10'%20y='6'%20rx='1'/%3E%3C/svg%3E") no-repeat center / contain;
}
.amantec-article-source__title {
	display: block;
	font-size: 16px;
	font-weight: 700;
	line-height: 1.6;
}
.amantec-article-source__label {
	display: block;
	margin-top: 4px;
	font-size: 13px;
	line-height: 1.5;
	color: #4A5456;
}
.amantec-article-body a.amantec-article-source:hover .amantec-article-source__title {
	color: var(--amantec-teal-dark);
}

/* --- embedded X posts (2026-09-21) ---------------------------------------
   WordPress's oEmbed turns a twitter.com link into X's blockquote plus
   X's script, which swaps in the real post. Until it loads, or if a
   visitor's browser blocks it, the blockquote is all there is: a quiet rule
   on the reading-start side and the Arabic face, not a box. */
.amantec-article-body blockquote.twitter-tweet {
	margin: 8px 0 28px;
	padding: 4px 16px;
	border-inline-start: 3px solid var(--amantec-teal);
	font-family: var(--amantec-font-ar);
	font-size: 14px;
	line-height: 1.7;
	color: #4A5456;
}
.amantec-article-body blockquote.twitter-tweet p {
	margin-bottom: 6px;
	text-align: start;
}
/* An Arabic post reads right to left, so its rule belongs on the right. */
.amantec-article-body blockquote.twitter-tweet:has(> p[dir="rtl"]) {
	direction: rtl;
}
.amantec-article-body .twitter-tweet-rendered {
	margin-block: 8px 28px !important;
}

/* Divider, as the old site puts above an article's boilerplate. */
.amantec-article-body hr {
	margin: 40px 0 8px;
	border: 0;
	border-top: 1px solid var(--amantec-border-soft);
}

/* --- share row (2026-09-21) ----------------------------------------------
   The old site's "Share the Post:" + Facebook / X / LinkedIn, rebuilt in
   this system's registers: the label is a mono uppercase data label (like
   the dateline), the buttons are the Contact page's social icons — ink
   square, cyan hairline and mark, teal on hover. Buttons are CONTROLS, so
   they are square: no bevel (DESIGN.md Shapes). 40px targets. */
.amantec-article-share {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 12px 16px;
	margin-top: 40px;
}
.amantec-article-share__label {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 11.5px;
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: #4A5456;
}
/* `.amantec-article-body` prefix: the article's own ul/li rules (0,1,1)
   would otherwise add a 22px bottom margin, an indent and 10px per item,
   which pushed the buttons off the label's centre line. */
.amantec-article-body ul.amantec-article-share__list {
	display: flex;
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.amantec-article-body .amantec-article-share__list li {
	margin: 0;
}
.amantec-article-body a.amantec-article-share__btn {
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	background: #13181A;
	border: 1px solid rgba(22, 190, 207, 0.28);
	color: var(--amantec-cyan);
	text-decoration: none;
	transition: background-color 0.18s ease-out, border-color 0.18s ease-out, color 0.18s ease-out;
}
.amantec-article-share__btn svg {
	width: 16px;
	height: 16px;
	fill: currentColor;
}
.amantec-article-body a.amantec-article-share__btn:hover,
.amantec-article-body a.amantec-article-share__btn:focus-visible {
	background: var(--amantec-teal);
	border-color: var(--amantec-teal);
	color: #FFFFFF;
}
.amantec-article-share + .amantec-article-back {
	margin-top: 28px;
}

/* --- the one return path ------------------------------------------------ */
.amantec-article-back {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	margin-top: 40px;
	padding-top: 26px;
	border-top: 1px solid var(--amantec-border);
	width: 100%;
	box-sizing: border-box;
	font-size: 15px;
	font-weight: 700;
	color: var(--amantec-teal);
	text-decoration: none;
}
.amantec-article-back:hover {
	color: var(--amantec-teal-dark);
}

@media (max-width: 1024px) {
	.amantec-article-title { font-size: 36px; }
	.amantec-article-body { padding-top: 56px; padding-bottom: 68px; }
}
@media (max-width: 767px) {
	.amantec-article-header { padding: 40px 30px 34px; }
	.amantec-article-title { font-size: 28px; letter-spacing: -0.025em; }
	.amantec-article-body { padding: 34px 30px 44px; }
	.amantec-article-body h2 { font-size: 24px; }
	.amantec-article-body h3 { font-size: 21px; }
	.amantec-article-body h4 { font-size: 19px; }
}

/* ===================== Sitewide scroll reveal — 2026-09-01 ===============
   Paired with assets/js/scroll-reveal.js. The hidden state is gated behind
   `js-reveal-ready` on <html>, which the script adds ONLY after it has
   confirmed IntersectionObserver support and that the visitor is not asking
   for reduced motion — so with JS off, an old browser, or reduce-motion set,
   nothing is ever hidden and the page renders exactly as it did before.
   (Same contract as the Impact panel's `js-at-ready` and the closing CTA's
   `js-cta-ready`; those two sections are excluded from this system entirely
   so their own authored moments are not double-animated.)

   `will-change` is deliberately NOT set: these are one-shot entrances that
   unobserve themselves, and a permanent compositor layer per card across a
   nine-card grid costs more than the single transition it would smooth. */
.js-reveal-ready .at-reveal {
	opacity: 0;
	transform: translateY(16px);
}
.js-reveal-ready .at-reveal.is-revealed {
	opacity: 1;
	transform: none;
	transition:
		opacity 0.55s cubic-bezier(0.16, 1, 0.3, 1) var(--at-reveal-delay, 0ms),
		transform 0.55s cubic-bezier(0.16, 1, 0.3, 1) var(--at-reveal-delay, 0ms);
}
/* Belt and braces next to the script's own matchMedia check: a visitor can
   flip the OS setting after load, and the script has already run by then. */
@media (prefers-reduced-motion: reduce) {
	.js-reveal-ready .at-reveal,
	.js-reveal-ready .at-reveal.is-revealed {
		opacity: 1;
		transform: none;
		transition: none;
	}
}

/* ===================== Header menu — Neo-HUD pass, 2026-09-01 =============
   User: the menu "reads too plain / generic" on desktop, and the mobile panel
   "needs work". Both are answered from the system that already exists on this
   site rather than by inventing a new one.

   DESKTOP. The top-level items were the only chrome in the header still set
   in plain sentence-case body type — sitting directly beside a monospace,
   uppercase, clipped-corner CTA pill, which is what made the row read as a
   default theme menu with one styled button dropped into it. They are now in
   the same label register the rest of the site uses for nav/label/data text
   (trust bar, stat chips, the CTA pill itself). This is NOT the "mono for
   prose" mistake the footer note warns against: six one-or-two-word nav
   labels are labels, not sentences, which is exactly the case that register
   is reserved for. Dropdown rows stay in the regular face — those read as a
   list of page names and get long enough to be prose-like.

   The hover/current state gains the Neo-HUD clipped corner and a cyan base
   rule, so the active page is marked by the same geometry as the buttons
   instead of a soft grey pill that could belong to any theme. */
.site-header .site-navigation > ul.menu > li:not(:last-child) > a {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 12.5px;
	font-weight: 700;
	text-transform: uppercase;
	/* 0.07em / 12px padding / 10px gap until 2026-09-21: SVC-03 added an
	   eighth top-level item (Solutions) and the bar no longer fit beside the
	   logo in the 1140px header — it dropped to a second row at every desktop
	   width. Tracking 0.04em, padding 10px and gap 4px (below) bring it back
	   to one row with ~27px to spare. Tighter than this and the hover wash
	   starts touching its neighbours. */
	letter-spacing: 0.04em;
	color: #A9B7B9;
	padding: 10px 10px;
	/* the wash/rule need a box to sit in; hello's own `a` is display:block
	   with only inline padding. */
	display: inline-block;
	border-radius: 0;
	clip-path: polygon(6px 0, 100% 0, 100% 100%, 0 100%, 0 6px);
}
.site-header .site-navigation ul.menu > li:not(:last-child) > a:hover,
.site-header .site-navigation ul.menu > li.current-menu-item:not(:last-child) > a {
	background: rgba(22, 190, 207, 0.08);
	/* inset rule rather than border-bottom: a border would change the box's
	   height on hover and shift the whole row by a pixel. */
	box-shadow: inset 0 -1px 0 var(--amantec-cyan);
}
.site-header .site-navigation ul.menu > li.current-menu-item:not(:last-child) > a {
	color: var(--amantec-cyan);
}
/* chevron re-centred against the shorter mono cap-height */
.site-header .site-navigation ul.menu > li.menu-item-has-children > a {
	padding-inline-end: 5px;
}
.site-header .site-navigation ul.menu {
	gap: 4px;
}

/* MOBILE PANEL. The three tiers were indistinguishable — same 20px inset,
   same size, same weight, so "Bitdefender Services" (a third-level page) sat
   in the list looking exactly like "Home". Each tier now gets a real indent
   and a cyan hairline rail marking how deep it is, and the top tier picks up
   the same label register as its desktop counterpart so the two headers read
   as one design. The rail is drawn on the UL, not per row, so it runs
   unbroken down the group the way a tree rail should. */
.site-header .site-navigation-dropdown > ul.menu > li > a {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 13px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: 0.04em; /* kept equal to the desktop bar's (2026-09-21) */
}
.site-header .site-navigation-dropdown ul.menu ul {
	position: relative;
	background: rgba(22, 190, 207, 0.04);
}
.site-header .site-navigation-dropdown ul.menu ul::before {
	content: "";
	position: absolute;
	inset-block: 0;
	inset-inline-start: 20px;
	width: 1px;
	background: rgba(22, 190, 207, 0.28);
}
.site-header .site-navigation-dropdown ul.menu ul li a {
	padding-inline-start: 36px;
	font-size: 14px;
}
.site-header .site-navigation-dropdown ul.menu ul ul::before {
	inset-inline-start: 36px;
}
.site-header .site-navigation-dropdown ul.menu ul ul li a {
	padding-inline-start: 52px;
	font-size: 13.5px;
	color: #9AA8AA;
}
/* Nested toggles were narrowed to 56px on the reasoning that the button should
   follow its row's indent inward. That was wrong twice over: the indent is
   padding on the <a>, not on the LI, so every toggle is already pinned to the
   same trailing edge and none of them could collide; and the narrower box
   moved the icon's centre to 28px from that edge while the top tier's sat at
   32px. The result was a 4px stagger down a column of otherwise identical
   chevrons — invisible in isolation, obvious as a wobble once you look at the
   panel as a vertical run. One width, one centre line, every tier. */
.site-header .site-navigation-dropdown ul.menu ul .amantec-submenu-toggle {
	width: 64px;
}
/* current-page row: the same clipped corner the desktop nav and the buttons
   use, instead of a plain full-bleed rectangle. */
.site-header .site-navigation-dropdown ul.menu li.current-menu-item > a {
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px);
}
/* the panel needs to read as a surface that ends, not as a list that runs
   off the bottom of the bar. */
.site-header .site-navigation-dropdown ul.menu {
	border-block-end: 1px solid rgba(22, 190, 207, 0.28);
	box-shadow: 0 18px 36px rgba(0, 0, 0, 0.5);
	padding-block-end: 8px;
}
/* NAV-09, 2026-09-21: the panel hangs off a position:fixed header, so it
   never scrolled with the page — once Services was expanded, the rows below
   the fold (Free Cyber Tools, Partners & Clients, News, Contact Us on a
   375x812 phone; News and Contact Us on a 768x1024 tablet) could not be
   reached at all. The panel now stops at the bottom of the screen and scrolls
   inside itself. --amantec-menu-top is the panel's top edge, kept current by
   mobile-menu-fix.js; the fallback is the phone header's height. dvh follows
   the mobile browser toolbar showing and hiding; vh is the fallback. The
   overscroll rule keeps a fling at the end of the list from scrolling the
   page underneath. */
.site-header .site-navigation-dropdown ul.menu {
	max-height: calc(100vh - var(--amantec-menu-top, 120px));
	max-height: calc(100dvh - var(--amantec-menu-top, 120px));
	overflow-y: auto;
	overscroll-behavior: contain;
}

/* ===================== Contact Us — form + layout, 2026-09-01 ============
   User asked for the form and the page layout. What was actually wrong:

   - The text inputs sized to WPForms' own ~50% default while the textarea ran
     full width, so the field stack had a ragged right edge and no column.
   - The submit button was a small default-sized control in brand teal, next
     to a header whose CTA is a mono, uppercase, clipped-corner pill. Same
     colour, none of the same language.
   - Labels were plain 400-weight body text — the one place on the site where
     a label is not set in the mono label register.
   - The three social icons still carried the platform brand colours
     (Facebook blue, X black, YouTube red). They were the only non-brand
     colours left anywhere in the build.

   !important is required throughout for the same documented reason as the
   original WPForms pass above: wpforms-full.min.css is enqueued after this
   stylesheet, so specificity alone never wins the tie. */
.wpforms-container .wpforms-field {
	padding-block: 0 20px !important;
}
.wpforms-container .wpforms-field-label {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important;
	text-transform: uppercase !important;
	letter-spacing: 0.06em !important;
	font-size: 11.5px !important;
	font-weight: 700 !important;
	color: #4A5456 !important;
	margin-bottom: 8px !important;
}
.wpforms-container .wpforms-required-label {
	color: var(--amantec-teal) !important;
}
.wpforms-container .wpforms-field input[type="text"],
.wpforms-container .wpforms-field input[type="email"],
.wpforms-container .wpforms-field select,
.wpforms-container .wpforms-field textarea {
	/* the ragged-edge fix: WPForms sizes text inputs to a "medium" preset and
	   only the textarea to 100%. One width for all four. */
	width: 100% !important;
	max-width: 100% !important;
	box-sizing: border-box !important;
	background: #F2F5F5 !important;
	border: 1px solid #D7DDDD !important;
	border-radius: 0 !important;
	/* same 8px notch the buttons and cards carry */
	clip-path: polygon(8px 0, 100% 0, 100% 100%, 0 100%, 0 8px) !important;
	font-size: 15px !important;
	color: #13181A !important;
	padding: 13px 16px !important;
}
/* A <select> keeps a normal line-height where a text input collapses its own to
   the font size — measured 22.5px against 15px. With the same 13px of vertical
   padding inside a 43px border-box field that leaves a 15px content box for a
   22.5px line box, so the text is clipped top and bottom: "Select a subject"
   lost the tail of its j. Less vertical padding and a tighter line-height make
   the line fit, and the field keeps the 43px outer height the text inputs have
   — the four fields have to agree, which is why the height is not simply
   raised. */
.wpforms-container .wpforms-field select {
	padding-top: 9px !important;
	padding-bottom: 9px !important;
	line-height: 1.4 !important;
}
.wpforms-container .wpforms-field textarea {
	min-height: 150px !important;
}
.wpforms-container .wpforms-field input[type="text"]:focus,
.wpforms-container .wpforms-field input[type="email"]:focus,
.wpforms-container .wpforms-field select:focus,
.wpforms-container .wpforms-field textarea:focus {
	background: var(--amantec-white, #fff) !important;
	border-color: var(--amantec-cyan) !important;
	/* box-shadow, not outline: outline is drawn outside the element and the
	   clip-path above would slice it off at the notched corner. */
	box-shadow: 0 0 0 3px rgba(22, 190, 207, 0.18) !important;
}
.wpforms-container .wpforms-field input::placeholder,
.wpforms-container .wpforms-field textarea::placeholder {
	color: #8B9698 !important;
}
.wpforms-container button[type="submit"].wpforms-submit {
	background: var(--amantec-teal) !important;
	color: var(--amantec-white) !important;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important;
	text-transform: uppercase !important;
	letter-spacing: 0.06em !important;
	font-size: 13px !important;
	font-weight: 700 !important;
	padding: 15px 30px !important;
	border: 0 !important;
	border-radius: 0 !important;
	clip-path: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px) !important;
	transition: background-color 0.18s ease-out !important;
}
.wpforms-container button[type="submit"].wpforms-submit:hover,
.wpforms-container button[type="submit"].wpforms-submit:focus {
	background: var(--amantec-teal-dark) !important;
}
/* WPForms' own inline error text sits in its default red at a size that
   under-reads next to the new label scale. */
.wpforms-container .wpforms-error {
	font-size: 12.5px !important;
	margin-top: 6px !important;
}

/* Social icons — off the platform palette and onto the site's own. Elementor
   writes the brand colour as an inline-ish per-widget rule (tier 5, the
   per-post stylesheet), so this needs !important, not more classes. */
.elementor .elementor-social-icon {
	background-color: #13181A !important;
	border: 1px solid rgba(22, 190, 207, 0.28) !important;
	border-radius: 0 !important;
	clip-path: polygon(7px 0, 100% 0, 100% 100%, 0 100%, 0 7px);
	transition: background-color 0.18s ease-out, border-color 0.18s ease-out;
}
.elementor .elementor-social-icon i,
.elementor .elementor-social-icon svg {
	color: var(--amantec-cyan) !important;
	fill: var(--amantec-cyan) !important;
}
.elementor .elementor-social-icon:hover {
	background-color: var(--amantec-teal) !important;
	border-color: var(--amantec-teal) !important;
}
.elementor .elementor-social-icon:hover i,
.elementor .elementor-social-icon:hover svg {
	color: var(--amantec-white) !important;
	fill: var(--amantec-white) !important;
}

/* ===================== Service cards — box pass, 2026-09-01 ==============
   User: "all services pages icons needs to change, even the boxes." The
   icons are handled in assets/css/icons.css; this is the card they sit in.

   What was wrong: the cards were a transparent ground inside a 1px #E7EBEC
   hairline — on the page's own near-white ground that hairline is the only
   thing separating card from page, so a nine-card grid read as a faint wire
   frame rather than as nine objects. And the icon floated loose at the top of
   each card with no box of its own, which is why swapping the glyph alone was
   never going to be enough.

   Scoped to the seven service pages by body class, deliberately: Home's own
   solution cards are a tuned, separately-authored set (see home_page_build)
   and are not in scope for this request. */
.page-id-10 .e-con:has(> .elementor-widget-icon-box),
.page-id-11 .e-con:has(> .elementor-widget-icon-box),
.page-id-12 .e-con:has(> .elementor-widget-icon-box),
.page-id-13 .e-con:has(> .elementor-widget-icon-box),
.page-id-14 .e-con:has(> .elementor-widget-icon-box),
.page-id-15 .e-con:has(> .elementor-widget-icon-box),
.page-id-16 .e-con:has(> .elementor-widget-icon-box) {
	background-color: var(--amantec-paper, #FBFCFC);
	border-color: #D7DDDD;
}
.page-id-10 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-11 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-12 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-13 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-14 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-15 .e-con:has(> .elementor-widget-icon-box):hover,
.page-id-16 .e-con:has(> .elementor-widget-icon-box):hover {
	border-color: rgba(0, 116, 126, 0.45);
	background-color: #fff;
}

/* The icon plate. Turns a loose glyph into a component with an edge — the
   same notched-corner geometry as the card it sits in and as the buttons, so
   the card now reads as one shape language at two scales instead of a shape
   with a decoration in it. Sized in px rather than em because the plate is a
   fixed object; the glyph inside it still scales from the widget's own
   font-size, which is what icons.css reads.

   The `:has(> svg[class*="e-fas-"])` guard is load-bearing, not defensive
   tidiness: the Trainings page's nine icons are custom uploaded SVGs (the
   Higgsfield set), each already drawn with its own frame. Plating those puts
   a box inside a box and crushes the artwork into 56px. Only the Font
   Awesome-derived glyphs — the ones icons.css remaps — get a plate. */
.page-id-10 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-11 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-12 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-13 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-14 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-15 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-16 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	background: rgba(0, 116, 126, 0.07);
	border: 1px solid rgba(0, 116, 126, 0.2);
	clip-path: polygon(9px 0, 100% 0, 100% 100%, 0 100%, 0 9px);
	transition: background-color 0.2s ease-out, border-color 0.2s ease-out;
}
.page-id-10 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-11 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-12 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-13 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-14 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-15 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-16 .e-con:hover > .elementor-widget-icon-box .elementor-icon:has(> svg[class*="e-fas-"]) {
	background: rgba(0, 116, 126, 0.13);
	border-color: rgba(0, 116, 126, 0.42);
}

/* ===================== Our Partners — logo sizing, 2026-09-01 ============
   User: "our partners page logos should look same size / proportioned."

   The measured cause: every logo was rendering at its Elementor width of
   300px with height left to the intrinsic aspect ratio, and the six source
   files are nothing like the same shape — knowbe4 is 300x60, bitdefender and
   sophos 300x50, hackthebox 300x180, idrak 300x233, kaspersky 300x187. So the
   first row sat as thin strips in a shallow tile while the second row
   rendered nearly four times taller and overflowed its card entirely
   (HACKTHEBOX and IDRAK were being clipped by the tile's own clip-path).

   The fix is the one Home's logo wall already uses: a FIXED box on both axes
   plus `object-fit: contain`. Width alone cannot work here — with six
   different aspect ratios, equal width is exactly what produces unequal size.
   Constraining both axes makes the BOX the constant and lets each logo scale
   inside it, which is what "same size" actually means for mixed logo art.

   !important on width/height: Elementor writes its per-widget image width to
   the tier-5 per-post stylesheet (`.elementor-18 .elementor-element-optile0img
   img`), which loads after this file and outranks any selector here. See
   [[css_specificity_ladder]]. */
.page-id-18 .elementor-widget-image img {
	width: 100% !important;
	max-width: 210px !important;
	height: 74px !important;
	object-fit: contain;
	object-position: center;
	/* the source PNGs are small; without this a 300x50 file scaled into a
	   210x74 box can land on a half pixel and read soft next to a large one. */
	image-rendering: auto;
}
.page-id-18 .elementor-widget-image {
	display: flex;
	justify-content: center;
}


/* ===================== Shape system — Direction B, 2026-09-02 =============
   User: "the square with top left cutout, it's everywhere now and it's too
   much" — and they were right. The audit found 14 clip-path declarations
   across 11 element families at SIX different sizes (6, 7, 8, 9, 10, 12px).
   A shape on everything is a texture, not a signature, and six sizes meant no
   two notched things agreed with each other.

   THE RULE NOW — the notch marks a SURFACE, and nothing else:
     keeps it   containers that hold content: cards, tiles, logo tiles, stat
                cells, the instrument panel, the nav flyout panel
     loses it   every control: buttons, badges, form fields, social icons,
                icon plates, desktop nav items, the mobile current-page row
     exception  the header's Contact Us pill keeps it, on the user's explicit
                instruction — it is the site's one conversion action, and the
                one control allowed to carry the mark.

   ONE SIZE, 12px, everywhere it survives. The 6/7/8/9/10px variants are gone.

   ---------------------------------------------------------------------------
   AND THE REAL BUG: clip-path was cutting the BORDER off with the corner.

   `clip-path` clips the rendered box, border included, so on a bordered card
   the diagonal had no line on it at all and the top and left borders simply
   stopped 12px short — the card read as sliced open at that corner rather
   than as a cut shape. That is what the user saw.

   `corner-shape: bevel` + `border-top-left-radius` is the native fix: it is a
   real corner, so the BORDER FOLLOWS IT round the diagonal. Verified
   supported in this Chrome (148) side by side against the old clip-path.
   It is gated behind @supports and the clip-path stays as the fallback
   outside it, so a browser without corner-shape still gets today's cut
   corner (borderless diagonal and all) rather than an unwanted rounded one.

   `!important` on the radius: Elementor stores border_radius:0 on each of
   these ids (set at the source by apply-neohud-clip-corners-2026-08-31.php,
   deliberately, so nothing rounded the box before clip-path cut it), and that
   lands in the tier-5 per-post stylesheet at (0,3,0). Nothing this file can
   spell beats it without !important. See [[css_specificity_ladder]].
   --------------------------------------------------------------------------- */

/* --- 1. controls: square off -------------------------------------------- */
.elementor-element-ctabtn1,
.elementor-element-ftcard0badge,
.elementor-element-ftcard0btn,
.elementor-element-ftcard1badge,
.elementor-element-ftcard1btn,
.elementor-element-ftcard2badge,
.elementor-element-ftcard2btn,
.elementor-element-ftcard3badge,
.elementor-element-ftcard3btn,
.elementor-element-ftcard4badge,
.elementor-element-ftcard4btn,
.elementor-element-ftcard5badge,
.elementor-element-ftcard5btn,
.elementor-element-herobtn1,
.elementor-element-herobtn2,
.elementor-element-srvctabtn,
.elementor-element-taibtn1,
.elementor-element-taibtn2,
.elementor-element-trainbtn0,
.elementor-element-trainbtn1,
.elementor-element-trainbtn3,
.elementor-element-trainbtn4,
.elementor-element-trainbtn5,
.elementor-element-trainbtn6,
.elementor-element-trainbtn7,
.elementor-element-trainbtn8,
.site-header .site-navigation > ul.menu > li:not(:last-child) > a,
.site-header .site-navigation-dropdown ul.menu li.current-menu-item > a,
.wpforms-container .wpforms-field input[type="text"],
.wpforms-container .wpforms-field input[type="email"],
.wpforms-container .wpforms-field select,
.wpforms-container .wpforms-field textarea,
.wpforms-container button[type="submit"].wpforms-submit,
.elementor-element-ctabtn1 .elementor-button,
.elementor-element-ftcard0btn .elementor-button,
.elementor-element-ftcard1btn .elementor-button,
.elementor-element-ftcard2btn .elementor-button,
.elementor-element-ftcard3btn .elementor-button,
.elementor-element-ftcard4btn .elementor-button,
.elementor-element-ftcard5btn .elementor-button,
.elementor-element-herobtn1 .elementor-button,
.elementor-element-herobtn2 .elementor-button,
.elementor-element-srvctabtn .elementor-button,
.elementor-element-taibtn1 .elementor-button,
.elementor-element-taibtn2 .elementor-button,
.elementor-element-trainbtn0 .elementor-button,
.elementor-element-trainbtn1 .elementor-button,
.elementor-element-trainbtn3 .elementor-button,
.elementor-element-trainbtn4 .elementor-button,
.elementor-element-trainbtn5 .elementor-button,
.elementor-element-trainbtn6 .elementor-button,
.elementor-element-trainbtn7 .elementor-button,
.elementor-element-trainbtn8 .elementor-button,
.elementor .elementor-social-icon,
.page-id-10 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-11 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-12 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-13 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-14 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-15 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.page-id-16 .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	/* !important because several of these already carry it: the WPForms field
	   and submit rules had to use it to beat wpforms-full.min.css's later
	   load order, and an override without it silently lost to them. */
	clip-path: none !important;
}

/* --- 2. surfaces: one notch, one size ----------------------------------- */
.elementor-element-aicard0,
.elementor-element-aicard1,
.elementor-element-aicard2,
.elementor-element-aicard3,
.elementor-element-aicard4,
.elementor-element-aicard5,
.elementor-element-bsoff0,
.elementor-element-bsoff1,
.elementor-element-bsoff2,
.elementor-element-bsoff3,
.elementor-element-bssup0,
.elementor-element-bssup1,
.elementor-element-bssup2,
.elementor-element-bssup3,
.elementor-element-ftcard0,
.elementor-element-ftcard1,
.elementor-element-ftcard2,
.elementor-element-ftcard3,
.elementor-element-ftcard4,
.elementor-element-ftcard5,
.elementor-element-grccard0,
.elementor-element-grccard1,
.elementor-element-grccard2,
.elementor-element-grccard3,
.elementor-element-grccard4,
.elementor-element-gzbencard0,
.elementor-element-gzbencard1,
.elementor-element-gzbencard2,
.elementor-element-gzbencard3,
.elementor-element-gzcapcard0,
.elementor-element-gzcapcard1,
.elementor-element-gzcapcard2,
.elementor-element-gzcapcard3,
.elementor-element-gzcapcard4,
.elementor-element-lc1,
.elementor-element-lc2,
.elementor-element-lc3,
.elementor-element-lc4,
.elementor-element-lc5,
.elementor-element-lc6,
.elementor-element-lc7,
.elementor-element-lp1,
.elementor-element-lp2,
.elementor-element-lp3,
.elementor-element-lp4,
.elementor-element-lp5,
.elementor-element-lp6,
.elementor-element-optile0,
.elementor-element-optile1,
.elementor-element-optile2,
.elementor-element-optile3,
.elementor-element-optile4,
.elementor-element-optile5,
.elementor-element-solcard0,
.elementor-element-solcard1,
.elementor-element-solcard2,
.elementor-element-solcard3,
.elementor-element-solcard4,
.elementor-element-sphprod0,
.elementor-element-sphprod1,
.elementor-element-sphprod10,
.elementor-element-sphprod11,
.elementor-element-sphprod2,
.elementor-element-sphprod3,
.elementor-element-sphprod4,
.elementor-element-sphprod5,
.elementor-element-sphprod6,
.elementor-element-sphprod7,
.elementor-element-sphprod8,
.elementor-element-sphprod9,
.elementor-element-sphsol0,
.elementor-element-sphsol1,
.elementor-element-sphsol2,
.elementor-element-sphsol3,
.elementor-element-sphsol4,
.elementor-element-sphsol5,
.elementor-element-srvcard0,
.elementor-element-srvcard1,
.elementor-element-srvcard2,
.elementor-element-srvcard3,
.elementor-element-srvcard4,
.elementor-element-srvcard5,
.elementor-element-srvcard6,
.elementor-element-srvcard7,
.elementor-element-taicarddark,
.elementor-element-taicardlight,
.elementor-element-teamcard0,
.elementor-element-teamcard1,
.elementor-element-testicol1,
.elementor-element-testicol2,
.elementor-element-testicol3,
.elementor-element-traincard0,
.elementor-element-traincard1,
.elementor-element-traincard3,
.elementor-element-traincard4,
.elementor-element-traincard5,
.elementor-element-traincard6,
.elementor-element-traincard7,
.elementor-element-traincard8,
.at-panel,
.site-header .site-navigation > ul.menu > li:last-child > a {
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
/* The MOBILE Contact Us row does not get one (user, 2026-09-02: "on mobile no
   need for the notch on contact us button"). It briefly did, on the reasoning
   that the desktop pill is display:none at that width — but the mobile row is
   a full-bleed bar spanning the whole panel, not a pill, and a 12px bite out
   of the corner of a full-width bar reads as a rendering fault rather than as
   a deliberate mark. The notch is now a DESKTOP-only signature. */
.site-header .site-navigation-dropdown > ul.menu > li:last-child > a {
	clip-path: none !important;
}
/* The nav flyout panel is a surface by the rule above, but it lost the notch
   anyway on the user's instruction (2026-09-02): "remove it from the flyout
   too, contact us only". The header now carries exactly ONE cut corner, on
   the one thing it wants you to click. */
.site-header .site-navigation ul.menu li ul::before {
	clip-path: none !important;
}

/* --- 3. the border fix, where the browser can do it properly ------------ */
@supports (corner-shape: bevel) {
.elementor-element-aicard0,
.elementor-element-aicard1,
.elementor-element-aicard2,
.elementor-element-aicard3,
.elementor-element-aicard4,
.elementor-element-aicard5,
.elementor-element-bsoff0,
.elementor-element-bsoff1,
.elementor-element-bsoff2,
.elementor-element-bsoff3,
.elementor-element-bssup0,
.elementor-element-bssup1,
.elementor-element-bssup2,
.elementor-element-bssup3,
.elementor-element-ftcard0,
.elementor-element-ftcard1,
.elementor-element-ftcard2,
.elementor-element-ftcard3,
.elementor-element-ftcard4,
.elementor-element-ftcard5,
.elementor-element-grccard0,
.elementor-element-grccard1,
.elementor-element-grccard2,
.elementor-element-grccard3,
.elementor-element-grccard4,
.elementor-element-gzbencard0,
.elementor-element-gzbencard1,
.elementor-element-gzbencard2,
.elementor-element-gzbencard3,
.elementor-element-gzcapcard0,
.elementor-element-gzcapcard1,
.elementor-element-gzcapcard2,
.elementor-element-gzcapcard3,
.elementor-element-gzcapcard4,
.elementor-element-lc1,
.elementor-element-lc2,
.elementor-element-lc3,
.elementor-element-lc4,
.elementor-element-lc5,
.elementor-element-lc6,
.elementor-element-lc7,
.elementor-element-lp1,
.elementor-element-lp2,
.elementor-element-lp3,
.elementor-element-lp4,
.elementor-element-lp5,
.elementor-element-lp6,
.elementor-element-optile0,
.elementor-element-optile1,
.elementor-element-optile2,
.elementor-element-optile3,
.elementor-element-optile4,
.elementor-element-optile5,
.elementor-element-solcard0,
.elementor-element-solcard1,
.elementor-element-solcard2,
.elementor-element-solcard3,
.elementor-element-solcard4,
.elementor-element-sphprod0,
.elementor-element-sphprod1,
.elementor-element-sphprod10,
.elementor-element-sphprod11,
.elementor-element-sphprod2,
.elementor-element-sphprod3,
.elementor-element-sphprod4,
.elementor-element-sphprod5,
.elementor-element-sphprod6,
.elementor-element-sphprod7,
.elementor-element-sphprod8,
.elementor-element-sphprod9,
.elementor-element-sphsol0,
.elementor-element-sphsol1,
.elementor-element-sphsol2,
.elementor-element-sphsol3,
.elementor-element-sphsol4,
.elementor-element-sphsol5,
.elementor-element-srvcard0,
.elementor-element-srvcard1,
.elementor-element-srvcard2,
.elementor-element-srvcard3,
.elementor-element-srvcard4,
.elementor-element-srvcard5,
.elementor-element-srvcard6,
.elementor-element-srvcard7,
.elementor-element-taicarddark,
.elementor-element-taicardlight,
.elementor-element-teamcard0,
.elementor-element-teamcard1,
.elementor-element-testicol1,
.elementor-element-testicol2,
.elementor-element-testicol3,
.elementor-element-traincard0,
.elementor-element-traincard1,
.elementor-element-traincard3,
.elementor-element-traincard4,
.elementor-element-traincard5,
.elementor-element-traincard6,
.elementor-element-traincard7,
.elementor-element-traincard8,
	.at-panel,
	.site-header .site-navigation > ul.menu > li:last-child > a {
		clip-path: none;
		border-top-left-radius: 12px !important;
		corner-shape: bevel;
	}
}

/* ===================== Home testimonials — layout, 2026-09-02 ============
   The three quote cards must span the same 1140px content column as the
   heading above them and as every other section on the page. They did not:
   each carried an Elementor `width: 30%`, and three 30% columns cannot fill
   a row — 336x3 + gaps left 82px of the column unused on the trailing edge.

   The Elementor `width` was REMOVED rather than re-tuned to another
   percentage (see build-scripts/testimonials-layout-2026-09-02.php): a
   percentage plus a fixed gap only tiles exactly at one viewport width.
   `flex: 1 1 0` divides whatever the row actually is, at every width, and
   with the tier-5 width gone this needs no !important to win.

   Scoped above the mobile breakpoint because the cards keep Elementor's
   `width_mobile: 100%` for the stacked layout, and flex-basis would override
   that width if this rule ran unconditionally. */
@media (min-width: 768px) {
	.elementor-element-testicol1,
	.elementor-element-testicol2,
	.elementor-element-testicol3 {
		/* Set the VARIABLES, not the `flex` shorthand. Elementor's
		   `.e-con.e-flex` rule is `flex: var(--flex-grow) var(--flex-shrink)
		   var(--flex-basis)` with defaults `0 1 auto`, so a plain
		   `flex: 1 1 0` here is simply overwritten when that rule resolves —
		   the first attempt did nothing and the cards stacked full-width.
		   Same trap the specificity note in memory describes for --column-gap
		   and --justify-content.
		   !important because frontend.min.css loads after this stylesheet and
		   its selector is (0,2,0) against this one's (0,1,0) — it wins on both
		   weight and order otherwise. */
		--flex-grow: 1 !important;
		--flex-shrink: 1 !important;
		--flex-basis: 0% !important;
		min-width: 0;
	}
}

/* ============ About Us team cards — full-height photo panel, 2026-09-02 ====
   The photo was a 172x214 thumbnail floating in a 487px-tall card: it filled
   exactly half the card's height and left ~211px of dead space beside the bio.
   It is now the card's leading-edge PANEL, edge to edge and top to bottom.
   Structure (card padding 0, text column carries the 30px, columns 40/60) and
   the removal of the widget's own fixed height/border are in
   build-scripts/team-cards-full-height-photo-2026-09-02.php; this is the part
   Elementor's image widget cannot express.

   SIZED BY FLEX, not by `height: 100%` or absolute positioning — both were
   tried and both failed for the same reason. Elementor puts `position:
   relative` on every widget at a weight a single element-id class cannot beat,
   so the widget never became the absolute container; and with the widget's own
   height left auto, a percentage height on the <img> resolved to auto and the
   photo stayed at its natural 260px. Letting the widget GROW inside the
   already-stretched column gives it a definite height with nothing to resolve
   against, so the image fills whatever the bio makes the card.

   `!important` throughout: these compete with Elementor's per-post stylesheet
   at (0,3,0) and its widget reset, both of which load after this file. */
.elementor-element-teamcard0,
.elementor-element-teamcard1 {
	/* what makes the panel respect the card's own 12px bevel — without it the
	   photo's square corner pokes through the cut. */
	overflow: hidden;
}
.elementor-element-teamcard0imgcol,
.elementor-element-teamcard1imgcol {
	display: flex;
	flex-direction: column;
	/* the seam between portrait and bio. A hairline in the same cyan the card's
	   own border uses, so the split reads as structure rather than as a gap —
	   this replaces the 24px flex gap the card used to hold. */
	border-inline-end: 1px solid rgba(22, 190, 207, 0.28);
}
.elementor-element-teamcard0photo,
.elementor-element-teamcard1photo {
	display: flex !important;
	flex: 1 1 auto !important;
	min-height: 0;
}
.elementor-element-teamcard0photo img,
.elementor-element-teamcard1photo img {
	display: block !important;
	width: 100% !important;
	height: 100% !important;
	min-height: 0;
	object-fit: cover !important;
	border: 0 !important;
}

/* PER-PHOTO FRAMING. Not cosmetic tuning — the two photographs are composed
   completely differently, and one shared value clips a face. Laith is standing
   at a lectern well right of centre with the mic and podium filling the left of
   the frame; Waleed is centred against a plain wall. A tall panel crops
   horizontally, so a centred crop would cut the right side of Laith's head off.
   Checked against the source images, not guessed. Revisit these two values if
   either photograph is ever replaced. */
.elementor-element-teamcard0photo img {
	object-position: 78% center !important;
}
.elementor-element-teamcard1photo img {
	object-position: 55% center !important;
}

/* The card is already column-direction from 1024px down (Elementor's
   flex_direction_tablet), so below that the panel becomes a banner across the
   top. Two things change with it:

   The column needs an EXPLICIT height. In a column-direction card its cross
   axis is the width, so nothing stretches it vertically and it would otherwise
   take the photo's natural aspect — a 477px-tall slab at tablet width that
   pushes the bio off the screen. `!important` because `.e-con`'s own
   `height: var(--height)` is the same (0,1,0) weight and loads later.

   And the crop axis FLIPS. A wide, short box crops VERTICALLY, so the
   horizontal values above stop doing anything and a vertical one starts
   mattering: both subjects' heads sit in the top third of their frame, so a
   centred vertical crop would cut them. */
@media (max-width: 1024px) {
	.elementor-element-teamcard0imgcol,
	.elementor-element-teamcard1imgcol {
		height: 320px !important;
		border-inline-end: 0;
		border-block-end: 1px solid rgba(22, 190, 207, 0.28);
	}
	.elementor-element-teamcard0photo img {
		object-position: 78% 22% !important;
	}
	.elementor-element-teamcard1photo img {
		object-position: 55% 18% !important;
	}
}

/* ====== Components lifted out of pasted HTML widgets — 2026-09-02 ==========
   These three were Elementor HTML widgets with every value inlined on every
   element: the capability pills, the human-firewall rows, and the Training/AI
   chips. Same rendered result, but the styling is here and the widgets emit
   classes only, so a colour change is one edit rather than a hunt through
   markup stored in the database. See widgets/class-amantec-{pill-row,
   numbered-row,chip-row}.php. */

/* --- capability pills (Protect / Detect / Respond) --------------------- */
.at-pill-row {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
}
.at-pill {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 8px 16px;
	/* 999px, not the sitewide notch: DESIGN.md carves tag pills out of the
	   clipped-corner rule as a deliberate exception. */
	border-radius: 999px;
	border: 1px solid var(--amantec-border);
	background: var(--amantec-white);
	font-size: 13px;
}
.at-pill-num {
	font-weight: 700;
	color: var(--amantec-teal);
}
.at-pill-label {
	font-weight: 600;
	color: var(--amantec-ink);
}

/* --- numbered rows (human firewall) ------------------------------------ */
.at-numrow {
	display: flex;
	gap: 14px;
}
.at-numrow-num {
	flex-shrink: 0;
	width: 28px;
	padding-top: 2px;
	font-size: 13px;
	font-weight: 700;
	color: #EAF6F7;
}
.at-numrow-title {
	margin: 0 0 6px;
	font-size: 18px;
	font-weight: 800;
	color: var(--amantec-white);
}
.at-numrow-text {
	margin: 0;
	font-size: 14px;
	line-height: 1.6;
	color: #EAF6F7;
}

/* --- capability chips (Training / AI cards) ---------------------------- */
.at-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 9px;
	margin: 16px 0 20px;
}
.at-chip {
	display: inline-block;
	padding: 8px 14px;
	border-radius: 999px;
	font-size: 13.5px;
	background: var(--amantec-tint);
	border: 1px solid var(--amantec-border);
	color: var(--amantec-ink);
}
/* the same component on a Neo-HUD card. The pasted version handled this by
   inlining different colours into every single span. */
.at-chips--dark .at-chip {
	background: rgba(255, 255, 255, 0.08);
	border-color: rgba(255, 255, 255, 0.16);
	color: var(--amantec-white);
}

/* ====== Text-editor widgets, styling lifted out of the markup — 2026-09-02 ==
   48 text editors carried their presentation as inline style attributes on the
   paragraph itself. Everything that maps to an Elementor control (size,
   line-height, weight, colour, alignment, margin) moved there; these three
   rules cover what has no control.

   `.at-te p { margin: 0 }` replaces the `margin:0` that was inlined on every
   one of them. Safe to apply flatly: not one text editor on this site holds
   more than a single paragraph (checked), so there is no inter-paragraph
   rhythm to lose. Outer spacing is the widget's own _margin now. */
.at-te p {
	margin: 0;
	/* font-size: inherit is LOAD-BEARING, not tidiness. Elementor's typography
	   control writes font-size to the widget CONTAINER, and this theme has a
	   direct `p { font-size: 14px }` rule — a direct rule always beats an
	   inherited value, so every paragraph silently collapsed to 14px the first
	   time these were converted (15/16/17px content included). Inheriting hands
	   control back to the widget. Nothing else needs it: line-height and colour
	   have no competing direct rule and inherited correctly on their own. */
	font-size: inherit;
}
.at-te-measure {
	max-width: 820px;
}
.at-te-list ul {
	margin: 0;
	/* logical, not padding-left — the RTL pass is still to come */
	padding-inline-start: 18px;
}
.at-te-list li {
	margin-bottom: 6px;
}

/* ====== The 14px paragraph directive, enforced for real — 2026-09-02 =======
   "Every <p> on the site is 14px, no exceptions" (user, 2026-08-30). It had
   never actually held: an audit found 33 of 48 body paragraphs at 15/16/17px,
   plus every icon-box description at Elementor's own 16px default and the hero
   lead at 17px from a theme rule. The text editors were fixed at the source
   (enforce-14px-paragraphs-2026-09-02.php); these are the two remaining
   sources, which are CSS-side.

   `!important` on the description: Elementor's kit generates
   `.elementor-widget-icon-box .elementor-icon-box-description` at (0,2,0) and
   loads it after this file, so an equal-weight rule loses the tie. This single
   rule replaces the per-element-id lists that used to do the same job for a
   handful of cards at a time — 68 icon boxes, one rule. */
.elementor .elementor-icon-box-description {
	font-size: 14px !important;
}

/* ===================== Company Profile alignment — 2026-09-15 ============
   Source: "AmanTec Staging Website Issues Mapping Tracker" (4 critical + 14
   high items), with the Company Profile 2026 as the single reference for
   facts and content. Everything below styles components ADDED in that pass;
   nothing earlier in this file was restyled. Build scripts:
   build-scripts/profile-align-*-2026-09-15.php */

/* --- Page Header positioning for the four new pages. Same rule as the
   per-page list further up: herogrid1 is absolutely positioned and needs a
   positioned, clipped ancestor. */
.elementor-element-ctheader,
.elementor-element-vpheader,
.elementor-element-brheader,
.elementor-element-aeheader {
	position: relative;
	overflow: hidden;
}

/* --- Trust bar: the group certification statement (HOME-01) -------------
   RETIRED 2026-10-04 on the client's instruction: the certificates are ICON
   Contracting's, not AmanTec's, so the widget was removed from Home and the
   same claim cut from the Solutions intro. These rules are kept, unused, so
   the statement can return the day AmanTec certifies in its own name — do not
   restore the old "held within the group" wording with them.
   Reuses the fact's own label and value
   classes so it reads as a sibling of "Since 2017", then adds the profile's
   qualifier underneath in the caption's colour. The standards line is 18px,
   not the facts' 26px: at 26px mono the three standards alone would take
   ~620px and push the row past its container at 1280. */
.at-tb-cert .at-tb-cert-pillars {
	margin: 0 0 8px;
}
.at-tb-cert .at-tb-cert-standards {
	font-size: 18px;
	white-space: nowrap;
}
.at-tb-cert-note {
	margin-top: 8px;
	max-inline-size: 430px;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.55;
	color: #7FA3A8;
}
@media (max-width: 1200px) {
	.at-tb-cert .at-tb-cert-standards {
		font-size: 16px;
	}
}
@media (max-width: 900px) {
	/* the 2-up grid below 900px: the statement takes a full row, like the
	   caption does, and "Since 2017" sits under it. */
	.elementor-element-tbcert {
		grid-column: 1 / -1;
	}
	.at-tb-cert-note {
		max-inline-size: none;
	}
}
@media (max-width: 767px) {
	.at-tb-cert .at-tb-cert-standards {
		font-size: 15px;
		white-space: normal;
	}
}

/* --- Impact figures (HOME-02 / ABOUT-01) --------------------------------
   The basis line under either layout, and the light `cards` layout About Us
   now uses. The cards reproduce the retired counter cells value for value
   (white, #E7EBEC hairline, 32/24 padding, 56px/800 number, 12px bevel) —
   the change was the data source, not the look. */
.at-stat-basis {
	margin: 16px 0 0;
	font-size: 14px;
	line-height: 1.6;
	color: #4A5456;
	text-align: center;
}
.at-statcards {
	display: grid;
	grid-template-columns: repeat(4, minmax(0, 1fr));
	gap: 20px;
}
.at-statcards[data-count="3"] {
	grid-template-columns: repeat(3, minmax(0, 1fr));
}
.at-statcards[data-count="2"] {
	grid-template-columns: repeat(2, minmax(0, 1fr));
}
.at-statcards[data-count="1"] {
	grid-template-columns: minmax(0, 1fr);
}
.at-statcard {
	padding: 32px 24px;
	background: #FFFFFF;
	border: 1px solid #E7EBEC;
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
@supports (corner-shape: bevel) {
	.at-statcard {
		clip-path: none;
		border-top-left-radius: 12px;
		corner-shape: bevel;
	}
}
.at-statcard-num {
	font-size: 56px;
	font-weight: 800;
	line-height: 1;
	color: #13181A;
}
.at-statcard-label {
	margin-top: 12px;
	font-size: 14px;
	line-height: 1.5;
	color: #4A5456;
}
@media (max-width: 1024px) {
	.at-statcards,
	.at-statcards[data-count="3"] {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
	.at-statcard-num {
		font-size: 44px;
	}
}
@media (max-width: 767px) {
	.at-statcards[data-count] {
		grid-template-columns: minmax(0, 1fr);
	}
	.at-statcard-num {
		font-size: 38px;
	}
}

/* --- Surface card for everything built in this pass ----------------------
   The service-page card treatment (paper ground, #D7DDDD hairline, teal
   hover edge, 56px icon plate) was scoped by `.page-id-N` body class, which
   a new page cannot join without its ID being known in advance. This is the
   same treatment on a class instead. A card is a SURFACE, so it carries the
   one 12px bevel (DESIGN.md Shapes); the plate inside it is a control and
   stays square. `!important` on border/background: the container's own
   Elementor border settings land in the per-post stylesheet at (0,3,0). */
.e-con.at-card {
	background-color: #FBFCFC !important;
	border: 1px solid #D7DDDD !important;
	border-radius: 0 !important;
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
	transition: border-color 0.2s ease-out, background-color 0.2s ease-out;
}
@supports (corner-shape: bevel) {
	.e-con.at-card {
		clip-path: none;
		border-top-left-radius: 12px !important;
		corner-shape: bevel;
	}
}
.e-con.at-card:hover {
	border-color: rgba(0, 116, 126, 0.45) !important;
	background-color: #FFFFFF !important;
}
/* the dark partner of a light/dark pair (VAPT vs PTaaS) — same pairing as
   Home's Training/AI split cards. */
.e-con.at-card--dark,
.e-con.at-card--dark:hover {
	background-color: #13181A !important;
}
.e-con.at-card--dark {
	border-color: #13181A !important;
}
.e-con.at-card--dark:hover {
	border-color: rgba(22, 190, 207, 0.45) !important;
}
.at-card .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	background: rgba(0, 116, 126, 0.07);
	border: 1px solid rgba(0, 116, 126, 0.2);
	clip-path: none;
	transition: background-color 0.2s ease-out, border-color 0.2s ease-out;
}
.e-con.at-card:hover .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	background: rgba(0, 116, 126, 0.13);
	border-color: rgba(0, 116, 126, 0.42);
}
.at-card--dark .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]),
.e-con.at-card--dark:hover .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	background: rgba(22, 190, 207, 0.1);
	border-color: rgba(22, 190, 207, 0.32);
}
.at-card strong {
	font-weight: 700;
	color: #00747E;
}
.at-card--dark strong {
	color: #16BECF;
}

/* Card metadata that belongs at the foot of a card (delivery chips on the
   Trainings cards, "Best for", "Target audience"). The auto margin takes the
   card's free space, so these line up across a row of unequal cards instead
   of floating directly under whichever description is shortest. */
.e-con > .elementor-widget.at-card-meta {
	margin-top: auto !important;
}
.at-card-meta .at-chips {
	margin: 18px 0;
}

/* --- Domain rows (Certified Training Portfolio) -------------------------
   index | domain | standards, one row per capability domain. Widths go on
   the flex LONGHANDS through the shorthand with !important: Elementor drives
   a container child's grow/basis through custom properties, and a plain
   shorthand is silently overwritten (DESIGN.md Don'ts). */
.e-con.at-domain {
	align-items: center;
}
.at-domain > .at-domain-index {
	flex: 0 0 36px !important;
	width: 36px !important;
}
.at-domain > .at-domain-title {
	flex: 0 0 34% !important;
	width: 34% !important;
}
.at-domain > .elementor-widget-amantec-chip-row {
	flex: 1 1 0 !important;
	width: auto !important;
	min-width: 0;
}
.at-domain .at-chips {
	margin: 0;
}
.at-mono .elementor-heading-title {
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important;
}
@media (max-width: 767px) {
	.at-domain > .at-domain-title {
		flex: 1 1 0 !important;
		width: auto !important;
	}
	.at-domain > .elementor-widget-amantec-chip-row {
		flex: 0 0 100% !important;
		width: 100% !important;
	}
}

/* --- Partner tiles: capability caption under each logo (PTR-01) ---------
   The captions are the profile's own (slide 23). */
.at-tile-caption {
	width: 100%;
}
.at-tile-caption .elementor-heading-title {
	margin-top: 18px;
	padding-top: 14px;
	border-top: 1px solid #E7EBEC;
	text-align: center;
	font-size: 13px !important;
	font-weight: 600 !important;
	line-height: 1.45 !important;
	letter-spacing: 0 !important;
	color: #4A5456 !important;
}
/* The only Montance mark available is the profile's embedded 134x20 image.
   `contain` would upscale it into the fixed logo box and blur it; scale-down
   keeps it sharp at its real size until a proper file arrives. */
.elementor-widget-image.at-logo-native img {
	object-fit: scale-down !important;
}
/* Partner tiles are flex COLUMNS (logo over caption), and both boxes around
   each logo shrink-wrap: the image widget collapses to its content inside a
   column with align-items:center, and the external link <a> inside it
   collapses to the image. The fixed 210x74 logo box then only held for files
   wider than 210px — Hack The Box rendered at 123px and Pentest Tools at
   135px. It takes BOTH rules; each alone was measured to change nothing,
   because each box just shrink-wraps the other. */
.page-id-18 .e-con > .elementor-widget-image {
	align-self: stretch !important;
	width: 100% !important;
}
.page-id-18 .elementor-widget-image a {
	display: flex !important;
	justify-content: center;
	width: 100%;
}

/* --- About Us: Mission/Vision strap lines (profile slide 4) ------------- */
.elementor-element-missioncopy p + p,
.elementor-element-visioncopy p + p {
	margin-top: 16px;
	font-weight: 600;
	color: #00747E;
}

/* ===================== Company Profile alignment — MEDIUM items, 2026-09-15 =====
   Tracker MEDIUM rows. Build script: build-scripts/profile-align-medium-2026-09-15.php.
   User decisions: Lucide everywhere now; no news dates; SOC-CMM retired;
   Radea named as the profile writes it. */

/* --- One icon plate everywhere (HOME-07, TRN-04, FREE-01, NAV-05) -------
   The service pages' 56px square plate, extended to Home's five solution
   cards. Square, per Shapes: a plate is a control, not a surface. */
.elementor-element-solgrid .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 56px;
	height: 56px;
	background: rgba(0, 116, 126, 0.07);
	border: 1px solid rgba(0, 116, 126, 0.2);
	clip-path: none;
	transition: background-color 0.2s ease-out, border-color 0.2s ease-out;
}
.elementor-element-solgrid > .e-con:hover .elementor-icon-box-icon .elementor-icon:has(> svg[class*="e-fas-"]) {
	background: rgba(0, 116, 126, 0.13);
	border-color: rgba(0, 116, 126, 0.42);
}
/* Free Cyber Tools: the solid teal badge becomes the same plate. The badge
   container keeps its 52px sizing rule further up; this only repaints it. */
.e-con.at-plate {
	background-color: rgba(0, 116, 126, 0.07) !important;
	border: 1px solid rgba(0, 116, 126, 0.2) !important;
	border-radius: 0 !important;
}

/* --- Bevel on its own, for a tile that keeps its own ground and border --- */
.e-con.at-bevel {
	border-radius: 0 !important;
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
@supports (corner-shape: bevel) {
	.e-con.at-bevel {
		clip-path: none;
		border-top-left-radius: 12px !important;
		corner-shape: bevel;
	}
}

/* --- Trainings: the tenth card (TRN-07) gets the other nine's hover ------ */
.elementor-element-traincard9 {
	position: relative;
	transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}
.elementor-element-traincard9:hover {
	box-shadow: 0 12px 28px rgba(19, 24, 26, 0.06);
}
@media (prefers-reduced-motion: no-preference) {
	.elementor-element-traincard9:hover {
		transform: translateY(-3px);
	}
}

/* --- Stacked paragraphs inside one text editor (About's overview) -------- */
.at-te-stack p + p {
	margin-top: 14px;
}

/* --- About: the Mission card is now dark (ABOUT-05), so its strap line
   takes the dark-ground accent instead of teal. */
.at-card--dark .elementor-element-missioncopy p + p {
	color: #16BECF;
}

/* --- News cards: share image on top (NEWS-03) ----------------------------
   Full-bleed inside the card's own padding. The card was the last rounded
   box on the site; it takes the surface bevel while it is being touched. */
.amantec-news-card {
	overflow: hidden;
	border-radius: 0;
	clip-path: polygon(12px 0, 100% 0, 100% 100%, 0 100%, 0 12px);
}
@supports (corner-shape: bevel) {
	.amantec-news-card {
		clip-path: none;
		border-top-left-radius: 12px;
		corner-shape: bevel;
	}
}
/* `.amantec-news-card .amantec-news-thumb` + !important: Elementor's
   `.elementor img { max-width: 100% }` is (0,1,1) and beat a single class,
   capping the image at the card's content width and leaving a 52px gap on
   the right (measured 313px in a 367px card). */
.amantec-news-card .amantec-news-thumb {
	display: block;
	width: calc(100% + 52px);
	max-width: none !important;
	height: auto;
	aspect-ratio: 1200 / 630;
	object-fit: cover;
	margin: -30px -26px 22px;
	border-bottom: 1px solid #E7EBEC;
}

/* --- Footer: registered names + parent-group badge (NAV-01) ------------- */
.amantec-footer-bottom {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	align-items: center;
	gap: 10px 20px;
}
.amantec-footer-bottom .amantec-footer-group {
	padding: 4px 10px;
	border: 1px solid rgba(22, 190, 207, 0.28);
	color: #16BECF;
	letter-spacing: 0.04em;
	text-decoration: none;
	transition: background-color 0.18s ease-out, border-color 0.18s ease-out, color 0.18s ease-out;
}
/* Now a link (afnanholding.com): the same hover language as the footer's
   social icons — teal fill, white text. */
.amantec-footer-bottom .amantec-footer-group:hover,
.amantec-footer-bottom .amantec-footer-group:focus-visible {
	background-color: #00747E;
	border-color: #00747E;
	color: #FFFFFF;
}


/* ===================== LOW items — 2026-09-15 ============================
   Tracker LOW pass (build-scripts/profile-align-low-2026-09-15.php). */

/* --- NAV-10 / HOME-11: the status pill above every inner-page H1 --------
   Same component as Home's SYSTEM_STATUS readout, reading the page's place
   in the site. Home keeps its centred 30px gap; inner headers are
   left-aligned and sit tighter over a 44px H1. The text wraps at the
   " / " separators on a phone rather than overflowing. */
/* In an Elementor header the container's own 20px flex gap already
   separates the pill from the H1 — a margin on top of it measured 40px.
   The article header is plain markup with no gap, so it keeps the margin. */
.elementor-widget-amantec-status-pill:not(.elementor-element-herostatus1) .at-status-pill {
	margin: 0;
}
.amantec-article-header__inner .at-status-pill {
	margin: 0 0 20px;
}
.at-status-pill {
	max-inline-size: 100%;
}
@media (max-width: 767px) {
	.at-status-pill {
		font-size: 11px;
		padding: 6px 12px;
		gap: 8px;
	}
}

/* --- TRN-08: Trainings programmes in slide 7's three audience groups ----
   Desktop: one grid, three columns, and each group a subgrid spanning four
   rows (heading + three cards), so cards line up row by row across the
   groups and every button sits on the same line. Elementor draws containers
   as flex through its own per-post rules, hence display/gap !important. */
.e-con.at-train-group > .elementor-widget-heading {
	padding-block-end: 12px;
	border-block-end: 1px solid #D7DDDD;
}
@media (min-width: 1025px) {
	.e-con.at-train-groups {
		display: grid !important;
		grid-template-columns: repeat(3, minmax(0, 1fr));
		grid-template-rows: auto repeat(3, auto);
		gap: 20px !important;
	}
	.e-con.at-train-group {
		display: grid !important;
		grid-row: span 4;
		grid-template-rows: subgrid;
		gap: 20px !important;
		width: auto !important;
		max-width: none !important;
	}
}
@media (max-width: 1024px) {
	.e-con.at-train-groups {
		flex-direction: column !important;
		gap: 48px !important;
	}
	.e-con.at-train-group {
		display: grid !important;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 20px !important;
		width: 100% !important;
	}
	.e-con.at-train-group > .elementor-widget-heading {
		grid-column: 1 / -1;
	}
}
@media (max-width: 600px) {
	.e-con.at-train-group {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* --- NEWS-04: topic filter + topic label on each card ------------------- */
.amantec-news-filter {
	display: flex;
	flex-wrap: wrap;
	gap: 9px;
	margin: 0 0 32px;
}
.amantec-news-filter a {
	display: inline-block;
	padding: 8px 16px;
	border: 1px solid #D7DDDD;
	border-radius: 0;
	background: #FFFFFF;
	color: #13181A;
	font-size: 14px;
	font-weight: 600;
	text-decoration: none;
	transition: border-color 0.2s ease-out, color 0.2s ease-out, background-color 0.2s ease-out;
}
.amantec-news-filter a:hover {
	border-color: #00747E;
	color: #00747E;
}
.amantec-news-filter a[aria-current] {
	background: #00747E;
	border-color: #00747E;
	color: #FFFFFF;
}
.amantec-news-filter a:focus-visible {
	outline: 2px solid #00747E;
	outline-offset: 2px;
}
.amantec-news-topic {
	display: block;
	margin: 0 0 8px;
	font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
	font-size: 11.5px;
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: #00747E;
}

/* --- FREE-02: newsletter opt-in on a dark card ---------------------------
   Two classes on each rule: Hello's reset styles bare `button`, `[type=email]`
   and their :hover at (0,1,0) with its pink theme colour. */
.at-optin .at-optin-form {
	display: flex;
	flex-wrap: wrap;
	gap: 12px;
	margin: 0;
}
.at-optin .at-optin-email {
	flex: 1 1 240px;
	min-inline-size: 0;
	padding: 13px 14px;
	border: 1px solid rgba(255, 255, 255, 0.22);
	border-radius: 0;
	background: rgba(255, 255, 255, 0.06);
	color: #FFFFFF;
	font-size: 14px;
}
.at-optin .at-optin-email::placeholder {
	color: #93A2A4;
}
.at-optin .at-optin-email:focus {
	outline: 2px solid #16BECF;
	outline-offset: 1px;
	border-color: #16BECF;
}
.at-optin .at-optin-submit,
.at-optin .at-optin-submit:hover,
.at-optin .at-optin-submit:focus {
	padding: 13px 22px;
	border: 0;
	border-radius: 0;
	background: #00747E;
	color: #FFFFFF;
	font-size: 14px;
	font-weight: 700;
	cursor: pointer;
}
.at-optin .at-optin-submit:hover {
	background: #005F67;
}
.at-optin .at-optin-submit:focus-visible {
	outline: 2px solid #16BECF;
	outline-offset: 2px;
}
.at-optin .at-optin-privacy {
	flex-basis: 100%;
	font-size: 13px;
	color: #C3CED0;
}
.at-optin .at-optin-privacy a {
	color: #16BECF;
}
.at-optin .at-optin-message,
.at-optin .at-optin-message p {
	margin: 0;
	font-size: 14px;
	line-height: 1.7;
	color: #EAF6F7;
}
.at-optin .at-optin-message p + p {
	margin-top: 10px;
}
