/*
 * cm-interior.css — per-family presentation for the interior templates.
 * ---------------------------------------------------------------------------
 * GENERATED. Do not hand-edit: it is assembled from the per-family fragments by
 * dev/cosmick-visual/build-interior-css.mjs. Edit a fragment and rebuild.
 *
 * Shared components (tokens, buttons, cards, type, forms, prose, grids) live in
 * cosmick-2026.css and are NOT repeated here. This file carries only what a
 * specific template family needs on top of that.
 *
 * Loaded as the last hardcoded <link> after cosmick-2026.css, so it can refine
 * the shared layer by source order without !important.
 */


/* =========================================================================
   SERVICES
   ========================================================================= */

/* ===========================================================================
 * services.css — Phase 4 fragment for the SERVICES family
 *
 *   archive-service.php   (/services/ — the services index, ref-04 §3.1)
 *   single-service.php    (/services/<slug>/ — service detail, ref-04 §3.2)
 *   page-services.php     (the "Services Page" page template)
 *
 * Everything the shared 2026 layer already expresses is composed from it:
 * .cm-wrap .cm-section .cm-section-tight .cm-band-sand .cm-band-sand-60
 * .cm-split/.cm-split-aside .cm-grid-2/3 .cm-card .cm-card-link .cm-group
 * .cm-pcard* .cm-aside-card .cm-aside-title .cm-tag .cm-btn* .cm-tlink
 * .cm-media-frame .cm-aspect-16-9/16-10 .cm-faq-list/.cm-faq-item/.cm-faq-mark
 * .cm-bundle-callout .cm-empty .cm-prose .cm-row .cm-sr-only .cm-eyebrow
 * .cm-h-page/.cm-h-section/.cm-h-card .cm-lede .cm-muted
 *
 * Only the rules below are left over — the ones the shared layer has no class
 * for. Everything here is namespaced `cm-svc-*` and is presentation only.
 * It must stay AFTER cosmick-2026.css in source order, like every other
 * Phase 4 fragment.
 * ======================================================================== */

/* ---------------------------------------------------------------------------
 * 1. SERVICE CARD (services index + page template)
 *
 * The card shell, media frame and body are .cm-card/.cm-pcard/.cm-pcard-media/
 * .cm-pcard-body from the shared layer. These add the numbered eyebrow row,
 * the tagline, the price/timeline meta row and the bottom-pinned arrow link
 * the approved reference's service card carries (§3.1).
 * ------------------------------------------------------------------------ */

.cm-svc-card .cm-pcard-body { padding: 24px 24px 26px; gap: 0; }

.cm-svc-head {
	display: flex;
	align-items: center;
	gap: 10px;
	min-height: 20px;
}

.cm-svc-num {
	font-family: var(--cm26-font-display);
	font-size: 13px;
	font-weight: 700;
	letter-spacing: .06em;
	color: var(--cm26-brand);
	flex: 0 0 auto;
}

/* Bootstrap Icons glyph from the `service_icon` field. Decorative: the card
   already names the service in its heading. */
.cm-svc-icon {
	font-size: 16px;
	line-height: 1;
	color: var(--cm26-brand-ink);
	flex: 0 0 auto;
}

.cm-svc-card-title { margin: 12px 0 0; }
.cm-svc-card-title a { color: inherit; text-decoration: none; }
.cm-svc-card-title a:hover,
.cm-svc-card-title a:focus-visible { color: var(--cm26-brand-ink); }

.cm-svc-tagline {
	margin: 10px 0 0;
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.4;
	color: var(--cm26-ink);
}

.cm-svc-copy {
	margin: 10px 0 0;
	font-size: 15.5px;
	line-height: 1.6;
	color: var(--cm26-body);
}

/* Category / availability chips. .cm-tag does the chrome; this only spaces the
   row and gives the "limited availability" chip its own tone. */
.cm-svc-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin-top: 14px;
}

.cm-tag-limited {
	background: var(--cm26-tint);
	color: var(--cm26-brand-hover);
	box-shadow: inset 0 0 0 1px #e8c4bf;
}

/* Price + timeline. A dl so the label/value pairing survives with styles off. */
.cm-svc-meta {
	display: flex;
	flex-wrap: wrap;
	gap: 6px 20px;
	margin: 16px 0 0;
	padding-top: 14px;
	border-top: 1px solid var(--cm26-line);
	font-size: 14px;
}

.cm-svc-meta > div { display: flex; align-items: baseline; gap: 6px; }
.cm-svc-meta dt { color: var(--cm26-stone); }
.cm-svc-meta dd { margin: 0; font-weight: 600; color: var(--cm26-ink); }
.cm-svc-meta small { display: block; font-size: 13px; font-weight: 400; color: var(--cm26-stone); }

.cm-svc-more { margin-top: auto; padding-top: 18px; }

.cm-svc-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: auto;
	padding-top: 20px;
}

/* "What's included" preview inside the larger featured card. */
.cm-svc-incl {
	list-style: none;
	margin: 16px 0 0;
	padding: 0;
	display: grid;
	gap: 6px;
	font-size: 14.5px;
	color: var(--cm26-body);
}

.cm-svc-incl li { display: flex; gap: 8px; }
.cm-svc-incl li::before {
	content: "";
	flex: 0 0 auto;
	width: 6px;
	height: 6px;
	margin-top: .55em;
	border-radius: 99px;
	background: var(--cm26-brand);
}
.cm-svc-incl .cm-svc-incl-more { color: var(--cm26-stone); }
.cm-svc-incl .cm-svc-incl-more::before { background: var(--cm26-line); }

/* ---------------------------------------------------------------------------
 * 2. SERVICE DETAIL — body blocks
 *
 * The left column of the .cm-split is a stack of titled blocks. The shared
 * layer has .cm-section for page-level rhythm but nothing for the tighter
 * rhythm between blocks inside one column, and .cm-h-section (28–40px) is a
 * page-level size that overpowers a 1fr column next to a 320px rail.
 * ------------------------------------------------------------------------ */

/* Icon + category / featured / availability chips above the body. */
.cm-svc-badges {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0 0 26px;
}

.cm-svc-body > .cm-svc-block + .cm-svc-block { margin-top: clamp(36px, 4.5vw, 56px); }

.cm-svc-block-title {
	margin: 0 0 20px;
	font-size: clamp(22px, 2.2vw, 27px);
	line-height: 1.2;
	letter-spacing: -.02em;
	font-weight: 700;
}

/* The wysiwyg `service_process` intro that sits above the numbered steps. */
.cm-svc-process-intro { margin-bottom: 26px; }

/* A short item card used by "What's included", "Key benefits", "Awards" and
   "Our specialties". .cm-card supplies the surface. */
.cm-svc-item { padding: 20px 22px; }
.cm-svc-item-title {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.35;
}
.cm-svc-item-copy {
	margin: 7px 0 0;
	font-size: 15px;
	line-height: 1.6;
	color: var(--cm26-body);
}
.cm-svc-item-note {
	display: inline-block;
	margin-top: 8px;
	font-size: 13px;
	font-weight: 600;
	letter-spacing: .06em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

/* Numbered process steps. An <ol> so the order is real, not painted on. */
.cm-svc-steps {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 4px;
}

.cm-svc-step {
	display: grid;
	grid-template-columns: 40px minmax(0, 1fr);
	gap: 18px;
	padding: 18px 0;
	border-top: 1px solid var(--cm26-line);
}

.cm-svc-step:last-child { border-bottom: 1px solid var(--cm26-line); }

.cm-svc-step-num {
	display: grid;
	place-items: center;
	width: 40px;
	height: 40px;
	border-radius: 99px;
	background: var(--cm26-sand);
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 700;
	color: var(--cm26-brand-ink);
}

/* Technologies, grouped by the `tech_type` select. */
.cm-svc-techs { display: grid; gap: 22px; }

.cm-svc-tech-title {
	margin: 0 0 10px;
	font-family: var(--cm26-font-display);
	font-size: 13px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

.cm-svc-chip-row { display: flex; flex-wrap: wrap; gap: 8px; }

/* Video poster. The whole poster is one link; the badge is decorative. */
.cm-svc-video {
	position: relative;
	display: block;
	border-radius: var(--cm26-radius);
	overflow: hidden;
	text-decoration: none;
}

.cm-svc-video-badge {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	pointer-events: none;
}

.cm-svc-video-badge span {
	display: grid;
	place-items: center;
	width: 68px;
	height: 68px;
	border-radius: 99px;
	background: var(--cm26-brand-ink);
	color: var(--cm26-on-brand);
	box-shadow: var(--cm26-shadow-lift);
	transition: transform .2s var(--cm26-ease);
}

.cm-svc-video:hover .cm-svc-video-badge span,
.cm-svc-video:focus-visible .cm-svc-video-badge span { transform: scale(1.07); }

.cm-svc-video-label {
	margin: 10px 0 0;
	font-size: 14px;
	color: var(--cm26-stone);
}

.cm-svc-embed { position: relative; aspect-ratio: 16 / 9; }
.cm-svc-embed iframe,
.cm-svc-embed video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
	border-radius: var(--cm26-radius);
}

/* Before / after comparison. */
.cm-svc-ba + .cm-svc-ba { margin-top: 28px; }
.cm-svc-ba-fig { margin: 0; }
.cm-svc-ba-title {
	margin: 0 0 12px;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
}
.cm-svc-ba-label {
	margin: 0 0 8px;
	font-family: var(--cm26-font-display);
	font-size: 12.5px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

/* Award / specialty logo. object-fit: contain, because these are logos on
   their own ground — .cm-media-frame's cover crop would clip them. */
.cm-svc-logo {
	display: grid;
	place-items: center;
	height: 64px;
	margin-bottom: 14px;
}
.cm-svc-logo img {
	max-height: 64px;
	width: auto;
	max-width: 100%;
	object-fit: contain;
}

/* ---------------------------------------------------------------------------
 * 3. SERVICE DETAIL — right rail
 * .cm-card.cm-aside-card and .cm-aside-title carry the surface and the label.
 * ------------------------------------------------------------------------ */

.cm-svc-summary { margin: 0; display: grid; gap: 12px; font-size: 15px; }
.cm-svc-summary > div { display: grid; gap: 2px; }
.cm-svc-summary dt {
	font-family: var(--cm26-font-display);
	font-size: 12.5px;
	font-weight: 700;
	letter-spacing: .1em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}
.cm-svc-summary dd { margin: 0; font-weight: 600; color: var(--cm26-ink); }
.cm-svc-summary dd small { display: block; font-size: 13.5px; font-weight: 400; color: var(--cm26-stone); }

.cm-svc-rail-actions { display: grid; gap: 10px; margin-top: 18px; }
.cm-svc-rail-actions .cm-btn { width: 100%; }

/* The related-services list is .cm-aside-card ul from the shared layer, which
   now carries the 17.5px display face, 6px padding and 4px gap. Only the
   line-height is local: the reference runs this particular list at
   `leading-snug` (1.375, measured 24.0625px) while the identical list on a
   software page is left at the body's 1.65 — an inconsistency in the
   reference itself, reproduced rather than averaged away, because these
   service labels wrap to two lines and the 8px difference is visible. */
.cm-svc-rail-list a { line-height: 1.375; }

.cm-svc-rail-foot { margin-top: 14px; }

.cm-svc-talk-title {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 17.5px;   /* reference: 17.5px/28.875px, not 16px/26.4px */
	font-weight: 700;
	line-height: 1.65;
}

.cm-svc-phone {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	margin-top: 10px;
	min-height: 44px;
	font-family: var(--cm26-font-display);
	font-size: 18px;
	font-weight: 700;
	color: var(--cm26-brand-ink);
	text-decoration: none;
}
.cm-svc-phone:hover,
.cm-svc-phone:focus-visible { text-decoration: underline; text-underline-offset: 4px; }

.cm-svc-talk-copy { margin: 6px 0 0; font-size: 14px; color: var(--cm26-stone); }

/* ---------------------------------------------------------------------------
 * 4. SERVICE DETAIL — closing enquiry band
 *
 * Holds the existing [gravityform id="1"] embed. Phase 5 owns the Gravity
 * Forms markup itself; nothing here reaches inside .gform_wrapper.
 * ------------------------------------------------------------------------ */

.cm-svc-enquire { display: grid; gap: 32px; align-items: start; }

@media (min-width: 1024px) {
	.cm-svc-enquire { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: 56px; }
}

.cm-svc-enquire-copy > * + * { margin-top: 16px; }
.cm-svc-enquire-form { padding: 24px; }

@media (min-width: 768px) { .cm-svc-enquire-form { padding: 32px; } }


/* =========================================================================
   PORTFOLIO
   ========================================================================= */

/* ===========================================================================
   PORTFOLIO FAMILY — archive-portfolio.php, single-portfolio.php,
   page-portfolio.php, template-portfolio.php
   ---------------------------------------------------------------------------
   Append to assets/css/cosmick-2026.css. Every rule below uses the existing
   cm26 tokens and only covers shapes the shared layer has no component for:
   the filter panel, the richer portfolio card, the framed hero screenshot,
   the long-form chapter rhythm, the metric tiles and the fact list.

   Nothing here redefines a shared component. The reset at the top of each
   list block is only there because .cm-grid-* is applied to <ul> elements,
   which would otherwise show markers.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   FILTER PANEL (ref-04 §3.4)
   -------------------------------------------------------------------------- */

.cm-pf-filters {
	display: grid;
	gap: 16px;
	padding: 16px;
	margin-bottom: 24px;
}

@media (min-width: 900px) {
	.cm-pf-filters {
		grid-template-columns: 1.6fr 1fr 1fr auto;
		align-items: end;
	}
}

.cm-pf-search { position: relative; display: block; }

.cm-pf-search-icon {
	position: absolute;
	left: 13px;
	top: 50%;
	transform: translateY(-50%);
	pointer-events: none;
	color: var(--cm26-stone);
}

.cm-pf-search-input { padding-left: 38px; }

/* Native select, re-skinned to match .cm-input, with room for the chevron. */
.cm-pf-select {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 38px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b6460' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 12px center;
}

.cm-pf-filters-actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
}

.cm-pf-count { margin: 0 0 20px; font-size: 14.5px; }

/* ---------------------------------------------------------------------------
   PORTFOLIO CARD
   The reference's project card plus the record meta this installation
   actually carries (brand logo, client, type, industry, services, status,
   completion date, case-study flag).
   -------------------------------------------------------------------------- */

.cm-pf-card { display: flex; flex-direction: column; overflow: hidden; }

.cm-pf-card-media { display: block; padding: 12px 12px 0; text-decoration: none; }
.cm-pf-card-media .cm-media-frame { border-radius: var(--cm26-radius-sm); }

.cm-pf-card-body {
	display: flex;
	flex: 1 1 auto;
	flex-direction: column;
	gap: 10px;
	padding: 20px;
}

.cm-pf-card-head { display: flex; align-items: flex-start; gap: 12px; }

.cm-pf-card-logo {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 44px;
	height: 44px;
	padding: 5px;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-sm);
	background: #fff;
	overflow: hidden;
}

.cm-pf-card-logo img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
}

.cm-pf-card-headings { min-width: 0; }

.cm-pf-card-client {
	margin: 2px 0 0;
	font-size: 13.5px;
	line-height: 1.35;
	color: var(--cm26-stone);
}

.cm-pf-card .cm-pcard-title,
.cm-pf-card .cm-pcard-excerpt { margin: 0; }

.cm-pf-card-chips,
.cm-pf-flags,
.cm-pf-chiplist {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin: 0;
	padding: 0;
	list-style: none;
}

.cm-pf-chip-flag {
	background: var(--cm26-tint);
	color: var(--cm26-brand-ink);
	font-weight: 600;
}

.cm-pf-chip-more { background: transparent; color: var(--cm26-stone); }

.cm-pf-card-foot {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	margin: auto 0 0;
	padding-top: 12px;
	font-size: 13px;
	color: var(--cm26-stone);
}

.cm-pf-card-kind { font-weight: 400; }   /* reference: regular, not semibold */
.cm-pf-card-sep { opacity: .6; }

/* The related-projects card reuses .cm-pcard-*; give its body the same
   breathing room as the index card. */
.cm-pcard-body .cm-pf-card-client { margin-top: 4px; }
.cm-pcard-body .cm-pf-card-foot { padding-top: 14px; }

/* ---------------------------------------------------------------------------
   HERO SCREENSHOT (ref-04 §3.5)
   -------------------------------------------------------------------------- */

.cm-pf-shot {
	max-width: 1040px;
	margin: 0 auto;
	padding: clamp(12px, 3vw, 36px);
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-card);
	background: var(--cm26-sand);
}

.cm-pf-shot-inner {
	overflow: hidden;
	border: 1px solid rgba(0, 0, 0, .1);
	border-radius: var(--cm26-radius-sm);
	background: #fff;
	box-shadow: 0 24px 50px -28px rgba(0, 0, 0, .4);
}

.cm-pf-shot-img { display: block; width: 100%; height: auto; }

.cm-pf-shot-caption {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-top: 16px;
	font-family: var(--cm26-font-display);
	font-size: 14px;
	font-weight: 600;
	color: var(--cm26-body);
}

.cm-pf-shot-logo {
	width: 32px;
	height: 32px;
	object-fit: contain;
	object-position: center;
	border-radius: 4px;
	background: #fff;
}

/* ---------------------------------------------------------------------------
   BODY CHAPTERS
   The shared layer has .cm-h-section (40px) and .cm-h-card (22px) but nothing
   in between for an in-body chapter heading. This matches .cm-prose h2 so a
   chapter heading and a heading inside the prose agree.
   -------------------------------------------------------------------------- */

.cm-pf-body { min-width: 0; }

.cm-pf-chapter + .cm-pf-chapter { margin-top: clamp(36px, 5vw, 56px); }

.cm-pf-chapter-head { margin-bottom: 20px; }

.cm-pf-chapter-title {
	font-size: clamp(24px, 2.4vw, 30px);
	line-height: 1.2;
	letter-spacing: -.018em;
	font-weight: 700;
}

/* A chapter's supporting line is a sub-line, not a page lede. */
.cm-pf-chapter-head .cm-lede {
	font-size: 16px;
	line-height: 1.55;
	color: var(--cm26-stone);
}

/* ---------------------------------------------------------------------------
   METRIC TILES
   -------------------------------------------------------------------------- */

.cm-pf-metrics {
	display: grid;
	gap: 16px;
	margin: 0 0 28px;
	padding: 0;
	list-style: none;
}

@media (min-width: 640px) {
	.cm-pf-metrics { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
}

.cm-pf-metric { padding: 20px; }

.cm-pf-metric-value {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: clamp(28px, 3vw, 36px);
	font-weight: 800;
	line-height: 1.05;
	letter-spacing: -.02em;
	color: var(--cm26-brand-ink);
}

.cm-pf-metric-label {
	margin: 8px 0 0;
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 600;
	line-height: 1.3;
	color: var(--cm26-ink);
}

.cm-pf-metric-note { margin: 4px 0 0; font-size: 13.5px; color: var(--cm26-body); }

.cm-pf-metric-source {
	margin: 8px 0 0;
	padding-top: 8px;
	border-top: 1px solid var(--cm26-line);
	font-size: 12.5px;
	line-height: 1.4;
	color: var(--cm26-stone);
}

/* ---------------------------------------------------------------------------
   VIDEO
   -------------------------------------------------------------------------- */

.cm-pf-video {
	position: relative;
	overflow: hidden;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius);
	background: var(--cm26-sand);
}

.cm-pf-video iframe,
.cm-pf-video video,
.cm-pf-video > :only-child {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

/* ---------------------------------------------------------------------------
   GALLERY (no script: each tile links to the full-size file)
   -------------------------------------------------------------------------- */

.cm-pf-gallery { margin: 0; padding: 0; list-style: none; }

.cm-pf-gallery-item { margin: 0; padding: 12px; overflow: hidden; }

.cm-pf-gallery-link { display: block; text-decoration: none; }

.cm-pf-gallery-link .cm-media-frame {
	display: block;
	border-radius: var(--cm26-radius-sm);
}

.cm-pf-gallery-item figcaption {
	margin-top: 10px;
	font-size: 13.5px;
	line-height: 1.45;
	color: var(--cm26-stone);
}

/* ---------------------------------------------------------------------------
   BEFORE / AFTER
   -------------------------------------------------------------------------- */

.cm-pf-ba-list { display: grid; gap: 24px; }

.cm-pf-ba { margin: 0; padding: 20px; }

.cm-pf-ba-pair { display: grid; gap: 20px; }

@media (min-width: 640px) {
	.cm-pf-ba-pair { grid-template-columns: 1fr 1fr; }
}

.cm-pf-ba-side .cm-eyebrow { margin-bottom: 8px; }

.cm-pf-ba-side .cm-media-frame {
	display: block;
	border-radius: var(--cm26-radius-sm);
}

.cm-pf-ba figcaption {
	margin-top: 16px;
	font-size: 14px;
	line-height: 1.5;
	color: var(--cm26-stone);
}

/* ---------------------------------------------------------------------------
   DELIVERABLES / INTEGRATIONS / AWARDS
   -------------------------------------------------------------------------- */

.cm-pf-list { margin: 0; padding: 0; list-style: none; }

.cm-pf-list-item {
	display: flex;
	flex-direction: column;
	gap: 8px;
	padding: 20px;
	border-left: 3px solid var(--cm26-brand);
}

.cm-pf-list-title {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.3;
}

.cm-pf-list-copy { margin: 0; font-size: 15px; line-height: 1.55; color: var(--cm26-body); }
.cm-pf-list-meta { margin: 0; font-size: 13.5px; color: var(--cm26-stone); }
.cm-pf-list-item .cm-tlink { margin-top: auto; }

/* ---------------------------------------------------------------------------
   TEAM CREDITS
   -------------------------------------------------------------------------- */

.cm-pf-team { margin: 0; padding: 0; list-style: none; }

.cm-pf-person { padding: 20px; text-align: left; }

.cm-pf-person-photo {
	display: grid;
	place-items: center;
	width: 64px;
	height: 64px;
	margin-bottom: 14px;
	overflow: hidden;
	border-radius: 999px;
	background: var(--cm26-sand);
}

.cm-pf-person-photo img { width: 100%; height: 100%; object-fit: cover; object-position: center top; }

.cm-pf-person-initials {
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	background: var(--cm26-charcoal);
	color: var(--cm26-paper);
	font-family: var(--cm26-font-display);
	font-size: 20px;
	font-weight: 700;
	letter-spacing: -.02em;
}

.cm-pf-person-name {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.3;
}

.cm-pf-person-name a { color: inherit; text-decoration: none; }
.cm-pf-person-name a:hover { color: var(--cm26-brand-ink); text-decoration: underline; text-underline-offset: 4px; }

.cm-pf-person-role { margin: 3px 0 0; font-size: 13.5px; color: var(--cm26-brand-ink); }
.cm-pf-person-bio { margin: 10px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--cm26-body); }

/* ---------------------------------------------------------------------------
   TESTIMONIAL PULL QUOTE
   -------------------------------------------------------------------------- */

.cm-pf-quote { margin: 0; padding: 28px; }

.cm-pf-quote-mark {
	display: block;
	font-family: var(--cm26-font-display);
	font-size: 54px;
	line-height: .6;
	color: var(--cm26-brand);
}

.cm-pf-quote-text { margin: 16px 0 0; border: 0; padding: 0; }

.cm-pf-quote-text p {
	margin: 0;
	font-size: 18px;
	line-height: 1.6;
	color: var(--cm26-prose);
}

.cm-pf-quote-by {
	display: flex;
	align-items: center;
	gap: 14px;
	margin-top: 20px;
	padding-top: 18px;
	border-top: 1px solid var(--cm26-line);
	font-size: 14px;
	color: var(--cm26-stone);
}

.cm-pf-quote-by strong {
	display: block;
	font-family: var(--cm26-font-display);
	font-weight: 600;
	color: var(--cm26-body);
}

.cm-pf-quote-role { display: block; }

.cm-pf-quote-face {
	flex: 0 0 auto;
	width: 52px;
	height: 52px;
	border-radius: 999px;
	object-fit: cover;
	object-position: center top;
}

/* ---------------------------------------------------------------------------
   SIDEBAR FACT LIST
   -------------------------------------------------------------------------- */

.cm-pf-facts { display: grid; gap: 14px; margin: 0; }

.cm-pf-facts > div {
	display: grid;
	gap: 2px;
	padding-bottom: 14px;
	border-bottom: 1px solid var(--cm26-line);
}

.cm-pf-facts > div:last-child { padding-bottom: 0; border-bottom: 0; }

.cm-pf-facts dt {
	font-family: var(--cm26-font-display);
	font-size: 12px;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

.cm-pf-facts dd { margin: 0; font-size: 15px; line-height: 1.45; color: var(--cm26-ink); }

.cm-pf-flags { margin-top: 16px; }

.cm-pf-aside-link { margin: 16px 0 0; }
.cm-pf-aside-copy { margin: 0; font-size: 15px; line-height: 1.55; color: var(--cm26-body); }

.cm-pf-aside-phone { margin: 12px 0 16px; }

.cm-pf-aside-phone a {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	min-height: 44px;
	font-family: var(--cm26-font-display);
	font-size: 18px;
	font-weight: 700;
	color: var(--cm26-brand-ink);
	text-decoration: none;
}

.cm-pf-aside-phone a:hover { text-decoration: underline; text-underline-offset: 4px; }


/* =========================================================================
   WORK-GALLERY
   ========================================================================= */

/* ===========================================================================
   WORK GALLERY — the portfolio index (/portfolio/)
   ---------------------------------------------------------------------------
   WHAT THIS LAYER IS
   This is the presentation layer for the rebuilt portfolio index: the dark
   hero and its spotlight cover, the "selected work" story rows, the industry
   links, the full collection grid with its filter panel, the closing CTA, and
   the device showcase (phone + browser frame) those blocks share. It is a
   per-family fragment: the orchestrator concatenates it into
   assets/css/cm-interior.css, which header.php loads as the LAST theme
   stylesheet, after cosmick-2026.css. Nothing here edits the built sheets in
   assets/css directly, and nothing here uses !important.

   Because cm-interior.css is last, a rule of equal specificity in this file
   beats cosmick-2026.css on source order alone. Several rules below depend on
   that and say so.

   WHY THE NAMESPACE IS cm-wk- AND NOT cm-work-
   cm-work-* is already taken, by the homepage showcase card
   (.cm-work / .cm-work-frame / .cm-work-body / .cm-work-media-link /
   .cm-work-img / .cm-work-device / .cm-work-tags / .cm-work-desc /
   .cm-work-action in cosmick-2026.css). Those are a different component on a
   different template, and a prefix collision would have made every rule here
   a cascade accident — ".cm-work-media" would have meant two things on two
   pages. cm-wk- was verified free across every .css, .php and .js in the
   theme before a line of this file was written.

   TRANSLATED FROM the approved reference bundle. Reference selector -> ours:
   work-gallery -> cm-wk, work-project -> cm-wk-card,
   work-device-showcase -> cm-wk-devices, work-story-government ->
   cm-wk-story--alt, work-image-fallback -> cm-wk-ph, and otherwise the
   reference name with "work-" swapped for "cm-wk-". The shared primitives
   .wrap / .input / .field are this theme's .cm-wrap / .cm-input / .cm-field.

   DELIBERATELY NOT TRANSLATED
   1. The bundle's `@import` of Montserrat + Poppins from Google Fonts.
      header.php already loads both families (Montserrat 100..900, Poppins
      300..700) with preconnect, and an @import in the middle of a
      concatenated file is invalid CSS and would be dropped anyway.
   2. The reference's `.hero-work-stage / .hero-backdrop / .hero-product /
      .hero-client-screen / .project-mount / .browser-bar` group. That is the
      reference HOMEPAGE hero — it appears in none of the gallery's reference
      blocks, it is absent from the class map, and it depends on tokens
      (--color-brand, --gutter) and classes this theme does not have. Emitting
      its bare `.browser-bar` rule would also collide with the homepage's own
      .cm-browser-bar. It was swept into the reference dump only because
      "hero-work-stage" contains the substring "work".
   3. The bundle's two !important blocks. See REDUCED MOTION and the note on
      image transforms at the end of the PREFLIGHT section.

   THE BUNDLE HAS TWO PASSES. Every rule below is the FINAL computed intent,
   resolved per-property, not a replay of both passes. The second pass turns
   the cover and the story rows into SINGLE-column layouts with the media
   first; every rule it superseded is called out where it mattered so nobody
   "restores" a two-column grid that the approved design does not have.

   ACCESSIBILITY. Five colour values differ from the reference. Each one was
   measured — relative luminance on linearised channels, ratio
   (L_lighter + .05) / (L_darker + .05) — and each carries its before/after
   ratio in a comment. Nothing else was touched.
   =========================================================================== */


/* ===========================================================================
   PREFLIGHT
   ---------------------------------------------------------------------------
   The reference was built on a bundle with a Tailwind preflight. We are not,
   and six of our legacy element-level rules land inside this page:

     style.css  `p { margin-bottom: 35px }`          (+ 30px/20px variants)
     style.css  `h3 { padding-bottom: 27px;
                       margin-bottom: 35px }`        — 62px of dead space
                                                       under every card title
     style.css        `h3, .h3 { line-height: 1.18 }`  — and
     cosmick-modern.css `h1…h6 { line-height: 1.2 }`   — the 2019 display
                                                       numbers, where the
                                                       reference inherits 1.65
     style.css  `sup { position: relative; top: -.5em }`
     no sheet resets `list-style`, and <button> keeps its UA border,
     padding and background.

   cosmick-2026.css DOES reset heading margins, but as an enumerated LIST of
   its own component classes (.cm-h-section, .cm-pcard-title, …). That list
   cannot know about .cm-wk-*, so these resets have to be made here.

   Specificity is deliberate throughout this block: `:where()` contributes
   zero, so `.cm-wk :where(p)` is (0,1,0) — enough to beat an element-level
   `p` at (0,0,1), and low enough that every component rule further down wins
   without needing to be written defensively. Keep this section FIRST.
   =========================================================================== */

/* From the reference. This one needs real specificity: it has to beat
   cosmick-2026.css's `h1, h2, h3, h4, h5 { color: var(--cm26-ink) }` at
   (0,0,1), so the headings on the dark bands inherit cream instead of ink. */
.cm-wk :is(h1, h2, h3) { color: inherit; }

.cm-wk :where(p) { margin: 0; }

/*
 * line-height belongs HERE rather than on the individual title rules, and it
 * closes the leak cosmick-2026.css:2905 documents by name: cosmick-modern.css
 * `h1, h2, h3, h4, h5, h6 { line-height: 1.2 }` and style.css
 * `h3, .h3 { line-height: 1.18 }` are both (0,0,1), so any title on this page
 * that states no value of its own silently takes a 2019 display number. The
 * reference styles exactly three of its titles with font-size and weight only
 * — .work-selected-intro h2, .work-industry-link h3, .work-empty h3 — and
 * lets them inherit its `body { line-height: 1.65 }`. 1.65 here reproduces
 * that, and matches the value cosmick-2026.css settled on for the same leak.
 *
 * cosmick-2026.css had to spell its fix as an enumerated list of class names
 * because its blanket heading reset sits LATER in that file at the same
 * (0,1,0) as the display titles it would have flattened. A blanket is safe
 * here: this block is FIRST, and every title rule below is a descendant
 * selector at (0,1,1), so the seven that set a tighter value of their own
 * (1.01 / 1.07 / 1.1 / 1.14 / 1.25, plus the 767px 1.02 and 1.15) still win.
 * The payoff is that a heading added to this page later lands on the
 * reference's 1.65 by default instead of on 1.2 — which is the "one list or
 * the other, never neither" convention, with the default made the safe one.
 */
.cm-wk :where(h1, h2, h3) {
	margin: 0;
	padding: 0;
	line-height: 1.65;
}

.cm-wk :where(ol, ul) {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* <figure> is already `margin: 0` site-wide (style.css re-zeroes Bootstrap's
   `figure { margin: 0 0 1rem }`), so .cm-wk-browser and .cm-wk-phone-group
   need nothing here. */

/*
 * EXEMPTS THE SITE'S OWN BUTTON COMPONENT — this reset is not allowed to
 * strip .cm-btn.
 *
 * The filter panel's Apply control is <button class="cm-btn cm-btn-primary
 * cm-wk-apply">, deliberately: it is the site's primary button, 48px tall so
 * it lines up with Reset. But .cm-btn and .cm-btn-primary are (0,1,0) in
 * cosmick-2026.css, this block is (0,1,0) too, and header.php loads
 * cm-interior.css AFTER cosmick-2026.css — so without the :not() below the
 * reset won the tie on source order and took Apply's `padding: 0 22px`,
 * `border: 1.5px solid transparent`, brand fill and on-brand text with it.
 * Only `.cm-btn-primary:hover:not(:disabled)` at (0,2,0) survived, so the fill
 * appeared on hover alone and the one control a JS-off visitor must press to
 * filter read as a line of dark text.
 *
 * The :not() is INSIDE :where(), which replaces the specificity of its whole
 * argument with zero — so this stays (0,1,0) and .cm-wk-inquiry (a real
 * <button>) and the inert .cm-wk-reset <button>, both (0,1,0) and both later
 * in this file, keep beating it. Written `:where(button):not(…)` it would be
 * (0,2,0) and would strip .cm-wk-inquiry's coral fill instead.
 */
.cm-wk :where(button:not([class*="cm-btn"])) {
	appearance: none;
	padding: 0;
	border: 0;
	background: none;
	color: inherit;
	text-align: inherit;
}

/* style.css stacks `position: relative; top: -.5em` on every <sup>, on top of
   the reference's own `vertical-align: super`. Two lifting mechanisms put the
   project count a full line above the heading it belongs to; this leaves
   vertical-align as the only one.

   `line-height` is NOT reset here, on purpose. style.css:302 is Bootstrap
   reboot's `sub, sup { line-height: 0 }` — the same modern-normalize rule the
   reference's own Tailwind preflight carries, so it is not a leak and there is
   nothing to close. It is also load-bearing: the collection <sup> is 15px
   inside a clamp(34px, 4.6vw, 62px) heading at line-height 1.1, and a zero
   line box is what stops a raised superscript from growing the heading's line
   box. Giving it `normal` would deviate from the reference AND reintroduce
   exactly the inflation the zero exists to prevent. */
.cm-wk :where(sup) {
	position: static;
	top: auto;
}

/*
 * NO IMAGE TRANSFORM OVERRIDE IS NEEDED.
 * The reference hard-disables image transforms inside the gallery with
 * `transform: none !important; transition: none !important`. Our house rule
 * forbids new !important, and here it costs nothing: the only two rules in
 * the entire stylesheet stack that scale an image are
 * `.cm-group:hover .cm-media-frame img` and `.cm-leader:hover .cm-leader-img`
 * in cosmick-2026.css, and neither .cm-group, .cm-media-frame nor
 * .cm-leader-img appears anywhere in this page's markup. So no transform can
 * reach a gallery image, and the way to keep it that way is simply to never
 * write one on these images — which this file does not.
 */


/* ===========================================================================
   ROOT + PALETTE
   ---------------------------------------------------------------------------
   Every colour this page uses is declared here, on .cm-wk rather than :root,
   so the palette is scoped to the page and cannot leak into the rest of the
   site. Ratios in the comments are measured, not estimated.
   =========================================================================== */

.cm-wk {
	/* ---- the five from the reference's .work-gallery ---- */
	--wk-cream: #f6f0e9;
	--wk-coral: #ff7868;
	--wk-ink:   #292725;
	--wk-muted: #695f58;   /* 5.49:1 on cream */
	--wk-rule:  #d5c7ba;   /* decorative hairline — 1.4.11 does not apply */

	/* Deep red: focus rings, the collection <sup>, the caption bar.
	   6.18:1 on cream, 5.32:1 on the filter panel, 5.27:1 on the industry
	   band, 5.28:1 on the default device paper. */
	--wk-deep: #a13228;

	/* ---- device papers, one per context (see DEVICE SHOWCASE) ---- */
	--wk-paper:       #eaded0;
	--wk-paper-cover: #f0b6a5;
	--wk-paper-alt:   #cbd0c8;

	/* ---- text on the dark bands ---- */
	--wk-intro:  #d6ccc2;  /* cover intro        — 9.41:1 on ink */
	--wk-dim:    #c9bfb5;  /* breadcrumb, cover foot, selected intro — 8.22:1 on ink */
	--wk-finale: #d5c9be;  /* finale copy        — 9.16:1 on ink */
	--wk-story:  #ded3c9;  /* story body copy    — 8.63:1 on --wk-story-bg */

	/* ---- surfaces ---- */
	--wk-story-bg:    #36322f;  /* story row ground */
	--wk-art:         #e5d9cc;  /* story art ground */
	--wk-art-alt:     #c6cbc6;  /* --alt story art ground */
	--wk-industry:    #e8ded3;  /* industry band */
	--wk-industry-fg: #594f48;  /* industry body copy — 6.00:1 on the band */
	--wk-panel:       #e9dfd4;  /* filter panel */
	--wk-field:       #fbf6ef;  /* filter input ground */
	--wk-reset-hover: #d8c7b7;  /* reset control, hovered */
	--wk-browser:     #ece4da;  /* browser frame body */
	--wk-frame:       #b7a797;  /* browser frame edge — 1.76:1, decorative */
	--wk-browser-bar: #f3ece3;  /* browser frame caption bar (device showcase) */
	--wk-dots:        #9c8c80;  /* decorative window dots, aria-hidden */
	--wk-ph:          #e5d7c9;  /* image placeholder ground */
	--wk-phone:       #302d2b;  /* phone body */
	--wk-phone-ring:  #74695e;  /* phone's 1px outline shadow */
	--wk-screen:      #d9cfc3;  /* phone screen, behind the image */

	/* ---- card art rotation (.cm-wk-card:nth-child(4n+2 / 4n+3)) ---- */
	--wk-art-1: #e5d8cb;
	--wk-art-2: #d7dcd6;
	--wk-art-3: #d9c3b5;

	/*
	 * OURS, NOT THE REFERENCE'S — two corrected values, both measured.
	 *
	 * --wk-edge replaces the reference's rgb(161,139,120) on the reset
	 * control and rgb(185,168,153) on the filter inputs. Those are the only
	 * boundary each control has, which is exactly what SC 1.4.11 asks about,
	 * and they measured 2.46:1 / 2.14:1. One colour now serves both, chosen
	 * to clear 3:1 against all three fills it ever sits on: the filter panel
	 * (4.18:1), the input ground (5.12:1) and the reset's hover fill
	 * (3.35:1) — the hover fill is the tight one, and the reference's value
	 * failed it worst there, at 1.97:1.
	 *
	 * --wk-caption replaces rgb(102,89,78) on the desktop capture's meta
	 * line. That line is 10px body text printed on whichever device paper
	 * its context sets, and the reference value failed on two of the three:
	 * 3.85:1 on the cover's #f0b6a5 and 4.32:1 on the --alt story's #cbd0c8.
	 * This value is the same hue 24% darker and clears 4.5:1 on all three —
	 * 6.30:1 default, 4.74:1 cover, 5.32:1 alt.
	 */
	--wk-edge:    #7a6554;
	--wk-caption: #574c42;

	background: var(--wk-cream);
	color: var(--wk-ink);
}

/* This page is WIDER than the site's 1240px container. Scoped to .cm-wk so no
   other template inherits it; (0,2,0) beats .cm-wrap's (0,1,0) regardless of
   which file lands last. */
.cm-wk .cm-wrap { max-width: 1440px; }


/* ===========================================================================
   FOCUS
   ---------------------------------------------------------------------------
   The reference's treatment, kept: a 3px deep-red ring at 5px offset, with a
   coral variant on the dark bands. One correction, below.
   =========================================================================== */

.cm-wk :is(a, button, input, select):focus-visible {
	outline: 3px solid var(--wk-deep);
	outline-offset: 5px;
}

.cm-wk :is(.cm-wk-hero, .cm-wk-selected, .cm-wk-finale) :is(a, button):focus-visible {
	outline-color: var(--wk-coral);
}

/*
 * CORRECTED. The two rules above are both the reference's, and together they
 * put an invisible focus ring on this page's most prominent link.
 *
 * .cm-wk-cover lives inside .cm-wk-hero, and its copy panel is painted CORAL
 * — so the coral variant resolved to coral-on-coral, 1.00:1. Falling back to
 * the base deep-red ring would not have rescued it either: that is 2.71:1 on
 * coral, still under the 3:1 SC 1.4.11 asks of a focus indicator. The same
 * applies wherever a device showcase sits inside a dark band: coral measures
 * 1.47:1 on the cover paper and 1.65:1 on the --alt story paper.
 *
 * Ink is the one ring colour that is unambiguous on all of them: 5.77:1 on
 * coral, 8.46:1 on #f0b6a5, 9.49:1 on #cbd0c8, 11.24:1 on #eaded0.
 *
 * Equal specificity to the coral rule above ((0,3,1) both), so this wins on
 * source order — it must stay AFTER it.
 */
.cm-wk :is(.cm-wk-cover, .cm-wk-story-art, .cm-wk-devices) :is(a, button):focus-visible {
	outline-color: var(--wk-ink);
}


/* ===========================================================================
   SHARED TYPE + SMALL PARTS
   =========================================================================== */

/* var(--font-display) in the reference. This theme's display face is
   --cm26-font-display (Montserrat); --font-display does not exist here and
   would have silently fallen back to the body face. */
.cm-wk-kicker,
.cm-wk-label {
	font-family: var(--cm26-font-display);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
}

.cm-wk-crumbs ol {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	font-size: 11px;
}

.cm-wk-crumbs a {
	text-decoration: underline;
	text-underline-offset: 4px;
}

.cm-wk-read {
	display: inline-flex;
	align-items: center;
	gap: 22px;
	min-height: 46px;
	margin-top: 28px;
	font-size: 12px;
	font-weight: 700;
}

.cm-wk-read svg {
	flex: none;   /* real link text runs longer than the reference's; without
	                 this the arrow is the thing that gives way */
	width: 20px;
	height: 20px;
}

.cm-wk .cm-wk-read:hover {
	text-decoration: underline;
	text-underline-offset: 6px;
}

.cm-wk-scope {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	font-size: 10px;
	font-weight: 600;
}

/* CORRECTED alpha: .36 -> .66. The border is the only boundary these chips
   have, and at .36 it composited to #b25b50 over coral — 1.81:1. At .66 it is
   #72433c, 3.15:1, which clears SC 1.4.11. (The chip TEXT was already fine at
   5.77:1; the chips are not interactive, but the contract asks for 3:1 on
   this boundary and 1.81:1 reads as no boundary at all on the coral panel.)
   Left as a literal rgba() rather than a relative-colour expression off
   --wk-ink: rgb(from …) support is too new for a theme with no build step. */
.cm-wk-scope span {
	padding: 7px 10px;
	border: 1px solid rgba(41, 39, 37, .66);
}

/* The browser frame. Shared by the cover, the story rows and the device
   showcase — .cm-wk-browser*, never .cm-browser-bar, which is the homepage's. */
.cm-wk-browser {
	width: 100%;
	background: var(--wk-browser);
	color: var(--wk-ink);
}

.cm-wk-browser-bar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 11px 16px;
	font-family: var(--cm26-font-display);
	font-size: 9px;
	font-weight: 600;
	letter-spacing: .03em;
}

.cm-wk-browser-dots { display: flex; gap: 4px; }

.cm-wk-browser-dots i {
	display: block;
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: var(--wk-dots);
}

/* The .cm-wk prefix is the reference's and it is load-bearing: cosmick-modern
   .css sets `img { height: auto; display: block }` at (0,0,1), and the
   object-fit rules below only work against an explicit height. (0,2,1) clears
   it with room to spare. Same reason on the card art and the phone screen. */
.cm-wk .cm-wk-browser img {
	display: block;
	width: 100%;
	height: auto;
	object-fit: contain;
}

/* Shown instead of an <img> when a project has no usable screenshot. */
.cm-wk-ph {
	display: grid;
	place-items: center;
	min-height: 220px;
	padding: 28px;
	background: var(--wk-ph);
	color: var(--wk-ink);
	font-family: var(--cm26-font-display);
	font-size: 24px;
	font-weight: 700;
	text-align: center;
}


/* ===========================================================================
   HERO  —  .cm-wk-hero
   =========================================================================== */

.cm-wk-hero {
	padding-block: 25px 0;
	background: var(--wk-ink);
	color: var(--wk-cream);
}

.cm-wk-hero .cm-wk-crumbs {
	margin-bottom: 52px;
	color: var(--wk-dim);
}

.cm-wk-cover-heading {
	display: flex;
	align-items: end;
	justify-content: space-between;
	gap: 40px;
	padding-bottom: 38px;
}

.cm-wk-cover-heading h1 {
	max-width: 12ch;
	margin-top: 22px;
	font-size: clamp(44px, 6.6vw, 92px);
	font-weight: 800;
	line-height: 1.01;
	letter-spacing: -.065em;
}

/* Large text, so 3:1 is the bar — coral on ink is 5.77:1. */
.cm-wk-cover-heading h1 span { color: var(--wk-coral); }

.cm-wk-cover-intro {
	max-width: 33ch;
	padding-bottom: 4px;
}

.cm-wk-cover-intro p {
	font-size: 14px;
	line-height: 1.9;
	color: var(--wk-intro);   /* 9.41:1 on ink — the reference value passes */
}

.cm-wk-explore {
	display: inline-flex;
	align-items: center;
	gap: 15px;
	min-height: 44px;
	margin-top: 25px;
	font-size: 12px;
	font-weight: 600;
}

.cm-wk-explore svg {
	flex: none;
	width: 22px;
	height: 22px;
	color: var(--wk-coral);
}

/*
 * THE SPOTLIGHT COVER — SINGLE COLUMN, MEDIA FIRST.
 * The bundle's first pass made this `grid-template-columns: .72fr 1.5fr` (and
 * .9fr 1.2fr under 1000px). Its second pass overrides both with `1fr`, at the
 * same specificity and later in the file, so one column is the approved
 * design at EVERY width. Do not restore the two-column rules: the copy block
 * below carries the two-column treatment now, and the screenshot is meant to
 * run the full width above it.
 */
.cm-wk-cover {
	position: relative;
	display: grid;
	grid-template-columns: 1fr;
	background: var(--wk-coral);
	color: var(--wk-ink);
}

/* The copy panel is itself the two-column grid, placed by grid-area: the
   label and headline stack in column 1, the paragraph / scope chips / link in
   column 2. (Superseded first pass: flex column with a clamp(24px,3.6vw,52px)
   pad.) */
.cm-wk-cover-copy {
	display: grid;
	grid-template-columns: 1fr 1fr;
	column-gap: 9%;
	align-items: start;
	padding: clamp(28px, 4vw, 56px);
}

/* line-height is folded in from the reference's generic `.work-cover-copy > p`
   rule, which the two rules below supersede for the body paragraph but not for
   the label — the label is a direct child <p> too. Same value, one less rule. */
.cm-wk-cover-copy .cm-wk-label {
	grid-column: 1;
	margin: 0 0 18px;
	font-size: 10px;
	line-height: 1.85;
	letter-spacing: .07em;
}

.cm-wk-cover-copy h2 {
	grid-area: 2 / 1 / 5;
	margin: 0;
	font-size: clamp(34px, 4vw, 57px);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -.05em;
}

.cm-wk-cover-copy > p:not(.cm-wk-label) {
	grid-area: 1 / 2 / 3;
	margin: 0 0 24px;
	font-size: 15px;
	line-height: 1.85;
}

.cm-wk-cover-copy .cm-wk-scope,
.cm-wk-cover-copy .cm-wk-read { grid-column: 2; }

.cm-wk-cover .cm-wk-read {
	margin-top: 8px;
	padding-top: 12px;
}

/* order:-1 is what puts the screenshot above the copy. The first pass's flex
   centring, 30px padding and 430px min-height (>=1100px) are all superseded;
   min-width:0 survives from it and is kept — it is what lets a wide capture
   shrink inside the grid column instead of forcing the page to scroll. */
.cm-wk-cover-media {
	display: block;
	order: -1;
	min-width: 0;
}

.cm-wk-cover-foot {
	display: flex;
	justify-content: space-between;
	gap: 20px;
	padding-block: 19px;
	font-size: 10px;
	color: var(--wk-dim);   /* 8.22:1 on ink — the reference value passes */
}


/* ===========================================================================
   SELECTED WORK  —  .cm-wk-selected
   =========================================================================== */

.cm-wk-selected {
	padding-block: 62px 80px;
	background: var(--wk-ink);
	color: var(--wk-cream);
}

.cm-wk-selected-intro {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 24px;
	margin-bottom: 38px;
}

.cm-wk-selected-intro h2 {
	font-size: clamp(25px, 3.4vw, 43px);
	font-weight: 700;
	letter-spacing: -.045em;
}

.cm-wk-selected-intro p {
	font-size: 12px;
	color: var(--wk-dim);   /* 8.22:1 on ink */
}

/* Same supersession as the cover: the first pass had 1.35fr/1fr (and 1fr/
   1.35fr for the --alt modifier). Both are overridden to one column later in
   the bundle, so a story row is art-then-copy stacked at every width, and
   .cm-wk-story-copy carries the two-column treatment instead. */
.cm-wk-story {
	display: grid;
	grid-template-columns: 1fr;
	margin-top: 46px;
	background: var(--wk-story-bg);
}

/*
 * The art cell is now a bare wrapper: the second pass zeroes its padding and
 * its 440px min-height (>=1100px), and resets the --alt modifier's `order: 2`
 * back to 0 — so the art no longer swaps sides, and the device showcase
 * inside it bleeds to the full width of the row. The grounds are kept because
 * they are what shows while the screenshots are still loading.
 */
.cm-wk-story-art {
	display: flex;
	align-items: center;
	min-width: 0;
	padding: 0;
	order: 0;
	background: var(--wk-art);
}

.cm-wk-story--alt .cm-wk-story-art { background: var(--wk-art-alt); }

.cm-wk-story-copy {
	display: grid;
	grid-template-columns: 1fr 1fr;
	column-gap: 9%;
	padding: clamp(28px, 4vw, 56px);
}

/*
 * This generic rule is mostly superseded — the :not(.cm-wk-label) rule below
 * takes the body paragraph's margin and size, and .cm-wk-label takes the
 * label's. What still lands from it: the body copy's COLOUR and line-height,
 * and the label's 13px size (the label has no size override of its own in a
 * story row, unlike in the cover). Keep all three.
 */
.cm-wk-story-copy > p {
	font-size: 13px;
	line-height: 1.85;
	color: var(--wk-story);   /* 8.63:1 on the story ground */
}

/* Coral at 13px on #36322f is 4.92:1 — above 4.5:1, so this stands. */
.cm-wk-story-copy .cm-wk-label {
	grid-column: 1;
	margin: 0;
	color: var(--wk-coral);
}

/* margin-top survives the second pass here (unlike the cover's h2, which is
   explicitly zeroed) — the reference keeps 21px above a story headline. */
.cm-wk-story-copy h3 {
	grid-area: 2 / 1 / 5;
	margin-top: 21px;
	font-size: clamp(32px, 4vw, 52px);
	font-weight: 700;
	line-height: 1.14;
	letter-spacing: -.045em;
}

.cm-wk-story-copy > p:not(.cm-wk-label) {
	grid-area: 1 / 2 / 3;
	margin: 0;
	font-size: 14px;
}

.cm-wk-story-copy .cm-wk-deliverables,
.cm-wk-story-copy .cm-wk-read { grid-column: 2; }

.cm-wk-story .cm-wk-read { color: var(--wk-coral); }   /* 4.92:1 at 12px/700 */

.cm-wk-deliverables {
	display: grid;
	gap: 13px;
	margin-top: 24px;
}

.cm-wk-deliverables li {
	display: grid;
	grid-template-columns: 18px 1fr;
	gap: 10px;
	font-size: 12px;
	line-height: 1.75;
}

.cm-wk-deliverables svg {
	width: 15px;
	height: 15px;
	margin-top: 3px;
	color: var(--wk-coral);   /* icon — 4.92:1, over the 3:1 of SC 1.4.11 */
}

/*
 * .cm-wk-story--alt has NO declarations of its own. Its one surviving job in
 * the approved design is the paper swap on the device showcase it contains
 * (see DEVICE SHOWCASE); the first pass's column flip and art reorder are
 * both superseded. The modifier is still worth emitting in the markup — it is
 * what selects the paper — but there is nothing to style on the container.
 */


/* ===========================================================================
   INDUSTRY LINKS  —  .cm-wk-industry
   =========================================================================== */

.cm-wk-industry {
	padding-block: 72px;
	background: var(--wk-industry);
}

.cm-wk-industry-head {
	display: grid;
	grid-template-columns: 1fr 1fr;
	align-items: end;
	gap: 40px;
	margin-bottom: 35px;
}

.cm-wk-industry h2 {
	max-width: 18ch;
	margin-top: 18px;
	font-size: clamp(30px, 4vw, 50px);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -.05em;
}

.cm-wk-industry-head > p {
	max-width: 47ch;
	font-size: 14px;
	line-height: 1.9;
	color: var(--wk-industry-fg);   /* 6.00:1 on the band — passes */
}

.cm-wk-industry-list {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 30px;
}

.cm-wk-industry-link {
	display: grid;
	grid-template-columns: 1fr 24px;
	gap: 15px;
	padding-top: 22px;
	border-top: 2px solid var(--wk-ink);
}

.cm-wk-industry-link h3 {
	font-size: 22px;
	font-weight: 700;
	letter-spacing: -.03em;
}

.cm-wk-industry-link p {
	max-width: 50ch;
	margin-top: 10px;
	font-size: 12px;
	line-height: 1.85;
	color: var(--wk-industry-fg);   /* 6.00:1 */
}

.cm-wk-industry-link > svg {
	width: 22px;
	height: 22px;
}


/* ===========================================================================
   THE COLLECTION  —  .cm-wk-collection
   =========================================================================== */

.cm-wk-collection {
	padding-block: 78px;
	scroll-margin-top: 100px;   /* target of the hero's "Explore all N" jump */
}

.cm-wk-collection-heading {
	display: flex;
	align-items: end;
	justify-content: space-between;
	gap: 25px;
	margin-bottom: 30px;
}

.cm-wk-collection-heading h2 {
	margin-top: 17px;
	font-size: clamp(34px, 4.6vw, 62px);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -.055em;
}

.cm-wk-collection-heading sup {
	margin-left: 10px;
	font-size: 15px;
	vertical-align: super;
	letter-spacing: 0;
	color: var(--wk-deep);   /* 6.18:1 on cream — passes */
}

.cm-wk-collection-note {
	max-width: 30ch;
	font-size: 12px;
	line-height: 1.8;
	color: var(--wk-muted);   /* 5.49:1 on cream — passes */
}

/* ---------------------------------------------------------------------------
   FILTER PANEL
   Four cells: search, detail select, year select, reset. The controls are the
   theme's .cm-field / .cm-input primitives, re-skinned to the reference's
   square, warmer treatment.
   -------------------------------------------------------------------------- */

.cm-wk-filters {
	display: grid;
	grid-template-columns: 1.6fr 1fr .7fr auto;
	align-items: end;
	gap: 18px;
	padding: 25px;
	background: var(--wk-panel);
}

.cm-wk-filters .cm-field { gap: 8px; }

.cm-wk-filters .cm-field label {
	font-size: 11px;
	font-weight: 700;
}

/*
 * background-COLOR, not the `background` shorthand the reference used: a
 * select on this page may also carry .cm-pf-select, whose affordance is a
 * background-image chevron, and the shorthand would have silently wiped it.
 *
 * border-color CORRECTED: the reference's rgb(185,168,153) is 2.14:1 against
 * the field ground and 1.75:1 against the panel behind it. A field's border
 * is the only thing that says "there is an input here", which is what SC
 * 1.4.11 covers. --wk-edge is 5.12:1 and 4.18:1. Width and style stay the
 * theme's 1.5px solid.
 */
.cm-wk-filters .cm-input {
	min-height: 48px;
	border-radius: 0;
	border-color: var(--wk-edge);
	background-color: var(--wk-field);
	font-size: 13px;
}

/*
 * THE SELECTS NEED A DRAWN CHEVRON. The reference keeps the native one, but
 * this theme cannot: style.css:11300 carries `select { -webkit-appearance:
 * none; -moz-appearance: none }` plus `select::-ms-expand { display: none }`
 * at (0,0,1), so the UA arrow is already gone site-wide. The theme's one
 * replacement is .cm-pf-select's background-image chevron, and the gallery's
 * two selects (#cm-wk-show, #cm-wk-year) carry .cm-input only — so without
 * this rule "Project detail" and "Published" render as plain bordered boxes
 * with nothing to say they open a list.
 *
 * Same mechanism as .cm-pf-select (cm-interior.css:476), re-stroked in this
 * page's own --wk-edge instead of --cm26-stone's #6b6460. The hex has to be
 * literal: a data: URI cannot read a custom property. Keep it in sync with
 * --wk-edge — 5.12:1 on the field ground, well over the 3:1 SC 1.4.11 asks of
 * a control's affordance.
 *
 * Longhands, never the `background` shorthand: --wk-field above is set as
 * background-color precisely so the two compose instead of wiping each other.
 */
.cm-wk-filters select.cm-input {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 38px;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%237a6554' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 12px center;
}

.cm-wk-search { position: relative; }

.cm-wk-search svg {
	position: absolute;
	top: 16px;          /* (48px field - 16px icon) / 2 */
	left: 13px;
	width: 16px;
	height: 16px;
	pointer-events: none;
}

.cm-wk-search .cm-input { padding-left: 39px; }

/* A real link back to the unfiltered URL, so it works with JS off. A link
   cannot match :disabled, so the inactive state below also keys off
   aria-disabled="true" — that is the only way to render the reference's
   greyed-out reset without JavaScript. */
.cm-wk-reset {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 7px;
	min-height: 48px;
	padding-inline: 15px;
	border: 1px solid var(--wk-edge);   /* CORRECTED, see --wk-edge */
	font-size: 12px;
	font-weight: 600;
	cursor: pointer;
}

.cm-wk-reset svg {
	flex: none;
	width: 14px;
	height: 14px;
}

/* The label composites to 2.85:1 on the panel at half opacity. Left as the
   reference has it: SC 1.4.3 places no contrast requirement on an inactive
   user-interface component, and dimming is what signals the state. */
.cm-wk-reset:disabled,
.cm-wk-reset[aria-disabled="true"] {
	opacity: .5;
	cursor: not-allowed;
}

.cm-wk-reset:not(:disabled):not([aria-disabled="true"]):hover {
	background-color: var(--wk-reset-hover);
}

.cm-wk-results {
	display: flex;
	justify-content: space-between;
	gap: 16px;
	padding-block: 23px 30px;
	font-size: 11px;
	color: var(--wk-muted);   /* 5.49:1 on cream — passes */
}

.cm-wk-results > span {
	font-size: 10px;
	letter-spacing: .08em;
	text-transform: uppercase;
}

/* ---------------------------------------------------------------------------
   PROJECT GRID
   -------------------------------------------------------------------------- */

.cm-wk-grid {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 42px 32px;
}

.cm-wk-card {
	min-width: 0;
	padding-bottom: 25px;
	/* 1.46:1 on cream. Measured and deliberately left: a separator under a
	   card is decoration, and the card is identified by its art and title,
	   not by this line — SC 1.4.11 exempts it. */
	border-bottom: 1px solid var(--wk-rule);
}

.cm-wk-card-link { display: block; }

.cm-wk-card-art {
	display: grid;
	place-items: center;
	aspect-ratio: 1.85 / 1;
	padding: 22px;
	overflow: hidden;
	background: var(--wk-art-1);
}

/* The reference tints every second and third card of each run of four, so a
   long grid does not read as one flat colour. nth-child counts GRID children,
   so .cm-wk-grid must contain nothing but cards or the rotation shifts. */
.cm-wk-card:nth-child(4n+2) .cm-wk-card-art { background: var(--wk-art-2); }
.cm-wk-card:nth-child(4n+3) .cm-wk-card-art { background: var(--wk-art-3); }

.cm-wk .cm-wk-card-art img {
	width: 100%;
	height: 100%;
	max-height: 100%;
	object-fit: contain;
}

.cm-wk-card-art .cm-wk-ph {
	min-height: 0;
	font-size: 22px;
}

.cm-wk-card-topline {
	display: flex;
	justify-content: space-between;
	gap: 14px;
	padding-block: 17px 9px;
	font-size: 9px;
	font-weight: 600;
	letter-spacing: .07em;
	text-transform: uppercase;
	color: var(--wk-muted);   /* 5.49:1 on cream — passes */
}

.cm-wk-card-title {
	display: flex;
	align-items: start;
	justify-content: space-between;
	gap: 15px;
}

.cm-wk-card h3 {
	font-size: clamp(19px, 2vw, 25px);
	font-weight: 700;
	line-height: 1.25;
	letter-spacing: -.035em;
}

.cm-wk-card-arrow {
	display: grid;
	place-items: center;
	flex-shrink: 0;
	width: 30px;
	height: 30px;
	background: var(--wk-ink);
	color: var(--wk-cream);
}

.cm-wk-card-arrow svg {
	width: 16px;
	height: 16px;
}

.cm-wk a:hover .cm-wk-card-arrow { background: var(--wk-deep); }

.cm-wk-card-copy {
	max-width: 64ch;
	margin-top: 12px;
	font-size: 12px;
	line-height: 1.8;
	color: var(--wk-muted);   /* 5.49:1 on cream — passes */
}

.cm-wk-empty {
	padding: 70px 25px;
	border: 1px solid var(--wk-rule);   /* decorative frame, see .cm-wk-card */
	text-align: center;
}

.cm-wk-empty > svg { margin: 0 auto 20px; }

.cm-wk-empty h3 {
	font-size: 25px;
	font-weight: 700;
}

.cm-wk-empty p {
	margin-block: 12px 22px;
	font-size: 14px;
}

/* The reference's pagination is this theme's .cm-pagination, which already
   matches it (48px top margin, 40px rounded cells). Only the extra 30px of
   inner lead is ours to add. */
.cm-wk .cm-pagination { padding-top: 30px; }


/* ===========================================================================
   FINALE  —  .cm-wk-finale
   The button is <button data-open-get-started>, which opens the ONE shared
   Get Started modal in footer.php. There is no form in this section.
   =========================================================================== */

.cm-wk-finale {
	padding-block: 68px;
	background: var(--wk-ink);
	color: var(--wk-cream);
}

.cm-wk-finale-inner {
	display: grid;
	grid-template-columns: 1.3fr 1fr;
	align-items: end;
	gap: 50px;
}

.cm-wk-finale .cm-wk-kicker { color: var(--wk-coral); }   /* 5.77:1 at 11px */

.cm-wk-finale h2 {
	margin-top: 23px;
	font-size: clamp(34px, 5vw, 67px);
	font-weight: 800;
	line-height: 1.07;
	letter-spacing: -.055em;
}

.cm-wk-finale h2 span { color: var(--wk-coral); }   /* large text — 5.77:1 */

.cm-wk-finale p {
	max-width: 39ch;
	margin-bottom: 26px;
	font-size: 14px;
	line-height: 1.85;
	color: var(--wk-finale);   /* 9.16:1 on ink — passes */
}

.cm-wk-inquiry {
	display: inline-flex;
	align-items: center;
	justify-content: space-between;
	gap: 44px;
	min-height: 54px;
	padding: 15px 24px;
	background: var(--wk-coral);
	color: var(--wk-ink);   /* 5.77:1 */
	font-size: 13px;
	font-weight: 700;
	cursor: pointer;
}

.cm-wk-inquiry svg {
	flex: none;
	width: 21px;
	height: 21px;
}


/* ===========================================================================
   DEVICE SHOWCASE  —  .cm-wk-devices
   ---------------------------------------------------------------------------
   The phone-plus-browser composition the cover and every story row render.
   Its ground is a per-context custom property, --device-paper; the partial
   may also set it inline as style="--device-paper:#rrggbb", which is the one
   inline style this page allows.
   =========================================================================== */

.cm-wk-devices {
	--device-paper: var(--wk-paper);

	position: relative;
	isolation: isolate;   /* keeps the ::before circle's z-index:-1 inside this
	                         box instead of sliding under the section ground */
	width: 100%;
	padding: clamp(20px, 4vw, 58px);
	background: var(--device-paper);
	color: var(--wk-ink);
	overflow: hidden;
}

/*
 * Per-context paper. Three grounds, one place.
 *
 * The cover instance also carries a WIDER inline pad than the base rule's
 * clamp(20px, 4vw, 58px) — that is the reference's
 * `.work-cover-media .work-device-showcase { padding-inline: clamp(22px, 5vw,
 * 72px) }`, and ref-geometry.json measures it on the cover showcase as
 * 57.6px 72px at 1440 and 30.72px 38.4px at 768. Without it the showcase runs
 * 14.4px wider per side at 1440, which pushes the phone/browser track pair
 * from the approved 1216px to 1244.8px. The 767px block restates `padding`
 * for this same selector, so mobile still collapses to 20px 16px 24px.
 */
.cm-wk-cover-media .cm-wk-devices {
	--device-paper: var(--wk-paper-cover);
	padding-inline: clamp(22px, 5vw, 72px);
}

.cm-wk-story--alt .cm-wk-devices     { --device-paper: var(--wk-paper-alt); }

/* Oversized quarter-circle bleeding off the bottom-left. Decorative: 1.34:1
   against the paper, which SC 1.4.11 exempts. */
.cm-wk-devices::before {
	content: "";
	position: absolute;
	z-index: -1;
	bottom: -18%;
	left: -15%;
	width: 62%;
	aspect-ratio: 1 / 1;
	border: 1px solid rgba(41, 39, 37, .16);
	border-radius: 50%;
	pointer-events: none;
}

.cm-wk-devices-head {
	display: flex;
	justify-content: space-between;
	gap: 16px;
	padding-bottom: 18px;
	/* 1.54:1 — a decorative divider under a label, not a component boundary. */
	border-bottom: 1px solid rgba(41, 39, 37, .23);
	font-family: var(--cm26-font-display);
	font-size: 10px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
}

.cm-wk-devices-head span:last-child {
	font-weight: 500;
	letter-spacing: .03em;
	text-align: right;
}

.cm-wk-devices-grid {
	display: grid;
	grid-template-columns: minmax(0, .29fr) minmax(0, 1fr);
	align-items: start;
	gap: clamp(14px, 3vw, 42px);
	padding-block: clamp(24px, 4vw, 55px) 0;
}

/*
 * OURS, NOT THE REFERENCE'S.
 * When a project has no mobile screenshot the partial omits the phone
 * entirely and adds this modifier, so the desktop capture gets the full
 * width instead of leaving a 0.29fr column of empty paper. The reference
 * instead puts the DESKTOP screenshot inside the phone bezel and labels it
 * "mobile capture pending" — we do not, because a desktop capture in a phone
 * frame states something false about the work.
 *
 * (0,2,0) beats both the base rule above and its narrow-screen override at
 * the end of this file, so the collapse holds at every width.
 */
.cm-wk-devices--solo .cm-wk-devices-grid {
	grid-template-columns: minmax(0, 1fr);
}

.cm-wk-phone-group {
	min-width: 0;
	margin-top: clamp(30px, 6vw, 88px);
}

/* 1 / 2.05 is the reference's bezel ratio — close to a 390x844 phone viewport
   plus its frame. The ::before is the notch. */
.cm-wk-phone {
	position: relative;
	width: 100%;
	aspect-ratio: 1 / 2.05;
	padding: clamp(5px, .75vw, 10px);
	border-radius: clamp(19px, 3vw, 40px);
	background: var(--wk-phone);
	box-shadow:
		0 0 0 1px var(--wk-phone-ring),
		7px 16px rgba(41, 39, 37, .08),
		0 22px 35px -20px rgba(41, 39, 37, .38);
}

.cm-wk-phone::before {
	content: "";
	position: absolute;
	z-index: 1;
	top: 3%;
	left: 34%;
	width: 32%;
	height: 3%;
	border-radius: 20px;
	background: var(--wk-phone);
}

/* Its own radius, tighter than the bezel's, so the screen sits inside it. */
.cm-wk-phone-screen {
	width: 100%;
	height: 100%;
	overflow: hidden;
	border-radius: clamp(14px, 2.3vw, 31px);
	background: var(--wk-screen);
}

/* cover + top-anchored: a real phone capture is far taller than the bezel, so
   the crop has to keep the top of the page rather than centre the middle of
   it. The .cm-wk prefix is what beats `img { height: auto }` — see
   .cm-wk-browser img above. */
.cm-wk .cm-wk-phone-screen img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	object-position: 50% 0;
}

.cm-wk-phone-screen .cm-wk-ph {
	min-height: 100%;
	padding: 12px;
	font-size: 13px;
}

.cm-wk-phone-caption {
	display: block;
	max-width: 25ch;
	margin-top: 18px;
	font-size: 11px;
	font-weight: 600;
	line-height: 1.6;
}

/* Short deep-red rule above the caption. Decorative. */
.cm-wk-phone-caption::before {
	content: "";
	display: block;
	width: 26px;
	height: 3px;
	margin-bottom: 10px;
	background: var(--wk-deep);
}

.cm-wk-desktop { min-width: 0; }

.cm-wk-desktop .cm-wk-browser {
	overflow: hidden;
	border: 1px solid var(--wk-frame);
	border-radius: 9px 9px 0 0;
	box-shadow: 0 20px 28px -20px rgba(41, 39, 37, .35);
}

.cm-wk-desktop .cm-wk-browser-bar {
	padding: 12px 15px;
	background: var(--wk-browser-bar);
}

/* The meta line under the capture. CORRECTED colour — see --wk-caption: the
   reference's rgb(102,89,78) failed at 3.85:1 on the cover paper and 4.32:1
   on the --alt paper. */
.cm-wk-desktop > p {
	display: flex;
	justify-content: space-between;
	gap: 12px;
	margin-top: 15px;
	font-size: 10px;
	line-height: 1.5;
	color: var(--wk-caption);
}

.cm-wk-desktop > p span:first-child {
	font-weight: 700;
	color: var(--wk-ink);
}


/* ===========================================================================
   RESPONSIVE
   ---------------------------------------------------------------------------
   Two of the bundle's breakpoint blocks are almost entirely dead, because the
   second pass's unprefixed rules come later at the same specificity and a
   media query adds none:

     @media (min-width: 1100px)  — .work-story-art min-height:440px and
       .work-cover-media min-height:430px, both overridden to 0. The whole
       block is dead; nothing from it is emitted.
     @media (max-width: 1000px)  — the cover's .9fr/1.2fr columns, its h2
       margin-top and its media padding are all overridden. Only the scope
       chips survive.

   The 767px block below is the LIVE merge of the bundle's two narrow-screen
   batches. Where the later batch revised an earlier value the later one is
   used and the change is noted.
   =========================================================================== */

@media (max-width: 1000px) {
	/* The one surviving declaration from this breakpoint. */
	.cm-wk-scope { font-size: 9px; }
}

@media (max-width: 767px) {

	/* ---- hero ---- */

	.cm-wk-hero .cm-wk-crumbs { margin-bottom: 34px; }

	.cm-wk-cover-heading {
		display: block;
		padding-bottom: 35px;   /* second batch revised this from 30px */
	}

	.cm-wk-cover-heading h1 {
		max-width: 13ch;
		font-size: clamp(44px, 11.6vw, 76px);   /* revised from clamp(42px,10vw,68px) */
		line-height: 1.02;
	}

	.cm-wk-cover-intro {
		max-width: 44ch;
		margin-top: 24px;
	}

	.cm-wk-cover-intro p {
		font-size: 15px;        /* revised from 13px */
		line-height: 1.75;
	}

	/*
	 * .cm-wk-cover and .cm-wk-story are already one column at every width, so
	 * they are not repeated here. These four are not — they are two-column
	 * only above this breakpoint.
	 */
	.cm-wk-industry-head,
	.cm-wk-industry-list,
	.cm-wk-finale-inner,
	.cm-wk-grid { grid-template-columns: 1fr; }

	/* The copy panels drop their grid-area placement and simply stack. */
	.cm-wk-cover-copy,
	.cm-wk-story-copy {
		display: flex;
		flex-direction: column;
		padding: 30px 24px 34px;
	}

	.cm-wk-cover-copy h2 {
		max-width: 14ch;
		margin: 0 0 22px;
		font-size: clamp(34px, 9vw, 52px);
	}

	.cm-wk-cover-copy > p:not(.cm-wk-label) {
		margin: 0 0 22px;
		font-size: 14px;
	}

	.cm-wk-cover-copy .cm-wk-scope { font-size: 10px; }
	.cm-wk-cover-copy .cm-wk-read  { margin-top: 20px; }

	/* The first batch padded .cm-wk-cover-media by 0 18px 22px; the second
	   pass zeroes that padding, and the showcase's own narrow-screen padding
	   (below) takes over. So the capture bleeds to the article's full width
	   here — that is the approved behaviour, not an oversight. */

	.cm-wk-cover-foot {
		flex-direction: column;
		gap: 6px;
		font-size: 10px;        /* revised from 9px */
		line-height: 1.6;
	}

	.cm-wk-cover-foot span:last-child {
		max-width: none;        /* first batch had 21ch / right-aligned */
		text-align: left;
	}

	/* ---- selected work ---- */

	.cm-wk-selected { padding-block: 40px 46px; }

	.cm-wk-selected-intro {
		display: block;
		margin-bottom: 25px;
	}

	.cm-wk-selected-intro h2 {
		font-size: 32px;
		line-height: 1.15;
	}

	.cm-wk-selected-intro p { margin-top: 12px; }

	.cm-wk-story { margin-top: 30px; }   /* revised from 22px */

	/* .cm-wk-story-art's padding and the --alt art's order are already 0 at
	   every width; the first batch's 22px pad and order:0 are dead. */

	.cm-wk-story-copy h3 {
		max-width: 20ch;
		margin-block: 20px;
		font-size: clamp(31px, 8.2vw, 45px);
	}

	.cm-wk-story-copy > p:not(.cm-wk-label) {
		font-size: 14px;
		line-height: 1.85;
	}

	.cm-wk-deliverables li { font-size: 13px; }

	.cm-wk-read {
		gap: 14px;
		font-size: 13px;
	}

	/* ---- industry ---- */

	.cm-wk-industry { padding-block: 45px; }
	.cm-wk-industry-head { gap: 22px; }
	.cm-wk-industry-list { gap: 25px; }

	/* ---- collection ---- */

	.cm-wk-collection { padding-block: 48px; }
	.cm-wk-collection-heading { display: block; }

	.cm-wk-collection-note {
		max-width: 43ch;
		margin-top: 15px;
	}

	.cm-wk-filters {
		grid-template-columns: 1fr;
		gap: 17px;
		padding: 20px;
	}

	/*
	 * NOT the reference's 13px. .cm-input is 16px on purpose — iOS zooms the
	 * viewport when a text field under 16px takes focus, and this is the one
	 * field on the page a phone user types into. 13px is kept above this
	 * breakpoint, where no such zoom happens.
	 */
	.cm-wk-filters .cm-input { font-size: 16px; }

	.cm-wk-results > span { display: none; }

	.cm-wk-grid { gap: 32px; }
	.cm-wk-card-art { padding: 16px; }

	/* ---- finale ---- */

	.cm-wk-finale { padding-block: 45px; }
	.cm-wk-finale-inner { gap: 25px; }

	/* ---- device showcase ---- */

	.cm-wk-devices,
	.cm-wk-cover-media .cm-wk-devices { padding: 20px 16px 24px; }

	.cm-wk-devices-head {
		padding-bottom: 14px;
		font-size: 9px;
		letter-spacing: .08em;
	}

	.cm-wk-devices-head span:last-child { max-width: 15ch; }

	.cm-wk-devices-grid {
		grid-template-columns: minmax(0, .53fr) minmax(0, 1fr);
		gap: 12px;
		padding-top: 25px;
	}

	.cm-wk-phone-group { margin-top: 40px; }

	.cm-wk-phone {
		padding: 5px;
		border-radius: 22px;
	}

	.cm-wk-phone-screen { border-radius: 17px; }

	.cm-wk-phone-caption {
		margin-top: 14px;
		font-size: 10px;
		line-height: 1.55;
	}

	.cm-wk-desktop .cm-wk-browser-bar {
		gap: 4px;
		padding: 8px 6px;
		font-size: 6px;
		letter-spacing: 0;
	}

	.cm-wk-desktop .cm-wk-browser-dots { gap: 2px; }

	.cm-wk-desktop .cm-wk-browser-dots i {
		width: 3px;
		height: 3px;
	}

	.cm-wk-desktop > p {
		flex-direction: column;
		gap: 3px;
		margin-top: 10px;
		font-size: 9px;
	}
}


/* ===========================================================================
   REDUCED MOTION
   ---------------------------------------------------------------------------
   The reference kills every animation and transition inside the gallery. Kept
   — but without the reference's !important, which the house rules forbid.

   Two things make that safe. First, cosmick-tokens.css already enforces the
   same suppression site-wide, at `html, html *, html *::before, html *::after`
   WITH !important, so nothing escapes. Second, this scoped restatement still
   wins where it has to on its own merits: the one element-level offender that
   reaches this page is style.css's `a { transition: all .3s }` at (0,0,1), and
   (0,1,0) beats it.

   So this block is the local, readable statement of intent for this page, and
   the global block is the belt. `scroll-behavior` is not restated: it applies
   to the scrolling element, not to descendants, and cosmick-tokens.css already
   pins `html { scroll-behavior: auto }` here.
   =========================================================================== */

@media (prefers-reduced-motion: reduce) {
	.cm-wk *,
	.cm-wk *::before,
	.cm-wk *::after {
		animation-duration: .01ms;
		animation-delay: .01ms;
		animation-iteration-count: 1;
		transition-duration: .01ms;
		transition-delay: 0s;
	}
}


/* =========================================================================
   SOFTWARE
   ========================================================================= */

/* ===========================================================================
   SOFTWARE — archive-software.php + single-software.php
   ---------------------------------------------------------------------------
   Family prefix: .cm-prod-*  (product). Everything here is a rule the shared
   component layer in cosmick-2026.css genuinely cannot express; every other
   part of these two templates composes the existing cm- classes
   (.cm-wrap .cm-section .cm-band-* .cm-split .cm-card .cm-aside-card
   .cm-faq-* .cm-rev-* .cm-tag .cm-btn .cm-tlink .cm-media-frame .cm-prose).

   Append AFTER the SOFTWARE block of cosmick-2026.css. Two selectors here
   deliberately out-specify `.cm-media-frame img` (0,1,1) — see the note on
   .cm-prod-img.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   1. Product art is never cropped
   ---------------------------------------------------------------------------
   `.cm-media-frame img` sets `object-fit: cover; object-position: top center`,
   which is right for website screenshots and wrong for a product logo or a
   boxed product shot — it shaves the edges off the mark. These selectors are
   written at (0,2,1) and (0,1,1) so they beat that rule on specificity rather
   than relying on which sheet loads last, and the frame ground goes white
   because a contained image shows its own letterboxing.
   --------------------------------------------------------------------------- */
.cm-media-frame img.cm-prod-img,
img.cm-prod-img {
	width: 100%;
	height: 100%;
	object-fit: contain;
	object-position: center;
	background: #fff;
}

/* The 1.025 hover scale is a screenshot affordance. On a contained logo it
   pushes the mark into the frame's `overflow: hidden` edge, i.e. it crops it. */
.cm-group:hover .cm-media-frame img.cm-prod-img { transform: none; }

/* ---------------------------------------------------------------------------
   2. Auto-fitting card grid
   ---------------------------------------------------------------------------
   .cm-grid-3 / .cm-grid-4 are fixed column counts, so a product with a single
   screenshot, one testimonial or one award would render in a one-third column
   with two thirds of empty row beside it. These sections have a record count
   that varies per product, so they need a grid that fills the row it is given.
   --------------------------------------------------------------------------- */
.cm-prod-auto {
	display: grid;
	gap: 20px;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}

/* ---------------------------------------------------------------------------
   3. Software index — the split card  (/software/)
   ---------------------------------------------------------------------------
   Reference: `card card-link grid overflow-hidden sm:grid-cols-[0.9fr_1.1fr]`
   with a square media cell that becomes full-bleed-height at sm.
   --------------------------------------------------------------------------- */
.cm-prod-split {
	display: grid;
	overflow: hidden;
	color: inherit;
	text-decoration: none;
}

/* The reference's mobile media cell is a square. 4/3 is the one deliberate
   departure: `contain` letterboxes, so a 16:10 product screenshot in a square
   left ~160px of dead white on a phone. 4/3 still frames a square logo
   comfortably and nothing is cropped either way. */
.cm-prod-split-media {
	position: relative;
	margin: 12px;
	border-radius: 8px;
	aspect-ratio: 4 / 3;
	background: #fff;
}

@media (min-width: 640px) {
	.cm-prod-split { grid-template-columns: 0.9fr 1.1fr; }

	/*
	 * Hold the aspect ratio at desktop too, and sit at the TOP of the card
	 * rather than stretching to the body column's height.
	 *
	 * Stretching looked right in the abstract, but the images are `contain`ed,
	 * so a wide product screenshot in a tall stretched box left roughly half the
	 * media column as empty white — measured at 1280px. Sizing the box to the
	 * image's own shape removes the gap without cropping anything.
	 */
	.cm-prod-split-media {
		aspect-ratio: 16 / 10;
		align-self: start;
		margin-right: 0;
	}

	.cm-prod-split-media img.cm-prod-img { position: absolute; inset: 0; }
}

.cm-prod-body {
	display: flex;
	flex-direction: column;
	gap: 10px;
	padding: 24px;
}

.cm-prod-body > h2,
.cm-prod-body > h3 { margin: 0; }

.cm-prod-tagline {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 14.5px;
	font-weight: 600;
	color: var(--cm26-brand-ink);
}

.cm-prod-desc {
	margin: 0;
	font-size: 15.5px;
	line-height: 1.6;
	color: var(--cm26-body);
}

.cm-prod-tags {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
}

.cm-prod-from {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 700;
	color: var(--cm26-ink);
}

.cm-prod-more { margin-top: auto; padding-top: 6px; }

/* The card is one link, so the arrow is a span and has to be told to slide. */
.cm-prod-split:hover .cm-prod-more { text-decoration-color: currentColor; }
.cm-prod-split:hover .cm-prod-more .cm-arrow { transform: translateX(3px); }

/* ---------------------------------------------------------------------------
   4. Product detail — the page-head aside rail
   ---------------------------------------------------------------------------
   Reference: `rounded-[14px] border border-line bg-white p-3 shadow-card`
   wrapping a full-width image at radius 8. .cm-card supplies border, radius
   and shadow; the ground has to be pure white (not --cm26-card) and the pad
   and inner radius are this component's own.
   --------------------------------------------------------------------------- */
.cm-prod-shot {
	padding: 12px;
	background: #fff;
	overflow: hidden;
}

.cm-prod-shot img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 8px;
}

/* ---------------------------------------------------------------------------
   5. Label / value rows  (sidebar specs and support details)
   --------------------------------------------------------------------------- */
.cm-prod-specs {
	display: grid;
	margin: 0;
	font-size: 14.5px;
}

.cm-prod-specs > div {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 16px;
	padding-block: 9px;
	border-top: 1px solid var(--cm26-line);
}

.cm-prod-specs > div:first-child { padding-top: 0; border-top: 0; }

.cm-prod-specs dt { color: var(--cm26-stone); }

.cm-prod-specs dd {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-weight: 600;
	color: var(--cm26-ink);
	text-align: right;
	overflow-wrap: anywhere;
}

.cm-prod-specs dd a {
	color: var(--cm26-brand-ink);
	text-decoration: underline;
	text-underline-offset: 3px;
}

.cm-prod-specs dd a:hover { color: var(--cm26-brand-hover); }

/* Values with no break opportunity — an email address, a long URL label —
   get the full row width instead of being hyphen-broken mid-word. */
.cm-prod-specs--stack > div {
	display: block;
	padding-block: 10px;
}

.cm-prod-specs--stack dd {
	margin-top: 2px;
	text-align: left;
}

.cm-prod-aside-foot { margin-top: 16px; }
.cm-prod-aside-foot .cm-btn { width: 100%; }

/* ---------------------------------------------------------------------------
   6. Feature / award cards
   --------------------------------------------------------------------------- */
.cm-prod-feature {
	display: flex;
	flex-direction: column;
	gap: 12px;
	padding: 26px;
}

.cm-prod-feature h3 { margin: 0; }

.cm-prod-feature p {
	margin: 0;
	font-size: 15.5px;
	line-height: 1.6;
	color: var(--cm26-body);
}

.cm-prod-icon {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	border-radius: var(--cm26-radius-sm);
	background: var(--cm26-sand);
	color: var(--cm26-brand-ink);
	font-size: 18px;
	line-height: 1;
}

/* ---------------------------------------------------------------------------
   7. Gallery figures
   ---------------------------------------------------------------------------
   Capped tiles rather than .cm-prod-auto: a product with one screenshot would
   otherwise stretch a 1024px asset across the full 1240px measure. The track
   maximum keeps a single screenshot a readable tile and centres it; three or
   more still fill the row.
   --------------------------------------------------------------------------- */
.cm-prod-shots {
	display: grid;
	gap: 20px;
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 380px));
	justify-content: center;
}

.cm-prod-figure { margin: 0; }

.cm-prod-figcaption {
	margin: 8px 0 0;
	font-size: 13.5px;
	line-height: 1.45;
	color: var(--cm26-stone);
}

/* ---------------------------------------------------------------------------
   8. Demo video
   ---------------------------------------------------------------------------
   .cm-aspect-16-9 + .cm-media-frame only governs an <img>; an embed needs the
   frame itself to become the positioning context.
   --------------------------------------------------------------------------- */
.cm-prod-video {
	position: relative;
	aspect-ratio: 16 / 9;
	overflow: hidden;
	border-radius: var(--cm26-radius-card);
	background: #000;
}

/* The action row that follows a full-width band figure. */
.cm-prod-band-foot { margin-top: 28px; }

.cm-prod-video iframe,
.cm-prod-video video,
.cm-prod-video embed,
.cm-prod-video object {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	border: 0;
}

/* ---------------------------------------------------------------------------
   9. Pricing plans
   --------------------------------------------------------------------------- */
.cm-prod-plans {
	max-width: 960px;
	margin-inline: auto;
}

.cm-prod-plan {
	position: relative;
	display: flex;
	flex-direction: column;
	gap: 14px;
	padding: 28px;
}

.cm-prod-plan h3 { margin: 0; }

.cm-prod-plan.is-featured {
	border-color: var(--cm26-brand-ink);
	box-shadow: var(--cm26-shadow-pop);
}

.cm-prod-plan-badge {
	position: absolute;
	top: -11px;
	left: 28px;
	display: inline-flex;
	align-items: center;
	height: 22px;
	padding: 0 10px;
	border-radius: 99px;
	background: var(--cm26-brand-ink);
	color: var(--cm26-on-brand);
	font-family: var(--cm26-font-display);
	font-size: 11.5px;
	font-weight: 700;
	letter-spacing: .08em;
	text-transform: uppercase;
}

.cm-prod-price {
	display: flex;
	align-items: baseline;
	gap: 4px;
	font-family: var(--cm26-font-display);
	color: var(--cm26-ink);
}

.cm-prod-price-amount {
	font-size: clamp(32px, 3.4vw, 42px);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -.02em;
}

.cm-prod-price-period {
	font-size: 14.5px;
	font-weight: 600;
	color: var(--cm26-stone);
}

.cm-prod-plan-list {
	display: grid;
	gap: 9px;
	margin: 0;
	padding: 0;
	list-style: none;
	font-size: 15px;
	color: var(--cm26-body);
}

.cm-prod-plan-list li {
	display: grid;
	grid-template-columns: 18px 1fr;
	align-items: start;
	gap: 9px;
	margin: 0;
}

.cm-prod-tick {
	margin-top: 4px;
	color: var(--cm26-brand-ink);
	font-size: 13px;
	line-height: 1;
}

.cm-prod-plan-foot { margin-top: auto; padding-top: 8px; }
.cm-prod-plan-foot .cm-btn { width: 100%; }

/* ---------------------------------------------------------------------------
   10. Testimonial rating
   ---------------------------------------------------------------------------
   The visible stars are decorative; the rating is announced from the
   .cm-sr-only sentence beside them.
   --------------------------------------------------------------------------- */
.cm-prod-stars {
	display: flex;
	gap: 3px;
	margin: 0;
	color: var(--cm26-brand-ink);
	font-size: 14px;
	line-height: 1;
}

.cm-prod-stars .bi-star { color: #c9bdb2; }


/* =========================================================================
   TEAM
   ========================================================================= */

/*
 * team.css — fragment for the team index (/our-team/, /team/) and the team
 * profile (/team/<slug>/).
 *
 * Composes on top of assets/css/cosmick-2026.css. Only rules the shared
 * component layer genuinely cannot express live here; layout, bands, type,
 * buttons, cards, tags, media frames, split/aside and pagination all come from
 * the shared layer. No !important, no overrides of shared components —
 * everything is additive and namespaced cm-team-* (plus two members of the
 * existing cm-aspect-* family).
 *
 * Portrait crops deliberately inherit `.cm-media-frame img { object-position:
 * top center }` from the shared layer so a 4:5 or 1:1 crop of a headshot keeps
 * the face in frame.
 */

/* Aspect ratios the shared layer does not ship yet. */
.cm-aspect-4-5 { aspect-ratio: 4 / 5; }
.cm-aspect-1-1 { aspect-ratio: 1 / 1; }

/* ---------------------------------------------------------------------------
 * Shared portrait pieces
 * ------------------------------------------------------------------------ */

/* A bordered portrait frame. Pair with .cm-media-frame .cm-aspect-4-5. */
.cm-team-photo { border: 1px solid var(--cm26-line); }

/* Initials stand-in. Used only when no real portrait exists anywhere on the
   record — a face is never generated or substituted. */
.cm-team-initials {
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	background: var(--cm26-charcoal);
	color: var(--cm26-paper);
	font-family: var(--cm26-font-display);
	font-size: 22px;
	font-weight: 700;
	letter-spacing: -.02em;
}

/* ---------------------------------------------------------------------------
 * Team index — roster
 * ------------------------------------------------------------------------ */

.cm-team-grid {
	display: grid;
	gap: 32px 20px;
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 560px)  { .cm-team-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px)  { .cm-team-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1200px) { .cm-team-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

/* Department block inside the full-team section. */
.cm-team-dept + .cm-team-dept { margin-top: clamp(36px, 4.5vw, 60px); }

.cm-team-dept-title {
	margin: 0 0 20px;
	font-family: var(--cm26-font-display);
	font-size: 14px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

/* One person, as a roster tile. */
.cm-team-person {
	display: flex;
	flex-direction: column;
	height: 100%;
}

.cm-team-name {
	margin: 12px 0 0;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.2;
}

.cm-team-name a { color: inherit; text-decoration: none; }
.cm-team-name a:hover,
.cm-team-name a:focus-visible { color: var(--cm26-brand-ink); }

.cm-team-role {
	margin: 4px 0 0;
	font-size: 14px;
	line-height: 1.35;
	color: var(--cm26-stone);
}

.cm-team-where {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	margin: 8px 0 0;
	font-size: 13px;
	color: var(--cm26-stone);
}

.cm-team-bio {
	margin: 10px 0 0;
	font-size: 14.5px;
	line-height: 1.5;
	color: var(--cm26-body);
	display: -webkit-box;
	-webkit-line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
}

.cm-team-tags {
	display: flex;
	flex-wrap: wrap;
	gap: 6px;
	margin: 10px 0 0;
	padding: 0;
	list-style: none;
}

/* Contact row. Pushed to the foot so tiles in a row line up. */
.cm-team-links {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 0 16px;
	margin-top: auto;
	padding-top: 8px;
}

.cm-team-links a {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 44px;
	font-family: var(--cm26-font-display);
	font-size: 13.5px;
	font-weight: 600;
	color: var(--cm26-brand-ink);
	text-decoration: underline transparent;
	text-decoration-thickness: 2px;
	text-underline-offset: 4px;
	transition: text-decoration-color .18s var(--cm26-ease);
}

.cm-team-links a:hover,
.cm-team-links a:focus-visible { text-decoration-color: currentColor; }

/* ---------------------------------------------------------------------------
 * Team index — leadership cards
 * ------------------------------------------------------------------------ */

.cm-team-leads {
	display: grid;
	gap: 20px;
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 900px) { .cm-team-leads { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.cm-team-lead {
	display: grid;
	gap: 20px;
	padding: 20px;
	height: 100%;
}

@media (min-width: 440px) { .cm-team-lead { grid-template-columns: 136px minmax(0, 1fr); } }

.cm-team-lead-body { display: flex; flex-direction: column; }
.cm-team-lead .cm-team-name { margin-top: 0; font-size: 19px; }
.cm-team-lead .cm-team-bio { -webkit-line-clamp: 4; }

.cm-team-quote {
	margin: 14px 0 0;
	padding-left: 14px;
	border-left: 3px solid var(--cm26-brand);
	font-size: 15px;
	font-style: italic;
	line-height: 1.5;
	color: var(--cm26-prose);
}

.cm-team-quote p { margin: 0; }

/* ---------------------------------------------------------------------------
 * Team index — hiring note under the roster
 * ------------------------------------------------------------------------ */

.cm-team-hiring {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px 16px;
	margin-top: clamp(32px, 4vw, 48px);
	padding-top: 24px;
	border-top: 1px solid var(--cm26-line);
	font-size: 15.5px;
	color: var(--cm26-body);
}

.cm-team-hiring p { margin: 0; }

/* ---------------------------------------------------------------------------
 * Profile — custom hero (this template has no page-heading band)
 * ------------------------------------------------------------------------ */

/* No sand tint: the reference leaves this hero on the page ground and
   separates it with a hairline, the same as its portfolio and service
   heroes. The template used to add .cm-band-sand-60. */
.cm-team-hero { border-bottom: 1px solid var(--cm26-line); }

/* The name fills its column. .cm-h-page caps itself at 783.84px for a
   full-width hero, which is narrower than the 800px column this two-column
   hero gives it. */
.cm-team-hero-title { max-width: none; }

.cm-team-hero > .cm-wrap {
	display: grid;
	gap: 32px;
	padding-block: clamp(32px, 5vw, 56px);
}

@media (min-width: 768px) {
	.cm-team-hero > .cm-wrap {
		grid-template-columns: 320px minmax(0, 1fr);
		gap: 40px;
		align-items: center;
	}
}

.cm-team-hero-portrait {
	max-width: 320px;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-card);
}

.cm-team-hero-portrait .cm-team-initials { font-size: 34px; }

/* Back link — the arrow icon is the shared one, turned around. */
.cm-team-back {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 44px;
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 700;
	color: var(--cm26-brand-ink);
	text-decoration: underline transparent;
	text-decoration-thickness: 2px;
	text-underline-offset: 5px;
	transition: text-decoration-color .18s var(--cm26-ease);
}

.cm-team-back:hover,
.cm-team-back:focus-visible { text-decoration-color: currentColor; color: var(--cm26-brand-ink); }
.cm-team-back svg { transform: scaleX(-1); transition: transform .2s var(--cm26-ease); }
.cm-team-back:hover svg { transform: scaleX(-1) translateX(3px); }

/* The member's name runs at the hero size but on a LOOSER leading than a
   page heading: the reference uses `leading-tight` (1.25 -> 65px on 52px),
   not .cm-h-page's 1.08, and tracks it in slightly less (-.025em, -1.3px). */
.cm-team-hero-title {
	margin: 8px 0 0;
	line-height: 1.25;
	letter-spacing: -.025em;
}

.cm-team-hero-role {
	margin: 10px 0 0;
	font-family: var(--cm26-font-display);
	font-size: 19px;
	font-weight: 600;
	line-height: 1.65;   /* reference: 31.35px, not 24.7px */
	color: var(--cm26-brand-ink);
}

.cm-team-chips {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 18px 0 0;
	padding: 0;
	list-style: none;
}

.cm-team-chip {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	min-height: 30px;
	padding: 0 11px;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-tag);
	background: var(--cm26-card);
	font-size: 13px;
	color: var(--cm26-body);
}

.cm-team-hero-quote {
	margin: 22px 0 0;
	padding-left: 16px;
	border-left: 3px solid var(--cm26-brand);
	max-width: 56ch;
	font-size: 17px;
	font-style: italic;
	line-height: 1.55;
	color: var(--cm26-prose);
}

.cm-team-hero-quote p { margin: 0; }

.cm-team-hero-bio { margin: 20px 0 0; }

.cm-team-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-top: 24px;
}

/* ---------------------------------------------------------------------------
 * Profile — body blocks
 * ------------------------------------------------------------------------ */

.cm-team-block + .cm-team-block { margin-top: clamp(36px, 5vw, 56px); }

/* 21px/1.75, not a 22-28px clamp at 1.2: the reference sets these in-page
   block headings well below its section headings, so "About <name>" does not
   compete with the member's own name above it. */
.cm-team-block-title {
	margin: 0 0 18px;
	font-family: var(--cm26-font-display);
	font-size: 21px;
	font-weight: 700;
	line-height: 1.75;
	letter-spacing: -.015em;
}

/* Video embed: oEmbed returns a bare iframe, so size it here. */
.cm-team-video {
	overflow: hidden;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius);
	background: var(--cm26-sand);
}

.cm-team-video iframe,
.cm-team-video video,
.cm-team-video embed,
.cm-team-video object {
	display: block;
	width: 100%;
	height: auto;
	aspect-ratio: 16 / 9;
	border: 0;
}

.cm-team-gallery {
	display: grid;
	gap: 14px;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 768px) { .cm-team-gallery { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.cm-team-gallery figure { margin: 0; }

.cm-team-gallery figcaption {
	margin-top: 6px;
	font-size: 13px;
	line-height: 1.45;
	color: var(--cm26-stone);
}

.cm-team-fact {
	margin: 0;
	padding: 20px 22px;
	font-size: 16px;
	line-height: 1.6;
	color: var(--cm26-prose);
}

/* ---------------------------------------------------------------------------
 * Profile — sidebar details
 * ------------------------------------------------------------------------ */

.cm-team-skills { margin: 0; padding: 0; list-style: none; }
.cm-team-skill + .cm-team-skill { margin-top: 14px; }

.cm-team-skill-row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 10px;
}

.cm-team-skill-name {
	font-family: var(--cm26-font-display);
	font-size: 14.5px;
	font-weight: 600;
	color: var(--cm26-ink);
}

.cm-team-skill-level {
	flex: 0 0 auto;
	font-size: 12px;
	font-weight: 600;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--cm26-stone);
}

.cm-team-meter {
	margin-top: 7px;
	height: 4px;
	border-radius: 999px;
	background: var(--cm26-sand);
	overflow: hidden;
}

.cm-team-meter span {
	display: block;
	height: 100%;
	border-radius: 999px;
	background: var(--cm26-brand-ink);
}

.cm-team-meter-expert span       { width: 100%; }
.cm-team-meter-advanced span     { width: 78%; }
.cm-team-meter-intermediate span { width: 56%; }
.cm-team-meter-beginner span     { width: 32%; }

.cm-team-certs { margin: 0; padding: 0; list-style: none; }

.cm-team-cert + .cm-team-cert {
	margin-top: 14px;
	padding-top: 14px;
	border-top: 1px solid var(--cm26-line);
}

.cm-team-cert-name {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 14.5px;
	font-weight: 700;
	line-height: 1.3;
}

.cm-team-cert-meta {
	margin: 3px 0 0;
	font-size: 13px;
	line-height: 1.45;
	color: var(--cm26-stone);
}

.cm-team-aside-note {
	margin: 0 0 14px;
	font-size: 14.5px;
	line-height: 1.5;
	color: var(--cm26-body);
}

.cm-team-aside-card .cm-btn { width: 100%; }

/* ---------------------------------------------------------------------------
 * Profile — more of the team
 * ------------------------------------------------------------------------ */

.cm-team-more {
	display: grid;
	gap: 20px;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 640px)  { .cm-team-more { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .cm-team-more { grid-template-columns: repeat(5, minmax(0, 1fr)); } }

.cm-team-more a { display: block; text-decoration: none; }
.cm-team-more .cm-team-name { font-size: 17.5px; line-height: 1.25; }
.cm-team-more .cm-team-role { font-size: 13px; line-height: 1.65; }
.cm-team-more .cm-team-initials { font-size: 20px; }

/* ---------------------------------------------------------------------------
 * TEAM ROSTER — the flat grid that /team/ and /our-team/ both render
 *
 * Measured off the reference's `ul.wrap.grid.grid-cols-2.gap-x-5.gap-y-9
 * .md:grid-cols-3.lg:grid-cols-5`: two columns on a phone, three from 768px
 * and five from 1024px, 20px apart with 36px between rows (216px columns at
 * 1440px). The <ul> is itself the wrap, so it carries the 1240px cap and the
 * 40px gutters rather than nesting another container.
 *
 * The card's frame, inner hairline, coral tab and rotating arrow badge are
 * .cm-person-link / .cm-portrait-mount / .cm-portrait-arrow from the shared
 * layer — the same components the homepage cohort uses. Only the grid and the
 * two lines of type below the portrait are local.
 * ------------------------------------------------------------------------ */

.cm-team-roster {
	list-style: none;
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	column-gap: 20px;
	row-gap: 36px;
}

@media (min-width: 768px) {
	.cm-team-roster { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (min-width: 1024px) {
	.cm-team-roster { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}

.cm-team-roster > li { min-width: 0; }

.cm-team-roster .cm-person-link { display: block; text-decoration: none; color: inherit; }

/* 16.5px/1.25 at 12px from the portrait; the role 14px/1.375 2px under it. */
.cm-person-name {
	margin: 12px 0 0;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.25;
	color: var(--cm26-ink);
}

.cm-person-link:hover .cm-person-name,
.cm-person-link:focus-visible .cm-person-name { color: var(--cm26-brand-ink); }

.cm-person-role {
	margin: 2px 0 0;
	font-size: 14px;
	line-height: 1.375;
	color: var(--cm26-stone);
}


/* =========================================================================
   BLOG
   ========================================================================= */

/* ===========================================================================
   blog.css — PHASE 4 FRAGMENT, group "blog"
   ---------------------------------------------------------------------------
   Append to assets/css/cosmick-2026.css. Everything here is what the shared
   component layer genuinely cannot express; every other surface in the blog
   family composes existing cm- classes (.cm-card, .cm-card-link, .cm-pcard*,
   .cm-media-frame, .cm-grid-3, .cm-prose, .cm-tag, .cm-empty, .cm-aside-card,
   .cm-pagination, .cm-page-head, .cm-section-head).

   Covers: blog index (home.php / page-blog.php), taxonomy + author + date
   archives (archive.php), single article (single.php), search results
   (search.php + template-parts/content-search.php) and 404 (404.php).

   Tokens only — no new colours, no !important, no bare-element selectors.
   =========================================================================== */

/* ---------------------------------------------------------------------------
   Card / article meta line ("August 12, 2026 · 4 min read")
   The reference sets this at 13px stone on grid cards and 13.5px on the lead
   story. One class, one size, used by every blog surface.
   ------------------------------------------------------------------------ */
.cm-pmeta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin: 0;
	font-size: 13px;
	color: var(--cm26-stone);
}

.cm-pmeta .cm-pmeta-sep { color: var(--cm26-line); }

.cm-pmeta a { color: inherit; text-decoration: underline; text-underline-offset: 3px; }
.cm-pmeta a:hover { color: var(--cm26-brand-ink); }

/* The post card is the project card with a 16/9 frame and a meta line above
   the title, so it reuses .cm-pcard* wholesale and only adjusts the stack. */
.cm-pcard-body > .cm-pmeta + .cm-pcard-title { margin-top: 6px; }

/* ---------------------------------------------------------------------------
   Lead story — blog index, page 1 only
   Reference: `card card-link mb-8 grid overflow-hidden md:grid-cols-[1.2fr_1fr]`
   ------------------------------------------------------------------------ */
.cm-postlead {
	display: grid;
	overflow: hidden;
	margin-bottom: 32px;
}

@media (min-width: 768px) {
	.cm-postlead { grid-template-columns: 1.2fr 1fr; }
}

.cm-postlead-media { display: block; padding: 12px; text-decoration: none; }
.cm-postlead-media .cm-media-frame { border-radius: var(--cm26-radius-sm); height: 100%; }

.cm-postlead-body {
	display: flex;
	flex-direction: column;
	justify-content: center;
	padding: 24px;
}

@media (min-width: 768px) {
	.cm-postlead-body { padding: 28px; }
}

.cm-postlead-title {
	margin: 8px 0 0;
	font-family: var(--cm26-font-display);
	font-size: clamp(22px, 2.4vw, 30px);
	font-weight: 700;
	line-height: 1.18;
	letter-spacing: -.015em;
}

.cm-postlead-title a { color: inherit; text-decoration: none; }
.cm-postlead-title a:hover { color: var(--cm26-brand-ink); }

.cm-postlead-excerpt { margin: 12px 0 0; font-size: 16px; color: var(--cm26-body); }
.cm-postlead .cm-tlink { margin-top: 20px; align-self: start; }

/* ---------------------------------------------------------------------------
   Term navigation — the category row on the blog index and the archives.
   Tag-shaped links with a real current state and a 44px-friendly target.
   ------------------------------------------------------------------------ */
.cm-termnav { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 28px; }

.cm-termnav .cm-termnav-link {
	height: auto;
	min-height: 38px;
	padding: 0 14px;
	text-decoration: none;
	transition: background-color .18s var(--cm26-ease), color .18s var(--cm26-ease);
}

.cm-termnav .cm-termnav-link:hover { background: var(--cm26-tint); color: var(--cm26-brand-ink); }

.cm-termnav .cm-termnav-link[aria-current] {
	background: var(--cm26-ink);
	color: var(--cm26-paper);
}

.cm-termnav-count { margin-left: 6px; font-variant-numeric: tabular-nums; opacity: .7; }

/* Stored term description on a taxonomy archive. */
.cm-archive-desc { margin-bottom: 28px; }

/* ---------------------------------------------------------------------------
   Card row list — the 404 destination list.
   A .cm-aside-card <ul> whose rows are full-width targets with a chevron.
   ------------------------------------------------------------------------ */
.cm-linkrows {
	list-style: none;
	margin: 0;
	padding: 0;
}

.cm-linkrows li + li { border-top: 1px solid var(--cm26-line); }

.cm-linkrows a {
	color: var(--cm26-ink);
	text-decoration: none;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	min-height: 48px;
	padding: 6px 0;
	font-family: var(--cm26-font-display);
	font-weight: 600;
}

.cm-linkrows a .cm-icon { color: var(--cm26-stone); flex: 0 0 auto; }
.cm-linkrows a:hover { color: var(--cm26-brand-ink); }
.cm-linkrows a:hover .cm-icon { color: var(--cm26-brand-ink); }

/* ---------------------------------------------------------------------------
   404 — reference `grid gap-10 lg:grid-cols-[1.1fr_1fr] lg:items-center`
   ------------------------------------------------------------------------ */
.cm-404-grid { display: grid; gap: 40px; }

@media (min-width: 1024px) {
	.cm-404-grid { grid-template-columns: 1.1fr 1fr; align-items: center; }
}

/* The contact-form card kept on the 404 page. */
.cm-404-form-card { padding: 28px; }
.cm-404-form-card .cm-muted { margin: 8px 0 20px; }

/* ---------------------------------------------------------------------------
   Single article
   Reading measure is .cm-prose's own 72ch; the header and hero sit on the
   slightly wider 920/1040px plates the reference uses.
   ------------------------------------------------------------------------ */
.cm-article { display: block; }

/* The reference puts the measure on the container itself (`wrap max-w-[920px]`),
   so these plates centre inside .cm-wrap rather than hanging off its left edge. */
.cm-article-plate      { max-width: 920px;  margin-inline: auto; }
.cm-article-plate-wide { max-width: 1040px; margin-inline: auto; }

.cm-article-head { padding-top: 40px; }

@media (min-width: 768px) { .cm-article-head { padding-top: 56px; } }

/* Article titles are long-form headlines, so they are not held to the 22ch
   measure .cm-h-page uses for short interior page titles. */
.cm-article-head .cm-h-page { max-width: 34ch; }

.cm-article-head .cm-pmeta { margin-top: 16px; font-size: 15px; }
.cm-article-head .cm-lede { margin-top: 16px; }
.cm-article-tags { margin-top: 20px; }

.cm-backlink { font-size: 14px; }
.cm-backlink .cm-icon { transform: rotate(180deg); }
.cm-backlink:hover .cm-icon { transform: rotate(180deg) translateX(3px); }

.cm-article-hero { margin: 32px 0 0; }

.cm-article-hero img {
	display: block;
	width: 100%;
	height: auto;
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-card);
}

.cm-article-hero figcaption {
	margin-top: 8px;
	font-size: 14px;
	color: var(--cm26-stone);
}

.cm-article-body { padding-top: 40px; }

/* The prose column is centred inside the 920px plate, as in the reference. */
.cm-article-body .cm-prose { margin-inline: auto; }

/* Share + tag rows share the prose measure so they line up with the body. */
.cm-article-foot {
	max-width: 72ch;
	margin: 40px auto 0;
	border-top: 1px solid var(--cm26-line);
	padding-top: 24px;
}

.cm-article-foot .cm-tagrow + .cm-share { margin-top: 16px; }

.cm-share {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
	font-size: 14.5px;
}

.cm-share-label { font-family: var(--cm26-font-display); font-weight: 700; }

.cm-share a.cm-tag {
	height: 34px;
	padding: 0 12px;
	text-decoration: none;
	transition: background-color .18s var(--cm26-ease), color .18s var(--cm26-ease);
}

.cm-share a.cm-tag:hover { background: var(--cm26-line); color: var(--cm26-ink); }

.cm-tagrow { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

.cm-tagrow a.cm-tag {
	height: auto;
	min-height: 32px;
	text-decoration: none;
	transition: background-color .18s var(--cm26-ease), color .18s var(--cm26-ease);
}

.cm-tagrow a.cm-tag:hover { background: var(--cm26-tint); color: var(--cm26-brand-ink); }

/* Author card */
.cm-author {
	display: grid;
	gap: 16px;
	max-width: 72ch;
	margin: 32px auto 0;
	padding: 24px;
}

@media (min-width: 640px) {
	.cm-author { grid-template-columns: 72px minmax(0, 1fr); align-items: start; gap: 20px; }
	.cm-author-noavatar { grid-template-columns: minmax(0, 1fr); }
}

.cm-author-avatar img {
	display: block;
	width: 72px;
	height: 72px;
	border-radius: 50%;
	border: 1px solid var(--cm26-line);
}

.cm-author-name { margin: 0; font-family: var(--cm26-font-display); font-size: 17px; font-weight: 700; }
.cm-author-bio { margin: 8px 0 0; font-size: 15.5px; color: var(--cm26-body); }
.cm-author-links { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 12px; }

/* Comments live inside the prose measure too. blog.css still owns the thread
   itself (comments.php binds to its classes); this only sets the column. */
.cm-comments { max-width: 72ch; margin: 48px auto 0; }

/* ---------------------------------------------------------------------------
   Search
   ------------------------------------------------------------------------ */
.cm-searchbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start; }
.cm-searchbar .cm-input { min-width: 0; flex: 1 1 240px; }
.cm-searchbar .cm-btn { flex: 0 0 auto; }

.cm-empty .cm-searchbar { max-width: 460px; margin: 20px auto 0; }

/* The optional stored search banner (ACF option `search_result_banner_image`)
   renders in the heading band aside when it is set. */
.cm-search-banner { max-width: 420px; }
.cm-search-banner img { display: block; width: 100%; height: auto; }


/* =========================================================================
   AREAS
   ========================================================================= */

/* ===========================================================================
   AREAS — archive-area.php + single-area.php
   ---------------------------------------------------------------------------
   Everything the areas templates need that the shared layer in
   assets/css/cosmick-2026.css already expresses is composed from that layer:
   .cm-wrap / .cm-section / .cm-section-tight / .cm-band-sand-60 for the bands,
   .cm-split for the 320px rail, .cm-grid-3 for the card grids, .cm-card /
   .cm-card-link / .cm-aside-card / .cm-tag for the surfaces, .cm-facts* for the
   hero-stat strip, .cm-rev* for the local testimonials, .cm-faq* for the local
   FAQ, .cm-pagination for the pager and .cm-cta-panel for the closing band.

   What is left below is only what the shared layer has no component for: the
   "plain row card" the areas index uses (ref-04 §4.5 — the one card shape in
   the reference that has no equivalent here yet), and small layout rules for
   the field-driven blocks that are specific to this post type.

   Two families, both namespaced:
     .cm-arow-*   the areas-index row card
     .cm-area-*   the area-detail blocks
   =========================================================================== */

/* ---------------------------------------------------------------------------
   AREAS INDEX — the row card
   ref-04 §3.14: ul.grid gap-2 sm:grid-cols-2 lg:grid-cols-3 of
   li > a.card card-link flex items-center justify-between px-5 py-4
   font-display font-semibold, with a trailing chevron.
   --------------------------------------------------------------------------- */

.cm-arow-list {
	display: grid;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

@media (min-width: 640px)  { .cm-arow-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .cm-arow-list { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.cm-arow {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	/* Keeps the whole row comfortably past the 44px target. */
	min-height: 64px;
	height: 100%;
	padding: 16px 20px;
	color: var(--cm26-ink);
	text-decoration: none;
}

.cm-arow:hover .cm-arow-title,
.cm-arow:focus-visible .cm-arow-title { color: var(--cm26-brand-ink); }

.cm-arow-copy { display: block; min-width: 0; }

.cm-arow-title {
	display: block;
	font-family: var(--cm26-font-display);
	font-size: 16.5px;
	font-weight: 700;
	line-height: 1.25;
}

.cm-arow-sub {
	display: block;
	margin-top: 1px;
	font-size: 13.5px;
	color: var(--cm26-stone);
}

.cm-arow-tagline {
	display: block;
	margin-top: 8px;
	font-size: 14px;
	line-height: 1.45;
	color: var(--cm26-body);
}

.cm-arow-meta {
	display: block;
	margin-top: 8px;
	font-size: 12.5px;
	color: var(--cm26-stone);
}

.cm-arow-mark { flex: 0 0 auto; color: var(--cm26-stone); transition: transform .2s var(--cm26-ease); }
.cm-arow:hover .cm-arow-mark { transform: translateX(3px); color: var(--cm26-brand-ink); }

.cm-arow-empty-actions { justify-content: center; margin-top: 20px; }

/* ---------------------------------------------------------------------------
   AREA DETAIL
   --------------------------------------------------------------------------- */

/*
 * Hero-stat strip. .cm-facts-grid is a fixed 2-then-4 column grid, which leaves
 * a lone stat stranded in a quarter-width cell; areas carry anywhere from one to
 * a handful, so the columns are allowed to fit the content.
 */
.cm-area-stats { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }

@media (min-width: 768px) {
	.cm-area-stats { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
}

/* Reading column */
.cm-area-hero-figure { margin: 0 0 32px; }

/* Rail — `card h-fit`, deliberately not sticky (ref-04 §4.2). */
.cm-area-rail { align-self: start; }

.cm-area-rail-note { margin: 0; font-size: 14px; line-height: 1.5; }
.cm-aside-title + .cm-area-rail-note { margin-top: -4px; }

.cm-area-address {
	margin: 12px 0 0;
	font-style: normal;
	font-size: 15px;
	line-height: 1.5;
	color: var(--cm26-body);
}

/*
 * The two office labels. .cm-aside-card ul already resets the list and sets a
 * 10px grid gap, so only the icon row needs describing — and the selector is
 * scoped the same way so it wins the specificity tie.
 */
.cm-area-places > li,
.cm-aside-card .cm-area-places > li {
	display: flex;
	align-items: flex-start;
	gap: 8px;
	font-size: 15px;
	line-height: 1.375;
}

.cm-area-places .cm-icon { margin-top: 3px; flex: 0 0 auto; }

.cm-area-rail-phone { margin: 16px 0 0; }
.cm-area-rail-phone + .cm-area-rail-note { margin-top: 12px; }

.cm-area-map { margin-top: 4px; }

.cm-area-map iframe {
	display: block;
	width: 100%;
	max-width: 100%;
	min-height: 220px;
	border: 0;
	border-radius: var(--cm26-radius-sm);
}

/*
 * Tag lists (counties, industries). `.cm-aside-card ul` sets display:grid at
 * equal specificity, so the scoped selector is listed alongside the plain one.
 */
.cm-area-taglist,
.cm-aside-card .cm-area-taglist {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}

.cm-area-taglist-lg .cm-tag {
	height: 36px;
	padding-inline: 14px;
	font-size: 14px;
}

.cm-area-tag-icon { margin-right: 7px; color: var(--cm26-brand-ink); }

/*
 * Padded card body for the field-driven grids (featured services, surrounding
 * communities, why-choose benefits). .cm-card itself carries only the surface.
 */
.cm-area-card {
	display: flex;
	flex-direction: column;
	padding: 24px;
}

.cm-area-card > .cm-h-card { margin: 0; }
.cm-area-card-icon { margin: 0 0 14px; font-size: 22px; line-height: 1; color: var(--cm26-brand-ink); }
.cm-area-card-meta { margin: 6px 0 0; font-size: 13.5px; color: var(--cm26-stone); }
.cm-area-card-copy { margin: 10px 0 0; font-size: 15px; line-height: 1.6; color: var(--cm26-body); }
.cm-area-card-action { margin: auto 0 0; padding-top: 18px; }

/* Testimonial by-line: company and location stack under the author. */
.cm-area-rev-meta { display: block; }

/* Enquiry form column */
.cm-area-form { margin-top: 28px; }


/* =========================================================================
   PAGES
   ========================================================================= */

/* ===========================================================================
   PAGES FAMILY — phase 4 fragment
   page.php · page-contact.php · page-reviews.php · page-history.php
   template-thank-you.php · template-parts/content-page.php

   Everything these templates could express with the shared component layer in
   assets/css/cosmick-2026.css is expressed there. What is left below is only
   the handful of things that layer has no vocabulary for:

     - a star row and a rating histogram (reviews)
     - a reviewer avatar chip (reviews)
     - the owner-response block inside a review card (reviews)
     - the review submission dialog (reviews)
     - a vertical milestone rail (history)
     - a large tap-target phone line and an hours table (contact)
     - the confirmation check badge (thank you)

   Every rule is namespaced cm-pages-*. Nothing here is load-bearing: each
   block is written so the markup still reads correctly with this file absent
   (stars fall back to inline icons at body colour, the histogram falls back to
   its numeric counts, the dialog is a native <dialog> so it stays closed, the
   milestone rail falls back to a stack of cards). This file must load AFTER
   assets/css/cosmick-2026.css.
   =========================================================================== */

/* ---------------------------------------------------------------- REVIEWS */

/* Star row. Bootstrap Icons is already on the page; this only colours and
   sizes them, and keeps the row from wrapping mid-rating. */
.cm-pages-stars {
	display: inline-flex;
	align-items: center;
	gap: 2px;
	color: var(--cm26-brand, #ff675b);
	font-size: 14px;
	line-height: 1;
	white-space: nowrap;
}

.cm-pages-stars--lg { font-size: 20px; gap: 3px; }

/* Toolbar: filter row on the left, "add your review" on the right */
.cm-pages-toolbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 28px;
}

/* The card grid itself is .cm-grid-3; cards must stretch to equal height. */
.cm-pages-revgrid > .cm-pages-rev { height: 100%; }

/* The decorative open quote sits between the reviewer row and the quote, so it
   needs its own breathing room — .cm-rev-mark's 0.6 line-height is tuned for
   being the first child of the card, which it is on the homepage but not here. */
.cm-pages-rev .cm-rev-mark { display: block; margin: 10px 0 2px; }

/* Paragraphs arrive from wpautop inside the blockquote. */
/* The reviews PAGE sets its quotes a point smaller than the homepage cards
   do — 15.5px/1.625 against 16.5px/1.625 — because these cards carry the full
   review rather than a pull quote. .cm-rev-quote keeps the homepage size. */
.cm-pages-rev .cm-rev-quote { margin-top: 0; font-size: 15.5px; line-height: 1.625; }
.cm-pages-rev .cm-rev-quote > p { margin: 0 0 .8em; }
.cm-pages-rev .cm-rev-quote > p:last-child { margin-bottom: 0; }

.cm-pages-rev .cm-rev-by {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px 14px;
}

/* Reviewer identity chip */
.cm-pages-who {
	display: flex;
	align-items: center;
	gap: 10px;
	margin: 0 0 4px;
}

.cm-pages-whoblock { display: grid; gap: 3px; min-width: 0; }

.cm-pages-whometa {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 4px 10px;
	font-size: 13px;
	color: var(--cm26-stone, #6b6460);
}

.cm-pages-avatar {
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	border-radius: 50%;
	object-fit: cover;
	background: var(--cm26-sand, #f3ede7);
	border: 1px solid var(--cm26-line, #e4dcd4);
}

.cm-pages-initial {
	display: grid;
	place-items: center;
	flex: 0 0 auto;
	width: 40px;
	height: 40px;
	border-radius: 50%;
	background: var(--cm26-charcoal, #3c3c3c);
	color: var(--cm26-paper, #fbf8f5);
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 15px;
	font-weight: 700;
	line-height: 1;
}

.cm-pages-whoname {
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 15px;
	font-weight: 700;
	color: var(--cm26-ink, #262423);
}

/* Media inside a review card */
.cm-pages-revmedia { margin: 16px 0 0; }
.cm-pages-revmedia img,
.cm-pages-revmedia video,
.cm-pages-revmedia iframe {
	display: block;
	width: 100%;
	height: auto;
	border-radius: 8px;
}

/* Owner response */
.cm-pages-response {
	margin-top: 18px;
	padding: 14px 16px;
	border-left: 3px solid var(--cm26-brand, #ff675b);
	background: rgba(243, 237, 231, .55);
	border-radius: 0 8px 8px 0;
	font-size: 14.5px;
	line-height: 1.6;
	color: var(--cm26-body, #4a4542);
}

.cm-pages-response-head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: 8px;
	margin: 0 0 6px;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 13.5px;
	font-weight: 700;
	color: var(--cm26-ink, #262423);
}

.cm-pages-response-head time { font-weight: 500; color: var(--cm26-stone, #6b6460); }
.cm-pages-response p { margin: 0 0 .7em; }
.cm-pages-response p:last-child { margin-bottom: 0; }

/* Rating summary + histogram (page-head aside) */
.cm-pages-score {
	margin: 0;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 44px;
	font-weight: 800;
	line-height: 1;
	letter-spacing: -.03em;
	color: var(--cm26-ink, #262423);
}

.cm-pages-hist { display: grid; gap: 6px; margin: 16px 0 0; padding: 0; list-style: none; }

.cm-pages-hist li {
	display: grid;
	grid-template-columns: 4.5em 1fr 2.5em;
	align-items: center;
	gap: 10px;
	font-size: 13px;
	color: var(--cm26-stone, #6b6460);
}

.cm-pages-hist-count { text-align: right; font-variant-numeric: tabular-nums; }

.cm-pages-bar {
	display: block;
	height: 7px;
	border-radius: 999px;
	background: var(--cm26-sand, #f3ede7);
	overflow: hidden;
}

.cm-pages-bar > span {
	display: block;
	height: 100%;
	border-radius: 999px;
	background: var(--cm26-brand, #ff675b);
}

/* Filter row */
.cm-pages-filters {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px;
}

.cm-pages-filters .cm-btn[aria-pressed="true"] {
	background: var(--cm26-ink, #262423);
	border-color: var(--cm26-ink, #262423);
	color: var(--cm26-paper, #fbf8f5);
}

/* Review submission dialog. A native <dialog>, so it is closed by default even
   with this file missing. */
.cm-pages-dialog {
	width: min(720px, calc(100% - 24px));
	max-height: min(88vh, 900px);
	padding: 0;
	border: 1px solid var(--cm26-line, #e4dcd4);
	border-radius: 14px;
	background: var(--cm26-card, #fffdfb);
	color: var(--cm26-ink, #262423);
	box-shadow: 0 1px 2px #2624230d, 0 24px 64px -24px #26242352;
}

.cm-pages-dialog::backdrop { background: rgba(38, 36, 35, .5); }

.cm-pages-dialog-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 16px;
	padding: 24px 24px 0;
}

.cm-pages-dialog-head h2 { margin: 0; }
.cm-pages-dialog-head p { margin: 6px 0 0; }

.cm-pages-dialog-body { padding: 16px 24px 24px; overflow-y: auto; }
.cm-pages-dialog-foot { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 24px; }

/* Star rating as a radio group: real inputs, visually a star row. */
.cm-pages-rate { display: flex; flex-wrap: wrap; gap: 8px; }

.cm-pages-rate label {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 48px;
	min-height: 44px;
	padding: 0 10px;
	border: 1.5px solid var(--cm26-input-border, #a28c79);
	border-radius: 9px;
	background: var(--cm26-card, #fffdfb);
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 14px;
	font-weight: 600;
	cursor: pointer;
}

.cm-pages-rate label:hover { border-color: var(--cm26-stone, #6b6460); }

.cm-pages-rate input {
	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;
}

.cm-pages-rate label:has(input:checked) {
	border-color: var(--cm26-brand-ink, #b8352b);
	box-shadow: inset 0 0 0 1px var(--cm26-brand-ink, #b8352b);
}

.cm-pages-rate label:has(input:focus-visible) {
	outline: 2px solid var(--cm26-brand-ink, #b8352b);
	outline-offset: 2px;
}

/* Inline AJAX status region */
.cm-pages-formstatus { margin-top: 16px; font-size: 15px; }
.cm-pages-formstatus:empty { display: none; }
.cm-pages-formstatus[data-state="error"] { color: var(--cm26-error, #a3221a); }

/* ---------------------------------------------------------------- CONTACT */

.cm-pages-phone {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	min-height: 44px;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 24px;
	font-weight: 800;
	letter-spacing: normal;   /* the reference does not track this number in */
	color: var(--cm26-ink, #262423);
	text-decoration: none;
}

.cm-pages-phone:hover { color: var(--cm26-brand-ink, #b8352b); }
.cm-pages-phone .cm-icon { color: var(--cm26-brand-ink, #b8352b); }

.cm-pages-hours { margin: 0; display: grid; gap: 8px; font-size: 15px; }

.cm-pages-hours > div {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 8px 16px;
	padding-bottom: 8px;
	border-bottom: 1px solid var(--cm26-line, #e4dcd4);
}

.cm-pages-hours > div:last-child { padding-bottom: 0; border-bottom: 0; }
.cm-pages-hours dt { font-weight: 600; color: var(--cm26-ink, #262423); }
.cm-pages-hours dd { margin: 0; color: var(--cm26-body, #4a4542); }

.cm-pages-address { font-style: normal; margin: 0; font-size: 16px; line-height: 1.65; color: var(--cm26-body, #4a4542); }

/* A single arrow link at the foot of a rail card */
.cm-pages-aside-action { margin: 14px 0 0; }

/* Social row (contact rail + thank you) */
.cm-pages-social { display: flex; flex-wrap: wrap; gap: 10px; }

.cm-pages-social a {
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	border: 1px solid var(--cm26-line, #e4dcd4);
	border-radius: 50%;
	background: var(--cm26-card, #fffdfb);
	color: var(--cm26-ink, #262423);
	font-size: 17px;
	text-decoration: none;
}

.cm-pages-social a:hover {
	border-color: var(--cm26-brand-ink, #b8352b);
	color: var(--cm26-brand-ink, #b8352b);
}

/* The heading that opens a full-width card (the contact form card). .cm-h-card
   sets type but no rhythm, so give it one where it leads a card. */
.cm-pages-cardtitle { margin: 0 0 24px; }

/* Numbered step cards ("What happens next") */
.cm-pages-steps { margin: 0; padding: 0; list-style: none; }
.cm-pages-steps .cm-h-card { margin: 10px 0 0; }
.cm-pages-steps p { margin: 8px 0 0; }

.cm-pages-step-num {
	display: block;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 12.5px;
	font-weight: 700;
	letter-spacing: .14em;
	text-transform: uppercase;
	color: var(--cm26-brand-ink, #b8352b);
}

/* ---------------------------------------------------------------- HISTORY */

.cm-pages-timeline { margin: 0; padding: 0; list-style: none; }

.cm-pages-timeline > li { position: relative; }
.cm-pages-timeline > li + li { margin-top: 20px; }

@media (min-width: 820px) {
	.cm-pages-timeline {
		position: relative;
		padding-left: 132px;
	}

	/* The rail */
	.cm-pages-timeline::before {
		content: "";
		position: absolute;
		top: 12px;
		bottom: 12px;
		left: 96px;
		width: 2px;
		background: var(--cm26-line, #e4dcd4);
	}

	.cm-pages-timeline > li + li { margin-top: 28px; }

	/* The year, parked in the gutter beside the rail */
	.cm-pages-year {
		position: absolute;
		top: 24px;
		left: -132px;
		width: 84px;
		text-align: right;
		font-family: var(--cm26-font-display, Montserrat, sans-serif);
		font-size: 22px;
		font-weight: 800;
		line-height: 1;
		letter-spacing: -.02em;
		color: var(--cm26-ink, #262423);
	}

	/* The node on the rail */
	.cm-pages-timeline > li::before {
		content: "";
		position: absolute;
		top: 28px;
		left: -41px;
		width: 11px;
		height: 11px;
		border-radius: 50%;
		background: var(--cm26-brand, #ff675b);
		box-shadow: 0 0 0 4px var(--cm26-paper, #fbf8f5);
	}
}

/* Before 820px the year sits inline above the card title. */
.cm-pages-year {
	display: block;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 18px;
	font-weight: 800;
	line-height: 1;
	color: var(--cm26-brand-ink, #b8352b);
}

.cm-pages-tl-body { display: grid; gap: 20px; padding: 24px; }

@media (min-width: 640px) {
	.cm-pages-tl-body--media { grid-template-columns: 200px minmax(0, 1fr); align-items: start; }
}

.cm-pages-tl-figure { margin: 0; }
.cm-pages-tl-figure img { display: block; width: 100%; height: auto; border-radius: 8px; }

.cm-pages-tl-meta {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px 14px;
	margin: 0 0 8px;
	font-size: 13.5px;
	color: var(--cm26-stone, #6b6460);
}

.cm-pages-tl-title { margin: 0; font-family: var(--cm26-font-display, Montserrat, sans-serif); font-size: clamp(19px, 1.6vw, 22px); font-weight: 700; line-height: 1.25; }
.cm-pages-tl-title a { color: inherit; text-decoration: none; }
.cm-pages-tl-title a:hover { color: var(--cm26-brand-ink, #b8352b); }
.cm-pages-tl-excerpt { margin: 8px 0 0; font-size: 15.5px; line-height: 1.65; color: var(--cm26-body, #4a4542); }
.cm-pages-tl-tags { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.cm-pages-tl-action { margin-top: 16px; }

/* -------------------------------------------------------------- THANK YOU */

.cm-pages-confirm { display: grid; gap: 24px; padding: 32px; justify-items: start; }

@media (min-width: 768px) { .cm-pages-confirm { padding: 44px; } }

.cm-pages-check {
	display: grid;
	place-items: center;
	width: 64px;
	height: 64px;
	border-radius: 50%;
	background: var(--cm26-brand-ink, #b8352b);
	color: var(--cm26-on-brand, #fffaf7);
}

.cm-pages-check svg { display: block; }

.cm-pages-ty-contact {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 14px 24px;
	padding-top: 24px;
	border-top: 1px solid var(--cm26-line, #e4dcd4);
	width: 100%;
}

.cm-pages-ty-contact a:not(.cm-pages-social a) {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	min-height: 44px;
	font-size: 15px;
	font-weight: 600;
	color: var(--cm26-ink, #262423);
	text-decoration: none;
}

.cm-pages-ty-contact a:hover { color: var(--cm26-brand-ink, #b8352b); }

/* --------------------------------------------------------- GENERIC PAGES */

/* A featured image above the reading column on an ordinary page. */
.cm-pages-figure { margin: 0 0 32px; max-width: 72ch; }
.cm-pages-figure img { display: block; width: 100%; height: auto; }

/* The edit link under a page body, for logged-in editors only */
.cm-pages-article-foot { margin-top: 32px; }

/* wp_link_pages, for a paginated page */
.cm-pages-links-label { color: var(--cm26-stone, #6b6460); font-weight: 600; }

.cm-pages-links {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 8px;
	margin-top: 32px;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: 14px;
	font-weight: 600;
}

.cm-pages-links a {
	display: grid;
	place-items: center;
	min-width: 44px;
	height: 44px;
	padding-inline: 12px;
	border: 1px solid var(--cm26-line, #e4dcd4);
	border-radius: 8px;
	color: var(--cm26-ink, #262423);
	text-decoration: none;
}

.cm-pages-links a:hover { border-color: var(--cm26-stone, #6b6460); }

/* .cm-empty styles its own h2; these templates use an h3 there so the heading
   order below a section's h2 stays correct. */
.cm-empty h3 {
	margin: 0 0 8px;
	font-family: var(--cm26-font-display, Montserrat, sans-serif);
	font-size: clamp(19px, 2vw, 23px);
	font-weight: 700;
	line-height: 1.25;
}

.cm-empty p { margin: 0 0 .7em; }
.cm-empty p:last-child { margin-bottom: 0; }

/* ---------------------------------------------------------------------------
 * CONTACT — the ways-to-reach-us rail
 *
 * The contact page's rail is WIDER than the service/software rails: the
 * reference splits 643/477 there (with the 40px gap, 1160 total) and pads
 * those cards 28px, against the 320px rail and 24px padding its service
 * pages use. .cm-split's 320px track is right for a service page and wrong
 * here, so the contact wrap opts in to its own track width.
 *
 * Only the two LOCATION cards take a plain heading. "Call us", "Office
 * hours", "Already a client?" and "Follow us" keep the uppercase stone
 * eyebrow of .cm-aside-title — that is what the reference uses for them, and
 * it is the city names alone that are set as 19px ink headings.
 * ------------------------------------------------------------------------ */

@media (min-width: 1024px) {
	.cm-split--wide-aside { grid-template-columns: minmax(0, 1fr) 477px; }
}

.cm-split--wide-aside .cm-aside-card { padding: 28px; }

.cm-pages-place-title {
	margin: 0 0 12px;
	font-family: var(--cm26-font-display);
	font-size: 19px;
	font-weight: 700;
	line-height: 1.65;
	letter-spacing: -.015em;
	text-transform: none;
	color: var(--cm26-ink);
}

/* "Already a client?" and its kin: a plain bold title in the display face at
   the card's own 17.5px, NOT the uppercase stone eyebrow .cm-aside-title
   carries. The reference writes it `<p class="font-display font-bold">`, and
   reserves the eyebrow for the short label cards ("Call us"). */
.cm-pages-card-title {
	margin: 0;
	font-family: var(--cm26-font-display);
	font-size: 17.5px;
	font-weight: 700;
	line-height: 1.65;
	letter-spacing: normal;
	text-transform: none;
	color: var(--cm26-ink);
}

/* Secondary copy in the contact rail is 15px, not the 17.5px it inherits from
   the card. Scoped to the rail so the shared .cm-muted is untouched. */
.cm-split--wide-aside .cm-muted { font-size: 15px; line-height: 1.65; }


/* =========================================================================
   CAREERS
   ========================================================================= */

/* ---------------------------------------------------------------------------
 * CAREERS
 * The application form's markup is deliberately left alone — every `name=`
 * attribute is part of the contract that inc/careers-form-handler.php reads,
 * and the nonce, the upload control and the required flags all belong to it.
 * So this maps the existing .cosmick-careers-* classes onto the design tokens
 * rather than rewriting the template.
 * ------------------------------------------------------------------------- */

.cosmick-careers-hero {
	background: rgba(243, 237, 231, .6);
	border-bottom: 1px solid var(--cm26-line);
	padding-block: 40px;
}

@media (min-width: 768px) { .cosmick-careers-hero { padding-block: 56px; } }

.cosmick-careers-hero-content h1 {
	font-size: clamp(32px, 4.4vw, 52px);
	line-height: 1.08;
	letter-spacing: -.028em;
	font-weight: 800;
	max-width: 22ch;
	text-wrap: balance;
}

.cosmick-careers-hero-content > p {
	margin-top: 16px;
	font-size: clamp(17px, 1.5vw, 20px);
	line-height: 1.6;
	color: var(--cm26-body);
	max-width: 62ch;
}

.cosmick-careers-hero-stats {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 24px;
	margin-top: 32px;
}

@media (min-width: 768px) { .cosmick-careers-hero-stats { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

.cosmick-careers-stat strong,
.cosmick-careers-stat .cosmick-careers-stat-number {
	display: block;
	font-family: var(--cm26-font-display);
	font-size: 30px;
	font-weight: 800;
	line-height: 1;
	color: var(--cm26-ink);
}

.cosmick-careers-why-section,
.cosmick-careers-form-section { padding-block: clamp(44px, 7vw, 84px); }

.cosmick-careers-section-title {
	font-size: clamp(28px, 3.3vw, 40px);
	line-height: 1.12;
	letter-spacing: -.022em;
	font-weight: 700;
}

.cosmick-careers-section-subtitle { color: var(--cm26-body); max-width: 62ch; }

.cosmick-careers-benefits-grid {
	display: grid;
	gap: 20px;
	margin-top: 36px;
}

@media (min-width: 640px)  { .cosmick-careers-benefits-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .cosmick-careers-benefits-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.cosmick-careers-benefit-card {
	background: var(--cm26-card);
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-card);
	box-shadow: var(--cm26-shadow-card);
	padding: 28px;
}

.cosmick-careers-benefit-icon { color: var(--cm26-brand); margin-bottom: 12px; }

/* ---- the application form ---- */

.cosmick-careers-form-container {
	background: var(--cm26-card);
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-card);
	box-shadow: var(--cm26-shadow-card);
	padding: 24px;
}

@media (min-width: 768px) { .cosmick-careers-form-container { padding: 32px; } }

.cosmick-careers-form-section-title {
	font-family: var(--cm26-font-display);
	font-size: 18px;
	font-weight: 700;
	padding-top: 24px;
	margin-bottom: 16px;
	border-top: 1px solid var(--cm26-line);
}

.cosmick-careers-form-section:first-of-type .cosmick-careers-form-section-title { border-top: 0; padding-top: 0; }

.cosmick-careers-form-row { display: grid; gap: 16px; }

@media (min-width: 640px) { .cosmick-careers-form-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.cosmick-careers-form-group { display: grid; gap: 6px; margin-bottom: 16px; min-width: 0; }

.cosmick-careers-form-label {
	font-family: var(--cm26-font-display);
	font-size: 14.5px;
	font-weight: 600;
	color: var(--cm26-ink);
}

.cosmick-careers-form-input,
.cosmick-careers-form-select,
.cosmick-careers-form-textarea {
	width: 100%;
	min-height: 48px;
	padding: 11px 14px;
	background: var(--cm26-card);
	color: var(--cm26-ink);
	border: 1.5px solid var(--cm26-input-border);
	border-radius: var(--cm26-radius-input);
	font-family: var(--cm26-font-body);
	font-size: 16px;
	transition: border-color .15s var(--cm26-ease), box-shadow .15s var(--cm26-ease);
}

.cosmick-careers-form-textarea { min-height: 132px; resize: vertical; }

.cosmick-careers-form-input:hover,
.cosmick-careers-form-select:hover,
.cosmick-careers-form-textarea:hover { border-color: var(--cm26-input-hover); }

.cosmick-careers-form-input:focus,
.cosmick-careers-form-select:focus,
.cosmick-careers-form-textarea:focus {
	border-color: var(--cm26-brand-ink);
	outline: none;
	box-shadow: 0 0 0 3px rgba(184, 53, 43, .18);
}

.cosmick-careers-form-input[aria-invalid="true"],
.cosmick-careers-form-input.is-invalid { border-color: var(--cm26-error-line); }

/* Upload control. The real <input type="file"> keeps its own label association
   and its accept list; this only styles the surface around it. */
.cosmick-careers-file-upload {
	display: grid;
	gap: 6px;
	padding: 20px;
	background: var(--cm26-sand);
	border: 1.5px dashed var(--cm26-input-border);
	border-radius: var(--cm26-radius-input);
	text-align: center;
}

.cosmick-careers-file-upload:focus-within {
	border-color: var(--cm26-brand-ink);
	border-style: solid;
	box-shadow: 0 0 0 3px rgba(184, 53, 43, .18);
}

.cosmick-careers-file-upload-icon { color: var(--cm26-brand-ink); }
.cosmick-careers-file-upload-text { font-family: var(--cm26-font-display); font-weight: 600; }
.cosmick-careers-file-upload-hint { font-size: 13.5px; color: var(--cm26-stone); }
.cosmick-careers-file-name { font-size: 14px; color: var(--cm26-body); font-weight: 500; }

.cosmick-careers-checkbox-group { display: grid; gap: 10px; }

.cosmick-careers-checkbox-label {
	display: grid;
	grid-template-columns: 22px 1fr;
	align-items: start;
	gap: 10px;
	padding: 10px 12px;
	background: var(--cm26-card);
	border: 1px solid var(--cm26-line);
	border-radius: var(--cm26-radius-input);
	font-size: 15px;
	line-height: 1.4;
	cursor: pointer;
}

.cosmick-careers-checkbox-label:has(input:checked) {
	border-color: var(--cm26-brand-ink);
	background: var(--cm26-tint);
}

.cosmick-careers-checkbox-label input[type="checkbox"] {
	width: 18px;
	height: 18px;
	margin-top: 2px;
	accent-color: var(--cm26-brand-ink);
}

.cosmick-careers-required-note { font-size: 13.5px; color: var(--cm26-stone); }

/* Errors never rely on colour alone — the message text carries it too. */
.cosmick-careers-error-message,
.cosmick-careers-form-error {
	padding: 8px 10px;
	background: rgba(163, 34, 26, .07);
	border-left: 3px solid var(--cm26-error);
	border-radius: 6px;
	font-size: 13.5px;
	font-weight: 500;
	color: var(--cm26-error);
}

.cosmick-careers-loading { color: var(--cm26-stone); font-size: 14px; }

.cosmick-careers-form button[type="submit"],
.cosmick-careers-form .cosmick-careers-submit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	padding: 0 22px;
	border: 1.5px solid transparent;
	border-radius: var(--cm26-radius);
	background: var(--cm26-brand-ink);
	color: var(--cm26-on-brand);
	font-family: var(--cm26-font-display);
	font-size: 15px;
	font-weight: 700;
	cursor: pointer;
	transition: background-color .18s var(--cm26-ease);
}

.cosmick-careers-form button[type="submit"]:hover { background: var(--cm26-brand-hover); }
.cosmick-careers-form button[type="submit"]:disabled { opacity: .55; cursor: not-allowed; }
