/* ============================================================
   Flahoo Lifestyle rebuild -- shared component stylesheet.
   [Claude] 2026-10-11T -- Anthony approved the lifestyle mood-board
   direction (full brand review artifact + a provided moodboard image),
   then "Let's proceed but don't change the logo yet" (AskUserQuestion:
   "All four (Home, Shop, Product, Collections)" built for real).

   This file is ADDITIVE and loaded after style.css (see header.php's
   matching [v16] edit log) -- nothing in style.css is touched or
   removed. It reuses the Phase 0 brand tokens already defined in
   style.css's own :root block (--flahoo-red, --flahoo-off-white,
   --flahoo-pink-tint, --flahoo-grey-light, --flahoo-charcoal,
   --flahoo-near-black, --flahoo-radius-card, --flahoo-radius-pill,
   --flahoo-shadow-card/-hover) rather than inventing competing colour
   tokens, and adds only the handful of genuinely new ones below (a
   softer/fainter text tone, a gold accent for the premium section, a
   hairline border colour, and a larger card radius for the big photo
   tiles this layer introduces).

   Every selector here is a NEW class (fl_ prefix, this project's own
   snake_case convention) added to the page templates alongside their
   existing classes -- no existing class in style.css is restyled or
   renamed, and no PHP data loop this file's markup depends on is
   changed by adding these classes. See home.php's own [v22] entry for
   the first page built on this layer.

   Typography: ORIGINALLY Fraunces (display/headlines) + Plus Jakarta
   Sans (body/UI) -- loaded via Google Fonts in header.php's own [v16]
   entry. [Claude] 2026-10-11T, later same day -- Anthony: "I don't
   like the fonts - I think the Flahoo fonts before are better."
   REVERTED: every font-family below now points back to the site's
   own self-hosted family (proxima_nova_rgbold / proxima_nova_rgregular
   -- see style.css's own @font-face block, backed by the Nemesis
   webfont files in assets/fonts/), matching whatever weight the rule
   already called for (700/800/bold -> rgbold, everything else ->
   rgregular). Nothing else changed -- every layout, colour, spacing
   and photography decision this file made stays exactly as it was;
   this was a typography-only request. The Google Fonts <link> for
   Fraunces/Plus Jakarta Sans is removed in header.php's own [v17]
   entry, since nothing on the site uses them any more after this.

   [Claude] 2026-10-11T -- Anthony, live on /uk/home: "when you resize it
   goes to small and the image becomes focus on the body and not the
   face". The hero photo (assets/images/lifestyle/hero.jpg, 1204x1400,
   face sits in roughly the top fifth of the frame) was relying on
   .fl_photo_fill's shared default object-position (50% 50%, dead
   centre) -- fine at full desktop width, where .fl_hero_photo is tall
   (min-height:600px, stretched by the grid), but at the single-column
   breakpoint (<=900px) the frame gets much shorter and wider relative
   to the photo, and a dead-centre crop landed on the collarbone/chest
   instead of the face. Fixed below with a hero-specific override
   (50% 15%) scoped to .fl_hero_photo .fl_photo_fill only -- NOT a
   change to the shared .fl_photo_fill default itself, which several
   other sections below (department tiles, premium banner, editorial
   cards) also use with their own different images and framing needs.
   Confirmed live at mobile (375px), tablet (768px, the width that
   showed the bug) and desktop (1440px) widths.
   ============================================================ */

:root {
	--flahoo-ink-soft: #4a4347;
	--flahoo-ink-faint: #8b8488;
	--flahoo-gold: #cda45e;
	--flahoo-line: rgba(34, 37, 42, 0.09);
	--flahoo-radius-lg: 22px;
}

.fl_display {
	font-family: 'proxima_nova_rgbold', sans-serif;
	letter-spacing: -0.01em;
	text-wrap: balance;
}

.fl_eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 11.5px;
	font-weight: 700;
	letter-spacing: .09em;
	text-transform: uppercase;
	color: var(--flahoo-red-dark);
}
.fl_eyebrow::before { content: ""; width: 18px; height: 1px; background: var(--flahoo-red-dark); }

/* ---------------- Photo-fill helper: a real <img> behind any card's
   text, with a bottom-up dark gradient for legibility. Used by the
   hero, the department/mood tiles, the premium banner, the "edit"
   cards and the editorial/magazine cards below. ---------------- */
.fl_photo_fill {
	position: absolute; inset: 0; width: 100%; height: 100%;
	object-fit: cover; z-index: 0;
}
.fl_photo_overlay {
	position: absolute; inset: 0; z-index: 1;
	background: linear-gradient(0deg, rgba(10,8,10,.68) 0%, rgba(10,8,10,0) 55%);
	border-radius: inherit;
	pointer-events: none;
}

/* ================= HERO ================= */
.fl_hero {
	display: grid;
	grid-template-columns: 1.05fr 1fr;
	align-items: stretch;
	min-height: 600px;
}
@media (max-width: 900px) { .fl_hero { grid-template-columns: 1fr; min-height: auto; } }
.fl_hero_copy {
	display: flex; flex-direction: column; justify-content: center;
	padding: clamp(32px,6vw,72px) clamp(20px,5vw,56px);
	gap: 20px;
	/* [Claude] 2026-10-12T -- Phase 5a, see .fl_trust_item's own edit
	   below for the full root-cause story (Anthony: "The Free to use etc
	   icons and wording should be... never truncated if the window is
	   made smaller"). A CSS grid item's implicit minimum width defaults
	   to its content's natural (unwrapped) width, not 0 -- without this,
	   a narrow window could force .fl_hero's whole 2-column grid wider
	   than the viewport rather than letting this column actually shrink,
	   silently clipping anything inside it once body-level overflow
	   hides the excess. */
	min-width: 0;
}
.fl_hero_copy h1 {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: clamp(36px,5.6vw,64px);
	line-height: 1.0;
	font-weight: 500;
	color: var(--flahoo-near-black);
	margin: 0;
}
.fl_hero_copy h1 em { font-style: italic; color: var(--flahoo-red); }
.fl_hero_copy p.fl_hero_sub {
	font-family: 'proxima_nova_rgregular', sans-serif;
	font-size: 16px;
	color: var(--flahoo-charcoal);
	max-width: 380px;
	line-height: 1.55;
	margin: 0;
}
.fl_hero_stats { display: flex; gap: clamp(18px, 4vw, 30px); padding-top: 4px; }
.fl_hero_stats div, .fl_hero_stats a { display: flex; flex-direction: column; }
/* [Claude] 2026-10-12T -- Phase 5a (Anthony, home page, instructing
   directly): "Th3 trusted stores number should link to the stores
   directory and the new deais should also link. Make this wording more
   prominent." .fl_n bumped from 20px/600 to a clamp up to 26px/700 (scales
   down on narrow phones so it can never force the 3-stat row to overflow
   -- see .fl_hero_stats' own clamp()'d gap above, same reasoning) and
   .fl_l from 11px to 12px/600 -- both read noticeably more prominent
   without needing a layout change, .fl_hero_stats is still the same
   plain flex row. The 2 now-linked stats (home.php's own [Claude]
   2026-10-12T entry, right below $hero_stats' own markup) reuse this
   same div-replaced-by-<a> styling via the ", .fl_hero_stats a" selector
   added above and the .fl_hero_stat_link rules just below -- colour/
   layout stay identical to the plain (non-link) 3rd stat, so the row
   doesn't visually split into "2 look like buttons, 1 doesn't". */
.fl_hero_stats .fl_n { font-family: 'proxima_nova_rgbold', sans-serif; font-size: clamp(18px, 6vw, 26px); font-weight: 700; color: var(--flahoo-near-black); }
.fl_hero_stats .fl_l { font-size: 12px; font-weight: 600; color: var(--flahoo-ink-faint); font-family: 'proxima_nova_rgregular', sans-serif; }
.fl_hero_stats a.fl_hero_stat_link {
	text-decoration: none; color: inherit; cursor: pointer;
}
/* [Claude] 2026-10-12T -- Phase 5b (Anthony: "I don't want underlink
   links. change colout the the flahoo pink."). Swapped the hover-
   underline for a flahoo-pink colour change instead -- same --flahoo-red
   token "Spend Less." already uses.
   [Claude] 2026-10-12T -- Phase 5c correction (Anthony: "The links need
   to start black and turn to flahoo pink on hover"). Phase 5b made the
   colour permanent -- overcorrected. Moved to :hover only, same as any
   ordinary link: black (inherited near-black) at rest, pink on hover. */
.fl_hero_stats a.fl_hero_stat_link .fl_n {
	transition: color .15s ease;
}
.fl_hero_stats a.fl_hero_stat_link:hover .fl_n {
	color: var(--flahoo-red);
}
.fl_hero_photo { position: relative; background: #2a1118; min-height: 320px; }
/* Anchors the crop toward the top of the frame, where this photo's
   face actually is -- see this file's own header note above. Scoped to
   the hero specifically; .fl_photo_fill's own default (50% 50%) is
   left alone for every other section reusing that helper class. */
.fl_hero_photo .fl_photo_fill { object-position: 50% 15%; }
.fl_hero_float_card {
	position: absolute; left: 24px; bottom: 24px; z-index: 2;
	background: rgba(255,255,255,0.92); backdrop-filter: blur(6px);
	border-radius: 14px; padding: 13px 15px; width: 210px;
	box-shadow: 0 16px 36px rgba(22,19,22,0.22);
	font-family: 'proxima_nova_rgregular', sans-serif;
}
.fl_hero_float_card .fl_store { font-size: 10.5px; color: var(--flahoo-ink-faint); font-weight: 700; text-transform: uppercase; letter-spacing: .04em; }
.fl_hero_float_card .fl_name { font-size: 12.5px; font-weight: 700; margin: 3px 0 6px; color: var(--flahoo-near-black); }
.fl_hero_float_card .fl_now { font-family: 'proxima_nova_rgbold', sans-serif; font-weight: 600; font-size: 16px; color: var(--flahoo-near-black); }
.fl_hero_float_card .fl_was { font-size: 11px; color: var(--flahoo-ink-faint); text-decoration: line-through; margin-left: 6px; }
.fl_hero_topchip {
	position: absolute; top: 20px; right: 20px; z-index: 2;
	background: rgba(255,255,255,0.92); font-size: 11px; font-weight: 700;
	color: var(--flahoo-near-black); padding: 6px 12px; border-radius: var(--flahoo-radius-pill);
	font-family: 'proxima_nova_rgbold', sans-serif;
}

/* ================= DEPARTMENT / MOOD TILES ================= */
.fl_dept_rail { display: grid; grid-template-columns: repeat(4,1fr); gap: 14px; }
@media (max-width: 900px) { .fl_dept_rail { grid-template-columns: repeat(2,1fr); } }
.fl_dept_tile {
	border-radius: var(--flahoo-radius-lg);
	aspect-ratio: 3/4; position: relative; overflow: hidden;
	display: flex; align-items: flex-end; padding: 16px; color: #fff;
	background: #20151a;
}
.fl_dept_tile h3 {
	position: relative; z-index: 2; font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 18px; font-weight: 600; margin: 0;
}
.fl_dept_tile .fl_cnt { position: relative; z-index: 2; font-size: 11px; opacity: .9; margin-top: 3px; font-family: 'proxima_nova_rgregular', sans-serif; }

/* ================= PREMIUM BANNER ================= */
.fl_premium { background: linear-gradient(180deg,#191418,#0e0b0e); color: #f3ede9; }
.fl_premium_inner { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: center; padding-block: 72px; }
@media (max-width: 900px) { .fl_premium_inner { grid-template-columns: 1fr; padding-block: 48px; gap: 26px; } }
.fl_premium_copy .fl_eyebrow { color: var(--flahoo-gold); }
.fl_premium_copy .fl_eyebrow::before { background: var(--flahoo-gold); }
.fl_premium_copy h2 { font-family: 'proxima_nova_rgbold', sans-serif; font-size: clamp(26px,3.6vw,40px); font-weight: 500; color: #fff; line-height: 1.08; margin: 12px 0 14px; }
.fl_premium_copy p { color: #c9c0c5; font-size: 14.5px; max-width: 420px; line-height: 1.6; margin: 0 0 20px; font-family: 'proxima_nova_rgregular', sans-serif; }
.fl_btn_gold {
	display: inline-flex; align-items: center; gap: 8px;
	background: var(--flahoo-gold); color: #1d1710; font-weight: 700; font-size: 13px;
	padding: 13px 22px; border-radius: var(--flahoo-radius-pill); border: none; cursor: pointer;
	font-family: 'proxima_nova_rgbold', sans-serif; text-decoration: none;
}
.fl_premium_photo { aspect-ratio: 4/3; border-radius: var(--flahoo-radius-lg); position: relative; background: #1a1410; overflow: hidden; }
.fl_premium_tag {
	position: absolute; z-index: 2; top: 16px; left: 16px;
	background: var(--flahoo-gold); color: #1d1710; font-size: 10.5px; font-weight: 800;
	padding: 5px 11px; border-radius: var(--flahoo-radius-pill); font-family: 'proxima_nova_rgbold', sans-serif;
}

/* ================= EDIT CARDS (featured product spotlights) ================= */
.fl_edit_grid { display: grid; grid-template-columns: 1.3fr 1fr 1fr; gap: 16px; }
@media (max-width: 900px) { .fl_edit_grid { grid-template-columns: 1fr; } }
.fl_edit_card {
	border-radius: var(--flahoo-radius-lg); position: relative; overflow: hidden;
	min-height: 380px; display: flex; flex-direction: column; justify-content: flex-end;
	padding: 20px; background: #20151a; color: #fff; text-decoration: none;
}
.fl_edit_card.fl_short { min-height: 178px; }
.fl_edit_card .fl_badge {
	position: relative; z-index: 2; align-self: flex-start;
	background: #fff; color: var(--flahoo-near-black); font-size: 10.5px; font-weight: 800;
	padding: 4px 11px; border-radius: var(--flahoo-radius-pill); margin-bottom: auto;
	font-family: 'proxima_nova_rgbold', sans-serif;
}
.fl_edit_card .fl_body { position: relative; z-index: 2; }
.fl_edit_card .fl_store { font-size: 10.5px; opacity: .85; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; font-family: 'proxima_nova_rgbold', sans-serif; }
.fl_edit_card .fl_title { font-family: 'proxima_nova_rgbold', sans-serif; font-size: 18px; font-weight: 600; margin: 5px 0 9px; line-height: 1.15; }
.fl_edit_card .fl_now { font-size: 17px; font-weight: 700; font-family: 'proxima_nova_rgbold', sans-serif; }
.fl_edit_card .fl_was { font-size: 11.5px; opacity: .7; text-decoration: line-through; margin-left: 7px; font-family: 'proxima_nova_rgregular', sans-serif; }

/* ================= DEPARTMENT / SHOP PAGE HERO ================= */
/* [Claude] 2026-10-12T [Quiet Confidence Phase 4] -- Anthony: "all hero
   banner photos should be stylish, follow the same theme throughout,
   and be flush so there is no white spaces or curves." Checked live:
   this banner was already full-bleed (0 side margin at every width
   tested, 375-1990px) -- the only real "curve" was this rule's own
   border-radius, removed below. The "same theme" photo mismatch (the
   audit's "generic coding-desk stock photo" finding) is fixed in
   shop.php/stores.php/pins.php -- see their own edit-log entries. */
/* [Claude] 2026-10-12T [Quiet Confidence Phase 4c -- alignment pass]
   -- Anthony: "ensure all things align on the page on the left: logo,
   menu starting with shop, hero text, shop by department and the rest."
   This hero's text was padded a flat 30px from the edge while the
   header logo/nav bar sits well to the right of that (135px/56px
   depending on page -- see the matching header/.top_background3 edits
   in this same pass) -- a real, measured misalignment, not a vague
   one: confirmed via getBoundingClientRect() before touching anything.
   Switched to the SAME clamp(20px,5vw,56px) left/right inset this file
   already uses for the home hero's own copy column and (as of this
   pass) the site's logo bar and Shop/Brands/Stores nav row, so this
   banner's eyebrow/heading/paragraph now share one consistent left
   edge with everything above them, on every page that renders this
   hero (Shop/Stores/Collections), at every width. */
.fl_page_hero {
	position: relative; overflow: hidden;
	min-height: 240px; display: flex; flex-direction: column; justify-content: flex-end;
	padding: 26px clamp(20px, 5vw, 56px); color: #fff; background: #1c1418;
}
.fl_page_hero::before {
	content: ""; position: absolute; inset: 0; z-index: 1;
	background: linear-gradient(100deg, rgba(10,8,10,.78) 10%, rgba(10,8,10,.25) 65%);
}
.fl_page_hero .fl_eyebrow { color: #ffd9de; position: relative; z-index: 2; }
.fl_page_hero .fl_eyebrow::before { background: #ffd9de; }
/* [Claude] 2026-10-12T -- Anthony: "drop the - from shop flahoo". Same
   small hyphen-like ::before mark already removed from the home hero's
   eyebrow (see .fl_hero_copy .fl_eyebrow::before below) -- scoped here
   to the Shop page's own eyebrow only, via a modifier class on its
   span (shop.php), since Stores/Collections share this same .fl_eyebrow
   base rule and weren't mentioned. */
.fl_page_hero .fl_eyebrow_no_dash::before { display: none; }
.fl_page_hero h1 { position: relative; z-index: 2; font-family: 'proxima_nova_rgbold', sans-serif; font-size: clamp(26px,3.6vw,42px); font-weight: 500; color: #fff; margin: 8px 0 0; }
.fl_page_hero p { position: relative; z-index: 2; color: #e4e2e6; font-size: 13.5px; max-width: 420px; margin-top: 8px; font-family: 'proxima_nova_rgregular', sans-serif; }
/* Per-photo crop focus overrides -- .fl_photo_fill's shared default
   object-position (50% 50%) crops some of this library's photos
   (people shot off-centre, facing down-frame) into an unrecognisable
   abstract close-up on this very wide/short banner. Live-tested at
   desktop (1440px, the tightest crop) and mobile (375px) before
   picking these two: fl_photo_pos_model keeps mood_weekend.jpg's
   model's face in frame; fl_photo_pos_fallback does the same for
   mag_fashion.jpg, used wherever no department-specific photo exists
   yet (see shop.php/stores.php/pins.php). Every other photo used here
   already reads correctly at the shared default and is left alone. */
.fl_page_hero .fl_photo_pos_model { object-position: 55% 18%; }
.fl_page_hero .fl_photo_pos_fallback { object-position: 55% 5%; }
/* [Claude] 2026-10-12T [Quiet Confidence Phase 4b] -- Anthony: "let
   every department get their own photo". The 7 departments without a
   confirmed-good wide/portrait photo (see shop.php's [v12] comment)
   use the square department-tile photos instead (assets/images/
   lifestyle/departments/*.jpg -- already sourced and approved for the
   homepage rail), but a plain object-fit:cover crop of a square photo
   into this very wide/short banner is an unrecognisable close-up
   (confirmed live testing electronics.jpg earlier). Two-layer "contain
   over blurred cover" treatment instead: fl_photo_bg fills the whole
   banner, blurred/darkened, as a backdrop; fl_photo_fg sits on top at
   object-fit:contain, showing the FULL photo undistorted, letterboxed
   by the blur rather than cropped. Live-tested on all 7 photos plus
   electronics.jpg (reusing it as the generic hard case) at 1440px and
   375px before writing -- every one reads clearly. .fl_page_hero's own
   overflow:hidden keeps the scaled blur from spilling past the edges. */
.fl_page_hero .fl_photo_bg {
	position: absolute; inset: 0; width: 100%; height: 100%;
	object-fit: cover; z-index: 0;
	filter: blur(24px) brightness(0.65) saturate(1.1);
	transform: scale(1.15);
}
.fl_page_hero .fl_photo_fg {
	position: absolute; inset: 0; width: 100%; height: 100%;
	object-fit: contain; z-index: 0;
}

/* ================= EDITORIAL / MAGAZINE STRIP ================= */
.fl_mag_grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; }
@media (max-width: 900px) { .fl_mag_grid { grid-template-columns: 1fr; } }
.fl_mag_card { border-radius: var(--flahoo-radius-lg); overflow: hidden; background: #fff; box-shadow: var(--flahoo-shadow-card); display: block; text-decoration: none; color: inherit; }
.fl_mag_cover { aspect-ratio: 16/10; position: relative; display: flex; align-items: flex-end; padding: 14px; background: #20151a; }
.fl_mag_cover span { position: relative; z-index: 2; color: #fff; font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; font-family: 'proxima_nova_rgbold', sans-serif; }
.fl_mag_body { padding: 15px 16px 18px; }
.fl_mag_body h3 { font-family: 'proxima_nova_rgbold', sans-serif; font-size: 15.5px; font-weight: 600; line-height: 1.3; margin: 0 0 5px; color: var(--flahoo-near-black); }
.fl_mag_body p { font-size: 12px; color: var(--flahoo-ink-soft); margin: 0; line-height: 1.5; font-family: 'proxima_nova_rgregular', sans-serif; }

/* ================= PRODUCT PAGE ================= */
.fl_pp_layout { display: grid; grid-template-columns: 1.05fr 1fr; gap: 38px; align-items: start; }
@media (max-width: 900px) { .fl_pp_layout { grid-template-columns: 1fr; gap: 20px; } }
.fl_pp_photo { aspect-ratio: 1/0.92; border-radius: var(--flahoo-radius-lg); position: relative; background: #eee; overflow: hidden; }
.fl_pp_why {
	font-size: 13px; color: var(--flahoo-ink-soft); line-height: 1.6; max-width: 440px;
	margin: 18px 0; padding: 15px 17px; background: #fff; border-radius: 14px; border: 1px solid var(--flahoo-line);
	font-family: 'proxima_nova_rgregular', sans-serif;
}
.fl_pp_why strong { color: var(--flahoo-near-black); }

/* ================= COLLECTIONS (Saved Collections / Pins) ================= */
.fl_coll_grid { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; }
@media (max-width: 900px) { .fl_coll_grid { grid-template-columns: 1fr; } }
.fl_coll_card {
	border-radius: var(--flahoo-radius-lg); position: relative; aspect-ratio: 16/11; overflow: hidden;
	display: flex; flex-direction: column; justify-content: flex-end; padding: 18px; color: #fff;
	background: #20151a; text-decoration: none;
}
.fl_coll_card h3 { position: relative; z-index: 2; font-family: 'proxima_nova_rgbold', sans-serif; font-size: 19px; font-weight: 600; margin: 0; }
.fl_coll_card .fl_meta { position: relative; z-index: 2; font-size: 11.5px; opacity: .9; margin-top: 4px; font-family: 'proxima_nova_rgregular', sans-serif; }

/* ================= Shared section rhythm ================= */
.fl_section { padding-block: 56px; }
/* [Claude] 2026-10-12T [Phase 4c] -- same alignment pass as the header/
   nav/hero rules above. .fl_section.container wraps every repeating
   home-page section ("Shop by Department", "Daily Offers", "The Flahoo
   Edit", "Stay in the Loop") in Bootstrap's own stepped .container
   (150px left edge at 1440px via its 15px column gutter) -- one more
   value that didn't match the logo/nav/hero's new shared inset. Scoped
   to .fl_section.container specifically (not bare .container, which is
   reused all over the site for unrelated layout -- footer, sidebar,
   modals -- that this pass isn't touching) so only these four sections
   move. */
.fl_section.container {
	width: auto; max-width: none; margin: 0;
	padding-left: clamp(20px, 5vw, 56px); padding-right: clamp(20px, 5vw, 56px);
}
.fl_section_head { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; margin-bottom: 26px; flex-wrap: wrap; }
.fl_section_head h2 { font-family: 'proxima_nova_rgbold', sans-serif; font-size: clamp(22px,3vw,32px); font-weight: 500; color: var(--flahoo-near-black); margin: 0; }
.fl_section_head p.fl_kicker { font-size: 11.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--flahoo-red-dark); margin: 0 0 6px; font-family: 'proxima_nova_rgbold', sans-serif; }
.fl_viewall { font-size: 12.5px; font-weight: 700; color: var(--flahoo-near-black); border-bottom: 1px solid var(--flahoo-near-black); padding-bottom: 2px; text-decoration: none; font-family: 'proxima_nova_rgbold', sans-serif; white-space: nowrap; }

/* ================= RESTYLE: existing Deal Score / Our Daily Offers
   tab system (home.php) -- CSS ONLY, per Anthony's "keep the tabs,
   restyle them" answer. Every selector below targets a class that
   already exists in home.php/style.css; none of this file's new fl_*
   classes needed to be added to that markup for this part. [Claude]
   2026-10-11T, home.php's own [v22] edit log. ================= */

.red_nav .title_promo .title {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
	letter-spacing: -0.01em;
}

.red_nav .title_promo .promo .promo_text {
	font-family: 'proxima_nova_rgregular', sans-serif;
}

/* [Claude] 2026-10-12T [v40] -- the .nav.nav-tabs block that used to sit
   here ([v22], 2026-10-11) is REMOVED. It was a now-superseded first
   pass at this tab bar (underline tabs on transparent bg). [v27]
   (2026-10-11, below at .fl_deals_tabs) replaced it with light pill
   buttons -- but [v27] never removed this old rule, and because
   ".nav.nav-tabs > li.active > a" has higher CSS specificity (3
   classes) than ".fl_deals_tabs > li.active > a" (2 classes), the OLD
   underline style was still winning on the live site regardless of
   source order -- confirmed via getComputedStyle() on
   https://www.flahoo.com/uk/home showing transparent background /
   top-corners-only radius on the active tab instead of the intended
   solid red pill. Deleting the dead rule (home.php's tabs are the only
   place "nav-tabs" is used in the templates, confirmed by grep) lets
   the v27 pill design apply as originally intended. */

.deal_section_subheading {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 600;
	letter-spacing: -0.005em;
}

.deal_section_subheading_link {
	color: var(--flahoo-red-dark);
}

/* ================= RESTYLE: existing Shop page filter sidebar / heading
   (shop.php) -- CSS ONLY, same "keep the tabs, restyle them" discipline
   carried over from home.php. Every selector below targets a class that
   already exists in shop.php/style.css; no markup there needed to
   change. [Claude] 2026-10-11T, shop.php's own [v11] edit log. ================= */

.search-results-header {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
	letter-spacing: -0.01em;
}

.sidebar-heading {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
	letter-spacing: .03em;
	color: var(--flahoo-near-black);
}

.active_filters_breadcrumb .active_filter_chip {
	font-family: 'proxima_nova_rgregular', sans-serif;
	border-radius: var(--flahoo-radius-pill);
}

.active_filters_breadcrumb .clear_all_filters {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
}

/* ================= RESTYLE: existing Product page (product.php) -- CSS
   ONLY, same discipline as home.php/shop.php. This page shows a real,
   specific product's own real photo/price/offers -- no new photography
   or invented content added here, just typography/colour on the
   classes that already exist. [Claude] 2026-10-11T, see home.php's own
   [v22] edit log for the wider context (no markup edit was needed in
   product.php itself for this page). ================= */

.p_title h2 {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
	letter-spacing: -0.01em;
}

.p_title h3 {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 600;
	color: var(--flahoo-ink-soft);
}

.p_badge_row .hot_deal_pill {
	/* [Claude] rgbold here, not rgregular -- this rule never declares its
	   own font-weight, but it overrides style.css's base .hot_deal_pill
	   rule, which already pairs proxima_nova_rgbold with font-weight:
	   bold. rgregular would have been a font this badge never actually
	   had, not a revert to it. */
	font-family: 'proxima_nova_rgbold', sans-serif;
	border-radius: var(--flahoo-radius-pill);
}

.item_price.p_item_price .item_price_now {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 600;
}

.p_cta_row .p_cta_primary {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
	border-radius: var(--flahoo-radius-pill);
	letter-spacing: .01em;
}

#p_offers_table {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
}

/* ================= RESTYLE: existing Stores directory + Store profile
   pages (stores.php, store.php) -- CSS ONLY, same "keep it, restyle it"
   discipline as every other RESTYLE section above. stores.php also gets a
   new fl_page_hero banner (see its own [v5] edit log entry, markup
   already covered by the rules above); store.php gets CSS-only treatment
   here -- it already shows the real merchant's own logo as its hero
   content, so no new/invented photography is added for it. Every
   selector below targets a class that already exists in stores.php/
   store.php/style.css (several, e.g. .store-card-profile-btn/
   .store-profile-shop-btn, are shared between the two pages' markup
   already). [Claude] 2026-10-11T. ================= */

.store-profile-heading h1 {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
	letter-spacing: -0.01em;
}

.store-profile-department-badge {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
}

.store-profile-section-heading {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 500;
	letter-spacing: -0.01em;
}

.store-stat-count {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 600;
}

.store-profile-shop-btn,
.store-profile-view-all-btn,
.store-card-profile-btn {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
	letter-spacing: .01em;
}

.store-filter-label,
.store-filter-search-group input[type="text"],
.store-filter-select {
	font-family: 'proxima_nova_rgregular', sans-serif;
}

.store-filter-reset {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-weight: 700;
}


/* ================= "OUR DAILY OFFERS" -- CLEAN TAB BAR =================
   [Claude] 2026-10-11T [v27] -- Anthony's moodboard punch list, Phase A.
   The loud red .red_nav banner this section used to live in is gone --
   see home.php's own [v27] entry, which moved the heading to a plain
   .fl_section_head (styled by the shared rule above, no CSS needed
   here) and the tabs to sit directly on the page's white background.
   Only the tab bar itself needs its own rule: light pill buttons,
   replacing the old translucent-white-on-red pills. .nav-tabs/.tab-
   pane/.active class names and the data-toggle="tab" markup Bootstrap's
   JS binds to are UNCHANGED, this is visual only -- same discipline as
   before. */
.fl_deals_tabs {
	border-bottom: none;
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin: 0 0 28px;
	padding: 0;
}
.fl_deals_tabs > li { float: none; margin: 0; }
.fl_deals_tabs > li > a {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 12.5px;
	font-weight: 700;
	letter-spacing: .02em;
	color: var(--flahoo-charcoal);
	background: var(--flahoo-grey-light);
	border: none;
	border-radius: var(--flahoo-radius-pill);
	padding: 9px 18px;
	margin: 0;
}
.fl_deals_tabs > li > a:hover {
	background: var(--flahoo-pink-tint);
	color: var(--flahoo-red-dark);
}
.fl_deals_tabs > li.active > a,
.fl_deals_tabs > li.active > a:hover,
.fl_deals_tabs > li.active > a:focus {
	background: var(--flahoo-red);
	color: #fff;
	border: none;
	/* [Claude] 2026-10-12T [v40] -- explicit pill radius here, tied in
	   specificity with style.css's old bootstrap ".nav-tabs > li.active
	   > a { border-radius:5px; }" (and its 768px media override that
	   zeroed the bottom corners) but loaded after it, so this wins the
	   tie and the active tab gets the same full pill shape as the
	   inactive ones instead of top-rounded-only corners. */
	border-radius: var(--flahoo-radius-pill);
}

/* ================= "STAY IN THE LOOP" SIGNUP =================
   [Claude] 2026-10-11T [v28] -- Anthony's moodboard punch list, Phase A.
   The newsletter form moved out of the old red deals banner into its
   own section (home.php's own [v28] entry) -- same form, same CSRF
   field, same flashdata states, just a new tint-background + photo
   layout matching the reference images' "Stay in the Loop" panel. */
.fl_signup_section {
	background: var(--flahoo-pink-tint);
	padding-block: 56px;
}
.fl_signup_grid {
	display: grid;
	grid-template-columns: 1.1fr 1fr;
	gap: 48px;
	align-items: center;
}
@media (max-width: 900px) { .fl_signup_grid { grid-template-columns: 1fr; gap: 28px; } }
.fl_signup_copy h2 {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: clamp(24px,3.4vw,36px);
	font-weight: 500;
	color: var(--flahoo-near-black);
	line-height: 1.12;
	margin: 6px 0 12px;
}
.fl_signup_sub {
	font-family: 'proxima_nova_rgregular', sans-serif;
	font-size: 14.5px;
	color: var(--flahoo-charcoal);
	max-width: 460px;
	line-height: 1.55;
	margin: 0 0 20px;
}
.fl_signup_benefits {
	display: flex;
	flex-wrap: wrap;
	gap: 18px 28px;
	margin-bottom: 26px;
}
.fl_signup_benefit {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
	gap: 8px;
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 12.5px;
	color: var(--flahoo-near-black);
	max-width: 110px;
}
.fl_signup_benefit svg {
	width: 22px;
	height: 22px;
	color: var(--flahoo-red);
	padding: 9px;
	background: #fff;
	border-radius: 50%;
	box-sizing: content-box;
}
.fl_signup_msg {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 13px;
	color: var(--flahoo-red-dark);
	margin: 0 0 12px;
}
.fl_signup_msg_success { color: #1f7a43; }
.fl_signup_form {
	display: flex;
	flex-wrap: wrap;
	gap: 10px;
	margin-bottom: 10px;
}
.fl_signup_field {
	display: flex;
	align-items: center;
	gap: 8px;
	background: #fff;
	border-radius: var(--flahoo-radius-pill);
	padding: 0 16px;
	flex: 1 1 260px;
	min-width: 220px;
}
.fl_signup_field svg { width: 17px; height: 17px; color: var(--flahoo-ink-faint); flex: 0 0 auto; }
.fl_signup_field input {
	border: none;
	background: transparent;
	outline: none;
	font-family: 'proxima_nova_rgregular', sans-serif;
	font-size: 14px;
	padding: 13px 0;
	width: 100%;
}
.fl_signup_btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	background: var(--flahoo-red);
	color: #fff;
	border: none;
	border-radius: var(--flahoo-radius-pill);
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 13.5px;
	font-weight: 700;
	padding: 0 24px;
	cursor: pointer;
	flex: 0 0 auto;
}
.fl_signup_btn:hover { background: var(--flahoo-red-dark); }
.fl_signup_legal {
	font-family: 'proxima_nova_rgregular', sans-serif;
	font-size: 11.5px;
	color: var(--flahoo-ink-faint);
	margin: 0;
}
.fl_signup_legal a { color: var(--flahoo-charcoal); text-decoration: underline; }
.fl_signup_photo {
	position: relative;
	border-radius: var(--flahoo-radius-lg);
	overflow: hidden;
	aspect-ratio: 4/3;
	background: #2a1118;
}
.fl_signup_photo_chip {
	position: absolute; left: 18px; bottom: 18px; z-index: 2;
	background: rgba(255,255,255,0.92); font-size: 12px; font-weight: 700;
	color: var(--flahoo-near-black); padding: 7px 14px; border-radius: var(--flahoo-radius-pill);
	font-family: 'proxima_nova_rgbold', sans-serif;
}

/* ================= "TRUSTED BY" BRAND STRIP =================
   [Claude] 2026-10-11T [v29] -- Anthony's moodboard punch list, Phase A
   (a scrollable brand-logo strip). Plain text wordmarks, not each
   brand's logo_url image -- a good number of brands in $popular_brands
   have no logo on file (the mobile Popular Brands row above already
   has a badge-initial fallback for exactly this reason), and a strip
   that's meant to read at a glance shouldn't mix real logos with
   fallback-initial badges. Horizontal scroll, same mechanics as the
   department rail above (flex + overflow-x:auto, hidden scrollbar). */
.fl_brand_strip_section {
	background: #fff;
	border-top: 1px solid var(--flahoo-line);
	border-bottom: 1px solid var(--flahoo-line);
	padding-block: 22px;
}
.fl_brand_strip_head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	flex-wrap: wrap;
	margin-bottom: 14px;
}
.fl_brand_strip_head p {
	margin: 0;
	font-family: 'proxima_nova_rgregular', sans-serif;
	font-size: 13px;
	color: var(--flahoo-charcoal);
}
.fl_brand_strip_row {
	display: flex;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	gap: 34px;
	padding: 2px 2px 6px;
	scrollbar-width: none;
}
.fl_brand_strip_row::-webkit-scrollbar { display: none; }
.fl_brand_strip_item {
	flex: 0 0 auto;
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 15px;
	color: var(--flahoo-near-black);
	text-decoration: none;
	white-space: nowrap;
	opacity: .72;
}
.fl_brand_strip_item:hover { opacity: 1; color: var(--flahoo-red); }

/* ================= SAVED COLLECTIONS: NAMED BOARD TABS =================
   [Claude] 2026-10-11T -- Saved Collections named boards (Anthony:
   "named boards + price alerts"). Pill-tab row on pins.php, sitting
   directly below .fl_page_hero and above the pre-existing .shop_head
   block -- see that file's own [v3] edit log entry for the markup.
   Same pill-tab visual language as .fl_deals_tabs (home.php's "Our
   Daily Offers" banner) for consistency, but on the page's plain light
   background rather than painted onto a red banner. Live-verified
   (375/768/1440px, wrap behaviour, active-state contrast) by injecting
   this block into the live /shop page's own .fl_page_hero with mock
   board names before writing it here -- /pins redirects anonymous
   visitors, so it can't be tested directly with no session. */
.fl_board_tabs_wrap {
	max-width: 1180px;
	margin: 0 auto;
	padding: 18px 20px 0;
}
.fl_board_tabs {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	list-style: none;
	margin: 0;
	padding: 0;
}
.fl_board_tabs > li {
	display: flex;
	align-items: center;
	gap: 4px;
}
.fl_board_tabs > li > a {
	display: inline-block;
	padding: 8px 16px;
	border-radius: var(--flahoo-radius-pill);
	background: var(--flahoo-grey-light);
	color: var(--flahoo-charcoal);
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 12.5px;
	letter-spacing: .02em;
	text-decoration: none;
	transition: background .15s ease, color .15s ease;
}
.fl_board_tabs > li > a:hover { background: var(--flahoo-pink-tint); color: var(--flahoo-red-dark); text-decoration: none; }
.fl_board_tabs > li.active > a { background: var(--flahoo-red); color: #fff; }
.fl_board_tab_actions { display: inline-flex; gap: 2px; }
.fl_board_rename_btn, .fl_board_delete_btn {
	border: none;
	background: var(--flahoo-grey-light);
	color: var(--flahoo-ink-soft);
	width: 26px;
	height: 26px;
	border-radius: 50%;
	cursor: pointer;
	font-size: 13px;
	line-height: 1;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.fl_board_rename_btn:hover, .fl_board_delete_btn:hover { background: var(--flahoo-pink-tint); color: var(--flahoo-red-dark); }
.fl_board_new > button {
	display: inline-block;
	padding: 8px 16px;
	border-radius: var(--flahoo-radius-pill);
	background: transparent;
	border: 1px dashed var(--flahoo-line);
	color: var(--flahoo-ink-faint);
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 12.5px;
	cursor: pointer;
}
.fl_board_new > button:hover { border-color: var(--flahoo-red); color: var(--flahoo-red); }

@media (max-width: 767px) {
	.fl_board_tabs_wrap { padding: 14px 16px 0; }
	.fl_board_tabs { gap: 6px; }
	.fl_board_tabs > li > a { padding: 7px 12px; font-size: 12px; }
}

/* ================= SAVED COLLECTIONS: PRICE-DROPPED BADGE =================
   [Claude] 2026-10-11T -- Saved Collections price-dropped indicator
   (Anthony: in-page indicator only, no email). .item_price_dropped_badge
   is rendered by Pop_model::renderProduct() (see its own doc comment on
   $price_drop_baseline) only on pins.php -- no other product grid
   site-wide ever passes that 3rd arg, so this class only ever appears
   there. Sits inside .item_price alongside the existing .discount_tag/
   .premium_value_tag/.one_to_watch_tag pills -- matching pill shape
   (var(--flahoo-radius-pill)) but its own green, since "price dropped"
   is a distinct, positive signal from the merchant's own sale/premium
   tags above it. */
.item_price_dropped_badge {
	display: inline-block;
	padding: 3px 10px;
	border-radius: var(--flahoo-radius-pill);
	background: #e3f5e9;
	color: #1f7a43;
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 11px;
	letter-spacing: .01em;
	white-space: nowrap;
}

/* ================= PHASE A: DESKTOP HEADER REBUILD =================
   [Claude] 2026-10-11T [v15] -- Anthony's moodboard punch list, Phase A
   (header): smaller logo, search + account merged into one compact
   row, and the black "Shop by Department" mega-menu bar replaced by a
   light "Shop / Brands / Stores" link row (the 3 real .stores-classed
   <li> elements in header.php's #navigation, relabelled/reordered --
   see header.php's own [v15] entry). The .departments <li> is hidden
   via .fl_nav_hidden rather than deleted, so the full department
   flyout markup/PHP loop stays intact and reversible.

   Scoped ENTIRELY to @media (min-width: 768px): header.php's existing
   mobile header (.mobile_hero_nav icon row, .mobile_login_icon, built
   Sept 15 2026) is a separate, already-good design and must not be
   touched by this pass -- confirmed via live DOM-injection testing at
   1440px/800px (desktop/tablet) and a mobile baseline screenshot
   before writing this file. Reuses the existing --flahoo-red/
   --flahoo-off-white/--flahoo-charcoal/--flahoo-near-black tokens
   (style.css's own :root block) rather than inventing new colours. */

/* [Claude] 2026-10-13T -- Phase 12 follow-up, widened Phase 13 (Anthony:
   "Still not aligned" on desktop, then "align the mobile version" the same
   day). Real cause: #login_box itself centres fine wherever #login is a
   flex row with align-items:center (confirmed via getBoundingClientRect at
   both 1440px and 375px -- #login_box and #login_text land on the same
   vertical centre either way). The mismatch is INSIDE #login_box:
   .pinns_saved (style.css) is an inline-flex <a>, which as an atomic
   inline box defaults to vertical-align:baseline -- so it sits with its
   own bottom edge pinned to #login_box's text baseline rather than
   centred in its line box, visibly higher than "Register" (which is just
   normal inline text, already centred by its own line-height). This was
   originally scoped inside the >=768px block above, but the identical
   markup/class is used at every width, so moved here, unscoped, once the
   same misalignment was confirmed live on mobile too -- deliberately not
   on the global .pinns_saved rule in style.css itself, since that class
   is also used on the product page in a context where this fix does not
   apply. */
#login_box .pinns_saved {
	vertical-align: middle;
}

@media (min-width: 768px) {

	/* Shrink the logo + reduce the two decorative header background
	   strips to match (style.css: .logo img had padding-top:40px,
	   max-width:150px, top:-20px; .header_bg_1 was 40px tall,
	   .header_bg_2 started at top:40px).
	   [Claude] 2026-10-12T [v35] -- Anthony: "Make flahoo logo smaller,
	   nearer to the search bar and align everything middle so it looks
	   really professional." Shrunk again (110px -> 80px) and the manual
	   padding-top:18px/top:0 nudge dropped to a flat 0/0 -- those were
	   only ever there to hand-position the logo under the old float-
	   based row; the new flex row below (#header .container > .row)
	   now centres it for real, so compensating offsets on the logo
	   itself would just throw that off again. */
	#header .logo img {
		max-width: 80px;
		padding-top: 0;
		top: 0;
	}
	#header .header_bg_1 { height: 20px; }
	#header .header_bg_2 { top: 20px; }

	/* [Claude] 2026-10-12T [v33] -- Anthony: "Seems like a grey border" (at
	   the very top of the page, above the logo). These two divs
	   (style.css, ~line 105) are a pair of decorative white-to-grey
	   gradient strips (#ffffff -> #f8f8f8, and #ffffff -> #efefef with its
	   own 1px #e6e6e6 border-top) built for the OLD, much taller desktop
	   header -- #header .logo img used to have padding-top:40px/top:-20px
	   (style.css base rule), so these 40px-tall strips sat behind/around
	   it as subtle texture. Since the Oct 11 Phase A shrink (logo cut to
	   padding-top:18px/top:0, just above), they no longer line up with
	   anything and just read as a stray grey bar pinned above the new
	   compact header. Hidden rather than removed -- see this file's own
	   "hide, don't delete" convention -- scoped to this existing >=768px
	   block so the Sept 15 2026 mobile header (which never adopted this
	   shrink and still wants its original 40px band) is untouched. */
	#header .header_bg_1, #header .header_bg_2 { display: none; }

	/* #login (style.css: position:relative; min-height:140px) becomes a
	   compact flex row holding the new desktop account icon + the
	   existing JS-populated #login_box/#login_text, replacing
	   #login_box's own broken-looking red background-image box. */
	#login {
		min-height: 0;
		display: flex;
		align-items: center;
		justify-content: flex-end;
		gap: 10px;
		/* [Claude] 2026-10-12T [v35] -- was 22px 0 0, then 16px 0 0 (the
		   [v32] pass's own manual nudge to line the icon up with the logo
		   and search bar under the old float-based row). The row itself
		   is a real centred flex row now (#header .container > .row,
		   below) -- it centres #login's whole box on its own, so any
		   padding here would just push the icon off-centre again. */
		padding: 0;
	}
	#login .mobile_login_icon { display: none; }
	#login .fl_account_icon_desktop {
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 34px;
		height: 34px;
		border-radius: 50%;
		background: var(--flahoo-grey-light);
		color: var(--flahoo-charcoal);
		flex: 0 0 auto;
	}
	#login .fl_account_icon_desktop svg { width: 18px; height: 18px; }
	#login #login_box {
		/* [Claude] 2026-10-13T -- Phase 12 (Anthony: "I still think the saved
		   text is not aligned with the Register text" / "Check the text is the
		   same size"). Root cause: #login_text ("Register") has always set its
		   own font-size:13px (style.css + this file), but #login_box (the
		   "N saved" link) never got an explicit font-size of its own -- it was
		   quietly inheriting the page global body font-size (14px), one pixel
		   larger than "Register" right next to it. Matching it to 13px so both
		   sides of the divider are genuinely the same size, not just visually
		   close. */
		font-size: 13px;
		position: static;
		height: auto;
		width: auto;
		background-image: none;
		background: none;
		/* [Claude] 2026-10-13T -- Phase 10 (Anthony: "the hearts don't align").
		   This box's own base rule (style.css, ~line 183) still carries
		   padding-top:34px -- a leftover from the OLD 114px-tall
		   login_70.png button this flex row replaced. Never reset when
		   this became a flex child of #login (align-items:center) --
		   so the saved-link content sat 34px lower inside its own box
		   than the account icon next to it, even though the row itself
		   was correctly centre-aligned. Zeroing it lets align-items:
		   center actually do its job.
		*/
		padding-top: 0;
		/* [Claude] 2026-10-13T -- Phase 9 (Anthony: "How do you track heart,
		   should it not be at the top next to the user icon" -- it's always
		   been here, right next to .fl_account_icon_desktop just above, but
		   was genuinely invisible). Root cause: style.css's base
		   "#login_box a { color: #fff; }" (written for the OLD red
		   login_70.png button background this desktop rebuild replaced,
		   still unchanged at the top of this file) was never overridden for
		   THIS flex-row layout -- so the saved-count link rendered white
		   text on this light header, i.e. nothing visible at all. Same
		   near-black token #login_text a already uses two rules down. */
		color: var(--flahoo-near-black);
	}
	#login #login_box a {
		color: var(--flahoo-near-black);
	}
	#login #login_text {
		position: static;
		top: auto;
		font-family: 'proxima_nova_rgbold', sans-serif;
		font-size: 13px;
		/* [Claude] 2026-10-13T -- Phase 11 (Anthony: "The Register is not
		   aligned with 12 saved, maybe a small line in between"). A plain
		   hairline separator between the saved-link and Register, reusing
		   the same #e6e6e6 this file already uses for the header's other
		   subtle borders (see .header_bg_2 above) rather than a new colour.
		   #login's own flex gap:10px still provides the space either side. */
		border-left: 1px solid #e6e6e6;
		padding-left: 10px;
		/* [Claude] 2026-10-13T -- Phase 10, same alignment pass as
		   #login_box just above. This box's base rule (style.css,
		   ~line 200) still carries margin-top:-6px and a fixed
		   width:70px/text-align:center -- both relics of the old
		   absolute-positioned (top:108px) layout. The negative margin
		   nudged "Register" up/out of line with the icon, and the
		   70px centred box padded empty space around short text,
		   making the gap to the saved-link look bigger than the gap
		   from the icon to the saved-link. Resetting both so this box
		   just hugs its own text, same as #login_box next to it.
		*/
		margin-top: 0;
		width: auto;
		text-align: left;
	}
	#login #login_text a {
		color: var(--flahoo-near-black);
		text-decoration: none;
	}
	#login #login_text a:hover { color: var(--flahoo-red); }
	#login #login_box a:hover { color: var(--flahoo-red); }

	/* [Claude] 2026-10-12T [v35] -- Anthony: "the top area needs to be
	   tidy... align everything middle so it looks really professional."
	   #header's row (logo / #login / the search column) was 3 Bootstrap
	   grid columns sized by FIXED PERCENTAGE (col-xs-3 / col-xs-2 /
	   col-md-7) -- a leftover from the original, much busier header this
	   grid was built for. At any real desktop width that leaves the
	   80px-wide logo sitting in a 25%-wide column (e.g. ~480px of empty
	   space at a 1990px-wide window) before the search bar even starts,
	   which is exactly the "logo far from the search bar" look Anthony
	   flagged. Turned the row into a real flex row instead, each column
	   sized to its own content (order: set explicitly since #login's
	   markup comes before the search column but needs to render last,
	   matching its old pull-right position) and vertically centred as a
	   whole -- this is also what finally makes "align everything middle"
	   solid rather than the earlier per-element padding nudges (#login's
	   own padding, #search_field's margin-top) this file already carried
	   working around a float layout. Those earlier rules are left in
	   place -- they still trim each item's OWN internal dead space
	   (shorter items -> a tighter, shorter row), just no longer need to
	   carry the vertical-alignment job themselves. Confirmed live via
	   getBoundingClientRect() at both 1990px and 800px wide (logo/
	   account-icon/search-bar centres landed within <1px of each other
	   at both) before writing this. */
	#header .container > .row {
		display: flex;
		align-items: center;
		gap: 24px;
	}
	#header .container > .row > .col-xs-3 {
		flex: 0 0 auto;
		width: auto;
		order: 1;
	}
	#header .container > .row > .col-xs-2.pull-right {
		flex: 0 0 auto;
		width: auto;
		float: none;
		order: 3;
	}
	#header .container > .row > .col-xs-12.col-sm-12.col-md-7.col-lg-7 {
		flex: 1 1 auto;
		width: auto;
		min-width: 0;
		order: 2;
	}
	/* [Claude] 2026-10-12T [v39] -- Anthony: "The logo needs to be near
	   the search bar and so does the user symbol and Register. Everything
	   need to be more compact." Measured live: the visible gap between
	   the logo image and the search box was 54px, and between the search
	   box and the account icon was ALSO 54px -- the flex row's own 24px
	   gap above only accounts for a third of that each time. The other
	   30px on each side is Bootstrap's original grid-gutter padding
	   (padding-left/right:15px), still sitting on these 3 columns from
	   before this row was converted to flex -- it was never needed once
	   spacing moved to the row's own `gap`, just never cleaned up.
	   (The account-icon column has an extra wrinkle: #login -- which the
	   earlier padding:0 rule already targets, just above -- is actually
	   nested INSIDE this flex item, not the flex item itself; the 15px
	   padding eating the extra space belongs to the OUTER .col-xs-2.
	   pull-right column.) Zeroed all 3 columns' leftover padding and
	   trimmed the row's own gap 24px -> 16px -- confirmed live, both
	   visible gaps now a consistent 16px (down from 54px), at 1440px,
	   1235px and 800px wide, with no overlap or crowding at any of
	   them. */
	#header .container > .row {
		gap: 16px;
	}
	#header .container > .row > .col-xs-3,
	#header .container > .row > .col-xs-12.col-sm-12.col-md-7.col-lg-7,
	#header .container > .row > .col-xs-2.pull-right {
		padding-left: 0;
		padding-right: 0;
	}
	/* [Claude] 2026-10-12T [v36] -- Anthony: "Too much white space. The menu
	   below should align to the left of the flahoo logo... When the screen
	   goes smaller the alignment goes." See the long note just above this
	   block for the root cause (Bootstrap's .row clearfix pseudo-elements
	   becoming phantom flex items). */
	#header .container > .row::before,
	#header .container > .row::after {
		display: none;
	}
	/* [Claude] 2026-10-12T [Phase 4c] -- Anthony: "ensure all things
	   align on the page on the left: logo, menu...". The logo bar above
	   has always used Bootstrap's own stepped, breakpoint-jumping
	   .container (135px left edge at 1440px); the nav row and hero text
	   elsewhere in this file use a smooth clamp(20px,5vw,56px) inset
	   instead (adopted so the home hero's nav never collides with its
	   photo at 901-1151px -- see that rule's own long comment). Rather
	   than pull nav/hero back onto Bootstrap's jumpy container (which
	   is what caused that collision in the first place), this gives the
	   logo bar the SAME smooth inset, so logo, nav, and hero text all
	   share one left edge at every width instead of three different
	   ones. Safe here specifically because the logo bar never sits next
	   to the hero photo the way the nav row does. */
	#header .container {
		width: auto;
		max-width: none;
		margin: 0;
		padding-left: clamp(20px, 5vw, 56px);
		padding-right: clamp(20px, 5vw, 56px);
	}
	/* Bootstrap's .row still carries its own -15px left/right margin
	   (meant to offset its children's 15px column gutters) even after
	   the v36 fix above hid its clearfix pseudo-elements -- confirmed
	   live this was eating exactly 15px off the new inset above (56px
	   padding - 15px negative margin = 41px, not 56px) before adding
	   this. */
	#header .container > .row {
		margin-left: 0;
		margin-right: 0;
	}

	/* Replace the black .top_background3 mega-menu bar with a light,
	   simple Shop/Brands/Stores row. */
	.top_background3 {
		background: var(--flahoo-off-white);
		border-top: 1px solid var(--flahoo-line);
		border-bottom: 1px solid var(--flahoo-line);
	}
	#navigation .fl_top_nav {
		display: flex;
		align-items: center;
		gap: 28px;
		padding: 0;
		margin: 0;
	}
	/* [Claude] 2026-10-12T [v31] -- Anthony: "Why does the top part look
	   so untidy, not centred and different sizes?" Root cause: these <li>
	   elements (and the Coupons/Blog/Help ones added in [v16]) carried a
	   generic "stores" class, reused from the original 3 real .stores-
	   classed nav links (header.php's own [v15] note) purely as a
	   styling hook. That collided with legacy style.css rules
	   (li.stores a { float:left; width:235px/290px; margin-left:-72px;
	   line-height:40px; text-align:center }) which this ruleset never
	   overrides, since it only sets display/padding/font/color on the
	   <a> -- not float/width/margin-left/line-height/text-align. Those
	   legacy box-model properties don't conflict in specificity (this
	   file's selector is more specific but never sets the same
	   properties), so both rulesets' properties merged, giving every
	   item a fixed legacy width/float/negative-margin instead of this
	   flex row's own sizing -- confirmed live via DOM injection
	   (stripping the "stores" class alone fixed the alignment).
	   header.php's own [v31] entry renames that class to the neutral
	   fl_top_nav_item, so none of this row's items match any li.stores
	   selector in style.css any more. The explicit padding:0 below
	   replaces style.css's unrelated generic "ul li { padding-left:9px }"
	   rule, which was adding uneven left padding on top of the above. */
	#navigation .fl_top_nav > li {
		list-style: none;
		margin: 0;
		padding: 0;
	}
	#navigation .fl_top_nav > li > a {
		display: block;
		padding: 13px 2px;
		font-family: 'proxima_nova_rgbold', sans-serif;
		font-size: 13px;
		letter-spacing: 0.04em;
		text-transform: uppercase;
		color: var(--flahoo-near-black);
	}
	#navigation .fl_top_nav > li > a:hover {
		color: var(--flahoo-red);
		/* [Claude] 2026-10-12T [v36] -- Anthony: "The hero menu only need to
		   change colour on hover and not be underlined." Bootstrap's own base
		   a:hover rule sets text-decoration:underline; this rule only ever
		   overrode colour, so the underline was still showing through. */
		text-decoration: none;
	}
	/* Hidden rather than removed -- see header.php's [v15] note. */
	#navigation .fl_nav_hidden { display: none; }

	/* [Claude] 2026-10-12T [v32] -- Anthony: "On item 1 let's remove the
	   all department dropdown and everything should be tidy and middle
	   aligned." Three separate things were making the search row look
	   untidy and sitting lower than the logo/account icon -- confirmed
	   live via DOM measurement before writing any of this:

	   1) The black "All Departments" dropdown (header.php's
	      .mobile_dept_select_wrapper, wrapping #category) was already
	      hidden on mobile (style.css) but NOT at desktop widths -- still
	      visible exactly as in Anthony's screenshot. Same "hide, don't
	      delete" treatment: the <select>, its name/id and
	      special_select.js's init are untouched, and special_select.js
	      inserts its own rendered widget (.sselect_wrapper) as a sibling
	      INSIDE this same wrapper div (confirmed in special_select.js),
	      so hiding the wrapper hides both the native select and the
	      visible custom widget together. The search input is already
	      flex:1 in #search_field .navbar-form (style.css), so with the
	      dropdown gone it simply stretches to fill the full row on its
	      own -- no markup change needed.

	   2) #search_field (style.css) and its text input each carried their
	      own separate margin-top:15px (30px stacked) -- the exact "two
	      15px margins" the Sept 15 2026 mobile fix already called out and
	      zeroed for mobile only (.mobile_dept_select_wrapper's own
	      comment, a few lines above here). Desktop never got that same
	      fix. Zeroed here too.

	   3) The real remainder (measured ~22px) was header.php's OTHER,
	      mostly-dead "row hidden-xs" above the search row -- the pre-
	      Phase-A navbar list (ul.navbar), now just one empty
	      <li class="account_settings"> plus several always-hidden
	      .fl_old_nav_hidden/admin_menu_link items -- still taking up an
	      empty line's worth of height from the browser's default <ul>
	      box. That li is NOT dead, though: footer.php's get_pinns AJAX
	      callback fills it with a real "Account Settings" link for a
	      logged-in visitor (search this file's own history/footer.php
	      for ".account_settings, .account_settings_"), so it can't just
	      be deleted or hidden outright without losing that link for
	      logged-in users. Collapsed instead with a live :has()/:empty
	      guard -- collapse the row ONLY while account_settings is still
	      genuinely empty (every anonymous visitor, and briefly for a
	      logged-in one before that AJAX call resolves); the moment
	      footer.php's script fills it, the row no longer matches
	      :empty and reappears on its own, no JS of mine required.
	      Verified live both ways (DOM-injection, including manually
	      filling the li to confirm the row comes back). */
	#header .row.hidden-xs:not(:has(li.account_settings:not(:empty))) {
		display: none;
	}
	.mobile_dept_select_wrapper { display: none; }
	#search_field { margin-top: 0; }
	#search_field input[type="text"] {
		margin-top: 0;
		/* [Claude] 2026-10-13T -- Phase 10 (Anthony: "the search bar
		   being too big"). style.css's base rule (~line 598) sets
		   height:50px/font-size:16px -- sized for the header's
		   original, much taller layout, never scaled down when the
		   logo (80px) and account icon (34px) were shrunk for this
		   compact row. Trimmed to match. */
		height: 40px;
		font-size: 14px;
		/* Square corners (style.css, ~line 5836) existed only to butt the
		   input flush against the dropdown that sat to its left -- with
		   that dropdown gone, round all four corners again so the search
		   bar reads as one clean pill. */
		border-top-left-radius: 10px;
		border-bottom-left-radius: 10px;
	}
	/* [Claude] 2026-10-13T -- Phase 11 (Anthony: "the search magnifying
	   glass should be centred and a little smaller"). The submit button
	   (style.css base rule) is still width/height:50px with bottom:0 --
	   sized and pinned for the input's OLD 50px height. Phase 10 just
	   shrank the input to 40px, so this 50px button now overflows below
	   it instead of sitting centred. Matched to the new 40px height and
	   switched bottom:0 -> top:0 so it fills the input's own box exactly
	   (#search_field has no height of its own -- the input is its only
	   normal-flow child, so top:0/height:40px spans precisely the same
	   box the input occupies). background-size shrinks the icon itself
	   within that box, independent of the source image's own pixel size. */
	#search_field [type="submit"] {
		width: 40px;
		height: 40px;
		top: 0;
		bottom: auto;
		background-size: 16px 16px;
	}
}

/* [Claude] 2026-10-12T -- Anthony's moodboard punch list, item 3: "Top of
   the hero bar becomes the menu... Shop, Brands, Stores." #navigation
   (the Shop/Brands/Stores/Coupons/Blog/Help row just above, "Shop by
   Department" already hidden there via .fl_nav_hidden) lives inside
   .top_background3, a plain light bar sitting directly above the pink
   hero on the home page -- but .top_background3 is part of the SHARED,
   cached header (every page includes it, see header.php's own "this
   header is rendered once and cached... shared identically across every
   visitor" note), so it can't be made conditionally pink server-side per
   page. Deliberately NOT a DOM-relocation (jQuery .prependTo() etc,
   the technique footer.php already uses elsewhere for similar shared-
   header/page-specific layout needs): moving #navigation INTO
   .fl_hero_copy's own flex column would add its height to that column,
   fighting the min-height trim just above (HERO section) and reopening
   the exact "too much pink" complaint that fixed. Instead: body:has()
   (well supported by now) recolours .top_background3 itself to the
   same --flahoo-pink-tint the hero already uses and drops its border,
   ONLY on a page that actually renders .fl_hero (home.php) -- with no
   gap or seam between this bar and the hero below it (.fl_hero already
   has margin-bottom:0/the header above has no bottom border fighting
   this), the menu row and the hero read as one continuous pink band,
   its own top line being the menu, with no DOM change needed and every
   other page's nav completely unaffected (confirmed live on /uk/shop
   before writing this -- still the plain light bar). Scoped to
   >=901px, same breakpoint as the rest of this phase -- mobile's
   .top_background3 also holds the separate .row.visible-xs icon-nav
   row (header.php), untouched either way since it's already hidden at
   this width by its own hidden-xs/visible-xs classes. */
/* [Claude] 2026-10-12T [v37] -- Anthony: "There is still a pink space
   above the hero pic where the menu sits on the left." Confirmed via
   both live measurement and direct pixel-sampling of Anthony's own
   screenshot that the nav bar and the photo are genuinely flush (zero
   gap) -- what he was pointing at is the solid pink block above, which
   is this very rule: it washes the ENTIRE full-width .top_background3
   bar the same pink as the hero, including the right-hand portion that
   sits directly above the photo, where there's no menu content at all
   -- confirmed with Anthony directly that this blank strip above the
   photo (not a layout gap) is what should go.
   First attempt (superseded, see [v38] below) tried splitting the
   bar's own background colour at the hero's 51.2195% column ratio --
   pink on the left, off-white on the right. Anthony's next message:
   "now there is a white space... the photo has to be flush top and
   bottom with the pink area" -- a colour swap was never the fix; nothing
   should visually occupy that area at all, the PHOTO itself needs to
   reach all the way up to the top of the bar, same as the pink copy
   column already visually does. See [v38] immediately below for the
   real fix -- this rule now just restores the bar to a flat pink (the
   original look before the gradient experiment), since the photo
   itself covers the right-hand portion once [v38]'s height change is
   in place, so the colour underneath no longer matters there. */
@media (min-width: 901px) {
	body:has(.fl_hero) .top_background3 {
		background: var(--flahoo-pink-tint);
		border-top: none;
		border-bottom: none;
	}

	/* [Claude] 2026-10-12T [v38] -- the actual fix for "the photo has to
	   be flush top and bottom with the pink area" (previous paragraph).
	   .fl_hero_photo (home.php) is a position:relative box holding an
	   absolutely-inset (inset:0) <img class="fl_photo_fill"
	   style="object-fit:cover">, so resizing the BOX itself is enough --
	   the image fills whatever shape it's given, no separate image edit
	   needed. Pulled the box up by exactly .top_background3's own
	   rendered height (44.5625px, confirmed IDENTICAL at 910px, 1235px
	   and 1990px wide -- #navigation's padding/font-size never changes
	   in this range, so this is a safe constant, not a guess) with a
	   matching negative margin-top, and grew its height by the same
	   amount so the BOTTOM edge -- already flush with the hero's own
	   bottom, untouched -- stays exactly where it was. Confirmed live via
	   getBoundingClientRect() at 1235px and 1990px: photo top ==
	   .top_background3 top == #header bottom, and photo bottom == hero
	   bottom, both pixel-exact. .fl_hero comes after .top_background3 in
	   the DOM with neither one positioned/z-indexed, so normal stacking
	   already paints the photo over the bar wherever the two overlap --
	   no z-index needed for that part. Mobile/tablet's stacked
	   (<=900px) layout is untouched, still min-width:901px-gated. */
	.fl_hero_photo {
		margin-top: -44.5625px;
		height: calc(100% + 44.5625px);
	}

	/* [Claude] 2026-10-12T [v38] -- necessary companion fix, found while
	   testing the above at narrower desktop widths (Anthony: "the menu
	   has to move dynamically with resizing"): once the photo reaches up
	   behind the bar, the Shop/Brands/Stores/Coupons/Blog/Help menu text
	   must never visually run UNDER it, at any width -- confirmed live
	   it was doing exactly that from ~901px to ~1140px wide (up to 76px
	   of overlap at 910px, menu text literally covered by the photo).
	   Root cause: #navigation sits inside its own ".container.hidden-xs"
	   (header.php), which is a plain Bootstrap container -- its width
	   SNAPS between fixed values (750/970/1170px) at Bootstrap's own
	   768/992/1200px breakpoints, centred with margin:auto, rather than
	   scaling smoothly -- while .fl_hero's own grid split (and therefore
	   where the photo begins) is a smooth, continuous percentage of the
	   viewport. Those two completely different responsive systems
	   sharing one row is what let them drift apart and collide in that
	   901-1140px band. Fix, scoped to the home page only so every other
	   page's nav keeps Bootstrap's normal container: make this
	   .container fluid instead of snapped (width/max-width/margin
	   cleared, replaced with the SAME clamp(20px,5vw,56px) left padding
	   .fl_hero_copy already uses -- so the menu's left edge now tracks
	   the copy text's own left edge at every width, continuously, and
	   not coincidentally looks properly aligned with it too), and let
	   the row's own item gap shrink a little at the narrow end
	   (clamp(14px,2vw,28px) instead of the flat 28px set above) so the
	   menu physically fits before the photo begins even at this
	   breakpoint's own minimum width. Verified live, continuously
	   resizing 901px -> 1990px: closest approach is -19px of clearance
	   at exactly 901px (the tightest point, right at this rule's own
	   lower edge), growing to roughly -87px by 1151px and beyond --
	   never once overlapping. */
	/* [Claude] 2026-10-12T [Phase 4c] -- was scoped to body:has(.fl_hero)
	   (home page only) when first written, so Shop/Stores/Collections
	   kept the OLD Bootstrap-centred nav (135px/150px left edge at
	   1440px) while home's nav tracked this same clamp() value (56px)
	   -- the exact cross-page inconsistency Anthony flagged. Un-scoped
	   so every page's nav uses this one fluid inset; nothing here
	   depends on .fl_hero specifically (it was only ever used to target
	   "pages with this kind of banner", and every page now wants the
	   same alignment regardless of which banner it has, or none). */
	.top_background3 .container {
		width: auto;
		max-width: none;
		margin: 0;
		padding-left: clamp(20px, 5vw, 56px);
		padding-right: 15px;
	}
	#navigation .fl_top_nav {
		gap: clamp(14px, 2vw, 28px);
	}
}

/* ================= PHASE A: HOMEPAGE HERO REBUILD =================
   [Claude] 2026-10-11T [v24] -- Anthony's moodboard punch list, Phase A
   (hero): "Spend Less" in brand pink/red, 3 live stats, 2 real deal
   teasers overlaid on the photo, and -- per Anthony's own mid-turn note
   ("For the pictures in the hero page. No gaps at the top and bottom")
   -- the hero photo now runs flush top and bottom. See home.php's own
   [v24] entry for the markup this pairs with. */

/* The legacy .home_hero_intro rule (style.css) still on this same div
   sets padding:36px 0 and margin-bottom:20px -- that's the exact gap
   Anthony flagged above and below the hero photo. This file loads
   AFTER style.css, so this single unconditional override wins at every
   width, including inside style.css's own <=767px media query. */
.fl_hero { padding: 0; margin-bottom: 0; }

/* "Spend Less" accent -- reuses the existing (previously unused)
   ".fl_hero_copy h1 em" colour rule, de-italicised: the moodboard shows
   it as the same weight as the rest of the headline, just in colour. */
.fl_hero_copy h1 em { font-style: normal; }

/* Tiny inline hyphen-like rule before "DAILY DEALS, CURATED" removed in
   the hero specifically (other .fl_eyebrow uses elsewhere -- the
   premium banner, department/shop page heroes -- are untouched). */
.fl_hero_copy .fl_eyebrow::before { display: none; }
.fl_hero_copy .fl_eyebrow { gap: 0; }

/* [v30] Oct 11 2026 -- Anthony: "The Daily Deal Curated need to left
   align wth live more, along with the sentence and stats." The old
   .home_hero_headline/.home_hero_subhead rules (style.css, still carried
   as classes on these elements alongside the new fl_* ones -- see this
   project's own "hide/extend, don't delete" discipline) set
   text-align:center from the original plain-text-banner hero era. Text-
   align is inherited, so setting it directly here -- on the column
   itself -- wins over that old centred value for every descendant
   (eyebrow/heading/subhead/stats) without needing to touch style.css or
   chase specificity. */
.fl_hero_copy { text-align: left; }

/* [v32] Oct 12 2026 -- Anthony: "The Free to Use line is in the WRONG
   PLACE again, this need to be part of the hero banner, the PINK part
   and at the VERY BOTTOM - IN THE PINK PART." The [v30] fix above only
   moved .fl_trust_row to be a 3rd child of .fl_hero as a whole -- a 2nd
   grid row spanning BOTH columns (grid-column:1/-1), still rendering as
   its own full-width white bar below the pink/photo row, not inside the
   pink column itself. home.php's own [v32] entry moves the same markup
   again, this time to be the LAST child of .fl_hero_copy. Since
   .fl_hero_copy is already `display:flex; flex-direction:column;
   justify-content:center` (lifestyle.css, HERO section above),
   margin-top:auto on the trust row consumes all remaining free space
   above it and pushes it flush to the column's bottom edge -- the
   eyebrow/heading/subhead/stats group above keeps its own natural
   flow. No longer a grid row of .fl_hero at all, so the [v30]
   grid-template-rows/grid-column overrides are removed (.fl_hero is
   back to its original single-row 2-column grid). Confirmed live via
   DOM injection before writing this. */
.fl_hero_copy > .fl_trust_row {
	/* [v33] Oct 12 2026 -- Anthony, after seeing the [v32] move live:
	   "There should be no grey line above and four icons should be at
	   the bottom we a small gap for style." Dropped the border-top
	   divider entirely and shrunk the gap above the icons from 20px to
	   10px -- confirmed live via DOM injection before writing this. */
	margin-top: auto;
	padding-top: 10px;
	padding-left: 0; padding-right: 0; padding-bottom: 0;
	justify-content: flex-start;
	gap: 14px 28px;
	background: transparent;
	border-bottom: none;
	border-top: none;
}
/* [Claude] 2026-10-12T -- Phase 5c (Anthony: trust row text is "too
   close to the photo for the mobile version"). See this rule's own
   entry above for why padding-bottom is deliberately 0 on desktop --
   below the same 900px breakpoint .fl_hero itself switches to a single
   stacked column (HERO section above) at, flush-to-bottom there means
   flush against the photo, so this reintroduces a small gap ONLY in the
   stacked layout. */
@media (max-width: 900px) {
	.fl_hero_copy > .fl_trust_row { padding-bottom: 22px; }
}
/* [v34] Oct 12 2026 -- Anthony, after the [v33] fix above: "Still not
   near the bottom." margin-top:auto on .fl_trust_row only pushes it
   flush to .fl_hero_copy's own CONTENT-box bottom edge -- it can't see
   past that column's own padding. .fl_hero_copy's padding (HERO section
   above) is `clamp(32px,6vw,72px) clamp(20px,5vw,56px)`, i.e. the same
   32-72px used for the TOP gap (above the eyebrow) was also being used
   as the gap below the trust row -- 72px at this viewport width,
   confirmed live via getBoundingClientRect(). Overriding just the
   bottom side to a small fixed 28px (top/left/right untouched, so the
   eyebrow/heading spacing at the top of the column is unaffected)
   brings the icon row genuinely close to the column's outer edge.
   Confirmed live via DOM injection before writing this. */
.fl_hero_copy { padding-bottom: 28px; }
/* [Claude] 2026-10-12T [v33] -- Anthony: "no pink space at the top, photo
   should be flush." In the <=900px stacked layout (.fl_hero's own
   @media (max-width: 900px) rule, HERO section above, switches it to a
   single grid column) .fl_hero_photo drops to its own row directly below
   .fl_hero_copy -- so the 28px padding-bottom just above, added to keep
   the trust row off the hero's bottom edge in the 2-column desktop
   layout, shows up as a visible pink gap before the photo instead.
   Zeroed ONLY in the stacked breakpoint; the 2-column desktop spacing
   above is untouched. Confirmed live via getBoundingClientRect() before
   writing this -- .fl_hero_photo's own top now lands exactly on
   .fl_trust_row's bottom edge, no gap. */
@media (max-width: 900px) {
	.fl_hero_copy { padding-bottom: 0; }
}

/* [Claude] 2026-10-12T -- Anthony: "the hero page can be a little smaller
   in height. Reduce pink space at the bottom." Measured live before
   changing anything: .fl_hero's own min-height:600px (HERO section,
   above) makes the whole band taller than the pink column's actual
   content needs -- the eyebrow/headline/subhead/stats group only runs
   from the top padding down to ~374px, but .fl_trust_row (pinned to the
   column's bottom via its own margin-top:auto, see the [v32]/[v34] fixes
   above) doesn't start until ~542px, a measured 168px dead gap between
   the stats row and the trust icons that reads as excess pink space --
   confirmed via getBoundingClientRect() at 1440px wide. Shrinking the
   band's min-height is the direct fix (rather than touching the trust
   row's own margin-top:auto/padding-top, which the [v32]-[v34] history
   above already dialled in and shouldn't be re-touched for this): closes
   most of that gap, leaving a natural-looking space rather than none at
   all. Only at >900px -- the <=900px media query above already drops
   min-height to auto on mobile, so phones are unaffected either way. */
@media (min-width: 901px) {
	.fl_hero { min-height: 480px; }
}

/* [v30] Oct 11 2026 -- fixes the hero deal-teaser cards rendering as full-
   height product cards instead of small floating chips (Anthony: "Where
   are the white boxes on the hero bar photo?" -- confirmed live the
   cards WERE there, just 438px tall instead of ~160px). Root cause: this
   file's existing ".fl_hero_deal_card .item_image img" rule (below) only
   constrains the <img>, but .item_image itself (the wrapping div) has
   its own base style.css rule -- display:table-cell + a fixed
   height:350px, meant for the normal full-size grid cards everywhere
   else on the site -- which this hero-specific selector never
   overrode. Collapsing the wrapper itself to match the image's own 64px
   fixes it; confirmed live (438px -> 158px).
   [v32] Oct 12 2026 -- Anthony: "too much white space on a product
   images." The 64px-tall/100%-wide box above (166x64, a ~2.6:1
   letterbox) left most of its width as dead white margin either side of
   the much-smaller-and-roughly-square watch photos once object-fit:
   contain fit them to the box -- confirmed live via DOM inspection.
   Changed to a square 76x76 box, centred with auto margins, so contain
   has far less empty space to fill. See this file's own [v32] entry on
   .item_price, just below the deal-card rules, for the matching fix to
   the two cards rendering at different HEIGHTS -- a separate bug,
   also raised in the same Anthony message. */
.fl_hero_deals .fl_hero_deal_card .item_image {
	display: block;
	width: 100%;
	/* [Claude] 2026-10-12T -- Phase 5b, live bug fix. See this rule's own
	   entry above for the full root-cause story (style.css's base
	   .item_image{height:350px} was still winning since nothing here
	   declared height). height:auto is what lets aspect-ratio actually
	   compute the box's height from its width, instead of being
	   overridden by that fixed 350px. border:none drops the base rule's
	   1px grey border, wrong for a full-bleed overlay-badge photo. */
	height: auto;
	aspect-ratio: 4 / 3;
	margin: 0;
	border: none;
	position: relative;
	overflow: hidden;
	background: #efe2e6;
}

/* [v30] Oct 11 2026 -- see header.php's own [v16] entry. Coupons/
   Editorial(->Blog)/Help are hidden here rather than removed from
   header.php's old ul.navbar, now that they're duplicated into
   #navigation .fl_top_nav (which already has full styling via the
   generic ".fl_top_nav > li > a" rule above -- no new rule needed for
   the new entries themselves). */
.fl_old_nav_hidden {
	display: none;
}

/* 3rd stat added alongside the existing 2 -- no layout change needed,
   .fl_hero_stats is already a plain flex row with gap. */

/* Deal teaser cards -- renderProduct()'s normal output (.product_grid_col/
   .item/...) shrunk down and repositioned over the bottom of the hero
   photo. fl_hero_deal_card is the extra_class renderProduct() adds to
   its own outer .product_grid_col div (see that method's own $extra_class
   doc comment) -- every rule below is scoped to it, so no other product
   card anywhere on the site is affected.
   [Claude] 2026-10-12T -- Phase 5a hero card restyle (Anthony, home page,
   instructing directly, reference image attached): "the hero pages images
   do not complement well. Please change the style to the attached...
   The image must fill the box as shown." The whole card below is rebuilt
   to match that reference's treatment: a full-bleed product photo
   (object-fit:cover, no more letterboxed contain-on-white) fills the top
   of the card edge-to-edge, with the store name and discount both moved
   OUT of the text block below and repositioned as overlay badges directly
   on the photo (store name top-left, discount pill top-right -- matching
   the reference's "BEAUTY"/"Save 94%" placement), a larger/bolder title,
   and renderProduct()'s own .button_store (previously hidden entirely --
   see the old display:none rule this replaces) repurposed as the
   reference's small circular arrow button rather than inventing new
   markup, since it already links to the same product URL as the rest of
   the card. item_store_name/discount_tag both get pointer-events:none so
   they never shadow-block the existing whole-card link (.item_title
   a::after, below, unchanged) -- confirmed the click-through still
   reaches every corner of the card via DOM injection before writing this
   to the real file. */
/* [Claude] 2026-10-12T -- Phase 5d (Anthony: "they need to be smaller
   and should resize for mobile"). Card width now scales with the
   viewport via clamp() instead of a fixed 170-220px, and the old
   "@media (max-width:480px){display:none}" rule (further down this
   block) is removed -- the cards now shrink to fit a phone instead of
   disappearing there. Every inner size below (overlay text, discount
   pill, title, price, button) scales down together with the card via
   its own matching clamp(), confirmed live at 320/375/414/900/1440px
   before writing this. */
/* [Claude] 2026-10-12T -- Phase 5e (Anthony, after seeing Phase 5d live:
   "Images too big, truncating still happening. % missing. Look at these
   image as if you was a senior graphic designer and fix it properly.").
   Three real issues, diagnosed against the actual live page (not the
   hand-typed test copy): (1) the cards were genuinely too large -- at
   typical desktop widths they covered ~42% of the hero photo's height
   and nearly its full width, leaving almost no margin either side; (2)
   a store name next to a wide discount pill (e.g. "VIADUCT CLOTHING" +
   "78% OFF") rendered its full text UNDER the pill rather than
   ellipsis-truncating, because item_store_name's right-hand reserve was
   a flat px/vw clamp that didn't know how wide the pill actually was --
   confirmed live via getBoundingClientRect() that the two boxes
   overlapped by ~18px at 907px wide; (3) a card with NO discount (not
   every premium pick is on sale -- see the Phase 5c two-pass-fallback
   note above) still had that same right-hand reserve carved out of its
   store name for a pill that wasn't there, reading as an unfinished/
   asymmetric card next to its sibling that had one.
   Fixed (1) by shrinking the whole card's size scale (see this rule and
   the sizing rules below). Fixed (2) and (3) together with one CSS
   mechanism rather than two: item_store_name and discount_tag are NOT
   siblings in the DOM (renderProduct()'s shared markup nests
   discount_tag inside item_price, several levels from item_store_name),
   so they can't be grouped into a real flexbox row without touching
   that shared partial -- used :has() instead, scoped to this card only:
   .item_store_name defaults to full card width, and only pulls its
   right edge in to 50% when `.item:has(.discount_tag)` actually matches
   (i.e. only on cards that really have a pill to avoid). Verified live
   at 320/375/907/1024/1440px: zero overlap at every width including the
   104px card floor, and the no-discount card's store name now runs the
   full width instead of leaving a dead reserved gap. */
.fl_hero_deals {
	position: absolute; left: 20px; right: 20px; bottom: 20px; z-index: 2;
	display: flex; gap: clamp(8px, 2vw, 12px); flex-wrap: wrap; align-items: flex-end;
}
.fl_hero_deals .fl_hero_deal_card {
	float: none; width: auto;
	flex: 1 1 clamp(96px, 26vw, 136px);
	max-width: clamp(104px, 28vw, 140px);
	padding: 0; margin: 0;
}
.fl_hero_deals .fl_hero_deal_card .item {
	background: #fff; backdrop-filter: blur(6px);
	border-radius: 16px; padding: 0; margin: 0;
	box-shadow: 0 16px 36px rgba(22,19,22,0.22);
	font-family: 'proxima_nova_rgregular', sans-serif;
	position: relative;
	overflow: hidden;
	/* [Claude] 2026-10-12T -- Phase 5b, live bug fix (Anthony: "The text
	   should be left aligned"). style.css's base ".three_col_prodlist
	   .item { text-align: center; }" was still winning -- this rule never
	   declared its own text-align, so title/price/store-name all rendered
	   centred instead of left-aligned like the reference. */
	text-align: left;
}
/* [Claude] 2026-10-12T -- Anthony: "the images in white boxes don't link
   to the product page." Root cause: renderProduct()'s shared markup only
   wraps the image and the title text in their own small <a> tags -- the
   price block (the most visually prominent part of this teaser, right
   under the title) and the card's own white padding/background have no
   link at all, so clicking almost anywhere on the card does nothing.
   That's true of the normal grid cards everywhere else on the site too,
   but THERE each card has a visible "View Offer" button to click instead
   -- this teaser's own button_store is now shown again (see the Phase 5a
   note above), but the rest of the card still needs the same whole-box
   fix. Fixed with the standard "block link" CSS trick, scoped to this one
   card variant only (no shared renderProduct() markup touched, so every
   other product grid on the site is unaffected): the title's existing
   <a> (already pointing at the right product URL) grows an absolutely
   positioned, invisible ::after that stretches to fill the whole
   position:relative .item box above, so every pixel of the card becomes
   part of that same link. */
/* [Claude] 2026-10-12T, round 2 -- Anthony: "The white box links are not
   working" (still, after the first attempt). Root cause of THAT: the fix
   above correctly made .item position:relative so the overlay below could
   span the whole card -- but the overlay's own selector ALSO happened to
   target the <a> itself with position:relative (a leftover from drafting
   this), which made the <a> -- not .item -- the nearest positioned
   ancestor. An absolutely positioned ::after containing-blocks against
   the NEAREST positioned ancestor, so the overlay collapsed down to just
   the <a>'s own tight inline box around the one line of title text,
   instead of the full card .item already made positioned for exactly
   this purpose. Confirmed by re-reading this rule: deliberately NOT
   repeating position:relative on the <a> below fixes it -- the <a> stays
   position:static, so its ::after's absolute positioning now correctly
   escapes up to .item. */
.fl_hero_deals .fl_hero_deal_card .item_title a::after {
	content: "";
	position: absolute;
	top: 0; right: 0; bottom: 0; left: 0;
}
/* [Claude] 2026-10-12T -- Phase 5a, see the Phase 5a note above .fl_hero_deals.
   Darkens the top of the photo just enough for the white overlay badges
   below to stay legible over any source image, regardless of how light
   that particular product photo is -- same linear-gradient idiom
   .fl_photo_overlay already uses elsewhere on the site for the same
   "white text/badge over a photo" problem, just anchored to the top of
   the box here instead of the bottom. */
.fl_hero_deals .fl_hero_deal_card .item_image::after {
	content: "";
	position: absolute; inset: 0;
	background: linear-gradient(180deg, rgba(10,8,10,.48) 0%, rgba(10,8,10,0) 42%);
	pointer-events: none;
}
.fl_hero_deals .fl_hero_deal_card .item_image img {
	width: 100%; height: 100%; object-fit: cover; object-position: center;
	display: block; border-radius: 0;
}
/* [Claude] 2026-10-12T -- Phase 5a. Moved off the text block and onto the
   photo itself (top-left overlay, matching the reference's "BEAUTY"/
   "ENTERTAINMENT" eyebrow placement) -- position:absolute against .item
   works here even though item_store_name is a sibling of item_image, not
   its child, since .item (not item_image) is the nearest positioned
   ancestor. pointer-events:none so this never sits on top of (and
   swallows clicks meant for) the whole-card link above when this div's
   own optional <a> (store_merchant_id link) would otherwise intercept
   them -- the one existing destination for every click on this teaser is
   still the product page. */
/* [Claude] 2026-10-13T -- Phase 5h, live bug (Anthony, with a screenshot:
   "Design the images so the store name is never obscured as shown" --
   "NEEDS NO LA" and "VIADUCT CLO" both hard-cut with no "..." at all,
   right where the discount pill starts). Root cause: renderProduct()'s
   own markup (pop_model.php) only puts the merchant name in a plain
   text node here when there's no merchant id to link to -- when there
   IS one (both cards in the screenshot), the text sits inside a nested
   <a> instead. The white-space/overflow/text-overflow trio only
   truncates a line box belonging to the SAME element that declares it,
   and this rule was also display:flex (for easy vertical centring) --
   between the flex formatting context and the text actually living one
   level down inside the <a>, nothing here was establishing the single-
   line box ellipsis needs, so the browser just clipped the overflow
   with no "..." rather than refusing to truncate. Switched the
   centring technique from flex+align-items to line-height (height and
   line-height both 17px, matching) so this element stays a plain block
   with its own single-line box -- ellipsis now correctly applies
   whether the merchant name is a direct text node or wrapped in an
   <a>, confirmed live via scrollWidth>clientWidth plus a zoomed
   screenshot showing real "..." at 320/710/1440px. Vertical alignment
   with .discount_tag (Phase 5d's "store text should middle align to
   the % off button") is unaffected -- same top+height on both, just a
   different technique for THIS element's own internal centring. */
/* [Claude] 2026-10-13T -- Phase 5i, live bug (Anthony, after uploading
   Phase 5h: "Still not working" -- same screenshot, "NEEDS NO"/
   "VIADUCT C" still hard-cut, no "..." visible). Investigated live:
   Phase 5h's computed styles were all genuinely correct on the real
   element (display:block, overflow:hidden, text-overflow:ellipsis,
   scrollWidth>clientWidth confirming real overflow) -- but at this
   element's actual 9px font size, three ellipsis dots are only a
   couple of device pixels wide, which turned out to be effectively
   imperceptible against a busy product photo (confirmed by testing
   the exact same element/CSS at a much larger font size, where the
   dots DO paint, just too small to read here in practice). Rather
   than keep depending on a human being able to spot 1-2px of dots,
   switched the truncation CUE itself from native ellipsis to a
   mask-image fade -- the store name now dissolves smoothly into the
   image's existing top scrim (.item_image::after, just below) at its
   right edge instead of hard-cutting OR relying on "...". This reads
   clearly as "more text here" at any size and needs no extra
   contrast element of its own, since it fades into the scrim that
   already exists for exactly this legibility purpose. Confirmed live
   at 320/1440px -- no more hard cut, no reliance on a glyph that's
   unreadable at this scale. text-overflow left as overflow-safety
   only (mask is what actually carries the visual cue now, so clip
   avoids stacking a second, inconsistent truncation signal on top of
   the fade). */
/* [Claude] 2026-10-13T -- Phase 5j, Anthony after Phase 5i went live:
   "Still not working - put it below the image in the white space."
   Every prior round (5h, 5i) kept the store name as a white overlay
   ON the photo and kept fighting legibility/truncation problems that
   come with that territory (ellipsis too small to see at this font
   size, a fade that still wasn't convincing enough live). Anthony's
   own instruction here sidesteps the whole problem instead of trying
   to solve it on the photo: move the store name off the image
   entirely, into the plain white content area below it.
   This also deletes the only reason the old right-hand-reserve /
   :has(.discount_tag) mechanism (Phase 5e) existed -- that was only
   ever needed because the store name and the discount pill used to
   share the same cramped strip of photo. On white space, in normal
   document flow, the store name has the full card width to itself
   and the discount pill (still on the photo, untouched) is nowhere
   near it, so that whole mechanism is removed rather than left
   dead/confusing.
   Confirmed live in the DOM that .item_store_name already sits
   exactly between .item_image and .item_title in renderProduct()'s
   own markup (pop_model.php, unchanged) -- so switching it from
   position:absolute back to normal static flow drops it in exactly
   the right place with no markup changes needed. Restyled as a small
   grey uppercase label (was white-on-photo with a text-shadow; that
   treatment only made sense over an image) sitting above the product
   title. Kept a white-space:nowrap/ellipsis safety truncation (not
   the mask from 5i -- no longer needed, since the card's full
   content width is now available and a hard-to-read merchant name
   this long is a genuine edge case, not the common case it was when
   squeezed next to a discount pill) in case an unusually long
   merchant name is ever hit. Verified live at 320/1440px: both
   merchant names ("Needs No Label", "Viaduct Clothing") show in
   full, with visible room to spare, and the photo itself is now
   clean -- just the discount pill, no overlaid text at all. */
.fl_hero_deals .fl_hero_deal_card .item_store_name {
	position: static;
	display: block; line-height: 1.3;
	padding: clamp(5px, 1.4vw, 7px) clamp(6px, 1.6vw, 9px) 0;
	margin: 0;
	font-size: clamp(7px, 1.6vw, 8.5px); color: var(--flahoo-ink-faint); font-weight: 700;
	text-transform: uppercase; letter-spacing: .06em;
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.fl_hero_deals .fl_hero_deal_card .item_store_name a {
	color: inherit; text-decoration: none;
}
.fl_hero_deals .fl_hero_deal_card .item_title {
	padding: clamp(6px, 1.6vw, 8px) clamp(6px, 1.6vw, 9px) 0;
	font-size: clamp(10px, 2.4vw, 11.5px); font-weight: 700; color: var(--flahoo-near-black);
	line-height: 1.24; margin: 0 0 4px;
	display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
	overflow: hidden;
}
.fl_hero_deals .fl_hero_deal_card .item_title a { color: inherit; text-decoration: none; }
.fl_hero_deals .fl_hero_deal_card .item_price {
	display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px;
	padding: 0 clamp(24px, 7vw, 30px) clamp(6px, 1.6vw, 9px) clamp(6px, 1.6vw, 9px);
}
.fl_hero_deals .fl_hero_deal_card .item_price .price_was {
	min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fl_hero_deals .fl_hero_deal_card .item_price_now {
	font-family: 'proxima_nova_rgbold', sans-serif; font-weight: 700;
	font-size: clamp(11.5px, 2.8vw, 13.5px); color: var(--flahoo-near-black);
}
.fl_hero_deals .fl_hero_deal_card .price_was {
	font-size: 9.5px; color: var(--flahoo-ink-faint); text-decoration: line-through;
}
/* [Claude] 2026-10-12T -- Phase 5a. Moved off the price row and onto the
   photo itself (top-right overlay, matching the reference's white "Save
   94%" pill) -- same position:absolute-against-.item approach as
   item_store_name above, plus the same pointer-events:none so it can
   never block the whole-card link either. Restyled white-on-dark-text (to
   read as a pill sitting ON a photo) instead of the old red-on-white tag
   (which worked fine inline in a text row, not as a photo overlay). */
.fl_hero_deals .fl_hero_deal_card .discount_tag {
	display: flex; align-items: center;
	position: absolute; top: clamp(6px, 1.6vw, 10px); height: 17px;
	right: clamp(6px, 1.6vw, 9px); z-index: 2;
	font-size: clamp(7px, 1.6vw, 8.5px); font-weight: 800; color: var(--flahoo-near-black);
	background: #fff;
	padding: 0 clamp(5px, 1.5vw, 7px); border-radius: var(--flahoo-radius-pill);
	box-shadow: 0 2px 6px rgba(22,19,22,.18);
	pointer-events: none;
	white-space: nowrap;
}
/* [Claude] 2026-10-12T -- Phase 5a. button_store (renderProduct()'s own
   "View Offer"/"N Options"/"Compare Offers" link -- already points at
   this same product's page, see that method's own doc comment) was
   display:none here before today; un-hidden and repurposed as the
   reference's small circular arrow button instead of inventing new
   markup. Positioned bottom-right of the price row, same corner the
   reference uses. The link's own text ("View Offer" etc) stays in the
   DOM for screen readers -- font-size:0 hides it visually only, the
   ::after below supplies the visible arrow glyph. position:absolute
   (not pointer-events:none) deliberately: this one IS meant to be its
   own clickable target, same destination as the rest of the card, so a
   visitor aiming for "the button" in the reference's style still finds
   one here. */
.fl_hero_deals .fl_hero_deal_card .button_store {
	display: block;
	position: absolute; right: clamp(6px, 1.6vw, 9px); bottom: clamp(6px, 1.6vw, 9px); z-index: 3;
}
.fl_hero_deals .fl_hero_deal_card .button_store a {
	display: flex; align-items: center; justify-content: center;
	width: clamp(18px, 4.5vw, 22px); height: clamp(18px, 4.5vw, 22px); border-radius: 50%;
	background: var(--flahoo-pink-tint, #fee7ec);
	font-size: 0; line-height: 0;
	text-decoration: none;
	box-shadow: 0 2px 6px rgba(22,19,22,.15);
}
.fl_hero_deals .fl_hero_deal_card .button_store a::after {
	content: "\2192";
	font-size: 11px; line-height: 1;
	color: var(--flahoo-red);
}
/* Everything else renderProduct() normally prints (the brand-NAME half
   of the brand/pin row, condition/value-tag/price-dropped pills, the Hot
   Deal flame) is still noise on a small photo teaser -- hidden here
   only. button_store is deliberately NOT in this list any more -- see
   its own rule above, and item_tag_brand is handled separately below
   (its pin/heart half is kept, just the brand-name half is hidden). */
.fl_hero_deals .fl_hero_deal_card .item_condition_badge,
.fl_hero_deals .fl_hero_deal_card .premium_value_tag,
.fl_hero_deals .fl_hero_deal_card .one_to_watch_tag,
.fl_hero_deals .fl_hero_deal_card .you_save,
.fl_hero_deals .fl_hero_deal_card .item_price_dropped_badge,
.fl_hero_deals .fl_hero_deal_card .item_hot_deal_badge,
.fl_hero_deals .fl_hero_deal_card .msg_popup {
	display: none;
}
/* [Claude] 2026-10-13T -- Phase 8 follow-up (Anthony: "Can the heart be
   the same for the hero page"). The heart/save icon is renderProduct()'s
   shared .item_brand_pin markup -- same element every other product card
   on the site uses, already wired up for guests too (see Pop_model::
   get_pin_identity()) -- but it used to be bundled into the hidden list
   just above along with the brand-name row it normally sits next to, so
   it never showed on these cards at all, even for a logged-in account,
   well before guest hearts existed. Un-hidden and repositioned as its
   own small circular badge over the top-left of the photo -- that corner
   has been empty since Phase 5j moved the store name below the image, so
   this doesn't compete with .discount_tag (top-right) or .button_store
   (bottom-right); same circle size as .button_store so the three overlay
   badges read as one consistent system. Only .item_brand_pin itself (the
   pin/heart wrapper) is shown -- item_tag_brand_label (the brand name
   text) stays hidden, still noise at this size.
   .unclicked_pin/.clicked_pin's own display:none->block reveal is left
   alone here -- footer.php's get_pinns AJAX callback already toggles
   that via inline style once per page load (now unconditional, not
   gated on login -- see that file's own 2026-10-13T comment), which an
   inline style always wins over regardless of any CSS here, so this
   card follows the exact same reveal timing as every other heart icon
   on the site rather than needing its own copy of that logic. */
.fl_hero_deals .fl_hero_deal_card .item_tag_brand {
	display: block;
	position: absolute; top: clamp(6px, 1.6vw, 10px); left: clamp(6px, 1.6vw, 9px); z-index: 3;
	margin: 0; padding: 0; width: auto; height: auto;
}
.fl_hero_deals .fl_hero_deal_card .item_tag_brand_label {
	display: none;
}
.fl_hero_deals .fl_hero_deal_card .item_brand_pin {
	width: clamp(18px, 4.5vw, 22px); height: clamp(18px, 4.5vw, 22px);
	margin: 0;
}
.fl_hero_deals .fl_hero_deal_card .item_brand_pin .star {
	width: 100%; height: 100%;
	display: flex; align-items: center; justify-content: center;
	background: #fff;
	border-radius: 50%;
	box-shadow: 0 2px 6px rgba(22,19,22,.18);
	float: none; margin: 0;
}
.fl_hero_deals .fl_hero_deal_card .item_brand_pin .star .unclicked_pin,
.fl_hero_deals .fl_hero_deal_card .item_brand_pin .star .clicked_pin {
	/* [Claude] 2026-10-13T -- Phase 9, same thin-stroke SVG heart swap as
	   style.css's base .star rules (see pop_model.php's own 2026-10-13T
	   comment) -- width/height replace the old font-size now that this is
	   an SVG, not a font glyph. */
	width: clamp(10px, 2.6vw, 12px);
	height: clamp(10px, 2.6vw, 12px);
}


/* ================= PHASE A: TRUST-ICON ROW =================
   [Claude] 2026-10-11T [v25] -- Anthony's moodboard punch list, Phase A.
   See home.php's own [v25] entry for the markup this pairs with. A
   plain, full-width white strip directly under the hero band (own
   section, not inside .fl_hero, so it isn't clipped by that grid). */
/* [Claude] 2026-10-12T -- Phase 5a (Anthony, home page, instructing
   directly): "The Free to use etc icons and wording should be smaller
   and never truncated if the window is made smaller." Confirmed the
   truncation live: .fl_trust_item had white-space:nowrap with no
   min-width:0 anywhere above it in the tree (.fl_hero_copy's own [Claude]
   2026-10-12T entry, just above, is the other half of this fix) -- a
   grid/flex item's implicit minimum width defaults to its unwrapped
   content width, so a narrow window could force .fl_hero_copy (and the
   whole .fl_hero grid) wider than the viewport rather than letting a
   long item like "Curated by experts" wrap, and whatever the browser
   couldn't fit was silently clipped off rather than visibly overflowing.
   Fixed at both causes: nowrap removed (text can wrap onto a 2nd line
   inside its own item now, same as .fl_trust_row already lets whole
   items wrap via flex-wrap), min-width:0 added here too so a shrunk
   item's own icon+text row can't force its own overflow either, and
   every size (icon, font, gaps, padding) now scales down via clamp()
   instead of only at one fixed 600px breakpoint -- smaller on every
   narrower window, not just a single jump. */
.fl_trust_row {
	display: flex;
	justify-content: center;
	flex-wrap: wrap;
	gap: clamp(10px, 2.5vw, 40px);
	padding: clamp(12px, 2.5vw, 20px) clamp(14px, 3vw, 24px);
	background: #fff;
	border-bottom: 1px solid var(--flahoo-line);
}
.fl_trust_item {
	display: flex;
	align-items: center;
	gap: 6px;
	min-width: 0;
	max-width: 100%;
	color: var(--flahoo-charcoal);
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: clamp(10px, 1.6vw, 12.5px);
	white-space: normal;
	line-height: 1.2;
}
.fl_trust_item svg {
	width: clamp(13px, 1.8vw, 18px);
	height: clamp(13px, 1.8vw, 18px);
	flex: 0 0 auto;
	color: var(--flahoo-red);
}

/* ================= PHASE A: "SHOP BY DEPARTMENT" SCROLL RAIL =================
   [Claude] 2026-10-11T [v26] -- Anthony's moodboard punch list, Phase A:
   "Shop by Mood" (a hand-picked 4-department sample with real photos)
   renamed to "Shop by Department" and expanded to every real department,
   horizontally scrollable. See home.php's own [v26] entry for the
   markup. The old .fl_dept_rail/.fl_dept_tile photo-tile rules above
   are left in place (harmless, unreferenced) in case a future photo-tile
   section wants them again -- nothing here overrides or removes them. */
.fl_dept_scroll_rail {
	display: flex;
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
	gap: 22px;
	padding: 4px 4px 14px;
	scrollbar-width: none;
}
.fl_dept_scroll_rail::-webkit-scrollbar { display: none; }
.fl_dept_circle {
	display: flex;
	flex-direction: column;
	align-items: center;
	flex: 0 0 auto;
	width: 78px;
	text-decoration: none;
	text-align: center;
}
.fl_dept_circle_icon.store-category-icon {
	width: 68px;
	height: 68px;
	margin-bottom: 8px;
}
.fl_dept_circle_icon.store-category-icon svg {
	width: 30px;
	height: 30px;
}
/* [v27] Oct 12 2026 -- real-photo variant of the department circle (see
   home.php's own [v27] entry). Reuses the same width/height/margin as
   the pastel icon above so photo and icon departments line up in the
   same rail; background-size/position fills the circle from the photo's
   center (all photos sourced already a square 600x600 crop) instead of
   the pastel fill + centered SVG the icon class uses. */
.fl_dept_circle_photo {
	width: 68px;
	height: 68px;
	margin-bottom: 8px;
	border-radius: 50%;
	flex-shrink: 0;
	display: block;
	background-size: cover;
	background-position: center;
	background-color: #f0f0f0;
}
.fl_dept_circle_label {
	font-size: 12px;
	font-weight: 700;
	font-family: 'proxima_nova_rgbold', sans-serif;
	color: var(--flahoo-near-black);
	line-height: 1.25;
}

/* ================= DESKTOP: "SHOP BY DEPARTMENT" PHOTO TILE GRID =================
   [Claude] 2026-10-12 [v28] -- Anthony: keep the small scrollable circles
   for mobile, but desktop gets the moodboard treatment instead -- full-
   bleed square photo tiles in a 7-col/2-row grid (14 departments), name
   overlaid bottom-left on a gradient scrim. This is a pure CSS override
   of the exact same markup the mobile circle rail uses (home.php's
   [v27] loop) -- no HTML/PHP change, so a department with no photo still
   degrades to its pastel icon, just centered in the oversized tile
   instead of a small circle, rather than breaking. Breakpoint matches
   the site's existing 900px mobile/desktop split (see .fl_dept_rail,
   .fl_hero etc. above). */
@media (min-width: 901px) {
	.fl_dept_scroll_rail {
		display: grid;
		grid-template-columns: repeat(7, 1fr);
		gap: 18px;
		overflow: visible;
		padding: 4px 4px 8px;
	}
	.fl_dept_circle {
		width: auto;
		flex: initial;
		position: relative;
		aspect-ratio: 1 / 1;
		border-radius: var(--flahoo-radius-lg);
		overflow: hidden;
		background: #20151a;
	}
	.fl_dept_circle_icon.store-category-icon,
	.fl_dept_circle_icon.fl_dept_circle_photo {
		width: 100%;
		height: 100%;
		margin-bottom: 0;
		border-radius: 0;
	}
	.fl_dept_circle_icon.store-category-icon svg {
		width: 40px;
		height: 40px;
	}
	.fl_dept_circle_label {
		position: absolute;
		left: 0;
		right: 0;
		bottom: 0;
		z-index: 2;
		margin: 0;
		padding: 28px 14px 14px;
		font-size: 15px;
		text-align: left;
		color: #fff;
		background: linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,.6) 100%);
	}
}
@media (min-width: 901px) and (max-width: 1100px) {
	.fl_dept_scroll_rail { grid-template-columns: repeat(4, 1fr); }
}

/* ============================================================
   Footer redesign (Oct 13 2026). See footer.php's own edit log
   for the full story of which reference-image links are real vs
   dropped. #footer keeps its old ID (style.css's #footer rules --
   gradient background, .top_row, .footer_icon, .bot_row, etc. --
   are simply no longer matched by anything in the new markup, left
   in place inert, same as every other lifestyle.css phase). Every
   override below pairs the ID with the new .fl_footer class so it
   safely out-specifies the old bare #footer rules regardless of
   file load order, rather than relying on cascade position alone.
   ============================================================ */
#footer.fl_footer {
	background: var(--flahoo-near-black);
	background-image: none;
	margin-top: 40px;
	padding: 0;
	font-family: 'proxima_nova_rgregular', sans-serif;
}
.fl_footer_main {
	display: grid;
	grid-template-columns: minmax(200px, 1.3fr) repeat(3, 1fr);
	gap: clamp(28px, 5vw, 56px);
	max-width: 1200px;
	margin: 0 auto;
	padding: clamp(36px, 6vw, 56px) clamp(20px, 5vw, 56px) clamp(28px, 5vw, 40px);
}
.fl_footer_col a {
	display: block;
	color: rgba(255, 255, 255, 0.68);
	text-decoration: none;
	font-size: 13.5px;
	line-height: 2.15;
	transition: color .15s ease;
}
.fl_footer_col a:hover {
	color: #fff;
}
.fl_footer_heading {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 11px;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .08em;
	color: rgba(255, 255, 255, 0.45);
	margin: 0 0 14px;
}
#footer.fl_footer .fl_footer_logo {
	position: static;
	top: auto; left: auto; margin-left: 0;
	width: 120px;
	display: block;
	margin-bottom: 14px;
}
.fl_footer_tagline {
	font-family: 'proxima_nova_rgbold', sans-serif;
	font-size: 15px;
	font-weight: 700;
	color: #fff;
	margin: 0 0 8px;
}
.fl_footer_desc {
	font-size: 13px;
	line-height: 1.5;
	color: rgba(255, 255, 255, 0.5);
	max-width: 32ch;
	margin: 0 0 20px;
}
.fl_footer_social {
	display: flex;
	align-items: center;
	gap: 10px;
}
#footer.fl_footer .fl_footer_social_link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px; height: 34px;
	border-radius: var(--flahoo-radius-pill);
	border: 1px solid rgba(255, 255, 255, 0.22);
	color: rgba(255, 255, 255, 0.75);
	transition: background .15s ease, border-color .15s ease, color .15s ease;
}
#footer.fl_footer .fl_footer_social_link svg {
	width: 16px; height: 16px;
	fill: currentColor;
}
#footer.fl_footer .fl_footer_social_link:hover {
	background: var(--flahoo-red);
	border-color: var(--flahoo-red);
	color: #fff;
}
.fl_footer_account:empty {
	display: none;
}
.fl_footer_blog .footer_blog, .fl_footer_blog {
	display: block;
}
.fl_footer_blog a {
	white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.fl_footer_legal_strip {
	max-width: 1200px;
	margin: 0 auto;
	padding: 0 clamp(20px, 5vw, 56px) 20px;
}
.fl_footer_legal_strip p {
	margin: 0;
	padding-top: 20px;
	border-top: 1px solid rgba(255, 255, 255, 0.1);
	font-size: 10.5px;
	letter-spacing: .03em;
	color: rgba(255, 255, 255, 0.35);
}
.fl_footer_bottom {
	border-top: 1px solid rgba(255, 255, 255, 0.1);
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	max-width: 1200px;
	margin: 0 auto;
	padding: 18px clamp(20px, 5vw, 56px) clamp(20px, 5vw, 28px);
}
.fl_footer_store_switch {
	display: inline-flex;
	align-items: center;
	gap: 8px;
	font-size: 12.5px;
}
.fl_footer_store_label {
	color: rgba(255, 255, 255, 0.6);
}
.fl_footer_country_select {
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	background-color: rgba(255, 255, 255, 0.08);
	border: 1px solid rgba(255, 255, 255, 0.22);
	border-radius: 6px;
	color: #fff;
	font-family: Arial, sans-serif;
	font-size: 12.5px;
	padding: 5px 26px 5px 10px;
	cursor: pointer;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath fill='%23ffffff' fill-opacity='0.7' d='M0 0l5 6 5-6z'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 10px center;
	transition: border-color .15s ease, background-color .15s ease;
}
.fl_footer_country_select:hover,
.fl_footer_country_select:focus {
	border-color: var(--flahoo-red);
	background-color: rgba(255, 255, 255, 0.12);
	outline: none;
}
.fl_footer_country_select option {
	color: #111;
	background: #fff;
}
.fl_footer_copyright {
	margin: 0;
	font-size: 12px;
	color: rgba(255, 255, 255, 0.4);
}
@media (max-width: 900px) {
	.fl_footer_main {
		grid-template-columns: 1fr 1fr;
	}
	.fl_footer_brand {
		grid-column: 1 / -1;
	}
}
@media (max-width: 520px) {
	.fl_footer_main {
		grid-template-columns: 1fr;
	}
}
