/* Glamora shared stylesheet — luxury black/gold theme, used by the client pages,
   the center-admin dashboard, and (scoped) inside wp-admin's Glamora screens. */

.glamora-scope {
	--g-bg-dark: oklch(0.18 0.015 285);
	--g-bg-dark-2: oklch(0.223 0.02 285);
	--g-bg-dark-3: oklch(0.27 0.02 285);
	--g-border-dark: oklch(0.34 0.02 285);
	--g-text-dark: oklch(0.95 0.01 80);
	--g-text-muted-dark: oklch(0.68 0.02 280);

	/* v1.20.0 — light mode re-tuned: a soft champagne / blush ground instead of near-white, deep plum
	   ink, warm muted secondary text. Easier on the eyes, still bright. */
	--g-bg-light: oklch(0.935 0.02 65);
	--g-bg-light-2: oklch(0.965 0.016 70);
	--g-bg-light-3: oklch(0.905 0.026 60);
	--g-border-light: oklch(0.855 0.03 55);
	--g-text-light: oklch(0.26 0.04 330);
	--g-text-muted-light: oklch(0.49 0.035 320);

	--g-gold: oklch(0.76 0.135 80);
	--g-gold-2: oklch(0.68 0.13 77);
	--g-gold-soft: oklch(0.93 0.05 85);

	--g-success: oklch(0.62 0.13 148);
	--g-success-bg: oklch(0.92 0.045 148);
	--g-pending: oklch(0.72 0.15 60);
	--g-pending-bg: oklch(0.93 0.06 65);
	--g-danger: oklch(0.58 0.17 25);
	--g-danger-bg: oklch(0.93 0.05 25);

	font-family: "Cairo", system-ui, sans-serif;
	box-sizing: border-box;
}
.glamora-scope *, .glamora-scope *::before, .glamora-scope *::after { box-sizing: inherit; }
.glamora-scope a { text-decoration: none; color: var(--g-gold-2); }
.glamora-scope button { font-family: inherit; cursor: pointer; }
/* Arabic is always Cairo — form controls don't inherit the page font by default, so make them. */
.glamora-scope input, .glamora-scope select, .glamora-scope textarea, .glamora-scope optgroup { font-family: inherit; }
.glamora-scope h1, .glamora-scope h2, .glamora-scope h3, .glamora-scope h4, .glamora-scope h5, .glamora-scope h6, .glamora-scope summary { font-family: inherit; } /* site themes style headings with their own font — Arabic stays Cairo */
.glamora-scope .glamora-logotype { font-family: "Cormorant Garamond", serif; font-style: italic; font-weight: 600; }
/* Glamora Plus wordmark image (assets/img/logo-dark.png / logo-light.png) — replaces the old plain-text .glamora-logotype in every spot that renders the brand mark. */
.glamora-logo-img { height: 48px; width: auto; display: block; } /* v1.20.4 — new stacked emblem logo (≈2:1) needs more height than the old wide wordmark */
/* Light/dark wordmark swap — a spot that can be in either mode (see the theme switch) renders BOTH
   <img> variants (class glamora-logo-for-dark / glamora-logo-for-light, same markup pattern each time)
   and this shows only the one matching the currently-active scope, so the near-white logo-dark.png
   wordmark never ends up sitting unreadably on a light background (or vice-versa). A spot that's always
   one mode regardless of the switch (e.g. the dashboard's always-dark topbar) keeps a single plain
   .glamora-logo-img with no variant classes, unaffected by this rule. */
.glamora-logo-for-dark, .glamora-logo-for-light { display: none; }
.glamora-dark .glamora-logo-for-dark, .glamora-light .glamora-logo-for-light { display: block; }

/* Semantic tokens: resolve to the dark or light token set depending on which of .glamora-dark /
   .glamora-light is currently applied to the scope (see the light/dark/system theme switch below).
   Components written against these (rather than the literal -dark/-light suffixed tokens) automatically
   follow whichever mode the visitor picked, with no extra CSS needed per component. Components that must
   stay a fixed shade regardless of mode (e.g. dark text for contrast on a gold button, or the WhatsApp
   Messages inbox which intentionally keeps its own always-light chat-app look) keep referencing the
   literal tokens directly and are left alone. */
.glamora-dark {
	--g-bg: var(--g-bg-dark); --g-bg-2: var(--g-bg-dark-2); --g-bg-3: var(--g-bg-dark-3);
	--g-border: var(--g-border-dark); --g-text: var(--g-text-dark); --g-text-muted: var(--g-text-muted-dark);
	background: var(--g-bg); color: var(--g-text);
}
.glamora-light {
	--g-bg: var(--g-bg-light); --g-bg-2: var(--g-bg-light-2); --g-bg-3: var(--g-bg-light-3);
	--g-border: var(--g-border-light); --g-text: var(--g-text-light); --g-text-muted: var(--g-text-muted-light);
	--g-gold-2: oklch(0.6 0.13 70); /* deeper gold for links/text on the light ground (contrast) */
	background:
		radial-gradient(1100px 520px at 100% -8%, oklch(0.88 0.06 15 / .55), transparent 62%),
		radial-gradient(900px 480px at -8% 12%, oklch(0.9 0.07 85 / .6), transparent 60%),
		radial-gradient(1000px 600px at 50% 110%, oklch(0.88 0.05 330 / .35), transparent 60%),
		var(--g-bg);
	background-attachment: fixed;
	color: var(--g-text);
}
/* The client-facing full-page templates (centers list / "home", the single-center booking page, the
   login screen) wrap their content in `.glamora-scope` with nothing else in the page body — but that div
   was only ever as tall as its own content. On a tall viewport with modest content (e.g. only a couple of
   centers listed) the background stopped partway down and the plain white WordPress page background
   showed through below it. Forcing the scope to at least fill the viewport closes that gap; on pages
   already taller than the viewport this has no visible effect. Applies regardless of mode (was dark-only
   before the light/dark switch existed, when every one of these pages was always dark). */
.glamora-scope { min-height: 100vh; }

/* Top-of-page "Register your center" bar — Settings > Glamora Plus > "شريط الإعلان" (see
   Glamora_Public::announcement_bar_html()). Full-bleed like .glamora-hero (a sibling of .glamora-shell,
   not inside it), always the same gold-on-dark treatment regardless of the page's own light/dark mode —
   it's a promo strip, not page content. */
.glamora-announcement-bar { width: 100%; box-sizing: border-box; background: linear-gradient(90deg, var(--g-gold), var(--g-gold-2), var(--g-gold)); color: var(--g-bg-dark); padding: 10px 20px; display: flex; align-items: center; justify-content: center; gap: 14px; flex-wrap: wrap; text-align: center; }
.glamora-announcement-bar .txt { font-size: 13px; font-weight: 700; }
.glamora-announcement-bar .glamora-btn { padding: 7px 18px; font-size: 12px; white-space: nowrap; }
/* v1.20.7 — "Contact Us" button + popup (Glamora_Contact) */
.glamora-announcement-actions { display: inline-grid; grid-template-columns: 1fr 1fr; align-items: center; gap: 8px; } /* equal columns → both buttons always the same width, whatever the language */
/* Both bar buttons share one box: same border width, padding, font, height and min-width. */
.glamora-announcement-actions .glamora-btn { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box; min-width: 128px; height: 34px; padding: 0 18px; font-size: 12px; line-height: 1; border: 1.5px solid var(--g-bg-dark); text-decoration: none; font-family: inherit; }
.glamora-announcement-bar .glamora-contact-open { background: transparent; color: var(--g-bg-dark); cursor: pointer; }
.glamora-announcement-bar .glamora-contact-open:hover { background: var(--g-bg-dark); color: var(--g-gold); }
.glamora-announcement-bar .glamora-contact-open:focus-visible, .glamora-contact-modal :focus-visible { outline: 2px solid var(--g-gold); outline-offset: 2px; }
.glamora-contact-backdrop[hidden] { display: none; }
.glamora-contact-modal { position: relative; max-width: 460px; padding: 26px 24px 22px; border: 1px solid var(--g-border); }
.glamora-contact-modal h2 { font-size: 19px; font-weight: 800; margin: 0 0 6px; }
.glamora-contact-sub { font-size: 12.5px; color: var(--g-text-muted); margin: 0 0 16px; line-height: 1.6; }
.glamora-contact-x { position: absolute; top: 12px; inset-inline-end: 12px; width: 32px; height: 32px; border-radius: 50%; border: none; background: var(--g-bg-3); color: var(--g-text); font-size: 20px; line-height: 1; cursor: pointer; }
.glamora-contact-x:hover { background: var(--g-border); }
.glamora-contact-ways { display: grid; gap: 8px; }
.glamora-contact-way { display: flex; align-items: center; gap: 12px; padding: 11px 14px; border-radius: 14px; background: var(--g-bg-2); border: 1px solid var(--g-border); color: inherit; text-decoration: none; transition: border-color .15s ease, transform .12s ease; }
.glamora-contact-way:hover { border-color: var(--g-gold); transform: translateY(-1px); }
.glamora-contact-way .ic { flex: 0 0 36px; height: 36px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; }
.glamora-contact-way .ic-mail { background: color-mix(in oklab, var(--g-gold) 18%, transparent); color: var(--g-gold); }
.glamora-contact-way .ic-wa { background: color-mix(in oklab, #25d366 18%, transparent); color: #25d366; }
.glamora-contact-way .tx { display: flex; flex-direction: column; min-width: 0; }
.glamora-contact-way .lb { font-size: 11px; color: var(--g-text-muted); font-weight: 600; }
.glamora-contact-way .vl { font-size: 14px; font-weight: 700; overflow-wrap: anywhere; text-align: start; }
.glamora-contact-sep { display: flex; align-items: center; gap: 10px; margin: 18px 0 12px; font-size: 12px; font-weight: 700; color: var(--g-text-muted); }
.glamora-contact-sep::before, .glamora-contact-sep::after { content: ""; flex: 1; height: 1px; background: var(--g-border); }
.glamora-contact-form textarea { resize: vertical; min-height: 90px; }
.glamora-contact-hp { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.glamora-contact-err { background: var(--g-danger-bg); color: var(--g-danger); font-size: 12px; padding: 9px 12px; border-radius: 10px; margin-bottom: 10px; }
.glamora-contact-err[hidden], .glamora-contact-ok[hidden], .glamora-contact-form[hidden] { display: none; }
.glamora-contact-send { width: 100%; padding: 12px; font-size: 14px; cursor: pointer; }
.glamora-contact-send:disabled { opacity: .65; cursor: progress; }
.glamora-contact-ok { text-align: center; padding: 10px 0 4px; }
.glamora-contact-ok .tick { width: 56px; height: 56px; border-radius: 50%; margin: 6px auto 12px; display: flex; align-items: center; justify-content: center; font-size: 26px; background: color-mix(in oklab, #25d366 18%, transparent); color: #25d366; }
.glamora-contact-ok .h { font-size: 16px; font-weight: 800; }
.glamora-contact-ok .b { font-size: 13px; color: var(--g-text-muted); margin: 6px 0 16px; }
.glamora-contact-ok .glamora-btn { padding: 10px 26px; cursor: pointer; }
@media (max-width: 480px) { .glamora-contact-modal { padding: 22px 16px 18px; } .glamora-announcement-bar { gap: 8px; padding: 9px 12px; } }

.glamora-shell { max-width: 1000px; margin: 0 auto; padding: 24px 20px 60px; }
.glamora-header { display: flex; align-items: center; justify-content: space-between; padding-bottom: 16px; border-bottom: 1px solid var(--g-border); margin-bottom: 20px; }
.glamora-header .glamora-logotype { font-size: 24px; color: var(--g-gold); }
.glamora-header .glamora-logo-img { height: 82px; align-self: center; } /* client centers-list header — 100% larger per Wissam's request (was 30px) */
.glamora-lang-switch { display: flex; align-items: center; gap: 6px; background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 20px; padding: 5px 12px; font-size: 12px; color: var(--g-text-muted); }
.glamora-lang-switch a { color: inherit; }
.glamora-lang-switch a.is-active { color: var(--g-gold); font-weight: 700; }

/* ---- narrow-viewport fix (v1.19.2) — .glamora-header packed logo + controls into one row with no
   breakpoint, so at app/phone widths (the app's WebView is always this narrow) the controls cluster —
   worst on center-list.php, which also had a "My Bookings" chip before it moved to the bottom nav —
   ran past the edge (the language switch specifically, since it's last in the row / first in RTL's
   reading order... it sits at the row's *end*, which is the visual left in RTL, same side it was
   reported cut off on). Logo drops to its own full-width row, controls wrap below it, matching what
   Wissam asked for (logo first, controls under it) instead of guessing at a narrower logo/controls fit. */
@media (max-width: 480px) {
	.glamora-header { flex-direction: column; align-items: stretch; gap: 12px; }
	.glamora-header > .glamora-flex { justify-content: flex-end; flex-wrap: wrap; }
	/* v1.19.5 fix: align-items:stretch above (kept so the controls row still fills the width nicely)
	   was also stretching the logo <img> itself — a flex item's auto cross-size (here, width:auto,
	   since the header is now a column so width IS the cross axis) gets stretched to fill by default,
	   which overrides the image's own aspect ratio and squashed/widened the wordmark. align-self pins
	   the logo back to its own intrinsic width regardless of the row's align-items. */
	.glamora-header .glamora-logo-img { height: 60px; align-self: flex-start; }
}

/* ---- light/dark/system theme switch — a 3-button pill (data-theme-btn="light|dark|system" on each
   button, see wireThemeSwitch() in glamora-client.js / glamora-dashboard.js). Uses the semantic tokens
   above so it always matches whichever mode is currently active. */
.glamora-theme-switch { display: flex; align-items: center; gap: 2px; background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 20px; padding: 3px; flex-shrink: 0; }
.glamora-theme-switch button { display: flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; background: none; border: none; color: var(--g-text-muted); transition: background-color .15s ease, color .15s ease; }
.glamora-theme-switch button:hover { color: var(--g-text); }
.glamora-theme-switch button.is-active { background: var(--g-gold); color: var(--g-bg-dark); }
.glamora-theme-switch svg { width: 14px; height: 14px; }

.glamora-page-title h1 { font-size: 20px; font-weight: 800; margin: 0 0 20px; }

/* ---- centers list: dynamic hero (headline + booking/center-owner toggle + search + category chips
   + hero photo). Full-bleed — rendered as a sibling of `.glamora-shell`, not inside it, so its background
   spans the full viewport width regardless of the shell's own 1000px max-width. Deliberately dark/gold
   regardless of the site's light/dark toggle (same precedent as .glamora-hero-slider/.glamora-ads-slide
   below, which are also fixed-dark marketing surfaces) — the `-dark` suffixed tokens are used directly
   rather than the semantic `--g-bg`/`--g-text` ones a light/dark visitor would otherwise get. */
.glamora-hero {
	margin-top: 6px;
	padding: 62px 20px 53px; /* ~10% taller than the original 56/48 — more breathing room around the floating demo card */
	position: relative;
	background:
		radial-gradient(circle at 20% 15%, oklch(0.34 0.06 60 / 0.55), transparent 55%),
		linear-gradient(135deg, oklch(0.3 0.04 40), oklch(0.19 0.03 30));
}
/* Subtle diagonal hairline texture — decorative only, never clipped (no overflow:hidden here: an earlier
   draft of this hero clipped the floating demo card by putting overflow:hidden on this same element). */
.glamora-hero::before {
	content: "";
	position: absolute; inset: 0;
	background-image: repeating-linear-gradient(115deg, oklch(0.76 0.135 80 / 0.05) 0px, oklch(0.76 0.135 80 / 0.05) 1px, transparent 1px, transparent 64px);
	pointer-events: none;
}
.glamora-hero-inner { max-width: 1000px; margin: 0 auto; position: relative; display: flex; align-items: center; gap: 44px; flex-wrap: wrap; }
.glamora-hero-text { flex: 1 1 380px; min-width: 0; }
.glamora-hero-headline { font-size: 40px; font-weight: 800; line-height: 1.28; margin: 0; color: var(--g-text-dark); }
.glamora-hero-headline .accent { color: var(--g-gold); }
.glamora-hero-sub { font-size: 15px; color: var(--g-text-muted-dark); margin: 14px 0 0; max-width: 480px; line-height: 1.85; }

.glamora-hero-toggle { display: inline-flex; background: var(--g-bg-dark-2); border: 1px solid var(--g-border-dark); border-radius: 30px; padding: 4px; margin-top: 28px; }
.glamora-hero-toggle span, .glamora-hero-toggle a { padding: 11px 22px; border-radius: 26px; font-weight: 700; font-size: 13px; }
.glamora-hero-toggle span.is-active { background: var(--g-gold); color: var(--g-bg-dark); }
.glamora-hero-toggle a { color: var(--g-text-muted-dark); }
.glamora-hero-toggle a:hover { color: var(--g-text-dark); }

.glamora-hero-search { margin-top: 20px; background: var(--g-bg-dark-2); border: 1px solid var(--g-border-dark); border-radius: 16px; padding: 8px; display: flex; align-items: center; gap: 10px; max-width: 520px; box-shadow: 0 18px 34px rgba(0,0,0,.3); }
.glamora-hero-search svg { flex-shrink: 0; color: var(--g-text-muted-dark); margin-inline-start: 8px; }
.glamora-hero-search input { flex: 1; min-width: 0; border: none; background: none; color: var(--g-text-dark); font-size: 14px; font-family: inherit; padding: 8px 0; }
.glamora-hero-search input:focus { outline: none; }
.glamora-hero-search input::placeholder { color: var(--g-text-muted-dark); }
.glamora-hero-search .glamora-btn { padding: 12px 24px; white-space: nowrap; }

.glamora-hero-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }

/* v1.19.30 — "now live on Google Play" strip at the foot of the hero text column (center-list.php).
   Always-dark like the rest of the hero; Google's own badge PNG carries its own black fill and a little
   transparent padding, so no frame is drawn around it here. Hidden in the Android app (rule below). */
.glamora-hero-app { margin-top: 22px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.glamora-hero-app-text { display: flex; align-items: center; gap: 8px; font-size: 13.5px; font-weight: 600; color: var(--g-text-dark); }
.glamora-hero-app-new { background: var(--g-gold); color: var(--g-bg-dark); font-size: 10.5px; font-weight: 800; padding: 3px 10px; border-radius: 20px; flex-shrink: 0; }
.glamora-hero-app-badge { display: inline-block; line-height: 0; border-radius: 10px; }
.glamora-hero-app-badge img { height: 58px; width: auto; display: block; transition: transform .15s ease; }
.glamora-hero-app-badge:hover img, .glamora-hero-app-badge:focus-visible img { transform: translateY(-2px); }
.glamora-hero-app-badge:focus-visible { outline: 2px solid var(--g-gold); outline-offset: 2px; }
.glamora-home-page.glamora-in-app .glamora-hero-app { display: none; }

.glamora-hero-media { flex: 0 0 368px; width: 368px; position: relative; }
.glamora-hero-photo { border-radius: 22px; overflow: hidden; width: 100%; aspect-ratio: 4/3; box-shadow: 0 24px 54px rgba(0,0,0,.4); }
.glamora-hero-photo img { width: 100%; height: 100%; object-fit: cover; object-position: 58% 50%; display: block; }
/* v1.19.6: fallback once glamoraHeroPhotoRetry() (center-list.php) gives up on the real photo — a plain
   branded gradient beats a broken-image glyph sitting in the hero for the rest of the visit. */
.glamora-hero-photo.img-failed img { display: none; }
.glamora-hero-photo.img-failed { background: linear-gradient(135deg, var(--g-bg-dark-2), var(--g-bg-dark)); }
.glamora-hero-demo-card { position: absolute; left: -18px; top: calc(100% - 52px); width: 210px; background: var(--g-bg-dark-2); border: 1px solid var(--g-border-dark); border-radius: 16px; padding: 14px 16px; box-shadow: 0 20px 38px rgba(0,0,0,.45); }
.glamora-hero-demo-card .status { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.glamora-hero-demo-card .status-label { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; color: var(--g-text-muted-dark); }
.glamora-hero-demo-card .status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--g-gold); display: inline-block; flex-shrink: 0; }
.glamora-hero-demo-card .service { font-size: 13.5px; font-weight: 700; color: var(--g-text-dark); }
.glamora-hero-demo-card .duration { font-size: 11px; color: var(--g-text-muted-dark); margin-top: 2px; }
.glamora-hero-demo-card .footer-row { display: flex; justify-content: space-between; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--g-border-dark); }
.glamora-hero-demo-card .footer-row .lbl { font-size: 9.5px; color: var(--g-text-muted-dark); }
.glamora-hero-demo-card .footer-row .val { font-size: 11px; font-weight: 600; margin-top: 2px; color: var(--g-text-dark); }

.glamora-browse-heading { display: flex; align-items: baseline; justify-content: space-between; margin: 8px 0 20px; }
.glamora-browse-heading .title { font-size: 20px; font-weight: 800; }

@media (max-width: 720px) {
	.glamora-hero { padding: 44px 16px 40px; } /* ~10% taller, same reasoning as the desktop rule above */
	.glamora-hero-inner { flex-direction: column; align-items: stretch; gap: 0; }
	.glamora-hero-headline { font-size: 30px; }
	.glamora-hero-sub { max-width: none; }
	.glamora-hero-search { max-width: none; }
	/* v1.19.5 fix: the demo card below is absolutely positioned (out of normal flow), overhanging past
	   the photo's own bottom edge by design (card height minus its "top: calc(100% - 44px)" offset).
	   On desktop that overhang sits comfortably inside .glamora-hero's padding because the row layout's
	   height is governed by the taller text column next to it — but here .glamora-hero-inner stacks into
	   a single column, so the media block's own height is all that's reserved, and the card's overhang
	   (~70px) poked past .glamora-hero's 40px bottom padding into the "تصفح المراكز" section below it.
	   This margin-bottom reserves that space directly on the element that needs it, regardless of
	   .glamora-hero's own padding. */
	.glamora-hero-media { width: 100%; max-width: 300px; margin: 26px auto 80px; }
	.glamora-hero-demo-card { width: 190px; left: -10px; top: calc(100% - 44px); padding: 12px 14px; }
	.glamora-hero-demo-card .service { font-size: 12.5px; }
}

/* v1.19.7 — the 80px bottom margin above exists only to reserve room for .glamora-hero-demo-card's
   overhang on the stacked mobile layout (see that rule's own comment). Inside the app, that card is
   hidden entirely (glamora-home-page.glamora-in-app rules further down), so on the app that margin was
   just left over as empty dead space at the bottom of the hero — this trims it back to a plain breathing
   gap there. Website visitors (mobile or desktop) still see the card and keep the full margin; higher
   specificity here (two classes + this one) wins over the plain `.glamora-hero-media` rule above
   regardless of the media query it's declared in. */
.glamora-home-page.glamora-in-app .glamora-hero-media { margin-bottom: 26px; }

/* ---- centers grid (client landing) ---- */
.glamora-centers-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 18px; }
.glamora-loading { color: var(--g-text-muted); text-align: center; padding: 30px; grid-column: 1 / -1; }
/* Animated spinner modifier — added alongside .glamora-loading only where the message is a genuine
   "still fetching" state (never on empty-state/error reuses of the same base class, e.g. "لا يوجد أحد في
   قائمة الانتظار حالياً", so a spinner never spins next to a message saying there's nothing to load). */
.glamora-loading.is-spinner { display: flex; align-items: center; justify-content: center; gap: 9px; }
.glamora-loading.is-spinner::before { content: ""; width: 14px; height: 14px; flex-shrink: 0; border-radius: 50%; border: 2px solid var(--g-border); border-top-color: var(--g-gold); animation: glamora-spin .7s linear infinite; }
@keyframes glamora-spin { to { transform: rotate(360deg); } }
.glamora-center-card { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 18px; overflow: hidden; display: flex; flex-direction: column; }
.glamora-center-card .cover { height: 120px; background: linear-gradient(135deg, oklch(0.3 0.04 40), oklch(0.19 0.03 30)); position: relative; display: flex; align-items: center; gap: 10px; padding: 12px; }
.glamora-center-card .cover .avatar { align-self: flex-end; }
/* Client-side "center logo" avatar (shows the center's own logo image via inline background-image,
   or an initial letter as fallback) — used on both the centers-list cards and the booking-page hero.
   Previously scoped only to `.glamora-center-card .avatar`, which meant the booking-page hero's avatar
   (same markup/class, no card wrapper around it) had no width/height/shape at all and silently rendered
   invisible there — this base rule now covers both, sized 50% larger than the original 50px. */
.avatar { width: 75px; height: 75px; border-radius: 50%; background: var(--g-bg); border: 2px solid var(--g-gold); display: flex; align-items: center; justify-content: center; font-family: "Cormorant Garamond", serif; font-style: italic; font-weight: 600; color: var(--g-gold); font-size: 30px; flex-shrink: 0; }
/* flex:1 lets .body fill whatever extra height the grid row's tallest card gives this one (the grid
   stretches every .glamora-center-card to a common row height by default); combined with the "احجز الآن"
   button's own margin-top:auto (see renderCenterCard() in glamora-client.js) this pushes the button to the
   same y-position on every card in a row, regardless of how many lines its name/meta/rating happen to take. */
.glamora-center-card .body { padding: 14px 16px 16px; display: flex; flex-direction: column; gap: 8px; flex: 1; }
.glamora-center-card .name { font-size: 16px; font-weight: 700; }
.glamora-center-card .meta { font-size: 12px; color: var(--g-text-muted); }

/* Offers ticker — fills the otherwise-idle cover space beside the logo (not a thin strip above it),
   one short offer line at a time sliding bottom-to-top (see startOfferTickers() in glamora-client.js).
   Cards with no active offers get no ticker element at all, so the cover looks exactly as it did before. */
.glamora-center-card .cover .offer-ticker { flex: 1; align-self: stretch; position: relative; overflow: hidden; min-width: 0; }
.glamora-center-card .cover .offer-ticker-line { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 4px 2px; transform: translateY(120%); opacity: 0; transition: transform .5s ease, opacity .5s ease; }
.glamora-center-card .cover .offer-ticker-line.is-active { transform: translateY(0); opacity: 1; }
.glamora-center-card .cover .offer-ticker-line.is-leaving { transform: translateY(-120%); opacity: 0; }
/* Two explicit lines (line1/line2, entered separately in the offer form — see offerLinesHtml() in
   glamora-client.js), stacked exactly as typed rather than auto-wrapped. Each line is its own row and is
   individually truncated with an ellipsis if it's too long for the card, instead of reflowing the stack. */
.glamora-center-card .cover .offer-ticker-line .ln1, .glamora-center-card .cover .offer-ticker-line .ln2 { display: block; width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: center; color: #fff; text-shadow: 0 1px 4px rgba(0,0,0,.5); }
.glamora-center-card .cover .offer-ticker-line .ln1 { font-size: 14.5px; font-weight: 800; }
.glamora-center-card .cover .offer-ticker-line .ln2 { font-size: 12px; font-weight: 600; margin-top: 2px; opacity: .9; }

/* Booking-page hero slider — the bigger, image-capable sibling of the offer-ticker above (see
   heroSlideHtml()/startHeroSlider() in glamora-client.js). Only rendered when the center has offers. */
.glamora-hero-slider { position: relative; height: 224px; border-radius: 16px; overflow: hidden; margin-bottom: 18px; background: linear-gradient(135deg, oklch(0.3 0.04 40), oklch(0.19 0.03 30)); } /* ~20% taller than the original 187px */
.glamora-hero-slide { position: absolute; inset: 0; background-size: cover; background-position: center; display: flex; align-items: flex-end; transform: translateY(120%); opacity: 0; transition: transform .6s ease, opacity .6s ease; }
.glamora-hero-slide.is-active { transform: translateY(0); opacity: 1; }
.glamora-hero-slide.is-leaving { transform: translateY(-120%); opacity: 0; }
.glamora-hero-slide .caption { display: block; width: 100%; padding: 16px 18px; background: linear-gradient(to top, rgba(0,0,0,.68), rgba(0,0,0,0)); color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,.5); }
.glamora-hero-slide .caption .ln1, .glamora-hero-slide .caption .ln2 { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.glamora-hero-slide .caption .ln1 { font-size: 16px; font-weight: 800; }
.glamora-hero-slide .caption .ln2 { font-size: 13px; font-weight: 600; margin-top: 3px; opacity: .9; }
.glamora-hero-slide.no-image { align-items: center; justify-content: center; text-align: center; }
.glamora-hero-slide.no-image .caption { background: none; padding: 20px; }
.glamora-hero-slide.no-image .caption .ln1 { font-size: 19px; }
.glamora-hero-slide.no-image .caption .ln2 { font-size: 14px; }
@media (max-width: 640px) { .glamora-hero-slider { height: 185px; } } /* ~20% taller than the original 154px */

/* Site-wide advertising banner slider — centers-list page hero, between the page title and the search
   box (see loadAds()/adSlideHtml()/startAdsSlider() in glamora-client.js). Managed only in wp-admin
   ("الإعلانات"), one plain image per slide, optionally click-through to an external link in a new tab.
   No element at all is rendered when there are no active ads. */
.glamora-ads-slider { position: relative; height: 130px; border-radius: 16px; overflow: hidden; margin: 4px 0 22px; background: var(--g-bg-2); }
.glamora-ads-slide { position: absolute; inset: 0; transform: translateY(120%); opacity: 0; transition: transform .6s ease, opacity .6s ease; }
.glamora-ads-slide.is-active { transform: translateY(0); opacity: 1; }
.glamora-ads-slide.is-leaving { transform: translateY(-120%); opacity: 0; }
.glamora-ads-slide, .glamora-ads-slide > a { display: flex; align-items: flex-end; width: 100%; height: 100%; }
.glamora-ads-slide > a { position: absolute; inset: 0; }
.glamora-ads-slide-img { position: absolute; inset: 0; background-size: cover; background-position: center; }
.glamora-ads-slide .caption { position: relative; z-index: 1; display: block; width: 100%; padding: 14px 16px; background: linear-gradient(to top, rgba(0,0,0,.68), rgba(0,0,0,0)); color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,.5); }
.glamora-ads-slide .caption .ln1, .glamora-ads-slide .caption .ln2 { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.glamora-ads-slide .caption .ln1 { font-size: 16px; font-weight: 800; }
.glamora-ads-slide .caption .ln2 { font-size: 13px; font-weight: 600; margin-top: 3px; opacity: .9; }
@media (max-width: 640px) { .glamora-ads-slider { height: 100px; } }

/* ---- buttons / chips / badges ---- */
.glamora-btn { border: none; border-radius: 12px; padding: 11px 18px; font-size: 13px; font-weight: 700; transition: background-color .15s ease, color .15s ease, border-color .15s ease, transform .12s ease, box-shadow .15s ease, opacity .15s ease; }
.glamora-btn.gold { background: var(--g-gold); color: var(--g-bg-dark); }
.glamora-btn.gold:hover { background: var(--g-gold-2); }
.glamora-btn.outline { background: transparent; border: 1px solid var(--g-border-light); color: inherit; }
.glamora-btn.outline.dark-border { border-color: var(--g-border-dark); }
.glamora-btn.dark { background: var(--g-bg-dark); color: var(--g-gold); }
.glamora-btn.dark:hover { background: var(--g-bg-dark-2); }
.glamora-btn.danger { background: transparent; color: var(--g-danger); border: 1px solid var(--g-danger-bg); }
.glamora-btn:not(:disabled):hover { transform: translateY(-1px); box-shadow: 0 5px 14px rgba(0,0,0,.1); }
.glamora-btn:not(:disabled):active { transform: translateY(0); box-shadow: none; }
.glamora-btn:disabled { opacity: .5; cursor: not-allowed; }
.glamora-chip { display: inline-flex; align-items: center; font-size: 12px; padding: 7px 16px; border-radius: 20px; background: var(--g-bg-dark-2); border: 1px solid var(--g-border-dark); color: var(--g-text-muted-dark); cursor: pointer; transition: background-color .15s ease, color .15s ease, border-color .15s ease, transform .12s ease; }
.glamora-chip:hover:not(.is-active) { background: var(--g-bg-dark-3); color: var(--g-text-dark); transform: translateY(-1px); }
.glamora-light .glamora-chip { background: var(--g-bg-light-2); border-color: var(--g-border-light); color: var(--g-text-muted-light); }
.glamora-light .glamora-chip:hover:not(.is-active) { background: var(--g-bg-light-3); color: var(--g-text-light); }
.glamora-chip.is-active { background: var(--g-gold); color: var(--g-bg-dark); border-color: var(--g-gold); font-weight: 700; }
.glamora-badge { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; padding: 4px 10px; border-radius: 8px; transition: background-color .2s ease, color .2s ease; }
.glamora-badge.success { background: var(--g-success-bg); color: var(--g-success); }
.glamora-badge.pending { background: var(--g-pending-bg); color: var(--g-pending); }
.glamora-badge.danger { background: var(--g-danger-bg); color: var(--g-danger); }

/* ---- toggle switch ---- */
.glamora-toggle { width: 34px; height: 19px; border-radius: 10px; background: var(--g-border-light); position: relative; display: inline-block; cursor: pointer; flex-shrink: 0; border: none; padding: 0; }
.glamora-toggle::after { content: ""; width: 15px; height: 15px; border-radius: 50%; background: #fff; position: absolute; top: 2px; inset-inline-end: 2px; transition: inset-inline .15s; }
.glamora-toggle.is-on { background: var(--g-gold); }
.glamora-toggle.is-on::after { inset-inline-start: 2px; inset-inline-end: auto; }

/* ---- forms ---- */
.glamora-field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 12px; }
.glamora-field label { font-size: 12px; color: var(--g-text-muted-dark); font-weight: 600; }
.glamora-light .glamora-field label { color: var(--g-text-muted-light); }
.glamora-field input, .glamora-field select, .glamora-field textarea {
	background: var(--g-bg-dark-2); border: 1px solid var(--g-border-dark); color: var(--g-text-dark);
	border-radius: 10px; padding: 11px 13px; font-size: 13px; font-family: inherit;
}
.glamora-light .glamora-field input, .glamora-light .glamora-field select, .glamora-light .glamora-field textarea {
	background: #fff; border-color: var(--g-border-light); color: var(--g-text-light);
}
/* Checkboxes/radios living inside a .glamora-field (e.g. a "which services this staff member can
   perform" list) are independent form controls, not text fields — the padded, rounded text-input
   look above squashed them into a shape that made their checked/unchecked state hard to see. Give
   them a normal small box with a visible border in both states, and a high-contrast checked color
   (the muted gold used elsewhere reads too close to the page background to see a checkmark on it). */
.glamora-field input[type="checkbox"], .glamora-field input[type="radio"] {
	background: none; border-radius: 3px; padding: 0; margin: 0;
	width: 16px; height: 16px; flex-shrink: 0;
	border: 1.5px solid var(--g-border-dark); accent-color: var(--g-text-dark);
}
.glamora-light .glamora-field input[type="checkbox"], .glamora-light .glamora-field input[type="radio"] {
	border-color: var(--g-border-light); accent-color: var(--g-text-light);
}
.glamora-field input[type="radio"] { border-radius: 50%; }
.glamora-field.required label::after { content: " *"; color: var(--g-gold); }

/* wp-admin's category multi-select checkboxes (the center/service edit modals' "التصنيفات" picker —
   see .c-category-cb/.s-category-cb in glamora-admin.js). The first attempt at fixing these (a plain
   `accent-color`) never actually took over rendering: wp-admin's own core CSS styles every
   `<input type="checkbox">` on every admin screen (`input[type=checkbox]{...}` — a type+attribute
   selector, which out-specifies a bare class selector like `.c-category-cb` on its own), painting a
   checked box with the site's admin color-scheme accent and its own dashicon glyph — never designed
   against Glamora's own modal, and hard to see clearly under some schemes. This time: take over the
   box completely (`appearance: none`, wp-admin's `:before` glyph stripped) and draw our own checkmark
   with a plain CSS shape instead of relying on accent-color or any icon font, with `!important` on
   every rule so nothing in wp-admin's stylesheet can win regardless of load order. wp-admin only ever
   renders these inside .glamora-light, so only the light border token is needed — no dark-mode
   variant. */
.c-category-cb, .s-category-cb {
	-webkit-appearance: none !important;
	appearance: none !important;
	width: 18px !important;
	height: 18px !important;
	min-width: 18px !important;
	flex-shrink: 0 !important;
	margin: 0 !important;
	padding: 0 !important;
	border-radius: 4px !important;
	border: 1.5px solid var(--g-border-light) !important;
	background: #fff !important;
	box-shadow: none !important;
	position: relative !important;
	cursor: pointer !important;
}
.c-category-cb::before, .s-category-cb::before { content: none !important; }
.c-category-cb:checked, .s-category-cb:checked {
	background: var(--g-gold) !important;
	border-color: var(--g-gold) !important;
}
.c-category-cb:checked::after, .s-category-cb:checked::after {
	content: "" !important;
	position: absolute !important;
	inset: 0 !important;
	margin: auto !important;
	width: 5px !important;
	height: 9px !important;
	border: solid var(--g-bg-dark) !important;
	border-width: 0 2px 2px 0 !important;
	transform: rotate(45deg) translate(-1px, -2px) !important;
}

/* ---- generic table ---- */
.glamora-table { width: 100%; border-collapse: collapse; background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 16px; overflow: hidden; }
.glamora-table th { text-align: start; font-size: 11px; color: var(--g-text-muted); font-weight: 700; padding: 12px 16px; border-bottom: 1px solid var(--g-border); }
.glamora-table td { padding: 12px 16px; border-bottom: 1px solid var(--g-border); font-size: 13px; vertical-align: middle; }
.glamora-table tr:last-child td { border-bottom: none; }
.glamora-table tbody tr { transition: background-color .15s ease; }
.glamora-table tbody tr:hover { background: var(--g-bg-3); }
/* Branch cards (dashboard "الفروع والموظفين") reuse .glamora-table as a plain bordered/rounded card
   rather than an actual <table> — give just those a gentle hover lift, scoped to their grid container so
   it never affects a real data table. */
#branches-grid > .glamora-table { transition: transform .18s ease, box-shadow .18s ease; animation: glamora-card-in .3s ease-out backwards; }
#branches-grid > .glamora-table:hover { transform: translateY(-2px); box-shadow: 0 8px 18px rgba(0,0,0,.07); }
.glamora-table .actions { display: flex; gap: 10px; font-size: 11px; font-weight: 700; }
.glamora-table .actions a, .glamora-table .actions button { background: none; border: none; padding: 0; color: var(--g-gold-2); font-size: 11px; font-weight: 700; }
.glamora-table .actions .danger { color: var(--g-danger); }

/* ---- dashboard shell (top header bar + sidebar layout) ---- */
.glamora-dash-shell { display: flex; flex-direction: column; min-height: 640px; }

/* Header of the dashboard body: Glamora Plus' own mark plus the logged-in center's own logo/name,
   both 50% larger than their old sizes inside the sidebar (the sidebar now holds nav only). */
.glamora-dash-topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; padding: 14px 28px; background: var(--g-bg-dark); color: var(--g-text-dark); border-bottom: 1px solid var(--g-border-dark); }
.glamora-dash-topbar .topbar-glamora-logo { height: 82px; width: auto; display: block; } /* was 46px */
.glamora-dash-topbar .topbar-center { display: flex; align-items: center; gap: 14px; }
.glamora-dash-topbar .topbar-center-logo { width: 66px; height: 66px; border-radius: 16px; object-fit: cover; background: var(--g-bg-dark-3); } /* was 34px, then 51px, +30% again */
.glamora-dash-topbar .topbar-center-name { font-size: 27px; font-weight: 700; color: var(--g-text-dark); line-height: 1.2; } /* was 18px */

.glamora-dash-body { display: flex; flex: 1; }
.glamora-dash-sidebar { width: 236px; flex-shrink: 0; background: var(--g-bg-dark); color: var(--g-text-dark); display: flex; flex-direction: column; padding: 20px 14px; }
.glamora-dash-nav { display: flex; flex-direction: column; gap: 4px; }
.glamora-dash-nav .navitem { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border-radius: 10px; font-size: 13px; color: var(--g-text-muted-dark); background: none; border: none; text-align: start; width: 100%; transition: background-color .18s ease, color .18s ease, transform .15s ease; }
.glamora-dash-nav .navitem svg { transition: transform .18s ease; flex-shrink: 0; }
.glamora-dash-nav .navitem:hover:not(.is-active) { background: var(--g-bg-dark-2); color: var(--g-text-dark); }
.glamora-dash-nav .navitem:hover:not(.is-active) svg { transform: scale(1.15); }
.glamora-dash-nav .navitem.is-active { background: var(--g-gold); color: var(--g-bg-dark); font-weight: 700; }
.glamora-dash-nav .navitem:active { transform: scale(.97); }
.glamora-dash-nav .navitem .nav-badge { margin-inline-start: auto; background: var(--g-danger); color: #fff; border-radius: 10px; padding: 1px 7px; font-size: 10px; font-weight: 700; transition: background-color .2s ease, color .2s ease; }
.glamora-dash-nav .navitem.is-active .nav-badge { background: var(--g-bg-dark); color: var(--g-text-dark); }
/* Badge "pop" — replayed via JS (popBadge() in glamora-dashboard.js) whenever an unread-messages or
   waiting-list count actually changes, so a new arrival catches the eye instead of silently updating. */
.nav-badge.is-pop { animation: glamora-badge-pop .35s ease-out; }
@keyframes glamora-badge-pop { 0% { transform: scale(.5); opacity: .3; } 55% { transform: scale(1.2); } 100% { transform: scale(1); opacity: 1; } }
.glamora-dash-main { flex: 1; padding: 26px 32px; display: flex; flex-direction: column; gap: 20px; overflow-x: auto; }
.glamora-dash-main h1 { font-size: 20px; font-weight: 800; margin: 0; }
.glamora-dash-main .subtitle { font-size: 12px; color: var(--g-text-muted); margin-top: 4px; }
/* View-switch entrance — replayed via JS (animateViewIn() in glamora-dashboard.js) every time a nav item
   is clicked, so each of the dashboard's sections (not just Messages, which already has its own bubble
   animation) feels alive as it appears instead of the content just snapping into place. */
.glamora-dash-main.glamora-view-anim { animation: glamora-view-in .3s ease-out; }
@keyframes glamora-view-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ---- shared footer (client pages: centers list + booking page — see client_footer_html() in
   class-glamora-public.php; and the Center Manager dashboard shell — see dashFooterHtml() in
   glamora-dashboard.js). Optional Privacy Policy / Terms of Use / Contact Us links (each only rendered
   when set in Settings > Glamora Plus) plus a fixed "Powered by" credit. Styled for the dark scope by
   default (client pages); the .glamora-light override below covers the dashboard shell. */
.glamora-footer { display: flex; flex-direction: column; align-items: center; gap: 6px; padding: 20px 20px 4px; margin-top: 10px; border-top: 1px solid var(--g-border-dark); font-size: 11.5px; color: var(--g-text-muted-dark); text-align: center; }
.glamora-footer-links { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; justify-content: center; }
.glamora-footer-links a { color: var(--g-text-muted-dark); transition: color .15s ease; }
.glamora-footer-links a:hover { color: var(--g-gold-2); }
.glamora-footer-links .sep { opacity: .5; }
.glamora-footer-credit a { color: var(--g-gold-2); font-weight: 600; }
.glamora-light .glamora-footer { border-top-color: var(--g-border-light); color: var(--g-text-muted-light); }
.glamora-light .glamora-footer-links a { color: var(--g-text-muted-light); }
@media (max-width: 640px) { .glamora-footer { padding: 16px 16px 4px; } }

/* ---- legal/contact pages (Privacy Policy, Terms of Use, Contact Us — public/templates/legal-page.php,
   selectable from Page Attributes as "قالب Glamora Plus") ---- */
.glamora-legal-content { font-size: 14px; line-height: 1.9; color: var(--g-text); }
.glamora-legal-content h1, .glamora-legal-content h2, .glamora-legal-content h3 { color: var(--g-text); margin: 26px 0 10px; }
.glamora-legal-content h1:first-child, .glamora-legal-content h2:first-child, .glamora-legal-content h3:first-child { margin-top: 0; }
.glamora-legal-content p { margin: 0 0 14px; }
.glamora-legal-content ul, .glamora-legal-content ol { margin: 0 0 14px; padding-inline-start: 22px; }
.glamora-legal-content a { color: var(--g-gold-2); text-decoration: underline; }

/* [glamora_contact_info] shortcode output — used on a Contact Us page (see shortcode_contact_info()
   in class-glamora-public.php); values come from Settings > Glamora Plus > معلومات التواصل. */
.glamora-contact-info { display: flex; flex-direction: column; gap: 14px; margin: 6px 0; }
.glamora-contact-info .row { display: flex; align-items: flex-start; gap: 14px; background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 14px; padding: 16px 18px; }
.glamora-contact-info .ico { flex-shrink: 0; color: var(--g-gold); margin-top: 2px; }
.glamora-contact-info .label { font-size: 11px; color: var(--g-text-muted); font-weight: 700; margin-bottom: 4px; }
.glamora-contact-info .val { font-size: 14.5px; font-weight: 600; }
.glamora-contact-info .val a { color: var(--g-text); }
.glamora-contact-info .val a:hover { color: var(--g-gold-2); }

/* ---- calendar day list ---- */
.glamora-cal-row { display: grid; grid-template-columns: 60px 1fr; padding: 10px 16px; border-bottom: 1px solid var(--g-border); align-items: center; }
.glamora-cal-row:last-child { border-bottom: none; }
.glamora-cal-slot { border-radius: 10px; padding: 9px 12px; display: flex; align-items: center; justify-content: space-between; font-size: 12px; transition: transform .15s ease, box-shadow .15s ease; animation: glamora-card-in .3s ease-out backwards; }
.glamora-cal-slot:hover { transform: translateY(-1px); box-shadow: 0 4px 10px rgba(0,0,0,.06); }
/* --g-pending-bg/--g-success-bg are fixed light tints regardless of light/dark mode (by design — a
   status highlight, not a themed surface), so their text must stay a fixed dark shade too. Previously
   this relied on inheriting the surrounding text color, which is fine in light mode (already dark) but
   turned unreadable in dark mode (near-white dashboard text on a near-white badge). */
.glamora-cal-slot.pending { background: var(--g-pending-bg); color: var(--g-text-light); }
.glamora-cal-slot.confirmed { background: var(--g-success-bg); color: var(--g-text-light); }
/* .glamora-muted (the staff-name aside, e.g. "— (Ahmed)") sets its own color rather than inheriting, and
   its `.glamora-dark .glamora-muted` variant would otherwise win here by specificity — repeat the fixed
   dark-on-light-badge override for it too, so it stays legible instead of going near-invisible in dark mode. */
.glamora-cal-slot.pending .glamora-muted, .glamora-cal-slot.confirmed .glamora-muted { color: var(--g-text-muted-light); }
.glamora-cal-slot.no-show { background: var(--g-danger-bg); color: var(--g-text-light); }
.glamora-cal-slot.no-show .glamora-muted { color: var(--g-text-muted-light); }
.glamora-cal-slot.open { border: 1px dashed var(--g-border); color: var(--g-text-muted); }
.glamora-cal-slot.closed { background: var(--g-bg-3); color: var(--g-text-muted); }

/* ---- modal ---- */
.glamora-modal-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,.5); display: flex; align-items: center; justify-content: center; z-index: 9999; padding: 20px; animation: glamora-fade-in .18s ease-out; }
.glamora-modal { background: var(--g-bg); color: var(--g-text); border-radius: 18px; padding: 24px; width: 100%; max-width: 440px; max-height: 86vh; overflow-y: auto; animation: glamora-modal-in .22s cubic-bezier(.2,.9,.3,1.2); }
.glamora-modal h2 { margin: 0 0 16px; font-size: 16px; }
@keyframes glamora-fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes glamora-modal-in { from { opacity: 0; transform: translateY(14px) scale(.97); } to { opacity: 1; transform: none; } }

/* ---- in-app notification log (v1.19.12; moved from a header bell into the bottom nav's own tab in
   v1.19.13 — see bottom_nav_html()'s docblock). The unread badge sits on the bottom-nav icon itself
   (.glamora-nav-icon-wrap, that tab's own <span> wrapper around its <svg>), the same small red-dot
   pattern most apps use for an unread count on a tab bar, rather than a separate free-floating button. */
.glamora-nav-icon-wrap { position: relative; display: inline-flex; }
.glamora-notif-badge { position: absolute; top: -5px; inset-inline-end: -7px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; background: var(--g-danger); color: #fff; font-size: 9.5px; font-weight: 700; line-height: 16px; text-align: center; box-shadow: 0 0 0 2px var(--g-bg-2); }
.glamora-notif-badge[hidden] { display: none; }

.glamora-notif-list { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
.glamora-notif-item { position: relative; display: flex; flex-direction: column; gap: 4px; padding: 12px 34px 12px 14px; border-radius: 12px; background: var(--g-bg-3); }
.glamora-notif-item.is-unread { background: color-mix(in oklab, var(--g-gold) 10%, var(--g-bg-3)); }
.glamora-notif-item.is-unread::before { content: ''; position: absolute; top: 14px; inset-inline-start: 6px; width: 7px; height: 7px; border-radius: 50%; background: var(--g-gold); }
.glamora-notif-item .title { font-weight: 700; font-size: 13.5px; padding-inline-start: 12px; }
.glamora-notif-item .message { font-size: 12.5px; color: var(--g-text-muted); padding-inline-start: 12px; }
.glamora-notif-item .time { font-size: 10.5px; color: var(--g-text-muted); padding-inline-start: 12px; }
.glamora-notif-item .del-btn { position: absolute; top: 8px; inset-inline-end: 8px; width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; border-radius: 50%; color: var(--g-text-muted); background: none; border: none; }
.glamora-notif-item .del-btn:hover { background: rgba(0,0,0,.08); color: var(--g-danger); }
.glamora-notif-item .del-btn svg { width: 13px; height: 13px; }
.glamora-notif-empty { text-align: center; padding: 30px 10px; color: var(--g-text-muted); font-size: 13px; }

/* wp-admin screens rendered by glamora-admin.js (#glamora-admin-root: المراكز, لائحة الخدمات, التصنيفات,
   التقارير, الإعلانات). Unlike the plain-PHP screens, this root isn't wrapped in WordPress's own `.wrap`
   (which carries its own side margin), and wp-admin's #wpcontent only pads the LEFT side in an LTR admin
   — so in this RTL content every heading, search box and card ran flush into the right edge of the
   window (the page title was even clipped). Reported by Wissam 2026-10-04. A symmetric inner gutter
   fixes every screen at once; the scope's own background fills it, so it reads as one framed panel. */
.glamora-admin-page { padding: 22px 22px 32px; margin: 10px 20px 0 0; border-radius: 12px; }
/* Arabic-locale wp-admin (body.rtl) puts the sidebar on the right and pads #wpcontent on the right instead. */
body.rtl .glamora-admin-page { margin: 10px 0 0 20px; }

/* ---- site-admin: Centers dashboard (stat cards, avatar-badge table, services-by-category) ---- */
.glamora-page-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 22px; flex-wrap: wrap; }
.glamora-page-head h1 { font-size: 20px; font-weight: 800; margin: 0; }
.glamora-page-head .subtitle { font-size: 12px; color: var(--g-text-muted); margin-top: 4px; }

.glamora-stats-grid { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 14px; margin-bottom: 22px; }
.glamora-stat-card { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 14px; padding: 16px; transition: transform .18s ease, box-shadow .18s ease; animation: glamora-card-in .35s ease-out backwards; }
.glamora-stat-card:hover { transform: translateY(-3px); box-shadow: 0 10px 22px rgba(0,0,0,.08); }
/* Small staggered entrance for however many stat cards a given page renders (Overview has 6, Reviews'
   summary has 2) — each card fades/rises in slightly after the previous one instead of all at once. */
.glamora-stat-card:nth-child(1) { animation-delay: .02s; }
.glamora-stat-card:nth-child(2) { animation-delay: .06s; }
.glamora-stat-card:nth-child(3) { animation-delay: .1s; }
.glamora-stat-card:nth-child(4) { animation-delay: .14s; }
.glamora-stat-card:nth-child(5) { animation-delay: .18s; }
.glamora-stat-card:nth-child(6) { animation-delay: .22s; }
@keyframes glamora-card-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
.glamora-stat-card .label { font-size: 11px; color: var(--g-text-muted); font-weight: 600; }
.glamora-stat-card .value { font-size: 24px; font-weight: 800; margin-top: 6px; }
.glamora-stat-card .value.success { color: var(--g-success); }
.glamora-stat-card .value.danger { color: var(--g-danger); }

.glamora-avatar-badge { width: 32px; height: 32px; border-radius: 9px; background: var(--g-bg-3); border: 1.5px solid var(--g-gold); display: flex; align-items: center; justify-content: center; font-family: "Cormorant Garamond", serif; font-style: italic; font-weight: 600; color: var(--g-gold); font-size: 13px; flex-shrink: 0; }
.glamora-avatar-badge.is-inactive { background: var(--g-bg-3); border-color: transparent; color: var(--g-text-muted); }

.glamora-grid-table { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 16px; overflow: hidden; margin-bottom: 26px; }
.glamora-grid-table .g-row { display: grid; grid-template-columns: 1.6fr 1.2fr 1.2fr 1fr 0.7fr 0.9fr 1.7fr; align-items: center; padding: 13px 18px; border-bottom: 1px solid var(--g-border); gap: 8px; transition: background-color .15s ease; }
.glamora-grid-table .g-row:not(.head):hover { background: var(--g-bg-3); }
.glamora-grid-table .g-row:last-child { border-bottom: none; }
.glamora-grid-table .g-row.head { padding: 12px 18px; font-size: 11px; color: var(--g-text-muted); font-weight: 700; }
.glamora-grid-table .g-row .g-name { display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 700; }
.glamora-grid-table .g-row .g-name.is-inactive { opacity: .55; }
.glamora-grid-table .g-row .g-muted { font-size: 12px; color: var(--g-text-muted); }
.glamora-grid-table .g-row .g-actions { display: flex; flex-wrap: wrap; gap: 4px 9px; font-size: 10.5px; font-weight: 700; white-space: nowrap; }
.glamora-grid-table .g-row .g-actions a, .glamora-grid-table .g-row .g-actions button { background: none; border: none; padding: 0; color: var(--g-gold-2); font-size: 10.5px; font-weight: 700; cursor: pointer; }
.glamora-grid-table .g-row .g-actions .danger { color: var(--g-danger); }

.glamora-cat-grid { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 14px; }
.glamora-cat-card { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 14px; padding: 14px; transition: transform .18s ease, box-shadow .18s ease; }
.glamora-cat-card:hover { transform: translateY(-2px); box-shadow: 0 8px 18px rgba(0,0,0,.07); }
.glamora-cat-card .cat-title { font-size: 11px; color: var(--g-gold-2); font-weight: 700; margin-bottom: 8px; }
.glamora-cat-card .svc-row { font-size: 12px; padding: 5px 0; display: flex; justify-content: space-between; gap: 8px; }
.glamora-cat-card .svc-row .dot-on { color: var(--g-success); }
.glamora-cat-card .svc-row .dot-off { color: var(--g-text-muted); font-size: 11px; }

@media (max-width: 900px) {
	.glamora-stats-grid, .glamora-cat-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
	.glamora-grid-table .g-row { grid-template-columns: 1fr; gap: 4px; }
	.glamora-grid-table .g-row.head { display: none; }
}

/* ---- site-admin: Reports page filter bar ---- */
.glamora-filter-bar { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap; background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 14px; padding: 14px 16px; margin-bottom: 18px; }
.glamora-filter-bar .glamora-field { margin-bottom: 0; min-width: 150px; }
.glamora-filter-bar .glamora-field.grow { flex: 1; min-width: 180px; }
.glamora-filter-bar .filter-actions { display: flex; gap: 8px; margin-inline-start: auto; }
.glamora-report-section { margin-bottom: 26px; }
.glamora-report-section h2 { font-size: 14px; font-weight: 800; margin: 0 0 10px; }
.glamora-report-currency-list { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 4px; }
.glamora-report-currency-list .chip { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 10px; padding: 8px 14px; font-size: 12px; font-weight: 700; }
.glamora-report-currency-list .chip .amt { color: var(--g-gold-2); margin-inline-start: 4px; }

/* small helpers */
.glamora-flex { display: flex; align-items: center; gap: 10px; }
.glamora-between { display: flex; align-items: center; justify-content: space-between; }
.glamora-muted { color: var(--g-text-muted-light); }
.glamora-dark .glamora-muted { color: var(--g-text-muted-dark); }
.glamora-gold-text { color: var(--g-gold-2); }
[dir="ltr"] .glamora-numeric { unicode-bidi: plaintext; }

/* ---- Messages inbox (dashboard "الرسائل") — modern two-pane WhatsApp-style layout ----
   Conversation list on one side (searchable, colored initials avatars, relative timestamps, WhatsApp-
   green unread pills) and a message thread on the other (warm wallpaper, white/green bubbles, date
   separators, sent/delivered/read ticks on our own messages, an auto-growing composer). Text/timestamp
   colors are always explicit (never `inherit`) — see the v1.0.36 note this block replaces for why. */
.wa-inbox { display: flex; gap: 16px; height: calc(100vh - 220px); min-height: 460px; }

.wa-inbox-list { width: 300px; flex-shrink: 0; display: flex; flex-direction: column; background: var(--g-bg-light-2); border: 1px solid var(--g-border-light); border-radius: 14px; overflow: hidden; }
.wa-list-search { padding: 10px; border-bottom: 1px solid var(--g-border-light); flex-shrink: 0; }
.wa-list-search input { width: 100%; border: 1px solid var(--g-border-light); background: #fff; border-radius: 20px; padding: 8px 14px; font-size: 12px; font-family: inherit; color: #111b21; }
.wa-list-search input::placeholder { color: var(--g-text-muted-light); }
.conv-list-scroll { flex: 1; overflow-y: auto; padding: 6px; }

.conv-item { display: flex; align-items: center; gap: 10px; width: 100%; text-align: start; padding: 9px 8px; border-radius: 10px; border: none; background: transparent; cursor: pointer; margin-bottom: 2px; transition: background .15s ease; }
.conv-item:hover { background: var(--g-bg-light-3); }
.conv-item.is-active { background: var(--g-gold-soft); }
.conv-avatar { width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0; display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 700; font-size: 15px; }
.conv-item-body { flex: 1; min-width: 0; }
.conv-item-top { display: flex; justify-content: space-between; align-items: baseline; gap: 6px; }
.conv-name { font-size: 13px; font-weight: 700; color: var(--g-text-light); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.conv-time { font-size: 10.5px; color: var(--g-text-muted-light); flex-shrink: 0; }
.conv-item-bottom { display: flex; justify-content: space-between; align-items: center; gap: 6px; margin-top: 2px; }
.conv-preview { font-size: 11.5px; color: var(--g-text-muted-light); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.conv-unread { background: #25d366; color: #fff; border-radius: 10px; padding: 1px 7px; font-size: 10px; font-weight: 700; flex-shrink: 0; }
.conv-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px; color: var(--g-text-muted-light); font-size: 12px; padding: 30px 14px; text-align: center; height: 100%; }

.wa-inbox-thread { flex: 1; display: flex; flex-direction: column; border: 1px solid var(--g-border-light); border-radius: 14px; overflow: hidden; background: #fff; }
.wa-thread-placeholder { margin: auto; display: flex; flex-direction: column; align-items: center; gap: 10px; color: var(--g-text-muted-light); font-size: 12px; }
.wa-thread-placeholder svg { width: 46px; height: 46px; opacity: .5; }
.wa-thread-header { display: flex; align-items: center; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--g-border-light); background: #f7f4ef; flex-shrink: 0; }
.wa-thread-name { font-weight: 700; font-size: 13.5px; color: #111b21; }
.wa-thread-phone { font-size: 11px; color: #667781; margin-top: 1px; }

.glamora-wa-thread { background: #efe7dc; flex: 1; overflow-y: auto; padding: 14px; display: flex; flex-direction: column; gap: 6px; }
.wa-date-sep { text-align: center; margin: 8px 0; }
.wa-date-sep span { background: #e9edf1; color: #54656f; font-size: 11px; padding: 4px 12px; border-radius: 8px; }

.wa-bubble { max-width: 75%; padding: 7px 10px 9px; border-radius: 7px; font-size: 13px; line-height: 1.4; box-shadow: 0 1px 1px rgba(0,0,0,.1); word-wrap: break-word; animation: wa-bubble-in .15s ease-out; }
@keyframes wa-bubble-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.wa-bubble.in { align-self: flex-end; background: #ffffff; color: #111b21; border-bottom-left-radius: 2px; }
.wa-bubble.out { align-self: flex-start; background: #d9fdd3; color: #111b21; border-bottom-right-radius: 2px; }
.wa-bubble.is-pending { opacity: .65; }
.wa-bubble .wa-sender { display: block; font-size: 11px; font-weight: 700; color: #06792d; margin-bottom: 2px; }
.wa-bubble .wa-time { display: flex; align-items: center; gap: 3px; margin-top: 3px; font-size: 10px; color: #667781; justify-content: flex-end; }
.wa-ticks { display: inline-flex; color: #8696a0; }
.wa-ticks svg:nth-child(2) { margin-inline-start: -7px; }
.wa-ticks.is-read { color: #53bdeb; }
.wa-tick-fail { color: #e53935; font-weight: 700; }
.wa-tick-pending { display: inline-flex; color: #8696a0; }

.wa-reply-error { background: #fdecea; color: #c0392b; font-size: 11.5px; padding: 8px 14px; border-top: 1px solid #f5c6cb; flex-shrink: 0; }
.wa-composer { display: flex; gap: 8px; padding: 10px 12px; background: #f7f4ef; border-top: 1px solid var(--g-border-light); align-items: flex-end; flex-shrink: 0; }
.wa-composer textarea {
	flex: 1; background: #fff; border: 1px solid var(--g-border-light); border-radius: 20px;
	padding: 10px 16px; font-size: 13px; font-family: inherit; color: #111b21; resize: none; max-height: 110px; line-height: 1.4;
}
.wa-composer textarea::placeholder { color: var(--g-text-muted-light); }
.wa-composer button.wa-send { background: #25d366; color: #fff; border-radius: 50%; width: 40px; height: 40px; padding: 0; font-size: 0; flex-shrink: 0; display: flex; align-items: center; justify-content: center; transition: background .15s; }
.wa-composer button.wa-send:hover { background: #20bd5a; }
.wa-composer button.wa-send:disabled { opacity: .6; cursor: not-allowed; }
.wa-composer button.wa-send svg { width: 18px; height: 18px; }
/* Reserved blank strip under the composer once a conversation is open, matching the empty space the
   placeholder state already has at the bottom of the thread panel (Wissam: keep that footer gap in
   both states — it's also where a page-wide floating widget, e.g. a WhatsApp chat-launcher button,
   sits, so the composer shouldn't extend flush to the panel's bottom edge). */
.wa-thread-footer-space { flex-shrink: 0; height: 64px; background: #fff; }

@media (max-width: 900px) {
	.wa-inbox { flex-direction: column; height: auto; }
	.wa-inbox-list { width: 100%; max-height: 280px; }
	.wa-inbox-thread { min-height: 420px; }
}

@media (max-width: 720px) {
	.glamora-dash-topbar { padding: 12px 16px; }
	.glamora-dash-topbar .topbar-glamora-logo { height: 58px; }
	.glamora-dash-topbar .topbar-center-logo { width: 49px; height: 49px; }
	.glamora-dash-topbar .topbar-center-name { font-size: 18px; }
	.glamora-dash-body { flex-direction: column; }
	.glamora-dash-sidebar { width: 100%; flex-direction: row; overflow-x: auto; }
	.glamora-dash-nav { flex-direction: row; }
}

/* ================================================================================================
   Client-facing motion & polish (centers list, per-center booking page, cancel/manage-booking page).
   Same black+gold layout/structure throughout — this block only adds entrance/hover/press motion and
   skeleton loading states on top of markup that already exists, nothing here changes page structure. */

/* One-time page-load fade+rise. `.glamora-shell` is the stable outer wrapper on the centers-list page
   (its own element, static PHP markup — JS never recreates it) and on the booking page (`#glamora-
   booking-root` itself keeps this class across every re-render; only ITS CHILDREN get replaced by
   renderBooking(), so this plays once on first paint and never replays on a selection/click re-render).
   `#glamora-cancel-root` gets the same treatment on the cancel/manage-booking page. */
.glamora-shell, #glamora-cancel-root { animation: glamora-page-in .5s ease-out; }
@keyframes glamora-page-in { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

/* Generic staggered entrance for a rendered list/grid item — index-driven via the `--i` custom property
   set inline per item (e.g. style="--i:2") by whichever render*() function builds the list, so cards/rows
   build in one after another instead of all snapping into place at once. Reused across center cards,
   service rows, staff rows, package cards, day/slot chips below. */
.glamora-stagger { animation: glamora-card-in .4s ease-out backwards; animation-delay: calc(var(--i, 0) * 45ms); }

/* Center cards (centers-list grid) — no hover feedback at all before this. */
.glamora-center-card { transition: transform .2s ease, box-shadow .2s ease; }
.glamora-center-card:hover { transform: translateY(-5px); box-shadow: 0 14px 28px rgba(0,0,0,.16); }
.glamora-center-card .avatar { transition: transform .25s ease; }
.glamora-center-card:hover .avatar { transform: scale(1.06); }

/* Service rows / staff rows / day & slot chips on the booking page, and the cart wizard's own slot chips
   — hover lift + press feedback layered on top of each element's own inline active-state colors (which
   this never touches: only transform/box-shadow are added here, neither is set inline anywhere). */
.glamora-service-row, .glamora-staff-row, .glamora-slot-chip, .glamora-day-chip, .wiz-slot-chip {
	transition: transform .15s ease, box-shadow .15s ease;
}
.glamora-service-row:hover, .glamora-staff-row:hover, .glamora-slot-chip:hover, .wiz-slot-chip:hover,
.glamora-day-chip:not([aria-disabled="true"]):hover {
	transform: translateY(-2px);
	box-shadow: 0 6px 16px rgba(0,0,0,.1);
}
.glamora-service-row:active, .glamora-staff-row:active, .glamora-slot-chip:active, .wiz-slot-chip:active,
.glamora-day-chip:active {
	transform: scale(.96);
}

/* Package info cards on the booking page (see renderPackageCard() in glamora-client.js). */
.glamora-package-card { transition: transform .18s ease, box-shadow .18s ease; }
.glamora-package-card:hover { transform: translateY(-3px); box-shadow: 0 10px 22px rgba(0,0,0,.14); }

/* Category accordion on the booking page's services list (see renderServiceGroups() in
   glamora-client.js) — collapses the list into expand/collapse sections by category to save vertical
   space on centers with many services. Toggling is a lightweight local class flip, not a re-render, so
   the open/closed transition below is the only thing animating. */
.glamora-cat-groups { display: flex; flex-direction: column; gap: 10px; }
.glamora-cat-group { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 14px; overflow: hidden; }
.glamora-cat-group-header {
	display: flex; align-items: center; gap: 10px; padding: 13px 14px; cursor: pointer;
	font-size: 13px; font-weight: 700; color: var(--g-text);
}
.glamora-cat-group-header:focus-visible { outline: 2px solid var(--g-gold); outline-offset: -2px; }
.glamora-cat-group-title { flex: 1; }
.glamora-cat-group-count {
	font-size: 11px; font-weight: 700; color: var(--g-text-muted); background: var(--g-bg-3);
	border-radius: 20px; padding: 2px 9px; flex-shrink: 0;
}
.glamora-cat-group-chevron { flex-shrink: 0; color: var(--g-text-muted); transition: transform .2s ease; }
.glamora-cat-group.is-open .glamora-cat-group-chevron { transform: rotate(180deg); }
.glamora-cat-group-body {
	display: grid; grid-template-rows: 0fr; transition: grid-template-rows .25s ease;
}
.glamora-cat-group-body > div { overflow: hidden; padding: 0 12px; }
.glamora-cat-group.is-open .glamora-cat-group-body { grid-template-rows: 1fr; }
.glamora-cat-group.is-open .glamora-cat-group-body > div { padding: 0 12px 12px; }

/* Sticky cart bar — slides up into view the first time a service is added, rather than snapping in. */
.glamora-cart-bar-in { animation: glamora-cart-in .3s cubic-bezier(.2,.9,.3,1.2); }
@keyframes glamora-cart-in { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: none; } }

/* Hero slider — a livelier crossfade (subtle zoom+slide instead of a flat vertical slide) since it's the
   single largest, most attention-grabbing element on the booking page. */
.glamora-hero-slide { transform: translateY(6%) scale(1.03); transition: transform .65s cubic-bezier(.22,1,.36,1), opacity .65s ease; }
.glamora-hero-slide.is-active { transform: translateY(0) scale(1); }
.glamora-hero-slide.is-leaving { transform: translateY(-6%) scale(1.03); }
/* Same crossfade curve on the two other slider variants (site-wide ads, per-card offer ticker) for a
   consistent feel, keeping their existing vertical-slide identity. */
.glamora-ads-slide, .offer-ticker-line { transition-timing-function: cubic-bezier(.22,1,.36,1); }

/* Skeleton loaders — shimmering placeholder shapes shown while data is still loading, replacing a plain
   "جارِ التحميل..." message so the page already looks like it's taking shape instead of stalled. */
.glamora-skeleton {
	background: linear-gradient(90deg, var(--g-bg-3) 25%, var(--g-bg-2) 50%, var(--g-bg-3) 75%);
	background-size: 200% 100%;
	animation: glamora-shimmer 1.4s ease-in-out infinite;
	border-radius: 8px;
}
@keyframes glamora-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
.glamora-skeleton-card { background: var(--g-bg-2); border: 1px solid var(--g-border); border-radius: 18px; overflow: hidden; }
.glamora-skeleton-card .cover { height: 120px; }
.glamora-skeleton-card .body { padding: 14px 16px 16px; display: flex; flex-direction: column; gap: 10px; }
.glamora-skeleton-row { border-radius: 14px; }

/* ---- fixed bottom tab bar (v1.19.2, Glamora_Public::bottom_nav_html()) — Home / My Bookings / Account,
   the 3-tab bottom nav from Wissam's approved design that had never actually been built (My Bookings had
   only ever lived as a header chip). Only rendered on pages that also carry the sibling
   `glamora-with-bottom-nav` class on their outer .glamora-scope wrapper, which reserves matching bottom
   padding so page content never ends up underneath the fixed bar. z-index kept well below
   .glamora-modal-backdrop's 9999 so any modal still overlays it correctly. */
.glamora-with-bottom-nav { padding-bottom: calc(66px + env(safe-area-inset-bottom)); }
.glamora-bottom-nav {
	position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
	display: flex; align-items: stretch;
	background: var(--g-bg-2); border-top: 1px solid var(--g-border);
	padding-bottom: env(safe-area-inset-bottom);
}
.glamora-bottom-nav a {
	flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
	padding: 9px 4px 8px; color: var(--g-text-muted); font-size: 11px; font-weight: 600; text-decoration: none;
	transition: color .15s ease;
}
.glamora-bottom-nav a svg { width: 22px; height: 22px; }
.glamora-bottom-nav a.is-active { color: var(--g-gold); font-weight: 700; }

/* v1.19.7 — on the shared homepage/app-"Home"-tab template only (`glamora-home-page`, center-list.php),
   Wissam wants the bottom tab bar to be app-only (the website already has the theme's own navigation and
   footer, so a second nav here was redundant) and the hero's decorative "booking confirmed" demo card to
   be website-only (not a real booking — no reason for it to take up space in the app). `glamora-in-app`
   is toggled synchronously before first paint by Glamora_Public::app_context_bootstrap_script(), so
   neither element flashes into view before disappearing. Scoped to `glamora-home-page` specifically so
   app-shell.php's own bottom nav (the app's login/bookings/account screens, which never carries that
   class) is untouched and keeps showing unconditionally, which is correct there. */
.glamora-home-page.glamora-with-bottom-nav { padding-bottom: 0; }
.glamora-home-page .glamora-bottom-nav { display: none; }
.glamora-home-page.glamora-in-app.glamora-with-bottom-nav { padding-bottom: calc(66px + env(safe-area-inset-bottom)); }
.glamora-home-page.glamora-in-app .glamora-bottom-nav { display: flex; }
.glamora-home-page.glamora-in-app .glamora-hero-demo-card { display: none; }

/* v1.19.10 — Wissam wants the hero photo gone in the app too (website keeps it), same app-only/website-only
   split as the demo card right above. .glamora-hero-media is the photo's whole wrapper — by now (demo card
   already hidden in-app) it holds nothing else, so hiding it outright is correct rather than just hiding
   the <img>, which would've left an empty rounded box. .glamora-hero-inner is a flex row with only
   .glamora-hero-text and .glamora-hero-media as children — hiding one leaves the text column as the sole
   flex item, so it naturally fills the row (desktop) or column (mobile, `flex-direction: column` from the
   720px rule above) with no reserved gap/margin left behind; no extra width/margin rule needed, unlike
   the demo-card fix (v1.19.8) which had to specifically zero out a bottom margin the card itself required. */
.glamora-home-page.glamora-in-app .glamora-hero-media { display: none; }

/* Respect the visitor's OS-level reduced-motion preference — flattens every animation/transition added
   in this block to an instant state change instead of disabling motion piecemeal per rule. Runs last so
   it wins the cascade regardless of rule order above. */
@media (prefers-reduced-motion: reduce) {
	.glamora-shell, #glamora-cancel-root, .glamora-stagger, .glamora-center-card, .glamora-center-card .avatar,
	.glamora-service-row, .glamora-staff-row, .glamora-slot-chip, .glamora-day-chip, .wiz-slot-chip,
	.glamora-package-card, .glamora-cart-bar-in, .glamora-hero-slide, .glamora-skeleton,
	.glamora-cat-group-chevron, .glamora-cat-group-body {
		animation: none !important;
		transition: none !important;
	}
}

/* v1.19.14 — "no internet connection" banner (GlamoraCommon.initOfflineBanner(), Google Play submission
   prep). Appended directly to <body> by JS, so it deliberately does NOT rely on any .glamora-scope custom
   property that only cascades inside the themed shell — plain literal colors instead, same reasoning a
   browser's own connectivity bar uses static colors regardless of the page's own theme. Fixed to the top
   with a safe-area inset so it clears a notch/status bar inside the Android app. */
.glamora-offline-banner {
	position: fixed;
	top: 0;
	left: 0;
	right: 0;
	z-index: 99999;
	padding: calc(env(safe-area-inset-top, 0px) + 8px) 14px 8px;
	background: #b3261e;
	color: #fff;
	font-size: 12.5px;
	font-weight: 700;
	text-align: center;
	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
}
.glamora-offline-banner[hidden] { display: none; }


/* ============================================================ v1.20.0 — light mode depth */
.glamora-light .glamora-center-card,
.glamora-light .glamora-table,
.glamora-light .glamora-grid-table,
.glamora-light .glamora-stat-card,
.glamora-light .glamora-modal {
	box-shadow: inset 0 1px 0 oklch(1 0 0 / .7), 0 14px 34px -22px oklch(0.35 0.07 330 / .45);
}
.glamora-light .glamora-center-card { transition: transform .18s ease, box-shadow .18s ease; }
.glamora-light .glamora-center-card:hover { transform: translateY(-2px); box-shadow: inset 0 1px 0 oklch(1 0 0 / .7), 0 20px 40px -22px oklch(0.4 0.09 340 / .55); }
.glamora-light .glamora-chip.is-active { background: linear-gradient(135deg, var(--g-gold), oklch(0.72 0.12 40)); border-color: transparent; color: oklch(0.22 0.03 330); }
.glamora-light .glamora-btn.gold { background: linear-gradient(135deg, var(--g-gold), oklch(0.7 0.13 60)); box-shadow: 0 8px 18px -10px oklch(0.6 0.13 60 / .8); }
.glamora-light .glamora-btn.gold:hover { filter: brightness(1.05); }
.glamora-light .glamora-header { border-bottom-color: oklch(0.82 0.04 50 / .7); }
.glamora-light input, .glamora-light select, .glamora-light textarea { background-color: oklch(0.985 0.008 75); border-color: var(--g-border-light); color: var(--g-text-light); }
.glamora-light .glamora-modal-backdrop .glamora-modal, .glamora-modal-backdrop.glamora-light .glamora-modal { background: var(--g-bg-light-2); }

/* ============================================================ v1.20.0 — header country chip */
.glamora-cty { position: relative; }
.glamora-cty-btn { display: inline-flex; align-items: center; gap: 7px; font: inherit; font-size: 12.5px; font-weight: 700; cursor: pointer; padding: 6px 12px; border-radius: 999px; color: var(--g-text); background: var(--g-bg-2); border: 1px solid var(--g-border); transition: background-color .15s ease, border-color .15s ease; }
.glamora-cty-btn:hover { border-color: var(--g-gold); }
.glamora-cty-btn:focus-visible { outline: 2px solid var(--g-gold); outline-offset: 2px; }
.glamora-cty-flag, .glamora-cty-opt > span:first-child { font-size: 16px; line-height: 1; display: inline-flex; }
.glamora-cty-flag img.emoji, .glamora-cty-opt img.emoji { width: 18px !important; height: 18px !important; margin: 0 !important; }
.glamora-cty-menu { position: absolute; inset-inline-end: 0; top: calc(100% + 8px); z-index: 60; width: 230px; max-height: 70vh; overflow-y: auto; padding: 6px; border-radius: 14px; background: var(--g-bg-2); color: var(--g-text); border: 1px solid var(--g-border); box-shadow: 0 18px 40px oklch(0 0 0 / .3); }
.glamora-cty-menu[hidden] { display: none; }
.glamora-cty-head { font-size: 11px; color: var(--g-text-muted); font-weight: 700; padding: 6px 10px 8px; }
.glamora-cty-opt { display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px; border: none; background: none; color: inherit; font: inherit; font-size: 13px; border-radius: 10px; cursor: pointer; text-align: start; }
.glamora-cty-opt:hover { background: var(--g-bg-3); }
.glamora-cty-opt.is-on { background: var(--g-gold-soft); color: oklch(0.25 0.03 330); font-weight: 700; }
.glamora-cty-opt .n { flex: 1; }
.glamora-cty-opt .d { font-size: 10px; color: var(--g-text-muted); }
@media (max-width: 560px) { .glamora-cty-name { display: none; } .glamora-header .glamora-flex { flex-wrap: wrap; justify-content: flex-end; } }

/* ============================================================ v1.20.2 — hero slideshow */
.glamora-hero-photo { position: relative; }
.glamora-hero-photo.is-slider img { position: absolute; inset: 0; opacity: 0; transition: opacity 1.1s ease, transform 6s ease; transform: scale(1.04); }
.glamora-hero-photo.is-slider img.is-on { opacity: 1; transform: scale(1); }
.glamora-hero-dots { position: absolute; right: 16px; bottom: 14px; display: flex; gap: 6px; z-index: 1; direction: ltr; padding: 5px 8px; border-radius: 20px; background: oklch(0 0 0 / .28); }
.glamora-hero-demo-card { z-index: 3; }
.glamora-hero-dots span { width: 6px; height: 6px; border-radius: 6px; background: oklch(1 0 0 / .55); transition: width .3s ease, background-color .3s ease; }
.glamora-hero-dots span.is-on { width: 18px; background: var(--g-gold); }
@media (prefers-reduced-motion: reduce) { .glamora-hero-photo.is-slider img { transition: none; transform: none; } }

/* ==== v1.20.9 — center photo gallery ================================================================ */
/* full-screen viewer — always dark, whatever the page theme */
.glamora-lightbox { position: fixed; inset: 0; z-index: 2147482000; background: rgba(8,7,10,.94); display: flex; align-items: center; justify-content: center; animation: glamora-fade-in .18s ease-out; color: #f4efe6; font-family: "Cairo", system-ui, sans-serif; }
.glamora-lightbox .lb-fig { margin: 0; max-width: min(92vw, 1100px); max-height: 86vh; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; flex: 1; height: 100%; }
.glamora-lightbox .lb-img { max-width: 100%; max-height: 78vh; object-fit: contain; border-radius: 12px; opacity: 0; transform: scale(.985); transition: opacity .2s ease, transform .2s ease; box-shadow: 0 20px 60px -20px rgba(0,0,0,.8); }
.glamora-lightbox .lb-img.is-in { opacity: 1; transform: none; }
.glamora-lightbox .lb-cap { font-size: 13px; text-align: center; max-width: 60ch; opacity: .85; }
.glamora-lightbox .lb-cap[hidden] { display: none; }
.glamora-lightbox .lb-count { position: absolute; top: 18px; inset-inline-start: 20px; font-size: 13px; font-weight: 700; opacity: .8; font-variant-numeric: tabular-nums; unicode-bidi: isolate; }
.glamora-lightbox .lb-close, .glamora-lightbox .lb-nav { position: absolute; border: none; border-radius: 50%; background: rgba(255,255,255,.12); color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; line-height: 1; }
.glamora-lightbox .lb-close { top: 12px; inset-inline-end: 14px; width: 42px; height: 42px; font-size: 26px; }
.glamora-lightbox .lb-nav { top: 50%; transform: translateY(-50%); width: 48px; height: 48px; font-size: 30px; }
.glamora-lightbox .lb-prev { inset-inline-start: 14px; }
.glamora-lightbox .lb-next { inset-inline-end: 14px; }
.glamora-lightbox .lb-close:hover, .glamora-lightbox .lb-nav:hover { background: rgba(255,255,255,.22); }
.glamora-lightbox button:focus-visible { outline: 2px solid #e2b24c; outline-offset: 2px; }
.glamora-lightbox.is-single .lb-nav { display: none; }
@media (max-width: 600px) { .glamora-lightbox .lb-nav { top: auto; bottom: 18px; transform: none; width: 44px; height: 44px; } .glamora-lightbox .lb-img { max-height: 70vh; } }
@media (prefers-reduced-motion: reduce) { .glamora-lightbox, .glamora-lightbox .lb-img, .glamora-gallery-thumb img { animation: none; transition: none; } }

/* ---- v1.20.10: "Our work" button on the center page ---- */
.glamora-gallery-btn { display: flex; align-items: center; gap: 14px; width: 100%; max-width: 440px; margin: -6px 0 20px; padding: 10px 14px 10px 12px; border: 1px solid var(--g-border); border-radius: 16px; background: var(--g-bg-2); color: var(--g-text); font: inherit; text-align: start; cursor: pointer; transition: border-color .15s ease, transform .12s ease, box-shadow .15s ease; }
.glamora-gallery-btn:hover { border-color: var(--g-gold); transform: translateY(-1px); box-shadow: 0 10px 24px -16px rgba(0,0,0,.5); }
.glamora-gallery-btn:focus-visible { outline: 2px solid var(--g-gold); outline-offset: 2px; }
.glamora-gallery-btn .gb-stack { position: relative; flex: 0 0 auto; width: 92px; height: 56px; }
.glamora-gallery-btn .gb-thumb { position: absolute; top: 0; inset-inline-start: calc(var(--i) * 18px); width: 56px; height: 56px; border-radius: 12px; background: var(--g-bg-3) center / cover no-repeat; border: 2px solid var(--g-bg-2); box-shadow: 0 4px 10px -4px rgba(0,0,0,.45); z-index: calc(3 - var(--i)); }
.glamora-gallery-btn .gb-txt { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.glamora-gallery-btn .gb-title { font-size: 14px; font-weight: 800; }
.glamora-gallery-btn .gb-sub { font-size: 12px; color: var(--g-text-muted); }
.glamora-gallery-btn .gb-chev { font-size: 22px; color: var(--g-gold); line-height: 1; }

/* ---- full-screen gallery (grid) — always dark so photos stand out ---- */
.glamora-gallery-panel { position: fixed; inset: 0; z-index: 2147481000; background: #0b0a0d; color: #f4efe6; overflow-y: auto; -webkit-overflow-scrolling: touch; animation: glamora-gp-in .22s cubic-bezier(.2,.8,.2,1); font-family: "Cairo", system-ui, sans-serif; }
.glamora-gallery-panel.is-out { animation: glamora-gp-out .18s ease forwards; }
@keyframes glamora-gp-in { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } }
@keyframes glamora-gp-out { to { opacity: 0; transform: translateY(12px); } }
.glamora-gallery-panel .gp-head { position: sticky; top: 0; z-index: 2; display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 12px; padding: 12px 16px; background: rgba(11,10,13,.88); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border-bottom: 1px solid rgba(255,255,255,.08); }
.glamora-gallery-panel .gp-back { border: 1px solid rgba(226,178,76,.55); background: transparent; color: #e2b24c; border-radius: 999px; padding: 8px 14px; font: inherit; font-size: 12.5px; font-weight: 700; cursor: pointer; white-space: nowrap; }
.glamora-gallery-panel .gp-back:hover { background: rgba(226,178,76,.12); }
.glamora-gallery-panel .gp-title { display: flex; flex-direction: column; align-items: center; text-align: center; min-width: 0; }
.glamora-gallery-panel .gp-title span { font-size: 15px; font-weight: 800; }
.glamora-gallery-panel .gp-title small { font-size: 11.5px; opacity: .65; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.glamora-gallery-panel .gp-x { width: 38px; height: 38px; border-radius: 50%; border: none; background: rgba(255,255,255,.1); color: #fff; font-size: 24px; line-height: 1; cursor: pointer; }
.glamora-gallery-panel .gp-x:hover { background: rgba(255,255,255,.2); }
.glamora-gallery-panel button:focus-visible { outline: 2px solid #e2b24c; outline-offset: 2px; }
.glamora-gallery-panel .gp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 10px; padding: 16px; max-width: 1200px; margin: 0 auto; }
@media (max-width: 560px) { .glamora-gallery-panel .gp-grid { grid-template-columns: 1fr 1fr; gap: 8px; padding: 10px; } .glamora-gallery-panel .gp-back { padding: 7px 11px; font-size: 12px; } }
.glamora-gallery-panel .gp-tile { position: relative; aspect-ratio: 4 / 5; padding: 0; border: none; border-radius: 14px; overflow: hidden; background: #1a181d; cursor: zoom-in; animation: glamora-fade-in .3s ease both; animation-delay: calc(var(--i) * 30ms); }
.glamora-gallery-panel .gp-tile img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.glamora-gallery-panel .gp-tile:hover img { transform: scale(1.04); }
.glamora-gallery-panel .gp-cap { position: absolute; inset-inline: 0; bottom: 0; padding: 26px 10px 9px; background: linear-gradient(transparent, rgba(0,0,0,.78)); color: #fff; font-size: 12px; font-weight: 600; text-align: start; line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
@media (prefers-reduced-motion: reduce) { .glamora-gallery-panel, .glamora-gallery-panel.is-out, .glamora-gallery-panel .gp-tile { animation: none; } }

/* ---- v1.20.10: photo uploader (dashboard + wp-admin) — assets/js/glamora-gallery-manager.js ---- */
.glamora-gm .gm-drop { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 26px 16px; border: 1.5px dashed color-mix(in oklab, var(--g-gold) 60%, var(--g-border)); border-radius: 18px; background: color-mix(in oklab, var(--g-gold) 6%, var(--g-bg-2)); text-align: center; cursor: pointer; transition: background-color .15s ease, border-color .15s ease, transform .12s ease; }
.glamora-gm .gm-drop:hover, .glamora-gm .gm-drop.is-over { background: color-mix(in oklab, var(--g-gold) 14%, var(--g-bg-2)); border-color: var(--g-gold); }
.glamora-gm .gm-drop.is-over { transform: scale(1.01); }
.glamora-gm .gm-drop:focus-visible { outline: 2px solid var(--g-gold); outline-offset: 2px; }
.glamora-gm .gm-drop.is-full { opacity: .5; pointer-events: none; }
.glamora-gm .gm-drop-ic { width: 48px; height: 48px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; background: color-mix(in oklab, var(--g-gold) 20%, transparent); color: var(--g-gold); }
.glamora-gm .gm-drop-title { font-size: 14px; font-weight: 800; color: var(--g-text); }
.glamora-gm .gm-drop-hint { font-size: 12px; color: var(--g-text-muted); }
.glamora-gm .gm-count { font-size: 11px; font-weight: 700; color: var(--g-gold); font-variant-numeric: tabular-nums; direction: ltr; }
.glamora-gm .gm-msg { min-height: 18px; margin: 8px 2px; font-size: 12px; color: var(--g-success, #2e9e5b); }
.glamora-gm .gm-msg.is-err { color: var(--g-danger); }
.glamora-gm .gm-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; transition: opacity .15s ease; }
.glamora-gm .gm-grid.is-busy { opacity: .6; pointer-events: none; }
.glamora-gm .gm-item { display: flex; flex-direction: column; border: 1px solid var(--g-border); border-radius: 14px; overflow: hidden; background: var(--g-bg-2); }
.glamora-gm .gm-ph { position: relative; aspect-ratio: 4 / 5; background: var(--g-bg-3); }
.glamora-gm .gm-ph img { width: 100%; height: 100%; object-fit: cover; display: block; }
.glamora-gm .gm-badge { position: absolute; top: 8px; inset-inline-start: 8px; background: var(--g-gold); color: var(--g-bg-dark); font-size: 10.5px; font-weight: 800; padding: 3px 9px; border-radius: 999px; }
.glamora-gm .gm-acts { position: absolute; inset-inline: 6px; bottom: 6px; display: flex; gap: 6px; justify-content: center; }
.glamora-gm .gm-acts button { width: 32px; height: 32px; border-radius: 50%; border: none; background: rgba(10,10,12,.72); color: #fff; font-size: 18px; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; }
.glamora-gm .gm-acts button:disabled { opacity: .35; cursor: default; }
.glamora-gm .gm-acts button.is-del { background: rgba(190,40,40,.88); }
.glamora-gm .gm-cap { position: relative; padding: 6px; }
.glamora-gm .gm-cap input { width: 100%; box-sizing: border-box; border: 1px solid transparent; border-radius: 9px; background: var(--g-bg-3); color: var(--g-text); font: inherit; font-size: 12px; padding: 8px 26px 8px 9px; padding-inline: 9px 26px; }
.glamora-gm .gm-cap input:focus { outline: none; border-color: var(--g-gold); }
.glamora-gm .gm-ok { position: absolute; top: 50%; inset-inline-end: 14px; transform: translateY(-50%); color: var(--g-success, #2e9e5b); font-size: 13px; font-weight: 800; opacity: 0; transition: opacity .2s ease; pointer-events: none; }
.glamora-gm .gm-ok.is-on { opacity: 1; }
.glamora-gm .gm-item.is-up .gm-ph img { filter: blur(1px) brightness(.6); }
.glamora-gm .gm-prog { position: absolute; inset-inline: 12px; bottom: 34px; height: 6px; border-radius: 3px; background: rgba(255,255,255,.25); overflow: hidden; }
.glamora-gm .gm-prog span { display: block; height: 100%; background: var(--g-gold); transition: width .2s ease; }
.glamora-gm .gm-up-lb { position: absolute; inset-inline: 0; bottom: 12px; text-align: center; font-size: 11px; font-weight: 700; color: #fff; }
.glamora-gm .gm-empty { grid-column: 1 / -1; text-align: center; padding: 22px 12px; font-size: 12.5px; color: var(--g-text-muted); }

/* ==== v1.21.0 — SEO content blocks (Glamora_SEO) ===================================================== */
/* home page: intro, service links, center links, owners pitch, FAQ */
.glamora-seo-home { margin: 46px 0 10px; padding-top: 30px; border-top: 1px solid var(--g-border); color: var(--g-text); }
.glamora-in-app .glamora-seo-home { display: none; }
.glamora-seo-home h2 { font-size: 20px; font-weight: 800; margin: 0 0 10px; text-wrap: balance; }
.glamora-seo-home h3, .glamora-landing h2 { font-size: 15px; font-weight: 800; margin: 26px 0 10px; }
.glamora-seo-home .intro, .glamora-landing-head p { font-size: 14px; line-height: 1.9; color: var(--g-text-muted); max-width: 75ch; margin: 0; }
.glamora-seo-links { display: flex; flex-wrap: wrap; gap: 8px; }
.glamora-scope .glamora-seo-links a { display: inline-flex; align-items: center; padding: 7px 14px; border-radius: 999px; border: 1px solid var(--g-border); background: var(--g-bg-2); color: var(--g-text); font-size: 13px; font-weight: 600; transition: border-color .15s ease, color .15s ease; }
.glamora-scope .glamora-seo-links a:hover { border-color: var(--g-gold); color: var(--g-gold); }
.glamora-seo-owners { display: flex; align-items: center; justify-content: space-between; gap: 18px; flex-wrap: wrap; margin: 28px 0 6px; padding: 20px 22px; border-radius: 18px; border: 1px solid color-mix(in oklab, var(--g-gold) 45%, var(--g-border)); background: color-mix(in oklab, var(--g-gold) 8%, var(--g-bg-2)); }
.glamora-seo-owners > div { flex: 1 1 320px; }
.glamora-seo-owners h2, .glamora-seo-owners h3 { margin: 0 0 6px !important; font-size: 16px; font-weight: 800; }
.glamora-seo-owners p { margin: 0; font-size: 13px; line-height: 1.8; color: var(--g-text-muted); }
.glamora-seo-owners .glamora-btn { white-space: nowrap; padding: 11px 22px; }
.glamora-seo-faq { display: grid; gap: 8px; }
.glamora-seo-faq details { border: 1px solid var(--g-border); border-radius: 14px; background: var(--g-bg-2); padding: 0 16px; }
.glamora-seo-faq summary { cursor: pointer; list-style: none; padding: 13px 0; font-size: 14px; font-weight: 700; display: flex; justify-content: space-between; gap: 12px; }
.glamora-seo-faq summary::-webkit-details-marker { display: none; }
.glamora-seo-faq summary::after { content: "+"; color: var(--g-gold); font-size: 18px; line-height: 1; }
.glamora-seo-faq details[open] summary::after { content: "−"; }
.glamora-seo-faq details p { margin: 0 0 14px; font-size: 13px; line-height: 1.85; color: var(--g-text-muted); }

/* service landing pages (/beauty/…) */
.glamora-landing { padding-top: 18px; padding-bottom: 30px; }
.glamora-crumbs { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 12px; color: var(--g-text-muted); margin-bottom: 14px; }
.glamora-scope .glamora-crumbs a { color: var(--g-gold); }
.glamora-landing-head h1 { font-size: clamp(24px, 4vw, 34px); font-weight: 800; line-height: 1.35; margin: 0 0 10px; text-wrap: balance; }
.glamora-landing-head { margin-bottom: 8px; }
.glamora-landing-cats { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; margin-top: 22px; }
.glamora-scope .glamora-landing-cat { display: flex; flex-direction: column; gap: 6px; padding: 16px 18px; border-radius: 16px; border: 1px solid var(--g-border); background: var(--g-bg-2); color: var(--g-text); transition: border-color .15s ease, transform .12s ease; }
.glamora-scope .glamora-landing-cat:hover { border-color: var(--g-gold); transform: translateY(-2px); }
.glamora-landing-cat .t { font-size: 15px; font-weight: 800; color: var(--g-gold); }
.glamora-landing-cat .d { font-size: 12.5px; line-height: 1.75; color: var(--g-text-muted); }
.glamora-landing .glamora-center-card .name { margin: 0; font-size: inherit; }

/* center page: server-rendered content shown until the booking UI loads */
.glamora-ssr-center { padding: 18px 0 10px; }
.glamora-ssr-center h1 { font-size: 29px; font-weight: 800; margin: 6px 0 4px; }
.glamora-ssr-center > p { font-size: 12px; margin: 0 0 14px; }
.glamora-ssr-branches { list-style: none; margin: 0 0 14px; padding: 0; font-size: 12px; color: var(--g-text-muted); }
.glamora-ssr-gallery { display: flex; gap: 8px; overflow: hidden; margin-bottom: 16px; }
.glamora-ssr-gallery img { width: 110px; height: 136px; object-fit: cover; border-radius: 12px; flex: 0 0 auto; }
.glamora-ssr-services { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.glamora-ssr-services li { display: flex; justify-content: space-between; gap: 12px; padding: 12px 14px; border-radius: 14px; background: var(--g-bg-2); border: 1px solid var(--g-border); font-size: 13px; font-weight: 600; }
.glamora-ssr-services li .glamora-muted { font-weight: 400; white-space: nowrap; font-variant-numeric: tabular-nums; }
/* site themes colour headings themselves — keep these blocks readable in both light and dark mode */
.glamora-ssr-center h1, .glamora-landing h1, .glamora-landing h2, .glamora-landing h3, .glamora-seo-home h2, .glamora-seo-home h3, .glamora-seo-owners h2, .glamora-seo-owners h3, .glamora-seo-faq summary { color: var(--g-text); }

/* ==== v1.22.0 — blog (/blog/ + articles, Glamora_Blog) =============================================== */
.glamora-post-strip { margin: 30px 0 6px; }
.glamora-post-strip-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.glamora-post-strip-head h3, .glamora-post-strip-head h2 { margin: 0 !important; font-size: 15px; font-weight: 800; color: var(--g-text); }
.glamora-scope .glamora-post-strip-head a { font-size: 12.5px; font-weight: 700; color: var(--g-gold); }
.glamora-post-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 14px; }
.glamora-post-grid.is-index { margin-top: 22px; grid-template-columns: repeat(auto-fill, minmax(270px, 1fr)); gap: 18px; }
.glamora-scope .glamora-post-card { display: flex; flex-direction: column; border-radius: 18px; overflow: hidden; border: 1px solid var(--g-border); background: var(--g-bg-2); color: var(--g-text); transition: border-color .15s ease, transform .15s ease; }
.glamora-scope .glamora-post-card:hover { border-color: var(--g-gold); transform: translateY(-2px); }
.glamora-post-card .ph { display: block; aspect-ratio: 16 / 10; background: var(--g-bg-3); overflow: hidden; }
.glamora-post-card .ph img { width: 100%; height: 100%; object-fit: cover; display: block; }
.glamora-post-card .tx { display: flex; flex-direction: column; gap: 6px; padding: 14px 16px 16px; flex: 1; }
.glamora-post-card .t { font-size: 15px; font-weight: 800; line-height: 1.55; text-wrap: balance; }
.glamora-post-card .d { font-size: 12.5px; line-height: 1.8; color: var(--g-text-muted); }
.glamora-post-card .m { margin-top: auto; padding-top: 4px; font-size: 11.5px; font-weight: 700; color: var(--g-gold); }
.glamora-blog-pages { display: flex; justify-content: center; gap: 10px; margin: 26px 0 0; }
.glamora-scope .glamora-blog-pages a { padding: 9px 20px; border-radius: 999px; border: 1px solid var(--g-border); background: var(--g-bg-2); color: var(--g-text); font-weight: 700; font-size: 13px; }

.glamora-article { max-width: 760px; margin: 0 auto; }
.glamora-article-head h1 { font-size: clamp(25px, 4.2vw, 36px); font-weight: 800; line-height: 1.45; margin: 4px 0 10px; text-wrap: balance; color: var(--g-text); }
.glamora-article-head .meta { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 18px; font-size: 12.5px; color: var(--g-text-muted); }
.glamora-article-cover { margin: 0 0 26px; border-radius: 20px; overflow: hidden; background: var(--g-bg-3); }
.glamora-article-cover img { display: block; width: 100%; height: auto; max-height: 460px; object-fit: cover; }
.glamora-prose { font-size: 16.5px; line-height: 2.05; color: var(--g-text); }
.glamora-prose > * { margin: 0 0 18px; }
.glamora-prose h2 { font-size: 21px; font-weight: 800; line-height: 1.6; margin: 34px 0 12px; color: var(--g-text); text-wrap: balance; }
.glamora-prose h3 { font-size: 17.5px; font-weight: 800; line-height: 1.6; margin: 26px 0 10px; color: var(--g-gold); }
.glamora-prose p, .glamora-prose li { color: color-mix(in oklab, var(--g-text) 88%, var(--g-text-muted)); }
.glamora-prose ul, .glamora-prose ol { padding-inline-start: 1.4em; }
.glamora-prose li { margin-bottom: 8px; }
.glamora-prose li::marker { color: var(--g-gold); }
.glamora-prose strong { color: var(--g-text); font-weight: 800; }
.glamora-scope .glamora-prose a { color: var(--g-gold); text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
.glamora-prose blockquote { margin-inline: 0; padding: 14px 18px; border-radius: 14px; background: color-mix(in oklab, var(--g-gold) 9%, var(--g-bg-2)); border: 1px solid color-mix(in oklab, var(--g-gold) 35%, var(--g-border)); font-size: 15px; }
.glamora-prose blockquote p { margin: 0; }
.glamora-prose figure.wp-block-table, .glamora-prose figure:has(> table) { margin: 0 0 18px; overflow-x: auto; }
.glamora-prose table { width: 100%; min-width: 480px; border-collapse: collapse; font-size: 14px; }
.glamora-prose table th, .glamora-prose table td, .glamora-prose .wp-block-table th, .glamora-prose .wp-block-table td { padding: 10px 12px; border: 1px solid var(--g-border); text-align: start; vertical-align: top; line-height: 1.7; }
.glamora-prose .wp-block-table thead { border-bottom: 2px solid color-mix(in oklab, var(--g-gold) 55%, var(--g-border)); }
.glamora-prose th { background: var(--g-bg-2); font-weight: 800; color: var(--g-text); }
.glamora-prose img { max-width: 100%; height: auto; border-radius: 14px; }
.glamora-article-book { max-width: 760px; margin-inline: auto; }
.glamora-blog h2 { color: var(--g-text); }
@media (max-width: 600px) { .glamora-prose { font-size: 15.5px; line-height: 1.95; } }

/* v1.23.1 — tips & articles under the centers on the home page (website only) */
.glamora-home-articles { margin: 34px 0 6px; }
.glamora-home-articles .glamora-post-strip-head h2 { margin: 0 !important; font-size: 18px; font-weight: 800; color: var(--g-text); }
.glamora-home-articles .glamora-post-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.glamora-home-articles .glamora-post-card[hidden] { display: none; }
@media (max-width: 860px) { .glamora-home-articles .glamora-post-grid { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); } }
.glamora-in-app .glamora-home-articles { display: none; }
