/**
 * Services listing page — visual reskin.
 *
 * ⚠️ PRESENTATION ONLY. No markup, no template, no block config.
 *
 * Every selector here hooks onto what the Services listing type (260) already
 * renders through MyListing's own single-page builder, so the block builder
 * keeps working: reorder or remove a block in the admin and this skin follows
 * it. Nothing here adds, removes, or relabels a control — a button that says
 * "Leave a review" still says "Leave a review", because restyling a control
 * into looking like a different one is how a page starts lying to people.
 *
 * Scoped to `body.type-services` throughout. That class is on the <body> of
 * every services listing and nothing else, which is what makes this safe to
 * apply to all of them at once without touching the other listing types.
 *
 * Block anatomy every rule below relies on:
 *   div.col-md-12.block-type-<X>
 *     div.element
 *       div.pf-head  >  div.title-style-1  >  i.mi.<glyph> + h3.title-style-1__heading
 *       div.pf-body
 */

/* ═══════════════════════════════════════════════════════════════════════════
   0. TOKENS
   Sampled from the mockup. Primary defers to the site variable so a palette
   change still reaches this page; the rest are this skin's own.
   ═══════════════════════════════════════════════════════════════════════════ */

body.type-services {
	--sk-teal:        var(--mfv-primary, #0e7490);
	--sk-teal-deep:   #0b5a6e;
	--sk-teal-ink:    #084a5c;
	--sk-teal-wash:   #e4f1f4;
	--sk-teal-line:   #cfe6ea;

	--sk-orange:      #ef8b32;
	--sk-orange-dark: #dd7a22;
	--sk-orange-wash: #fdeedd;

	--sk-navy:        #0c1a22;
	--sk-pink:        #fdeceb;
	--sk-pink-ink:    #d0524e;
	--sk-cream:       #fdf5e6;
	--sk-cream-line:  #f3e4c8;

	--sk-ink:         #16232e;
	--sk-muted:       #6b7d8c;
	--sk-line:        #e6ecf1;
	--sk-card:        #ffffff;
	--sk-page:        #f7f9fa;

	/*
	 * ⚠️ Matched to the shared skin (mfv-listing-skin.css), not chosen here.
	 * These were 16px / 10px, which made services the one page whose cards were
	 * visibly rounder than every other listing type. The radius is a
	 * site-wide decision, so it follows the shared value.
	 */
	--sk-r:           7px;    /* card radius */
	--sk-r-sm:        6px;    /* chip radius */
	--sk-shadow:      0 1px 2px rgba(22, 35, 46, .04), 0 8px 24px rgba(22, 35, 46, .05);
}

body.type-services { background: var(--sk-page); }

/* ═══════════════════════════════════════════════════════════════════════════
   1. HERO — see mfv-listing-skin.css
   The services hero used to be its own thing: a dark teal rounded card floating
   bottom-left over the cover, with a second, differently-built version for
   mobile. It is now the shared hero every listing type uses — cover 380px, a
   vertical wash, the identity in plain white type bottom-left with the emblem
   inline, and the actions bottom-right.
   Both blocks (desktop and mobile) were REMOVED rather than overridden: two
   hero treatments on one cover do not average, they fight, and the loser is
   whichever the cascade happens to reach second. Recoverable from git.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   2. TAB BAR — active tab becomes a filled teal pill
   ═══════════════════════════════════════════════════════════════════════════ */

body.type-services .profile-header {
	background: var(--sk-card);
	border-bottom: 1px solid var(--sk-line);
	box-shadow: none;
}

body.type-services .profile-menu > ul {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 8px;
	padding: 14px 0;
}

body.type-services .profile-menu > ul > li { float: none; margin: 0; }

body.type-services .profile-menu a.listing-tab-toggle {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 38px;
	padding: 0 20px;
	border: 0;
	border-radius: 999px;
	background: transparent;
	color: var(--sk-muted) !important;
	font-size: 14px;
	font-weight: 600;
	line-height: 1;
	transition: background .16s ease, color .16s ease;
}

body.type-services .profile-menu > ul > li:not(.active) a.listing-tab-toggle:hover {
	background: var(--sk-teal-wash);
	color: var(--sk-teal) !important;
}

body.type-services .profile-menu > ul > li.active a.listing-tab-toggle {
	background: var(--sk-teal);
	color: #fff !important;
	box-shadow: 0 4px 12px rgba(10, 74, 92, .22);
}

/* The theme draws the active state as an underline; the pill replaces it. */
body.type-services .profile-menu > ul > li.active a.listing-tab-toggle::after,
body.type-services .profile-menu > ul > li a.listing-tab-toggle::after { display: none; }

body.type-services .profile-menu .mfv-tab-icon { display: inline-flex; font-size: 16px; }

body.type-services .profile-menu .items-counter {
	min-width: 20px;
	height: 20px;
	padding: 0 6px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .22);
	font-size: 11px;
	font-weight: 700;
	line-height: 20px;
	text-align: center;
}

body.type-services .profile-menu > ul > li:not(.active) .items-counter {
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
}

/* ═══════════════════════════════════════════════════════════════════════════
   3. QUICK ACTIONS — light outlined pills with coloured icons
   ═══════════════════════════════════════════════════════════════════════════ */

body.type-services .qla-container { padding-top: 20px; }

body.type-services .quick-listing-actions > ul {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: center;
	gap: 10px;
}

body.type-services .quick-listing-actions > ul > li { float: none; margin: 0; }

body.type-services .quick-listing-actions > ul > li > a,
body.type-services .quick-listing-actions > ul > li > button {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 40px;
	padding: 0 18px;
	border: 1px solid var(--sk-line);
	border-radius: 999px;
	/* ⚠️ `.quick-listing-actions > ul > li > a` sets background-color to
	   --mfl-primary with !important, which is why these stayed solid teal. */
	background: var(--sk-card) !important;
	color: var(--sk-ink) !important;
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1;
	box-shadow: 0 1px 2px rgba(22, 35, 46, .04);
	transition: border-color .16s ease, box-shadow .16s ease, transform .16s ease;
}

/*
 * ⚠️ White-on-white trap. The theme sets
 *   .quick-listing-actions > ul > li > a > i,
 *   .quick-listing-actions > ul > li > a span { color: #ffffff !important }
 * because its pills are solid teal. Turning the pill white without matching
 * that !important leaves a row of blank capsules — the icon and the label are
 * both still there, painted white on white.
 */
body.type-services .quick-listing-actions > ul > li > a span,
body.type-services .quick-listing-actions > ul > li > button span { color: var(--sk-ink) !important; }

body.type-services .quick-listing-actions > ul > li > a:hover,
body.type-services .quick-listing-actions > ul > li > button:hover {
	border-color: var(--sk-teal-line);
	box-shadow: 0 6px 16px rgba(22, 35, 46, .09);
	transform: translateY(-1px);
}

body.type-services .quick-listing-actions i { font-size: 16px; color: var(--sk-teal) !important; }

/* Bookmark and Report carry their own meaning, so they carry their own colour. */
body.type-services .quick-listing-actions .mylisting-bookmark-item i { color: var(--sk-orange) !important; }
body.type-services .quick-listing-actions > ul > li:last-of-type i { color: var(--sk-pink-ink) !important; }
body.type-services .quick-listing-actions .mfv-booking-trigger > a {
	border-color: transparent;
	/* The booking module paints this one itself, so it needs the same treatment. */
	background: var(--sk-teal) !important;
	color: #fff !important;
}

body.type-services .quick-listing-actions .mfv-booking-trigger > a span { color: #fff !important; }
body.type-services .quick-listing-actions .mfv-booking-trigger i { color: #fff !important; }

/* ═══════════════════════════════════════════════════════════════════════════
   4. OWNER-ONLY CARDS
   Rendered only for the listing owner and admins, so they are invisible to
   visitors — but they are the first two things the owner sees, and in the
   mockup they carry the strongest colour on the page.
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * ⚠️ EVERY ELEMENT IN THE OWNER CONTROLS BAR IS STYLED WITH AN INLINE
 * `style=""` ATTRIBUTE, so an ordinary rule here loses no matter how specific.
 *
 * That mismatch produced a real bug: `color:#fff` won (the inline colour has no
 * !important) while `background` lost to the inline `background:#fff`, leaving
 * the "Edit listing" button as white text on a white box — unreadable. Either
 * both sides of a colour pair carry !important, or neither may.
 *
 * Inline values being overridden here:
 *   .mfv-owner-controls        background:linear-gradient(#f0fdfa→#eff6ff); border:1px solid #a7f3d0
 *   .mfv-owner-controls__toggle  color:#0f172a
 *   .mfv-owner-controls__hint    color:#64748b
 *   .mfv-owner-controls__edit    color:#0e7490; background:#fff; border:1px solid #99f6e4
 * The CTA tiles keep their own state colours (#ecfdf5/#065f46, #fff7ed/#9a3412):
 * they are self-contained light cards and stay legible on the dark bar.
 */

/* ── Completion meter — mint card ── */
body.type-services .mfv-lc {
	padding: 20px 22px;
	border: 1px solid var(--sk-teal-line);
	border-radius: var(--sk-r);
	background: var(--sk-teal-wash);
	box-shadow: none;
}

body.type-services .mfv-lc__head {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 6px 16px;
	margin-bottom: 12px;
}

body.type-services .mfv-lc__title {
	font-size: 15.5px;
	font-weight: 600;
	color: var(--sk-teal-ink);
}

body.type-services .mfv-lc__title strong { font-weight: 800; }

body.type-services .mfv-lc__note {
	font-size: 11.5px;
	color: #7c99a2;
}

body.type-services .mfv-lc__bar {
	height: 9px;
	border-radius: 999px;
	background: rgba(11, 90, 110, .13);
	overflow: hidden;
}

body.type-services .mfv-lc__fill {
	display: block;
	height: 100%;
	border-radius: 999px;
	background: linear-gradient( 90deg, var(--sk-teal) 0%, #17a2b8 100% );
}

body.type-services .mfv-lc__missing {
	margin: 12px 0 0;
	font-size: 13px;
	color: #5d8290;
}

body.type-services .mfv-lc__btn {
	display: inline-flex;
	align-items: center;
	height: 40px;
	margin-top: 14px;
	padding: 0 20px;
	border: 0;
	border-radius: 999px;
	background: var(--sk-teal);
	color: #fff !important;
	font-size: 13.5px;
	font-weight: 600;
}

body.type-services .mfv-lc__btn:hover { background: var(--sk-teal-deep); }

/* ── Owner controls — near-black bar ── */
/*
 * Light, not black. The near-black slab read as a piece of another site sitting
 * between the mint completion card above it and the white blocks below — three
 * different grounds in three consecutive rows. A soft teal tint keeps the
 * owner-only strip reading as one band, and the CTA tiles inside are white
 * cards that still separate from it.
 */
body.type-services .mfv-owner-controls {
	border: 1px solid var(--sk-teal-line) !important;
	border-radius: var(--sk-r) !important;
	background: var(--sk-teal-wash) !important;
	box-shadow: none !important;
}

body.type-services .mfv-owner-controls__header {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 10px 14px;
	padding: 16px 20px;
}

/* ⚠️ Text colours must flip with the ground. These were white for the dark bar;
   left as-is they would be white on a pale tint — the same white-on-white class
   of bug the Edit button had. */
body.type-services .mfv-owner-controls__toggle,
body.type-services .mfv-owner-controls__toggle strong,
body.type-services .mfv-owner-controls__title {
	color: var(--sk-teal-ink) !important;
}

body.type-services .mfv-owner-controls__hint { color: #5d8290 !important; }

body.type-services .mfv-owner-controls__chevron { color: var(--sk-teal) !important; }

body.type-services .mfv-owner-controls__badge {
	background: #fff !important;
	border-color: var(--sk-teal-line) !important;
	color: var(--sk-teal) !important;
}

body.type-services .mfv-owner-controls__badge i,
body.type-services .mfv-owner-controls__badge svg {
	color: var(--sk-orange);
	fill: var(--sk-orange);
	font-size: 17px;
}

body.type-services .mfv-owner-controls__hint {
	flex: 1 1 220px;
	font-size: 12px;
	color: rgba(255, 255, 255, .58);
}

body.type-services .mfv-owner-controls__toggle {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 38px;
	padding: 0 16px;
	border: 1px solid rgba(255, 255, 255, .22);
	border-radius: 10px;
	background: rgba(255, 255, 255, .06);
	color: #fff;
	font-size: 13px;
	font-weight: 600;
}

body.type-services .mfv-owner-controls__toggle:hover { background: rgba(255, 255, 255, .12); }

/* ⚠️ background AND border need !important here or the button is white text on
   the inline white background — the exact unreadable state reported. */
body.type-services .mfv-owner-controls__edit {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	height: 34px;
	padding: 0 16px !important;
	border: 1px solid transparent !important;
	border-radius: 999px !important;
	background: var(--sk-orange) !important;
	color: #fff !important;
	font-size: 12.5px !important;
	font-weight: 700 !important;
	white-space: nowrap;
}

body.type-services .mfv-owner-controls__edit:hover { background: var(--sk-orange-dark) !important; }

body.type-services .mfv-owner-controls__tile {
	border-radius: 12px;
}

/* ── Booking prompt — dark teal card ── */
body.type-services .mfv-owner-cta-col > * ,
body.type-services .mfv-owner-cta {
	border: 0;
	border-radius: var(--sk-r);
	background: linear-gradient( 155deg, var(--sk-teal-deep) 0%, var(--sk-teal-ink) 100% );
	box-shadow: 0 10px 26px rgba(8, 60, 74, .22);
	color: #fff;
}

body.type-services .mfv-owner-cta__eyebrow {
	display: block;
	margin-bottom: 8px;
	font-size: 10px;
	font-weight: 700;
	letter-spacing: .12em;
	text-transform: uppercase;
	color: rgba(255, 255, 255, .55);
}

body.type-services .mfv-owner-cta__title {
	margin: 0 0 8px;
	font-size: 16px;
	font-weight: 700;
	line-height: 1.35;
	color: #fff;
}

body.type-services .mfv-owner-cta__body {
	font-size: 13px;
	line-height: 1.6;
	color: rgba(255, 255, 255, .78);
}

body.type-services .mfv-owner-cta__quota {
	margin-top: 12px;
	padding-top: 12px;
	border-top: 1px solid rgba(255, 255, 255, .14);
	font-size: 11.5px;
	color: rgba(255, 255, 255, .6);
}

body.type-services .mfv-owner-cta-col a:not(.mfv-owner-cta__link),
body.type-services .mfv-owner-cta a.button,
body.type-services .mfv-owner-cta__btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	height: 42px;
	margin-top: 14px;
	padding: 0 20px;
	border-radius: 999px;
	background: var(--sk-orange);
	color: #fff !important;
	font-size: 13.5px;
	font-weight: 700;
}

body.type-services .mfv-owner-cta-col a:not(.mfv-owner-cta__link):hover { background: var(--sk-orange-dark); }

/*
 * ⚠️ The booking module prints its OWN `<style>` block in the body with
 *   .mfv-owner-cta__btn { background:#0e7490 !important }
 * for the `--blue` variant. Being inline and in the body, it sits later in the
 * cascade than this file, so a matching-specificity !important still loses —
 * and the result is a teal button on a teal card, which is the weakest contrast
 * pairing on the page. The extra ancestor is what actually wins it.
 */
body.type-services .mfv-owner-cta .mfv-owner-cta__btn,
body.type-services .mfv-owner-cta--blue .mfv-owner-cta__btn {
	background: var(--sk-orange) !important;
	color: #fff !important;
}

body.type-services .mfv-owner-cta .mfv-owner-cta__btn:hover {
	background: var(--sk-orange-dark) !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   5. BLOCK SHELL — the card, and the icon chip beside every title
   ═══════════════════════════════════════════════════════════════════════════ */

body.type-services .profile-body { background: transparent; }
body.type-services .tab-template-content-sidebar > .row { row-gap: 0; }

body.type-services .cts-column-wrapper > [class*='block-type-'] { margin-bottom: 20px; }

body.type-services [class*='block-type-'] > div.element {
	padding: 0 0 18px;
	border: 1px solid var(--sk-line);
	border-radius: var(--sk-r);
	background: var(--sk-card);
	box-shadow: var(--sk-shadow);
	overflow: hidden;
}

/* The theme paints .pf-head as a grey bar. The mockup has no bar — the title
   sits directly on the card with an icon chip beside it. */
body.type-services [class*='block-type-'] .pf-head {
	padding: 18px 20px 0;
	border: 0;
	/* ⚠️ `.element .pf-head { background: var(--mfl-bg-cool) !important }` paints
	   the grey bar. !important is required to remove it — specificity alone
	   loses to an !important declaration regardless of weight. */
	background: none !important;
}

body.type-services [class*='block-type-'] .title-style-1 {
	display: flex;
	align-items: center;
	gap: 11px;
	margin: 0;
	padding: 0;
	border: 0;
}

body.type-services [class*='block-type-'] .title-style-1__heading {
	margin: 0;
	font-size: 16px;
	font-weight: 700;
	line-height: 1.3;
	color: var(--sk-ink);
	letter-spacing: -.005em;
}

/* ── The icon chip ──────────────────────────────────────────────────────────
   Rounded square, tinted background, teal glyph. Applied to the block title
   icon ONLY — never .listing-rating's stars, which are also i.mi. */
body.type-services [class*='block-type-'] .title-style-1 > i {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 38px;
	height: 38px;
	border-radius: 11px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-size: 21px;
	line-height: 1;
}

/*
 * Blocks whose title carries NO icon — the gallery is one — get a chip anyway,
 * so the column reads as one rhythm instead of one odd row. `:has()` is what
 * makes "only when there is no <i>" expressible in CSS at all.
 */
body.type-services [class*='block-type-'] .title-style-1:not(:has(> i))::before {
	content: 'photo_library';
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 38px;
	height: 38px;
	border-radius: 11px;
	background: var(--sk-orange-wash);
	color: var(--sk-orange);
	font-family: 'Material Icons', 'Material Icons Outlined', sans-serif;
	font-size: 21px;
	font-weight: 400;
	font-style: normal;
	line-height: 1;
	letter-spacing: normal;
	text-transform: none;
	-webkit-font-feature-settings: 'liga';
	font-feature-settings: 'liga';
}

/* Per-block accent, matching the mockup's alternation. */
body.type-services .block-type-gallery .title-style-1 > i,
body.type-services .block-type-tags .title-style-1 > i,
body.type-services .block-type-reviews > .element:first-child .title-style-1 > i,
body.type-services .block-type-location .title-style-1 > i {
	background: var(--sk-orange-wash);
	color: var(--sk-orange);
}

body.type-services [class*='block-type-'] .pf-body { padding: 14px 20px 0; }

/* ═══════════════════════════════════════════════════════════════════════════
   6. INDIVIDUAL BLOCKS
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Work Portfolio ── */
body.type-services .block-type-gallery .gallerySlider .galleryPreview .owl-item img,
body.type-services .block-type-gallery .galleryPreview .item {
	border-radius: 12px;
}

body.type-services .block-type-gallery .gallery-thumb .owl-item img {
	border-radius: 10px;
	opacity: .72;
	transition: opacity .16s ease, box-shadow .16s ease;
}

body.type-services .block-type-gallery .gallery-thumb .owl-item.current img,
body.type-services .block-type-gallery .gallery-thumb .owl-item:hover img {
	opacity: 1;
	box-shadow: 0 0 0 3px var(--sk-orange);
}

body.type-services .block-type-gallery .gallery-nav ul {
	display: flex;
	justify-content: center;
	gap: 8px;
}

body.type-services .block-type-gallery .gallery-nav ul li {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border: 1px solid var(--sk-line);
	border-radius: 50%;
	color: var(--sk-muted);
	cursor: pointer;
}

body.type-services .block-type-gallery .gallery-nav ul li:hover {
	border-color: var(--sk-teal-line);
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
}

/* ── About us ── */
body.type-services .block-type-text .pf-body {
	font-size: 14.5px;
	line-height: 1.72;
	color: #4c6068;
}

/* ── Services & Pricing ── */
body.type-services .mfv-svc-list { margin: 0; padding: 0; }

body.type-services li.mfv-svc {
	display: grid;
	grid-template-columns: 36px 1fr;
	column-gap: 12px;
	padding: 13px 0;
	border-bottom: 1px solid var(--sk-line);
}

body.type-services li.mfv-svc:last-child { border-bottom: 0; }

/* A leading chip per row. The chip is a real element now — mfv-place-sidebar-cards.php
   emits `.mfv-svc__icon` with a vector icon resolved per service (owner's pick →
   title keywords → listing category → trades fallback). This used to be a
   `::before` carrying one Material `handyman` glyph for every row, which put
   crossed tools on a tutoring academy's essay coaching. */
body.type-services li.mfv-svc .mfv-svc__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	grid-row: 1 / span 2;
	width: 36px;
	height: 36px;
	border-radius: 11px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
}

body.type-services li.mfv-svc .mfv-svc__icon svg {
	width: 20px;
	height: 20px;
	display: block;
}

/* Rows rendered before the icon element existed (cached HTML) keep a chip. */
body.type-services li.mfv-svc:not(:has(.mfv-svc__icon))::before {
	content: 'handyman';
	display: inline-flex;
	align-items: center;
	justify-content: center;
	grid-row: 1 / span 2;
	width: 36px;
	height: 36px;
	border-radius: 11px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-family: 'Material Icons', 'Material Icons Outlined', sans-serif;
	font-size: 20px;
	font-style: normal;
	line-height: 1;
	-webkit-font-feature-settings: 'liga';
	font-feature-settings: 'liga';
}

body.type-services .mfv-svc__head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
}

body.type-services .mfv-svc__name {
	font-size: 14.5px;
	font-weight: 700;
	color: var(--sk-ink);
}

body.type-services .mfv-svc__price {
	flex: 0 0 auto;
	padding: 4px 11px;
	border-radius: 999px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-size: 12px;
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

body.type-services .mfv-svc__desc {
	margin-top: 3px;
	font-size: 13px;
	line-height: 1.6;
	color: var(--sk-muted);
}

/* ── Credentials ── */
body.type-services .mfv-place-list--cred { margin: 0; padding: 0; }

body.type-services li.mfv-place-cred {
	display: flex;
	align-items: flex-start;
	gap: 11px;
	padding: 11px 0;
	border-bottom: 1px solid var(--sk-line);
}

body.type-services li.mfv-place-cred:last-child { border-bottom: 0; }

body.type-services .mfv-place-cred__ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 22px;
	height: 22px;
	margin-top: 1px;
	border-radius: 50%;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-size: 12px;
	line-height: 1;
}

body.type-services .mfv-place-cred__body { font-size: 13.5px; line-height: 1.45; }
body.type-services .mfv-place-cred__body strong,
body.type-services .mfv-place-cred__body b { font-weight: 700; color: var(--sk-ink); }
body.type-services .mfv-place-cred__body small,
body.type-services .mfv-place-cred__body span { color: var(--sk-muted); font-size: 12px; }

/* ── Hours — the mockup's soft pink "Closed" card ── */
/*
 * ⚠️ `overflow: hidden` on the card (needed so gallery images honour the rounded
 * corners) CLIPPED the hours tooltip — it opens upward out of the header and was
 * sliced off mid-word. Nothing in this block needs clipping, so it opts out.
 */
body.type-services .block-type-work_hours > div.element {
	border-color: #f7d9d7;
	background: var(--sk-pink);
	overflow: visible;
}

body.type-services .block-type-work_hours .pf-head,
body.type-services .block-type-work_hours .title-style-1 { overflow: visible; }

/* And it must sit above the neighbouring cards, or it is hidden behind them. */
body.type-services .block-type-work_hours .tooltip-element,
body.type-services .block-type-work_hours [class*='tooltip'] { z-index: 30; }

body.type-services .block-type-work_hours .title-style-1 > i {
	background: rgba(208, 82, 78, .12);
	color: var(--sk-pink-ink);
}

body.type-services .work-hours-status.closed,
body.type-services .block-type-work_hours .work-hours-status {
	font-size: 16px;
	font-weight: 700;
	color: var(--sk-pink-ink);
}

body.type-services .block-type-work_hours .work-hours-status.open { color: #1c8a5f; }

body.type-services .block-type-work_hours > div.element:has(.work-hours-status.open) {
	border-color: #cfe9dc;
	background: #edf8f2;
}

body.type-services .block-type-work_hours > div.element:has(.work-hours-status.open) .title-style-1 > i {
	background: rgba(28, 138, 95, .12);
	color: #1c8a5f;
}

body.type-services .block-type-work_hours .timing-today {
	font-size: 12.5px;
	color: #8a6f6d;
}

/*
 * ── Detail tables ──
 *
 * ⚠️ Deliberately NOT tinted cream, and deliberately NOT re-iconed.
 *
 * The mockup's cream card is the Pricing block specifically, but all three
 * sidebar tables — Pricing, Listing Info and Credentials — are `block-type-table`
 * with nothing in the markup to tell them apart. Tinting the selector tinted all
 * three and stamped a `payments` icon on "Listing Info", which then claimed to
 * be about money. A wrong label is worse than a plain card, so they stay plain.
 *
 * To get the cream Pricing card exactly: give that one block a CSS class in
 * Listing Types → Services → Single Page (the block's `class` field, which is
 * already there and empty) and the rule below can target it.
 */
body.type-services .cts-right-column .block-type-table.mfv-block-pricing > div.element {
	border-color: var(--sk-cream-line);
	background: var(--sk-cream);
}

body.type-services .cts-right-column .block-type-table.mfv-block-pricing .title-style-1 > i {
	background: rgba(239, 139, 50, .14);
	color: var(--sk-orange);
}

body.type-services .cts-right-column .block-type-table.mfv-block-pricing .title-style-1 > i.mi::before {
	content: 'payments';
}

body.type-services .block-type-table .pf-body {
	font-size: 13.5px;
	line-height: 1.65;
	color: #4c6068;
}

body.type-services .cts-left-column .block-type-table > div.element {
	border-color: var(--sk-line);
	background: var(--sk-card);
}

body.type-services .cts-left-column .block-type-table .pf-body { color: #4c6068; }

body.type-services .block-type-table .extra-details > li,
body.type-services .block-type-table table tr {
	border-bottom: 1px solid rgba(22, 35, 46, .07);
}

body.type-services .block-type-table .extra-details > li:last-child,
body.type-services .block-type-table table tr:last-child { border-bottom: 0; }

/* ── Map ── */
body.type-services .block-type-location .marker-holder,
body.type-services .block-type-location .mapboxgl-map,
body.type-services .block-type-location .map-holder {
	border-radius: 12px;
	overflow: hidden;
}

/*
 * A light brand wash over the map tiles.
 *
 * ⚠️ `pointer-events: none` is not optional — an overlay that accepts clicks
 * swallows every pan, zoom and marker tap, and the map silently stops working.
 * The wash is deliberately weak: any heavier and street labels stop being
 * readable, which is the one thing a location map has to do.
 */
body.type-services .block-type-location .mapboxgl-map { position: relative; }

body.type-services .block-type-location .mapboxgl-map::after {
	content: '';
	position: absolute;
	inset: 0;
	z-index: 2;
	pointer-events: none;
	background: linear-gradient( 160deg,
		rgba(14, 116, 144, .10) 0%,
		rgba(14, 116, 144, .04) 45%,
		rgba(239, 139, 50, .06) 100% );
	box-shadow: inset 0 0 0 1px rgba(11, 74, 92, .10);
}

/* The controls must stay above the wash. */
body.type-services .block-type-location .mapboxgl-ctrl-group,
body.type-services .block-type-location .mapboxgl-ctrl-bottom-left,
body.type-services .block-type-location .mapboxgl-ctrl-bottom-right,
body.type-services .block-type-location .mapboxgl-marker { z-index: 3; }

body.type-services .block-type-location .mapboxgl-ctrl-group {
	border: 0;
	border-radius: 10px;
	box-shadow: 0 2px 8px rgba(22, 35, 46, .18);
}

/* ── Tags / terms — soft pills ── */
body.type-services .block-type-tags .pf-body,
body.type-services .block-type-terms .pf-body {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	padding-bottom: 4px;
}

/*
 * ⚠️ Do NOT style the inner <span> as a pill.
 *
 * A tag renders as `<a><i/><span>Label</span></a>`. Including `span` in this
 * selector gave the label its OWN rounded, tinted pill inside the chip's pill —
 * a visible box-in-a-box on every "We Are Proudly" tag. Only the <a> is the chip.
 */
body.type-services .block-type-tags .pf-body a,
body.type-services .block-type-terms .pf-body a {
	display: inline-flex;
	align-items: center;
	margin: 0;
	padding: 6px 13px;
	border: 1px solid var(--sk-teal-line);
	border-radius: 999px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal) !important;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.3;
	transition: background .16s ease, transform .16s ease;
}

/* Consistency with the terms block: no disc behind a tag icon either, and the
   glyph sized to actually be identifiable. The theme draws a 40px #f4f4f4
   circle on `a i`, which is the same dotty texture removed from Services
   Provided — and it forced the chip to 54px tall for no information gained. */
body.type-services .block-type-tags .pf-body a {
	gap: 9px;
	min-height: 0;
}

body.type-services .block-type-tags .pf-body a > i {
	padding: 0 !important;
	border-radius: 0 !important;
	background: none !important;
	box-shadow: none !important;
	font-size: 20px !important;
	line-height: 1 !important;
	color: var(--sk-teal) !important;
}

/*
 * ⚠️ Two separate rules were cutting the label off — "24-hour-emerge…".
 *
 *   .pf-body > .social-nav li            width: 33.3%   (the same grid trap as
 *                                                        the terms block)
 *   .pf-body > .social-nav li a span     white-space:nowrap; overflow:hidden;
 *                                        text-overflow:ellipsis
 *
 * A tag is short by nature; there is nothing to gain by truncating it and a
 * whole word to lose, so the chip sizes to its label instead.
 */
body.type-services .block-type-tags .pf-body > ul {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0;
	padding: 0;
}

body.type-services .block-type-tags .pf-body > ul > li {
	width: auto;
	float: none;
	margin: 0;
	padding: 0;
	list-style: none;
}

body.type-services .block-type-tags .pf-body a > span {
	padding: 0 !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: none !important;
	color: inherit !important;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.3;
	max-width: none;
	overflow: visible;
	white-space: normal;
	text-overflow: clip;
}

body.type-services .block-type-tags .pf-body a:nth-child(even),
body.type-services .block-type-terms .pf-body a:nth-child(even) {
	border-color: #f6ddc2;
	background: var(--sk-orange-wash);
	color: var(--sk-orange-dark) !important;
}

body.type-services .block-type-tags .pf-body a:hover,
body.type-services .block-type-terms .pf-body a:hover { transform: translateY(-1px); }

/* ── Reviews ──────────────────────────────────────────────────────────────
 *
 * The block holds two .element children: the review list and the submission
 * form. They used to sit side by side, which spent half the width on an empty
 * form and left no room to state a score at all.
 *
 * Now the form is parked (mfv-services-skin.js sets [hidden] on it and reveals
 * it from the Write a Review button) and the summary rail takes its place
 * beside the list — so the block itself is a single column again and the grid
 * moved inward, onto .pf-body.
 *
 * ⚠️ If the JS never runs, none of the mfv-sv-rev__* classes exist: the block
 * stays one column with the form below the list. Readable, just not the skin.
 * ── */

body.type-services .block-type-reviews .comment-container,
body.type-services .tab-type-comments .comment-container { padding: 0; border: 0; }

/*
 * ⚠️ Same absolute-avatar trap as the hero: `.comment-container .avatar` is
 * `position:absolute; top:0; left:20px`, so it sat on top of the reviewer's
 * name — "lavois campbell" rendered with a disc through the middle of it.
 * A flex row with the avatar back in the flow is the fix.
 */
/*
 * ⚠️ A single flex row could not hold name + date + stars once the ratings
 * started rendering: in a half-width column the names wrapped mid-person —
 * "Jordan / E.", "Manda / C.". An explicit 3-area grid stacks the name over
 * its date and pins the stars right, so nothing has to shrink.
 *
 * ⚠️ Every area is placed by NAME, never by source order — this page has a
 * documented habit of gaining an injected empty <div> as a first child, and
 * implicit placement hands that ghost the first cell.
 */
body.type-services .block-type-reviews .comment-head,
body.type-services .tab-type-comments .comment-head {
	display: grid;
	grid-template-columns: 40px minmax(0, 1fr) auto;
	grid-template-areas:
		'avatar name  stars'
		'avatar date  stars';
	align-items: center;
	column-gap: 11px;
	row-gap: 1px;
	margin-bottom: 10px;
}

body.type-services .block-type-reviews .c27-user-avatar,
body.type-services .tab-type-comments .c27-user-avatar {
	grid-area: avatar;
	width: 40px;
	height: 40px;
}

body.type-services .block-type-reviews .comment-container img.avatar,
body.type-services .tab-type-comments .comment-container img.avatar,
body.type-services .block-type-reviews .c27-user-avatar img,
body.type-services .tab-type-comments .c27-user-avatar img {
	position: static;
	width: 40px;
	height: 40px;
	border-radius: 50%;
}

body.type-services .block-type-reviews .comment-head > h5,
body.type-services .tab-type-comments .comment-head > h5 {
	grid-area: name;
	min-width: 0;
	margin: 0 !important;
	font-size: 14px !important;
	font-weight: 700 !important;
	line-height: 1.3 !important;
	color: var(--sk-ink) !important;
}

body.type-services .block-type-reviews .comment-head > .comment-date,
body.type-services .tab-type-comments .comment-head > .comment-date {
	grid-area: date;
	min-width: 0;
	font-size: 12px;
	line-height: 1.3;
	color: var(--sk-muted);
}

/*
 * ⚠️ `.listing-review-rating` is `position:absolute; top:20px; right:20px`,
 * anchored to the comment container. Once the head became a flex row the stars
 * landed straight on top of the date. Returning them to the flow and pushing
 * them to the end keeps the same visual position without the collision.
 */
body.type-services .block-type-reviews .comment-head > .listing-rating,
body.type-services .tab-type-comments .comment-head > .listing-rating {
	grid-area: stars;
	position: static;
	display: inline-flex;
	align-items: center;
	gap: 1px;
	justify-self: end;
}

body.type-services .block-type-reviews .comment-head > .listing-rating i,
body.type-services .tab-type-comments .comment-head > .listing-rating i {
	font-size: 14px;
	color: var(--sk-orange) !important;
}

body.type-services .block-type-reviews .comment-body,
body.type-services .tab-type-comments .comment-body,
body.type-services .block-type-reviews .comment-text,
body.type-services .tab-type-comments .comment-text {
	font-size: 13.5px;
	line-height: 1.65;
	color: #4c6068;
}

body.type-services .block-type-reviews .comments-list > li.comment,
body.type-services .tab-type-comments .comments-list > li.comment {
	padding: 0;
	border: 0;
}

/*
 * ⚠️ The theme fills every other review with #fbfbfb (`.comment.alt
 * .comment-container`). Against the rail that striping read as if alternate
 * reviews were a different kind of thing, and the fill ran wider than the text
 * it was meant to group. A hairline between reviews separates them without
 * implying a difference — so the fill goes, and the rule stays off the last
 * one, which has nothing after it to divide from.
 */
body.type-services .block-type-reviews .comments-list > li.comment .comment-container,
body.type-services .tab-type-comments .comments-list > li.comment .comment-container {
	background: transparent !important;
	padding: 16px 0;
}

body.type-services .block-type-reviews .comments-list > li.comment + li.comment > .comment-container,
body.type-services .tab-type-comments .comments-list > li.comment + li.comment > .comment-container {
	border-top: 1px solid var(--sk-line);
}

body.type-services .block-type-reviews .comments-list > li.comment:first-child > .comment-container,
body.type-services .tab-type-comments .comments-list > li.comment:first-child > .comment-container { padding-top: 0; }
body.type-services .block-type-reviews .comments-list > li.comment:last-child  > .comment-container,
body.type-services .tab-type-comments .comments-list > li.comment:last-child  > .comment-container { padding-bottom: 0; }

body.type-services .block-type-reviews .comment-form textarea,
body.type-services .tab-type-comments .comment-form textarea,
body.type-services .block-type-reviews .comment-form input[type='text'],
body.type-services .tab-type-comments .comment-form input[type='text'],
body.type-services .block-type-reviews .comment-form input[type='email'],
body.type-services .tab-type-comments .comment-form input[type='email'] {
	border: 1px solid var(--sk-line) !important;
	border-radius: 12px !important;
	background: #fafcfd !important;
	font-size: 13.5px !important;
}

/*
 * ⚠️ Submit buttons in this theme are declared with !important, and a plain
 * override loses the tie on specificity alone. The extra body/class weight
 * here is what makes the teal actually apply.
 */
body.type-services .block-type-reviews .comment-form input[type='submit'],
body.type-services .tab-type-comments .comment-form input[type='submit'],
body.type-services .block-type-reviews .comment-form button[type='submit'],
body.type-services .tab-type-comments .comment-form button[type='submit'],
body.type-services .sidebar-comment-form input[type='submit'] {
	height: 44px !important;
	padding: 0 24px !important;
	border: 0 !important;
	border-radius: 999px !important;
	background: var(--sk-teal) !important;
	color: #fff !important;
	font-size: 14px !important;
	font-weight: 700 !important;
	box-shadow: 0 6px 16px rgba(10, 74, 92, .2) !important;
}

body.type-services .block-type-reviews .comment-form input[type='submit']:hover,
body.type-services .tab-type-comments .comment-form input[type='submit']:hover {
	background: var(--sk-teal-deep) !important;
}

body.type-services .block-type-reviews .stars-rating i,
body.type-services .tab-type-comments .stars-rating i,
body.type-services .block-type-reviews .listing-rating i,
body.type-services .tab-type-comments .listing-rating i { color: var(--sk-orange); }

/* ── The summary rail ─────────────────────────────────────────────────────
 *
 * Built by mfv-services-skin.js from numbers PHP passed it. Everything below
 * is inert until those classes exist, so the stock block is never left
 * half-styled.
 * ── */

body.type-services .mfv-sv-rev__grid { display: block; }

@media (min-width: 782px) {
	body.type-services .mfv-sv-rev__grid {
		display: grid;
		grid-template-columns: 216px minmax(0, 1fr);
		grid-template-areas: 'rail list';
		column-gap: 0;
		align-items: start;
	}

	body.type-services .mfv-sv-rev__rail { grid-area: rail; }
	body.type-services .mfv-sv-rev__list { grid-area: list; }

	/* No rail to show (no reviews, no imported rating) — give the list it all. */
	body.type-services .mfv-sv-rev--norail .mfv-sv-rev__grid {
		display: block;
	}

	body.type-services .mfv-sv-rev--norail .mfv-sv-rev__list {
		padding-left: 0;
		border-left: 0;
	}

	body.type-services .mfv-sv-rev__rail {
		position: sticky;
		top: 92px;
		padding-right: 26px;
	}

	/*
	 * ⚠️ The divider belongs to the LIST, not the rail. The rail is short
	 * (161px against a 778px list) and sticky, so a border on it drew a stub
	 * that stopped a fifth of the way down. The list is the tall column, so
	 * its left edge is the only one that reaches the bottom of the card.
	 */
	body.type-services .mfv-sv-rev__list {
		padding-left: 26px;
		border-left: 1px solid var(--sk-line);
	}
}

@media (max-width: 781.98px) {
	body.type-services .mfv-sv-rev__rail {
		margin-bottom: 22px;
		padding-bottom: 20px;
		border-bottom: 1px solid var(--sk-line);
	}
}

body.type-services .mfv-sv-rev__score {
	margin: 0 0 6px !important;
	font-size: 40px !important;
	font-weight: 800 !important;
	line-height: 1 !important;
	letter-spacing: -.02em;
	color: var(--sk-ink) !important;
}

/* The "6 reviews, none of them rated" case — a count is not a score. */
body.type-services .mfv-sv-rev__score--none {
	font-size: 22px !important;
	font-weight: 700 !important;
}

body.type-services .mfv-sv-rev__basis {
	margin: 8px 0 16px !important;
	font-size: 12.5px !important;
	line-height: 1.45;
	color: var(--sk-muted) !important;
}

/* ── Stars: a muted row with a coloured row clipped over it. ── */
body.type-services .mfv-sv-stars {
	position: relative;
	display: inline-block;
	line-height: 0;
	white-space: nowrap;
}

body.type-services .mfv-sv-stars__fill {
	position: absolute;
	top: 0;
	left: 0;
	overflow: hidden;
	white-space: nowrap;
}

body.type-services .mfv-sv-stars svg {
	width: 17px;
	height: 17px;
	margin-right: 2px;
	fill: currentColor;
	vertical-align: top;
}

body.type-services .mfv-sv-stars__base { color: #dfe6ec; }
body.type-services .mfv-sv-stars__fill { color: var(--sk-orange); }

/* ── Write a Review ───────────────────────────────────────────────────────
 * ⚠️ The theme declares its listing buttons with !important, so a plain
 * declaration here loses on specificity even when it is more specific in
 * spirit. This is deliberately weighted to win.
 * ── */
body.type-services .mfv-sv-rev__write {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 100%;
	min-height: 44px;              /* WCAG target size */
	padding: 0 18px !important;
	border: 1.5px solid var(--sk-teal) !important;
	border-radius: 999px !important;
	background: transparent !important;
	color: var(--sk-teal) !important;
	font-size: 13.5px !important;
	font-weight: 700 !important;
	line-height: 1.2 !important;
	cursor: pointer;
	transition: background .16s ease, color .16s ease;
}

body.type-services .mfv-sv-rev__write:hover,
body.type-services .mfv-sv-rev__write:focus-visible {
	background: var(--sk-teal) !important;
	color: #fff !important;
}

/* ── The parked form ──────────────────────────────────────────────────────
 * ⚠️ [hidden] is a UA rule and loses to any author `display`. Nothing here
 * sets display on .mfv-sv-rev__form, and this !important guarantees it stays
 * hidden even if a later rule ever does.
 * ── */
body.type-services .mfv-sv-rev__form[hidden] { display: none !important; }

/*
 * The form is its own .element, which the theme already gives card chrome —
 * so it needs spacing from the reviews card above it and nothing else. An
 * earlier border-top here drew a stray rule across the inside of that card,
 * just above its own "Add a review" heading.
 */
body.type-services .mfv-sv-rev__form { margin-top: 22px; }

/* ── The form's own close control ─────────────────────────────────────────
 * The theme's review form ships no cancel of any kind, so this is the only
 * dismissal that sits inside the panel itself.
 * ── */
body.type-services .mfv-sv-rev__form-head {
	display: flex;
	align-items: center;
	gap: 10px;
}

body.type-services .mfv-sv-rev__form-head > .title-style-1 { flex: 1 1 auto; min-width: 0; }

body.type-services .mfv-sv-rev__close {
	flex: 0 0 auto;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 44px;              /* WCAG target size — the glyph is 16px */
	height: 44px;
	margin-left: auto;
	padding: 0 !important;
	border: 0 !important;
	border-radius: 50% !important;
	background: transparent !important;
	color: var(--sk-muted) !important;
	cursor: pointer;
	transition: background .16s ease, color .16s ease;
}

body.type-services .mfv-sv-rev__close svg {
	width: 16px;
	height: 16px;
	fill: currentColor;
}

body.type-services .mfv-sv-rev__close:hover,
body.type-services .mfv-sv-rev__close:focus-visible {
	background: var(--sk-line) !important;
	color: var(--sk-ink) !important;
}

/* While the POST is in flight the panel stops accepting a second submit. */
body.type-services .mfv-sv-rev--saving .mfv-sv-rev__form {
	opacity: .6;
	pointer-events: none;
}

/*
 * ⚠️ The EDIT form's submit is a <button>, not an <input>, and it sits in a
 * bare <form> inside .sidebar-comment-form — so neither the .comment-form rule
 * above nor the input[type=submit] one reaches it, and "Update review" rendered
 * as an outlined ghost while "Submit review" was solid teal. Same control, two
 * looks, depending only on whether you had reviewed before.
 */
body.type-services .sidebar-comment-form button[type='submit'],
body.type-services .tab-type-comments .sidebar-comment-form button[type='submit'] {
	height: 44px !important;
	padding: 0 24px !important;
	border: 0 !important;
	border-radius: 999px !important;
	background: var(--sk-teal) !important;
	color: #fff !important;
	font-size: 14px !important;
	font-weight: 700 !important;
	box-shadow: 0 6px 16px rgba(10, 74, 92, .2) !important;
}

body.type-services .sidebar-comment-form button[type='submit']:hover {
	background: var(--sk-teal-deep) !important;
}

body.type-services .sidebar-comment-form button[type='submit'][disabled] {
	background: var(--sk-muted) !important;
	box-shadow: none !important;
	cursor: default;
}

/* ── Empty state — 15 of 18 services listings have no review yet, so this is
   the normal view, not the exception. Never a row of grey stars: an unrated
   listing and a badly rated one must not look alike. ── */
body.type-services .mfv-sv-rev__empty {
	padding: 26px 20px 30px;
	text-align: center;
}

body.type-services .mfv-sv-rev__empty-ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 52px;
	height: 52px;
	margin-bottom: 12px;
	border-radius: 50%;
	background: var(--sk-orange-wash);
	color: var(--sk-orange);
}

body.type-services .mfv-sv-rev__empty-ico svg {
	width: 24px;
	height: 24px;
	fill: currentColor;
}

body.type-services .mfv-sv-rev__empty-lead {
	margin: 0 0 6px !important;
	font-size: 16px !important;
	font-weight: 700 !important;
	color: var(--sk-ink) !important;
}

body.type-services .mfv-sv-rev__empty-sub {
	max-width: 34ch;
	margin: 0 auto !important;
	font-size: 13.5px !important;
	line-height: 1.6;
	color: var(--sk-muted) !important;
}

/* In the empty state the button carries the card, so it sizes to its text. */
body.type-services .mfv-sv-rev__empty .mfv-sv-rev__write {
	width: auto;
	margin-top: 18px;
}

/* ── The Reviews TAB's own empty state ────────────────────────────────────
 *
 * ⚠️ This page carries reviews TWICE — the About tab's block (restyled above)
 * and a separate Reviews tab that renders the same comments again. The JS rail
 * only builds on the block, so the tab kept the theme's stock empty state: a
 * `mood_bad` frowning face over "No reviews added yet."
 *
 * A frowning face is the wrong reading of an unrated listing — it says
 * something went wrong, when nothing has. There is no markup to rebuild here
 * (it is a bare .no-results-wrapper, not a block), so the icon is dropped and
 * the sentence is given the same weight as the block's invitation.
 * ── */

body.type-services .tab-type-comments .no-results-wrapper {
	padding: 30px 20px 34px;
	text-align: center;
}

body.type-services .tab-type-comments .no-results-wrapper .no-results-icon {
	display: none;
}

body.type-services .tab-type-comments .no_job_listings_found {
	display: block;
	font-size: 15px;
	font-weight: 700;
	color: var(--sk-ink);
	list-style: none;
}

/* ── Imported public rating (Google) ──────────────────────────────────────
 * Always visibly its source's, never blended into the average above it.
 * ── */
body.type-services .mfv-sv-rev__ext {
	margin-top: 20px;
	padding-top: 18px;
	border-top: 1px solid var(--sk-line);
}

/*
 * The rule above separates the imported rating from this site's own. When the
 * imported one leads the rail there is nothing above it to separate from, and
 * the border read as a stray line across the top of the card.
 */
body.type-services .mfv-sv-rev__ext:first-child {
	margin-top: 0;
	padding-top: 0;
	border-top: 0;
}

/* The quotes continue their own summary — no second rule between the two. */
body.type-services .mfv-sv-rev__ext--quotes {
	margin-top: 4px;
	padding-top: 0;
	border-top: 0;
}

body.type-services .mfv-sv-rev__ext-score {
	margin: 0 0 6px !important;
	font-size: 13px !important;
	color: var(--sk-muted) !important;
}

body.type-services .mfv-sv-rev__ext-score strong {
	font-size: 22px;
	font-weight: 800;
	color: var(--sk-ink);
}

body.type-services .mfv-sv-rev__ext-src { font-weight: 600; }

body.type-services .mfv-sv-rev__ext-basis {
	margin: 7px 0 10px !important;
	font-size: 12px !important;
	color: var(--sk-muted) !important;
}

body.type-services .mfv-sv-rev__ext-link {
	display: inline-block;
	margin-bottom: 4px;
	font-size: 13px;
	font-weight: 700;
	color: var(--sk-teal) !important;
}

/* Breathing room when the button follows the imported score rather than ours. */
body.type-services .mfv-sv-rev__ext + .mfv-sv-rev__write { margin-top: 12px; }

/*
 * ⚠️ The theme styles every <blockquote> as a pull quote: centred, uppercased,
 * letter-spaced, with a large decorative " glyph on a ::before. A Google
 * excerpt rendered that way was unreadable — "THE CINEMA IS BEAUTIFUL AND SO
 * OLD WITH CHARACTER…" down a 190px rail. These are quotations of ordinary
 * sentences, so every one of those decorations is reset here.
 */
body.type-services .mfv-sv-rev__ext-quote {
	margin: 12px 0 0;
	padding: 0 0 0 12px;
	border-left: 2px solid var(--sk-line);
	text-align: left !important;
	text-transform: none !important;
	letter-spacing: normal !important;
	font-style: normal !important;
}

/*
 * ⚠️ The 50px decorative " hangs off `blockquote p::before`, not off the
 * blockquote — resetting the blockquote's own pseudo-elements left it exactly
 * where it was, taking 60px of vertical space above every excerpt.
 */
body.type-services .mfv-sv-rev__ext-quote::before,
body.type-services .mfv-sv-rev__ext-quote::after,
body.type-services .mfv-sv-rev__ext-quote p::before,
body.type-services .mfv-sv-rev__ext-quote p::after {
	content: none !important;
	display: none !important;
}

body.type-services .mfv-sv-rev__ext-quote p {
	margin: 0 0 4px !important;
	font-size: 12.5px !important;
	font-weight: 400 !important;
	line-height: 1.55;
	text-align: left !important;
	text-transform: none !important;
	letter-spacing: normal !important;
	color: #4c6068 !important;
}

body.type-services .mfv-sv-rev__ext-quote cite {
	font-size: 11.5px;
	font-style: normal;
	color: var(--sk-muted);
}

body.type-services .mfv-sv-rev__ext-attrib {
	margin: 14px 0 0 !important;
	font-size: 11px !important;
	line-height: 1.5;
	color: #9aa9b4 !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   7. "YOU MAY ALSO BE INTERESTED IN" — the mint panel
   ═══════════════════════════════════════════════════════════════════════════ */

body.type-services .i-section.similar-listings {
	margin: 10px auto 44px;
	padding: 30px 26px 34px;
	border: 1px solid var(--sk-teal-line);
	border-radius: 26px;
	background: var(--sk-teal-wash);
}

/* ⚠️ The theme sizes every h1–h6 with !important, so this heading renders at
   38px unless the override carries !important too. */
body.type-services .similar-listings h2,
body.type-services .similar-listings h2.case27-primary-text,
body.type-services .similar-listings h3 {
	margin: 0 0 22px !important;
	font-size: 19px !important;
	font-weight: 700 !important;
	line-height: 1.3 !important;
	color: var(--sk-teal-ink) !important;
	text-align: center;
}

body.type-services .similar-listings .listing-preview,
body.type-services .similar-listings .case27-listing-preview {
	border: 1px solid rgba(11, 90, 110, .10);
	border-radius: 16px;
	background: var(--sk-card);
	box-shadow: 0 2px 4px rgba(22, 35, 46, .05);
	overflow: hidden;
	transition: box-shadow .18s ease, transform .18s ease;
}

body.type-services .similar-listings .listing-preview:hover {
	box-shadow: 0 12px 28px rgba(22, 35, 46, .12);
	transform: translateY(-2px);
}

body.type-services .similar-listings .listing-preview .lp-actions i,
body.type-services .similar-listings .listing-preview .actions i { color: var(--sk-teal); }

/* ═══════════════════════════════════════════════════════════════════════════
   8. RESPONSIVE
   ═══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 991px) {
	/*
	 * ⚠️ MOBILE IS A DIFFERENT LAYOUT, NOT A NARROWER ONE.
	 *
	 * Below 992px the theme renders the identity block in `.main-info-mobile`,
	 * a SIBLING that sits BELOW the cover — `.main-info-desktop` collapses to
	 * ~14px and holds nothing. So the desktop treatment (pin the card over the
	 * photograph, clip the section to the image height) does not merely look
	 * different here, it fights a layout that isn't there: forcing a height on
	 * the section clipped the carousel, and the card landed on white anyway.
	 *
	 * Mobile therefore keeps the theme's stacked hero untouched and only takes
	 * the colours.
	 */
	body.type-services .profile-cover-gallery {
		height: auto;
		min-height: 0;
		max-height: none;
		overflow: visible;
	}

	body.type-services .profile-cover-gallery .header-gallery-carousel,
	body.type-services .profile-cover-gallery .owl-stage-outer,
	body.type-services .profile-cover-gallery .owl-item .item {
		height: 300px;
		min-height: 300px;
		max-height: 300px;
	}

	body.type-services .profile-cover-gallery .main-info-desktop { position: static; }

	/* ⚠️ REMOVED: this used to force the card opaque, from when mobile stacked the
	   card BELOW the photo and translucency had nothing to reveal. The card now
	   overlaps the cover, so forcing it solid here would undo the transparency
	   the design asks for. */
	/* The tagline sits inside .pa-below-title, so it needs the shadow restated
	   after that container's is cleared — it is over glass and needs the help;
	   the stars, being solid amber, do not. */
	body.type-services .main-info-mobile .profile-name h1.case27-primary-text,
	body.type-services .main-info-mobile .profile-name h2.profile-tagline {
		text-shadow: 0 1px 3px rgba(6, 30, 38, .45) !important;
	}

	body.type-services .listing-main-buttons > ul { justify-content: flex-start; }
}

@media (max-width: 767px) {
	body.type-services .profile-name {
		width: 100%;
		padding: 12px 14px;
		border-radius: 14px;
	}

	body.type-services .profile-name h1.case27-primary-text { font-size: 17px !important; }
	body.type-services .profile-name .profile-avatar { width: 38px; height: 38px; }

	/* The identity card already carries the name, so the theme's separate mobile
	   info block would repeat it under the photo and double the hero's height. */
	body.type-services .main-info-desktop { padding-bottom: 14px; }

	body.type-services .listing-main-buttons > ul { gap: 8px; }

	body.type-services .listing-main-buttons li.lmb-calltoaction > a {
		height: 42px;
		padding: 0 16px;
		font-size: 13.5px;
	}

	body.type-services .listing-main-buttons li.price-or-date.is-price {
		min-height: 42px;
		padding: 5px 16px !important;
	}

	body.type-services [class*='block-type-'] .pf-head { padding: 16px 15px 0; }
	body.type-services [class*='block-type-'] .pf-body { padding: 12px 15px 0; }

	body.type-services .i-section.similar-listings {
		padding: 22px 14px 26px;
		border-radius: 20px;
	}

	/* A pill row that cannot fit scrolls rather than stacking into a tower. */
	body.type-services .quick-listing-actions > ul,
	body.type-services .profile-menu > ul {
		flex-wrap: nowrap;
		justify-content: flex-start;
		overflow-x: auto;
		scrollbar-width: none;
	}

	body.type-services .quick-listing-actions > ul::-webkit-scrollbar,
	body.type-services .profile-menu > ul::-webkit-scrollbar { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   9. ICON CORRECTIONS
   Three separate problems, all fixed the same way — by overriding ::before.
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * ⚠️ `.mi` icons in this theme are CODEPOINT-based, not ligature-based:
 * the class supplies the glyph through a `::before { content: "\e8ee" }` rule.
 * `<i class="mi verified">` has no such rule, so Trust Signals rendered NOTHING
 * — an empty box — and did so before this skin existed; the chip merely gave
 * the void an outline.
 *
 * Material Icons supports ligatures as well as codepoints, so writing the icon
 * NAME into content works and needs no font change. That also makes it the
 * mechanism for swapping an icon: three blocks (Services Provided, Service
 * Details, Pricing) all shipped the same generic `view_module` grid, which
 * reads as one repeated shrug down the column.
 */
body.type-services [class*='block-type-'] .title-style-1 > i.mi::before {
	font-family: 'Material Icons', 'Material Icons Outlined', sans-serif;
	font-weight: 400;
	font-style: normal;
	font-size: 21px;
	line-height: 1;
	letter-spacing: normal;
	text-transform: none;
	-webkit-font-feature-settings: 'liga';
	font-feature-settings: 'liga';
}

body.type-services .block-type-mfv_trust_signals .title-style-1 > i.mi::before { content: 'verified'; }
/* ⚠️ Scoped to the CATEGORY terms block only. Unscoped, this forced a tag glyph
   onto every terms block — including Accepted Payment, whose own `mi payments`
   icon was set in the admin and then silently overwritten here. */
body.type-services .block-type-terms:not(.mfv-block-payments) .title-style-1 > i.mi::before { content: 'sell'; }

/* ⚠️ `mi payments` has no codepoint rule in this theme either — same empty box
   as `mi verified`. Scoping the override off this block left it blank, so it
   needs its own ligature. */
body.type-services .mfv-block-payments .title-style-1 > i.mi::before { content: 'payments'; }
body.type-services .block-type-location         .title-style-1 > i.mi::before { content: 'place'; }

/* Only the left column's table is reliably "details about the business"; the
   sidebar's three tables are indistinguishable in markup, so they keep theirs. */
body.type-services .cts-left-column .block-type-table .title-style-1 > i.mi::before { content: 'business_center'; }

/*
 * Term chips: NO disc behind the icon, and a bigger glyph.
 *
 * The disc loses twice. Twelve chips each carrying a bordered circle turns the
 * block into a field of dots and the eye stops reading the labels; and the
 * circle caps the glyph at ~12px, below the size at which a 24×24-designed
 * icon is identifiable at all — so it cost legibility to buy noise. Dropping
 * it frees the glyph to 17px, where the icon actually says something, and the
 * chip reads as one shape.
 *
 * The per-category colour arrives as an INLINE background on .cat-icon, so
 * removing the disc needs !important; the colour is not lost, it moves to the
 * glyph via currentColor on the chip.
 */
body.type-services .block-type-terms .listing-details .cat-icon {
	width: auto;
	height: auto;
	margin-right: 8px;
	border-radius: 0 !important;
	background-color: transparent !important;
	box-shadow: none !important;
}

body.type-services .block-type-terms .listing-details .cat-icon i {
	font-size: 20px !important;
	line-height: 1;
	color: var(--sk-teal) !important;
}

body.type-services .block-type-terms .listing-details > ul {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0;
	padding: 0;
}

/*
 * ⚠️ `.element .pf-body > .listing-details li { width: 33.3% }` plus
 * `float: left` locks these into a rigid three-across grid, so a two-word
 * category and a twenty-character one occupy the same slab and the row runs
 * far taller than the tag cloud in the design. Releasing width and float lets
 * each chip be as wide as its own label.
 */
body.type-services .block-type-terms .listing-details > ul > li {
	width: auto;
	float: none;
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * The price chip is the shared one now — see mfv-listing-skin.css.
 * The rules that were here coloured its value teal, which assumed the white
 * chip the old services hero drew. With that hero gone the chip is orange, and
 * teal on orange measured 1.91:1. Removed rather than retuned: one chip, one
 * rule, in one file.
 */

/* ═══════════════════════════════════════════════════════════════════════════
   10. TABLE BLOCKS — rows carry an icon, and Listing Info reads as stats
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * Each `table` block row has its own `icon` prop in the listing-type config, and
 * they were all empty — which is most of why these cards read as a bare
 * label/value ledger. With icons set, the row becomes scannable.
 */
body.type-services .block-type-table .extra-details > li,
body.type-services .block-type-table .listing-details > ul > li {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 11px 0;
}

body.type-services .block-type-table .extra-details > li > i,
body.type-services .block-type-table li > .item-icon,
body.type-services .block-type-table li > i {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 28px;
	height: 28px;
	border-radius: 8px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-size: 15px;
	line-height: 1;
}

body.type-services .block-type-table .item-attr {
	flex: 1 1 auto;
	min-width: 0;
	font-size: 13px;
	color: var(--sk-muted);
}

body.type-services .block-type-table .item-property {
	flex: 0 0 auto;
	font-size: 13.5px;
	font-weight: 700;
	color: var(--sk-ink);
	font-variant-numeric: tabular-nums;
	text-align: right;
}

/* ── Listing Info: two stat tiles instead of a ledger ─────────────────────────
   Posted and Views are both single facts about the listing rather than a table
   of readings, so they read better as a pair of tiles than as rows with the
   value flung to the far right of a 320px card. */
body.type-services .mfv-block-listing-info .pf-body > .extra-details,
body.type-services .block-type-table:has(.item-attr) .pf-body { min-width: 0; }

body.type-services .mfv-lc-stats,
body.type-services .block-type-table.mfv-block-listing-info .extra-details {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 10px;
}

body.type-services .block-type-table.mfv-block-listing-info .extra-details > li {
	display: grid;
	gap: 2px;
	padding: 12px 14px;
	border: 1px solid var(--sk-line);
	border-radius: 12px;
	background: #fbfdfe;
	text-align: left;
}

body.type-services .block-type-table.mfv-block-listing-info .item-attr {
	order: 2;
	font-size: 11px;
	font-weight: 600;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: var(--sk-muted);
}

body.type-services .block-type-table.mfv-block-listing-info .item-property {
	order: 1;
	font-size: 16px;
	font-weight: 700;
	text-align: left;
	color: var(--sk-ink);
}

/*
 * ⚠️ The row `icon` prop in the listing-type config IS IGNORED by this theme.
 *
 * `table-block.php` renders only `.item-attr` and `.item-property`; `$row['icon']`
 * is never output. So setting row icons in the admin changes nothing, and the
 * icon here has to be drawn by CSS instead.
 *
 * nth-child is safe for THIS block and only this block: its two rows are
 * `[[:date]]` and `[[:views]]`, which always resolve, so neither can drop out
 * and shift the order. Tables whose rows can be empty (Service Details, where
 * Response Time only appears when set) would shift, so they get no row icons.
 */
body.type-services .block-type-table.mfv-block-listing-info .extra-details > li::before {
	order: 0;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 26px;
	height: 26px;
	margin-bottom: 6px;
	border-radius: 8px;
	background: var(--sk-teal-wash);
	color: var(--sk-teal);
	font-family: 'Material Icons', 'Material Icons Outlined', sans-serif;
	font-size: 15px;
	font-style: normal;
	font-weight: 400;
	line-height: 1;
	letter-spacing: normal;
	text-transform: none;
	-webkit-font-feature-settings: 'liga';
	font-feature-settings: 'liga';
}

body.type-services .block-type-table.mfv-block-listing-info .extra-details > li:nth-child(1)::before { content: 'event'; }
body.type-services .block-type-table.mfv-block-listing-info .extra-details > li:nth-child(2)::before {
	content: 'visibility';
	background: var(--sk-orange-wash);
	color: var(--sk-orange);
}

/* ═══════════════════════════════════════════════════════════════════════════
   11. ACCEPTED PAYMENT — acceptance marks, bigger than a category glyph
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * These are brand acceptance marks, not decorative glyphs — a Visa or Apple Pay
 * mark is only useful if it is recognisable, so it gets more room than a
 * category icon and keeps its own weight rather than being tinted to match.
 */
body.type-services .mfv-block-payments .listing-details > ul {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0;
	padding: 0;
}

body.type-services .mfv-block-payments .listing-details > ul > li {
	width: auto;
	float: none;
	margin: 0;
	padding: 0;
	list-style: none;
}

/*
 * ⚠️ With `link` = link-disable the theme wraps each term in
 * `div.terms-no-link`, NOT an <a>. Styling only `a` (and a direct `span`) missed
 * every chip, so the marks rendered as bare icon-and-text with no chip at all.
 */
body.type-services .mfv-block-payments .listing-details li > a,
body.type-services .mfv-block-payments .listing-details li > .terms-no-link,
body.type-services .mfv-block-payments .listing-details li > span {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	padding: 7px 13px;
	border: 1px solid var(--sk-line);
	border-radius: 10px;
	background: #fff;
	color: var(--sk-ink) !important;
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.2;
	white-space: nowrap;
}

body.type-services .mfv-block-payments .cat-icon {
	width: auto !important;
	height: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	border-radius: 0 !important;
	background: none !important;
	box-shadow: none !important;
}

/*
 * Generic methods are line icons like the rest of the page; the two branded ones
 * keep their real acceptance mark. Both are pinned to the SAME 20px box and the
 * same ink, so a mark and a glyph sit on one baseline instead of the marks
 * looking pasted in at a different weight and size.
 */
body.type-services .mfv-block-payments .cat-icon i,
body.type-services .mfv-block-payments li i {
	font-size: 20px !important;
	line-height: 1 !important;
	color: #253746 !important;
}

body.type-services .mfv-block-payments li i[class*='mfv-ic-'] {
	width: 20px !important;
	height: 20px !important;
	background-color: #253746 !important;
}

/* A brand mark is wider than it is tall; cap it so it cannot out-grow the row. */
body.type-services .mfv-block-payments li i[class*='fa-'] {
	max-height: 20px;
	font-size: 19px !important;
}

/* The mark is the point, so it should not be truncated or wrapped away. */
body.type-services .mfv-block-payments .listing-details li .category-name,
body.type-services .mfv-block-payments .listing-details li span,
body.type-services .mfv-block-payments .listing-details li a span {
	max-width: none;
	overflow: visible;
	white-space: nowrap;
	text-overflow: clip;
}

/*
 * ⚠️ TRADEMARK ATTRIBUTION.
 *
 * Acceptance marks are the trademarks of their owners and are shown here only
 * to state which payment methods a provider takes — the use those marks exist
 * for. This line says so on the page rather than leaving it implied. It is a
 * pseudo-element because this is a reskin: the notice has to come from CSS, not
 * from new markup. If it ever needs to be selectable or translated, it should
 * move into the block's own output.
 */
body.type-services .mfv-block-payments .pf-body::after {
	content: 'Payment marks are trademarks of their respective owners, shown to indicate accepted payment methods only.';
	display: block;
	margin-top: 12px;
	padding-top: 10px;
	border-top: 1px solid var(--sk-line-soft);
	font-size: 10.5px;
	line-height: 1.5;
	color: #94a3b8;
}

/* ═══════════════════════════════════════════════════════════════════════════
   12. COMPLETION RING
   The full-width bar spent an entire row saying one number. A ring says it in
   the corner and gives the row back to what the owner actually needs: which
   sections are still missing.
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * Only applies once the script has read the percentage off the inline width and
 * set --mfv-lc-pct. Without JS the card keeps the bar, which is why the bar is
 * hidden HERE and not in the base rule — a hidden bar with no ring would leave
 * the owner no completion indicator at all.
 */
/*
 * ⚠️ Three columns, not two.
 *
 * With ring + content only, the CTA sat under the text and the right half of a
 * 1100px card was empty — a full-width band carrying one number and one button.
 * Moving the button to its own right-hand column pulls the card's content out to
 * both edges, and the middle column then has room for the missing-section chips
 * rather than a single truncated sentence.
 */
body.type-services .mfv-lc--ring {
	display: grid;
	grid-template-columns: auto minmax(0, 1fr) auto;
	align-items: center;
	column-gap: 22px;
	row-gap: 6px;
	padding: 16px 22px;
}

body.type-services .mfv-lc--ring .mfv-lc__actions,
body.type-services .mfv-lc--ring > .mfv-lc__btn {
	grid-column: 3;
	grid-row: 1 / span 3;
	align-self: center;
	margin: 0;
}

body.type-services .mfv-lc--ring .mfv-lc__bar { display: none; }

body.type-services .mfv-lc__ring {
	grid-column: 1;
	grid-row: 1 / span 3;
	position: relative;
	width: 74px;
	height: 74px;
	border-radius: 50%;
	/* The sweep is the percentage; the track is the remainder. */
	background: conic-gradient(
		var(--sk-teal) calc( var(--mfv-lc-pct, 0) * 1% ),
		rgba(11, 90, 110, .14) 0
	);
	display: grid;
	place-items: center;
}

/* Punch the middle out so it reads as a ring rather than a pie. */
body.type-services .mfv-lc__ring::before {
	content: '';
	position: absolute;
	inset: 9px;
	border-radius: 50%;
	background: var(--sk-teal-wash);
}

body.type-services .mfv-lc__ring-num {
	position: relative;
	font-size: 20px;
	font-weight: 800;
	line-height: 1;
	color: var(--sk-teal-ink);
	font-variant-numeric: tabular-nums;
}

body.type-services .mfv-lc__ring-num i {
	font-size: 11px;
	font-style: normal;
	font-weight: 700;
	vertical-align: super;
	opacity: .7;
}

body.type-services .mfv-lc--ring .mfv-lc__head { margin-bottom: 2px; }

/* With the ring carrying the number, the sentence can stop shouting it. */
body.type-services .mfv-lc--ring .mfv-lc__title { font-size: 14.5px; }

body.type-services .mfv-lc--ring .mfv-lc__head,
body.type-services .mfv-lc--ring .mfv-lc__title,
body.type-services .mfv-lc--ring .mfv-lc__missing { grid-column: 2; }

body.type-services .mfv-lc--ring .mfv-lc__missing { margin-top: 4px; }

/* ── The missing sections, as chips ────────────────────────────────────────────
   The script splits the sentence the server renders into one chip per item, so
   the row shows WHAT is outstanding instead of a comma list that trails off. */
body.type-services .mfv-lc__gaps {
	grid-column: 2;
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	margin-top: 6px;
}

body.type-services .mfv-lc__gap {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 4px 11px;
	border: 1px solid var(--sk-teal-line);
	border-radius: 999px;
	background: #fff;
	color: var(--sk-teal-ink);
	font-size: 12px;
	font-weight: 600;
	line-height: 1.35;
}

body.type-services .mfv-lc__gap::before {
	content: '';
	width: 5px;
	height: 5px;
	border-radius: 50%;
	background: var(--sk-orange);
}

body.type-services .mfv-lc__gap.is-more {
	border-style: dashed;
	background: transparent;
	color: #5d8290;
}

body.type-services .mfv-lc__gap.is-more::before { background: #9db9c2; }

body.type-services .mfv-lc--gaps .mfv-lc__missing { display: none; }

@media (max-width: 780px) {
	body.type-services .mfv-lc--ring { grid-template-columns: auto minmax(0, 1fr); }

	body.type-services .mfv-lc--ring .mfv-lc__actions,
	body.type-services .mfv-lc--ring > .mfv-lc__btn {
		grid-column: 1 / -1;
		grid-row: auto;
		margin-top: 10px;
	}
}

@media (max-width: 600px) {
	body.type-services .mfv-lc--ring { column-gap: 14px; }
	body.type-services .mfv-lc__ring { width: 60px; height: 60px; }
	body.type-services .mfv-lc__ring::before { inset: 8px; }
	body.type-services .mfv-lc__ring-num { font-size: 17px; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   13. SERVICE-RADIUS KEY ON THE MAP
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * The circle alone is ambiguous — a ring on a map could be anything. The key
 * names it, and sits inside the map's own frame so the two are read together.
 */
body.type-services .block-type-location { position: relative; }

body.type-services .mfv-radius-key {
	position: absolute;
	left: 32px;
	bottom: 86px;
	z-index: 4;
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 6px 12px;
	border-radius: 999px;
	background: rgba(255, 255, 255, .95);
	color: var(--sk-teal-ink);
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1;
	box-shadow: 0 2px 8px rgba(22, 35, 46, .18);
	pointer-events: none;
}

body.type-services .mfv-radius-key::before {
	content: '';
	width: 12px;
	height: 12px;
	border: 1.5px dashed var(--sk-teal);
	border-radius: 50%;
	background: rgba(14, 116, 144, .12);
}

@media (max-width: 767px) {
	body.type-services .mfv-radius-key { left: 20px; bottom: 78px; font-size: 11px; }
}


/* ═══════════════════════════════════════════════════════════════════════════
   14. ONE ICON SCALE
   The page was mixing four icon families — Font Awesome solid, FA regular,
   Material Icons and the theme's own font — each with its own stroke weight and
   optical size, so twelve chips in a row looked like twelve different sets.
   Categories and tags now use the MFV SVG line set (masked, so they inherit
   currentColor), and every icon box below is one of three fixed sizes.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Block header chip — 38px box, 21px glyph. */
body.type-services [class*='block-type-'] .title-style-1 > i[class*='mfv-ic-'] {
	font-size: 21px;
}

/* Chip rows (categories, tags, services) — 20px glyph, no box. */
body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details .cat-icon i[class*='mfv-ic-'],
body.type-services .block-type-tags .pf-body a > i[class*='mfv-ic-'] {
	font-size: 20px !important;
	width: 20px !important;
	height: 20px !important;
}

/*
 * ⚠️ A MASKED ICON IS NOT AN ICON FONT, and two rules written for fonts break it.
 *
 * The tag chips carry `background: none !important` and `width/height: auto`
 * from removing the theme's grey disc. On a glyph that was harmless; on a masked
 * element it is fatal twice over — `background: none` wipes the
 * `background-color: currentColor` that the mask is painting, and `auto` on an
 * empty inline-block collapses it to 0 height. The tag icons rendered
 * 40px x 0px and fully transparent.
 *
 * So a masked icon must restate its own box and its own fill, with the weight to
 * beat those earlier !important declarations.
 */
body.type-services i[class*='mfv-ic-'] {
	display: inline-block !important;
	/* ⚠️ `min-width` is the one that actually decides here. The theme sets
	   `.pf-body > .listing-details li span.cat-icon { width:40px; min-width:40px }`,
	   so overriding `width` alone left every chip icon stuck at a 40px box while
	   the artwork inside was 20px — the icons looked randomly spaced, not
	   standardised. Both have to be released. */
	width: 1em !important;
	height: 1em !important;
	min-width: 0 !important;
	max-width: none !important;
	padding: 0 !important;
	background-color: currentColor !important;
	background-image: none !important;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

body.type-services .block-type-terms .listing-details .cat-icon i[class*='mfv-ic-'],
body.type-services .block-type-tags .pf-body a > i[class*='mfv-ic-'] {
	color: var(--sk-teal) !important;
	background-color: var(--sk-teal) !important;
}

/* Payment marks stay brand marks and stay larger — a logo has to be
   recognisable, and it is not part of the line set. */
body.type-services .mfv-block-payments li i { font-size: 24px !important; }


/* ═══════════════════════════════════════════════════════════════════════════
   15. ONE OWNER ACTION AT A TIME
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * While the completion card is on screen, "Complete your listing" and
 * "Edit listing" are the same journey twice — both land the owner in the listing
 * editor, and the orange button competes with the primary one two rows above it.
 *
 * The condition is exact rather than approximate: mfv-listing-completion.php
 * returns early when `percent >= 100`, so `.mfv-lc` EXISTS only while the
 * listing is incomplete. `body:has()` reads that as "is there an outstanding
 * completion prompt" without needing to know the number.
 *
 * Once the listing hits 100% the card stops rendering, the :has() stops
 * matching, and "Edit listing" comes back on its own — which is the state where
 * it is the only way in.
 */
body.type-services:has(.mfv-lc) .mfv-owner-controls__edit {
	display: none !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   16. DIVIDED GRIDS — Trust Signals, Service Categories, We Are Proudly
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * These three blocks move from pill clouds to a divided grid.
 *
 * ⚠️ The dividers are a 1px GRID GAP over a coloured container, not borders on
 * the cells. Borders would need to know which cell ends a row — and with a
 * responsive column count that is not expressible in CSS, so a wrapped row ends
 * up with a stray line down the middle or a missing one at the edge. A 1px gap
 * over `background: var(--sk-line)` draws every internal line and none of the
 * outer ones, at any column count, for free.
 */

/* ── Shared cell chrome ─────────────────────────────────────────────────────── */
body.type-services .block-type-mfv_trust_signals .mfv-place-badges,
body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details > ul,
body.type-services .block-type-tags .pf-body > ul {
	display: grid;
	gap: 1px;
	margin: 0;
	padding: 0;
	background: var(--sk-line);
}

/* The grid runs to the card's inner edges, as in the design, so the horizontal
   rules read as full-width rather than floating inside a gutter. */
/*
 * ⚠️ `.pf-body` must go back to `display: block` here.
 *
 * The earlier chip treatment set it to `display: flex`, which made the <ul> a
 * FLEX ITEM sized to its own content — 286px inside a 661px card. The grid on
 * that <ul> then had room for exactly one track, so both blocks rendered as a
 * single column no matter what grid-template-columns said. The payments block
 * still wants the flex chip row, hence the :not().
 */
body.type-services .block-type-mfv_trust_signals .pf-body,
body.type-services .block-type-terms:not(.mfv-block-payments) .pf-body,
body.type-services .block-type-tags .pf-body {
	display: block;
	padding: 14px 0 0;
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details {
	width: 100%;
}

body.type-services .block-type-mfv_trust_signals > div.element,
body.type-services .block-type-terms:not(.mfv-block-payments) > div.element,
body.type-services .block-type-tags > div.element {
	padding-bottom: 0;
}

/* ── Trust Signals — one row, green line check, label may wrap to two lines ── */
body.type-services .block-type-mfv_trust_signals .mfv-place-badges {
	grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
}

body.type-services .block-type-mfv_trust_signals .mfv-place-badge {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	padding: 16px 18px;
	border: 0;
	border-radius: 0;
	background: var(--sk-card);
	color: var(--sk-ink);
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1.35;
	/* A fact, not a control — so no pointer, and the hover is a whisper. */
	cursor: default;
	transition: background .16s ease;
}

body.type-services .block-type-mfv_trust_signals .mfv-place-badge:hover {
	background: #f2fbf7;
}

/*
 * ⚠️ The tick in the markup is the character ✔ (U+2714), a heavy glyph that
 * cannot be made to look like the light stroke in the design. Zeroing the font
 * size hides it and the box is repainted with the MFV `check` path as a mask, so
 * it matches the stroke weight of every other icon on the page.
 */
body.type-services .block-type-mfv_trust_signals .mfv-place-badge__ico {
	flex: 0 0 auto;
	width: 19px;
	height: 19px;
	margin-top: 1px;
	font-size: 0;
	color: transparent;
	background-color: #1f9254;
	-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
	mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
	-webkit-mask-size: contain;
	mask-size: contain;
}

/* ── Service Categories — three columns, dividers both ways ─────────────────── */
body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details > ul {
	grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details > ul > li {
	width: auto;
	float: none;
	margin: 0;
	padding: 0;
	list-style: none;
	background: var(--sk-card);
}

/* The pill is gone: the cell IS the shape now. */
body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details li > a,
body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details li > .terms-no-link {
	display: flex;
	align-items: center;
	gap: 14px;
	width: 100%;
	padding: 18px 18px;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	color: var(--sk-ink) !important;
	font-size: 14px;
	font-weight: 600;
	line-height: 1.35;
	transition: background .16s ease;
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details li > a:hover {
	background: #f4fafb !important;
	transform: none;
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details .cat-icon {
	width: auto !important;
	min-width: 0 !important;
	height: auto !important;
	margin: 0 !important;
	padding: 0 !important;
	border-radius: 0 !important;
	background: none !important;
	box-shadow: none !important;
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details .cat-icon i[class*='mfv-ic-'] {
	width: 26px !important;
	height: 26px !important;
	font-size: 26px !important;
}

body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details .category-name {
	max-width: none;
	overflow: visible;
	white-space: normal;
	text-overflow: clip;
}

/* ── We Are Proudly — one row, hover marks the link ─────────────────────────── */
body.type-services .block-type-tags .pf-body > ul {
	grid-template-columns: repeat(auto-fit, minmax(122px, 1fr));
}

body.type-services .block-type-tags .pf-body > ul > li {
	width: auto;
	float: none;
	margin: 0;
	padding: 0;
	list-style: none;
	background: var(--sk-card);
}

body.type-services .block-type-tags .pf-body a {
	display: flex;
	align-items: center;
	gap: 11px;
	width: 100%;
	min-height: 0;
	padding: 16px 18px !important;
	border: 0 !important;
	border-radius: 0 !important;
	background: transparent !important;
	color: var(--sk-ink) !important;
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1.35;
	transform: none !important;
}

body.type-services .block-type-tags .pf-body a > i[class*='mfv-ic-'] {
	width: 21px !important;
	height: 21px !important;
	font-size: 21px !important;
}

/*
 * These ARE links, so the hover says so: the label picks up an orange rule and
 * the text darkens. Underlining the label rather than tinting the whole cell
 * keeps the row's rhythm intact while it is being scanned.
 */
/*
 * ⚠️ The theme's ellipsis rule ties this one on specificity, so it has to be
 * settled with !important rather than weight:
 *   .element .pf-body > .social-nav li a span
 *     { white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
 * With five cells in a 660px column that clipped every label to "Black O…",
 * "24-hou…". A tag is its name; truncating it removes the whole content, so it
 * wraps to a second line instead — the same two-line behaviour the Trust
 * Signals labels already have.
 */
body.type-services .block-type-tags .pf-body a > span {
	padding: 2px 0 3px !important;
	border-bottom: 2px solid transparent !important;
	max-width: none !important;
	overflow: visible !important;
	white-space: normal !important;
	text-overflow: clip !important;
	transition: border-color .16s ease, color .16s ease;
}

body.type-services .block-type-tags .pf-body a:hover > span {
	border-bottom-color: var(--sk-orange) !important;
	color: var(--sk-teal-ink) !important;
}

/* Nothing in this row alternates any more, so the even-child orange tint that
   belonged to the pill treatment has to go with it. */
body.type-services .block-type-tags .pf-body a:nth-child(even),
body.type-services .block-type-terms:not(.mfv-block-payments) .pf-body a:nth-child(even) {
	border-color: transparent;
	background: transparent;
	color: var(--sk-ink) !important;
}

@media (max-width: 560px) {
	body.type-services .block-type-mfv_trust_signals .mfv-place-badges,
	body.type-services .block-type-terms:not(.mfv-block-payments) .listing-details > ul,
	body.type-services .block-type-tags .pf-body > ul {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

/* ═══════════════════════════════════════════════════════════════════════════
   17. MOBILE HERO — see mfv-listing-skin.css §7
   Removed with the desktop hero above; the shared skin handles both widths.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════════════════════════════════
   18. THE BOOKING BUTTON MUST NOT HIDE BEHIND THE ASSISTANT
   ═══════════════════════════════════════════════════════════════════════════ */

/*
 * ⚠️ Two fixed elements were sharing one corner, and the wrong one was winning.
 *
 * On a 414px phone:
 *   .mfv-booking-fab   z-index 9999    x263–398  y769–816
 *   the assistant FAB  z-index 99998   x338–394  y760–816
 *
 * They overlap across x338–394, and the assistant's z-index is an order of
 * magnitude higher — so it painted over the right-hand half of "Book Now",
 * covering the primary action on a services listing with a secondary one.
 *
 * Stacking them vertically is the fix rather than a z-index fight: two round
 * targets in the same 56px square cannot both be tappable no matter who is on
 * top. The z-index is still raised as a backstop, so if either ever moves the
 * booking action is the one that stays reachable — on a listing page, booking
 * is what the visitor came for.
 *
 * ⚠️ NOT scoped to services. This file loads on every single listing
 * (`is_singular('job_listing')`), and the collision is not services-specific —
 * any listing with booking enabled has it.
 */
@media (max-width: 991px) {
	body.single-job_listing .mfv-booking-fab {
		/* Clears the assistant button: its 56px height + a 12px gap above the
		   80px both were sharing. */
		bottom: 148px !important;
		z-index: 100000 !important;
	}
}

/*
 * The same corner on desktop holds `.back-to-top` (z-index 999) underneath the
 * assistant (z-index 99998) — it is unreachable there too. That one is a
 * SITE-WIDE issue rather than a listing one, so it is only nudged clear here,
 * where this stylesheet is actually loaded.
 */
@media (min-width: 992px) {
	body.single-job_listing a.back-to-top {
		bottom: 92px !important;
		z-index: 99999 !important;
	}
}
