
/* Ben, 2026-08-31: "I don't really like Read more there — display the full quotes and make it a
   little bit longer." The full text is ALREADY in the DOM; GoHighLevel clamps it with CSS and
   adds a link. So this is not a content change, it is deleting a clamp. */
/* Ben, 2026-08-31, after seeing both: *"it would look better if this just says Read more and all
   the cards are the same size."* So the clamp and the link stay — the earlier version unclamped
   them and the cards ended up three different heights, which looked worse than the truncation it
   fixed. What was missing was never the full text; it was equal height.

   ⚠️ AND THE UNCLAMP MUST NEVER TOUCH LAYOUT CONTAINERS. The first attempt matched
   [class*="content"], which caught `.testimonial-carousel-content` — the 3-column GRID — and
   forced display:block on it, collapsing three cards into one. */
/* Equal height has to be set at BOTH levels — the item wrapper and the card inside it. Setting
   it on one alone left the cards 291px and 266px, which is the ragged look Ben flagged. */
/* Ben, 2026-08-31: "make the review cards a little bit longer, more like a 4:5 … one or two
   more lines". The clamp comes from GoHighLevel at 4 lines; 6 plus a min-height gives the taller
   proportion without letting one long quote set the height for all three. */
/* 8 lines, not 6 — at 360px the card had a band of empty space under a 6-line quote, which is
   the "fill the box" Ben asked for. Anything longer still truncates to "Read more", so the
   cards stay uniform. */
/* ⚠️ LEFT AT GOOGLE HIGHLEVEL'S OWN PROPORTIONS ON PURPOSE. An 8-line clamp and a 360px
   min-height were tried and reverted — Ben, 2026-08-31: *"put it back at the squares, it looked
   better"*, because a short interview then sat in a tall box looking stranded. The full quote is
   still injected, so "Read more" now reveals a complete sentence rather than one that stops
   mid-word; only the card geometry is theirs. */
[id^="testimonial-"] .testimonial-item,
[id^="testimonial-"] .testimonial-grid-item,
[id^="testimonial-"] [class*="grid-item"] {
  height: 100% !important; display: flex !important; flex-direction: column !important; }
/* ⚠️ `flex: 0 0 auto` HERE WAS THE BUG — it forbade the card from growing, so the columns stayed
   266px and 291px no matter what height:100% said above. The card must GROW to fill the stretched
   grid row; only the footer block inside it should hold its size. */
[id^="testimonial-"] .testimonial-item > .testimonial-grid-item,
[id^="testimonial-"] .testimonial-item > * { flex: 1 1 auto !important; }
[id^="testimonial-"] .slide-testimonials,
[id^="testimonial-"] .testimonial-carousel-content { align-items: stretch !important; }
[class*="testimonial"] [class*="grid-item"] { height: auto !important; }
[id^="testimonial-"] .carousel__slide { min-height: 0 !important; }

/* ⚠️ THE TESTIMONIAL CAROUSEL DOES NOT ADVANCE, AND THE JS IS NOT THE REASON.
   Measured on next.skiller.app 2026-08-31: the shim sets `translateX(-100%)` on the track
   correctly, but the track measures **0px wide**, so -100% of 0 is 0 and nothing moves.
   ⛔ AND THE OBVIOUS FIX MADE IT WORSE. Forcing `display:flex; width:100%` on the track and
   `flex:0 0 100%` on the slides took the SLIDES to 0px as well — the zero width comes from
   further up the chain, not from the track. Reverted rather than left in: a change that makes a
   broken thing more broken is worse than the bug. The real cause is somewhere in
   `.testimonial-carousel` / `.testimonial-container` sizing that went with the framework, and it
   needs measuring up the ancestor chain, not another guess at the leaf. */

/* The arrows are pointer-events:none on the track so the slides stay clickable; the buttons
   themselves have to opt back in or nothing is clickable at all. */
.carousel__arrow { pointer-events: none; }
.carousel__arrow > * { pointer-events: auto; cursor: pointer; }
.carousel__pagination { cursor: pointer; }

/* A <video> with no poster paints black until it is played. preload=metadata (set by the JS
   shim) makes the browser draw the first frame, which is the thumbnail Ben expected. */
video { background: #0C1130; }

/* 🔴 THE QUOTE MODAL MUST CONSTRAIN ITS IMAGES. It clones the whole card, and the cloned
   `.profile-pic` inherited no size in the overlay — so a 1200px original rendered full-bleed and
   filled the screen. Ben flagged this twice. Cap every image inside the modal, and pin the
   portrait to the size it has on the card. */
#skiller-quote-modal img { max-width: 100% !important; height: auto !important; }
#skiller-quote-modal .profile-pic,
#skiller-quote-modal img[class*="profile-pic"] {
  width: 44px !important; height: 44px !important; border-radius: 50% !important;
  object-fit: cover !important; flex: 0 0 44px !important; }
#skiller-quote-modal [class*="testimonial-stars"] img { width: auto !important; height: 1em !important; }
/* the cloned card is already inside a styled panel — let its own chrome go */
#skiller-quote-modal [class*="grid-item"] {
  background: transparent !important; padding: 0 !important; height: auto !important;
  min-height: 0 !important; border: 0 !important; box-shadow: none !important; }
/* and the quote is the point of the modal: no clamp, full text */
#skiller-quote-modal .testimonial-content-text {
  display: block !important; -webkit-line-clamp: unset !important;
  max-height: none !important; overflow: visible !important; margin: 14px 0 22px !important; }
#skiller-quote-modal [class*="testimonial-stars"] { letter-spacing: 3px; }

/* Ben, 2026-08-31: "remove the underlines here" — the header links. GoHighLevel's nav sets an
   underline on hover/visited that reads as a stray rule on a dark bar. */
nav a, .head-nav a, [class*="nav-menu"] a, .menu-item, .menu-item:hover,
[class*="nav"] a:hover, [class*="nav"] a:visited {
  text-decoration: none !important; }

/* ⚠️ FOUT BELT-AND-BRACES. The preload above wins the race in almost every case; `swap` here
   means that if it ever loses, the reader gets a metrics-compatible fallback for a beat rather
   than invisible text. Never `optional` — that lets the browser skip the real face entirely on a
   slow connection, and the page would just be wrong. */
@font-face { font-family: 'Teko'; font-display: swap; }

/* ── the contact form GoHighLevel renders client-side ────────────────────────────────────────
   Colours are CSS variables the JS shim fills in from the page itself — see fillForms(). Every
   value here is a fallback for the case where sampling finds nothing. */
.skiller-form { display: flex; flex-direction: column; gap: 14px; width: 100%;
  font-family: var(--contentfont, 'Roboto'), system-ui, sans-serif; }
.skiller-form .sf-row { display: flex; gap: 14px; }
.skiller-form .sf-row > label { flex: 1 1 0; min-width: 0; }
.skiller-form label { display: flex; flex-direction: column; gap: 6px;
  font-size: 12px; letter-spacing: .08em; text-transform: uppercase; font-weight: 500;
  color: var(--sf-label, #666); }
.skiller-form input, .skiller-form textarea {
  font: 400 16px/1.5 var(--contentfont, 'Roboto'), system-ui, sans-serif;
  color: var(--sf-text, #191919); background: var(--sf-field, #fff);
  border: 1px solid var(--sf-border, #d8dae5); border-radius: 8px;
  padding: 13px 15px; width: 100%; transition: border-color .18s ease, box-shadow .18s ease; }
.skiller-form textarea { resize: vertical; min-height: 132px; }
.skiller-form input::placeholder, .skiller-form textarea::placeholder {
  color: var(--sf-label, #666); opacity: .55; }
.skiller-form input:focus, .skiller-form textarea:focus { outline: none;
  border-color: var(--sf-accent, #3b4be2);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--sf-accent, #3b4be2) 22%, transparent); }
.skiller-form button {
  align-self: flex-start; margin-top: 4px; cursor: pointer;
  font: 400 20px/1 var(--headlinefont, 'Teko'), system-ui, sans-serif;
  letter-spacing: .06em; text-transform: uppercase; color: #fff;
  background: var(--sf-accent, #3b4be2); border: 1px solid var(--sf-accent, #3b4be2);
  border-radius: 150px; padding: 13px 34px 11px;
  transition: transform .18s ease, opacity .18s ease; }
.skiller-form button:hover { opacity: .88; transform: translateY(-1px); }
.skiller-form .sf-note { font-size: 12px; line-height: 1.5; margin: 0;
  color: var(--sf-label, #666); opacity: .8; text-transform: none; letter-spacing: 0; }
.skiller-form .sf-note b { color: var(--sf-accent, #3b4be2); font-weight: 500; }
@media (max-width: 640px) { .skiller-form .sf-row { flex-direction: column; } }
