/* ==========================================================================
   Diet Delights — public website
   Single stylesheet for the whole marketing site + customer account area.

   Conventions
   -----------
   * Every class is prefixed `ws-` so nothing collides with the admin theme.
   * Logical properties only (margin-inline, inset-inline, text-align: start).
     RTL therefore needs no mirrored sheet — `dir="rtl"` on <html> is enough.
   * Colours, spacing and radii come from the custom properties below, so the
     palette can follow the brand colours managed in admin.
   ========================================================================== */

/* --------------------------------------------------------------- tokens -- */
:root {
    --ws-primary: #19ab54;
    --ws-primary-dark: #0f8a41;
    --ws-primary-darker: #0a6b32;
    --ws-primary-soft: #e8f7ee;
    --ws-primary-softer: #f3fbf6;

    --ws-accent: #f6a609;
    --ws-accent-soft: #fff4de;

    --ws-ink: #14261c;
    --ws-body: #46584e;
    --ws-muted: #7d8f85;
    --ws-line: #e3ebe6;

    --ws-surface: #ffffff;
    --ws-bg: #f6faf7;

    --ws-danger: #e2445c;
    --ws-danger-soft: #fdecef;
    --ws-success: #19ab54;
    --ws-success-soft: #e8f7ee;
    --ws-warning: #b7791f;
    --ws-warning-soft: #fff4de;

    --ws-gradient: linear-gradient(135deg, #19ab54 0%, #0f8a41 55%, #0a6b32 100%);
    --ws-gradient-soft: linear-gradient(135deg, #f3fbf6 0%, #e8f7ee 100%);
    --ws-gradient-warm: linear-gradient(135deg, #fff8ea 0%, #fdf1dc 100%);
    --ws-gradient-hero: linear-gradient(160deg, #f3fbf6 0%, #eaf6ee 42%, #fdf6e8 100%);

    /* Two more section tints so consecutive bands never repeat: a near-white
       mist that still reads as a gradient, and a cool blue-green. */
    --ws-gradient-mist: linear-gradient(135deg, #ffffff 0%, #f5faf7 100%);
    --ws-gradient-cool: linear-gradient(135deg, #f2f9fb 0%, #e7f3f7 100%);

    /* Sampled straight off the logo: charcoal wordmark, lime "NUTRITION
       CENTER" rule, orange dot over the i. */
    --ws-logo-ink: #303030;
    --ws-logo-lime: #7ab51d;
    --ws-logo-orange: #f58c26;
    --ws-gradient-logo: linear-gradient(120deg, #f3f9e7 0%, #ffffff 48%, #fdf1e2 100%);

    --ws-radius-sm: 10px;
    --ws-radius: 16px;
    --ws-radius-lg: 24px;
    --ws-radius-pill: 999px;

    /* Layered shadows — the depth cue that makes the cards read as elevated. */
    --ws-shadow-xs: 0 1px 2px rgba(20, 38, 28, .06);
    --ws-shadow-sm: 0 2px 6px rgba(20, 38, 28, .06), 0 1px 2px rgba(20, 38, 28, .04);
    --ws-shadow: 0 10px 30px rgba(20, 38, 28, .08), 0 2px 8px rgba(20, 38, 28, .04);
    --ws-shadow-lg: 0 24px 60px rgba(20, 38, 28, .14), 0 6px 18px rgba(20, 38, 28, .06);
    --ws-shadow-primary: 0 14px 32px rgba(25, 171, 84, .28);

    --ws-container: 1180px;
    --ws-gap: 24px;

    --ws-font: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;
    --ws-transition: .25s cubic-bezier(.4, 0, .2, 1);
}

/* Arabic typography — same family the admin panel switched to. */
[dir="rtl"] {
    --ws-font: 'Noto Kufi Arabic', 'Montserrat', 'Segoe UI', Tahoma, sans-serif;
}

/* ----------------------------------------------------------------- base -- */
*,
*::before,
*::after {
    box-sizing: border-box;
}

html {
    scroll-behavior: smooth;
    -webkit-text-size-adjust: 100%;

    /* The mobile nav drawer is parked off-screen with a transform, which still
       counts towards the document scroll width. `clip` removes that phantom
       horizontal scroll without turning <html> into a scroll container, so the
       sticky header keeps working (`hidden` would break it). */
    overflow-x: hidden;
    overflow-x: clip;
}

body.ws-body {
    margin: 0;
    background: var(--ws-bg);
    color: var(--ws-body);
    font-family: var(--ws-font);
    font-size: 16px;
    line-height: 1.7;
    overflow-x: hidden;
    overflow-x: clip;
}

img {
    max-width: 100%;
    height: auto;
    display: block;
}

a {
    color: var(--ws-primary-dark);
    text-decoration: none;
    transition: color var(--ws-transition);
}

a:hover {
    color: var(--ws-primary-darker);
}

h1, h2, h3, h4, h5 {
    margin: 0 0 .6em;
    color: var(--ws-ink);
    font-weight: 800;
    line-height: 1.25;
}

h1 { font-size: clamp(2rem, 4.4vw, 3.25rem); }
h2 { font-size: clamp(1.6rem, 3vw, 2.35rem); }
h3 { font-size: clamp(1.15rem, 1.8vw, 1.4rem); }
h4 { font-size: 1.05rem; }

p { margin: 0 0 1rem; }

ul, ol { margin: 0; padding: 0; }

/* Keyboard users get the outline; mouse users do not. */
:focus-visible {
    outline: 3px solid rgba(25, 171, 84, .45);
    outline-offset: 2px;
    border-radius: 4px;
}

.ws-skip-link {
    position: absolute;
    inset-block-start: -60px;
    inset-inline-start: 16px;
    z-index: 200;
    padding: 10px 18px;
    background: var(--ws-primary);
    color: #fff;
    border-radius: 0 0 var(--ws-radius-sm) var(--ws-radius-sm);
    transition: inset-block-start var(--ws-transition);
}

.ws-skip-link:focus {
    inset-block-start: 0;
    color: #fff;
}

/* --------------------------------------------------------------- layout -- */
/* Fluid container (Bootstrap `container-fluid` behaviour): full viewport width
   with a small gutter, instead of the old 1180px centred column. */
.ws-container {
    width: 100%;
    max-width: none;
    margin-inline: auto;
    padding-inline: clamp(16px, 3vw, 40px);
}

/* Opt-in reading column for long-form copy (legal pages, FAQs). */
.ws-container--narrow {
    max-width: var(--ws-container);
}

.ws-section {
    padding-block: clamp(48px, 7vw, 92px);
}

.ws-section--tight { padding-block: clamp(32px, 4vw, 56px); }

.ws-section--soft { background: var(--ws-gradient-soft); }

.ws-section--warm { background: var(--ws-gradient-warm); }

.ws-section--mist { background: var(--ws-gradient-mist); }

.ws-section--cool { background: var(--ws-gradient-cool); }

.ws-section--surface { background: var(--ws-surface); }

.ws-grid {
    display: grid;
    gap: var(--ws-gap);
}

/* Grid and flex children default to min-width:auto, which lets wide content
   (a horizontal slider, a long table) blow the column out past the viewport.
   Pinning it to 0 keeps every column inside its track. */
.ws-grid > *,
.ws-hero__inner > *,
.ws-appdl__inner > * {
    min-width: 0;
}

.ws-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.ws-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.ws-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

.ws-grid--auto {
    grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
}

/* Stat strip — wide enough that long figures like "8,000,000+" never clip. */
.ws-grid--stats { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }

/* Asymmetric two-column layouts (form + sidebar) that collapse on tablets. */
.ws-grid--split { grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr); }
.ws-grid--split-reverse { grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); }
.ws-grid--split,
.ws-grid--split-reverse { gap: clamp(24px, 4vw, 44px); align-items: start; }

/* Checkout: the form carries most of the interaction (day chips, two-up field
   rows), so it gets appreciably more room than the summary beside it. */
.ws-checkout {
    grid-template-columns: minmax(0, 1.9fr) minmax(0, 1fr);
    gap: clamp(24px, 4vw, 44px);
    align-items: start;
}

/* Every form panel stacks in the left column so the summary is always the
   right-hand column, however many sections the form grows to. */
.ws-checkout__main {
    display: grid;
    gap: 24px;
    min-width: 0;
}

/* The summary follows the form down — the totals and Proceed button stay in
   view while the customer works through the fields. */
.ws-checkout__summary {
    position: sticky;
    inset-block-start: 88px;
    min-width: 0;
}

/* Sticky only helps while the summary is beside the form; once the layout
   stacks it would just pin a panel over the fields. */
@media (max-width: 992px) {
    .ws-checkout__summary { position: static; }
}

/* ------------------------------------------------------- section header -- */
.ws-section-head {
    max-width: 720px;
    margin-inline: auto;
    margin-block-end: clamp(28px, 4vw, 48px);
    text-align: center;
}

.ws-section-head--start {
    margin-inline: 0;
    text-align: start;
}

.ws-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-block-end: 14px;
    padding: 6px 16px;
    border-radius: var(--ws-radius-pill);
    background: var(--ws-primary-soft);
    color: var(--ws-primary-darker);
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.ws-section-head p {
    margin-block-end: 0;
    color: var(--ws-muted);
    font-size: 1.02rem;
}

/* ---------------------------------------------------------------- icons -- */
.ws-icon {
    width: 1.15em;
    height: 1.15em;
    flex: none;
    vertical-align: middle;
}

.ws-icon--lg { width: 1.6em; height: 1.6em; }
.ws-icon--xl { width: 2.1em; height: 2.1em; }

/* Directional glyphs flip with the writing direction. */
[dir="rtl"] .ws-icon--flip { transform: scaleX(-1); }

.ws-icon-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 56px;
    height: 56px;
    border-radius: 18px;
    background: var(--ws-gradient);
    color: #fff;
    box-shadow: var(--ws-shadow-primary);
}

.ws-icon-badge--soft {
    background: var(--ws-primary-soft);
    color: var(--ws-primary-dark);
    box-shadow: none;
}

.ws-icon-badge--round {
    border-radius: 50%;
    background: var(--ws-primary-darker);
    box-shadow: none;
}

/* ---------------------------------------------------------- stats band -- */
/* Full-bleed strip directly under the hero. Compact by design — one row of
   five, each a cream pill with an amber badge. */
/* Deliberately dark. The hero above it is a pale mint/cream gradient, so any
   light tint here read as a continuation of the hero rather than a band in its
   own right. Charcoal is taken from the logo wordmark. */
.ws-stats-band {
    padding-block: clamp(18px, 2.5vw, 28px);
    background: linear-gradient(135deg, #303030 0%, #1b211d 100%);
}

.ws-stats {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: clamp(10px, 1.4vw, 18px);
    list-style: none;
}

.ws-stat-pill {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
    padding: 10px 16px 10px 10px;
    border-radius: var(--ws-radius-pill);
    background: rgba(255, 255, 255, .07);
    border: 1px solid rgba(255, 255, 255, .12);
}

.ws-stat-pill__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: var(--ws-logo-lime);
    color: #fff;
}

/* Figure on the first line, label underneath. */
.ws-stat-pill__text {
    display: flex;
    flex-direction: column;
    min-width: 0;
    line-height: 1.25;
}

.ws-stat-pill__text strong {
    color: #fff;
    font-size: 1.15rem;
    font-weight: 800;
    white-space: nowrap;
}

.ws-stat-pill__text > span {
    color: rgba(255, 255, 255, .72);
    font-size: .84rem;
}

@media (max-width: 1200px) {
    .ws-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 768px) {
    .ws-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 520px) {
    .ws-stats { grid-template-columns: 1fr; }
}

/* --------------------------------------------------------- meal detail -- */
/* Labelled badges. The category and meal-type vocabularies overlap ("Lunch" is
   both), so the label is what tells the two apart. */
.ws-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-block-end: 26px;
    list-style: none;
}

.ws-tag {
    display: inline-flex;
    align-items: baseline;
    gap: 7px;
    padding: 7px 14px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-pill);
    background: var(--ws-surface);
    box-shadow: var(--ws-shadow-xs);
}

.ws-tag__label {
    color: var(--ws-muted);
    font-size: .7rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
}

.ws-tag__value {
    color: var(--ws-ink);
    font-size: .88rem;
    font-weight: 700;
}

.ws-tag--flag {
    border-color: rgba(246, 166, 9, .4);
    background: var(--ws-accent-soft);
    color: var(--ws-warning);
    font-size: .82rem;
    font-weight: 700;
}

/* Even 50/50 split, image beside the copy, with the usual gap between them. */
.ws-meal-detail {
    gap: clamp(24px, 4vw, 44px);
    align-items: start;
}

.ws-meal-detail__media {
    border-radius: var(--ws-radius-lg);
    overflow: hidden;
    background: var(--ws-gradient-soft);
    box-shadow: var(--ws-shadow);
    aspect-ratio: 4 / 3;
}

.ws-meal-detail__media img { width: 100%; height: 100%; object-fit: cover; }

/* Meal names run long (up to ~80 characters), so they wrap to two or three
   lines — the global 1.25 heading line-height is too tight at this size. */
.ws-meal-detail__title {
    margin-block-end: 14px;
    font-size: clamp(1.15rem, 1.7vw, 1.45rem);
    line-height: 1.45;
    text-wrap: balance;
}

/* Macro tiles. auto-fit, because how many render depends on which figures the
   kitchen has filled in for that portion size. */
.ws-macros {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
    gap: 12px;
}

/* Portion sizes side by side, one column each. */
.ws-portions {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
    gap: 16px;
}

.ws-portion + .ws-portion {
    padding-inline-start: 16px;
    border-inline-start: 1px solid var(--ws-line);
}

.ws-portion__size {
    display: block;
    margin-block-end: 8px;
    color: var(--ws-muted);
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
}

.ws-macro {
    padding: 14px 12px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    background: var(--ws-primary-softer);
    text-align: center;
}

.ws-macro__value {
    display: block;
    color: var(--ws-primary-darker);
    font-size: 1.25rem;
    font-weight: 800;
    line-height: 1.2;
}

.ws-macro__value small { font-size: .72rem; font-weight: 700; margin-inline-start: 2px; }

.ws-macro__label {
    display: block;
    margin-block-start: 4px;
    color: var(--ws-muted);
    font-size: .8rem;
}

@media (max-width: 992px) {
    .ws-meal-detail { grid-template-columns: 1fr; }
}

/* -------------------------------------------------------------- clients -- */
/* Logos are supplied as 300x150 JPEGs on white, so they are desaturated to sit
   quietly together and colourise on hover/focus. */
.ws-clients {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    align-items: center;
    gap: clamp(12px, 2vw, 28px);
    max-width: 1180px;
    margin-inline: auto;
    list-style: none;
}

.ws-clients__item {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 10px;
    border-radius: var(--ws-radius);
    background: #fff;
}

.ws-clients__item img {
    width: 100%;
    max-width: 180px;
    height: auto;
    filter: grayscale(1);
    opacity: .68;
    mix-blend-mode: multiply;
    transition: filter var(--ws-transition), opacity var(--ws-transition), transform var(--ws-transition);
}

.ws-clients__item:hover img {
    filter: grayscale(0);
    opacity: 1;
    transform: scale(1.04);
}

@media (max-width: 992px) {
    .ws-clients { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 576px) {
    .ws-clients { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ------------------------------------------------------------- outcomes -- */
/* Full-bleed band, eight row-cards four across. Row layout (badge beside the
   copy, not above it) is what lets a 4-across grid still hold the longest
   title and description in two lines each. */
.ws-outcomes-band {
    position: relative;
    overflow: hidden;
    background: linear-gradient(135deg, #eaf6ee 0%, #f7fbf8 46%, #fdf3e2 100%);
}

/* Wide, low glow behind the grid — decoration only, never over the cards. */
.ws-outcomes-band::before {
    content: '';
    position: absolute;
    inset-block-start: 50%;
    inset-inline-start: 50%;
    width: min(1100px, 90vw);
    aspect-ratio: 2 / 1;
    transform: translate(-50%, -50%);
    border-radius: 50%;
    background: radial-gradient(ellipse, rgba(25, 171, 84, .12) 0%, rgba(25, 171, 84, 0) 70%);
    pointer-events: none;
}

/* Eight cards laid out 3 + 3 + 2. A six-column track with every card spanning
   two gives three per row; the trailing pair falls into columns 1-4, so the
   last row sits flush left under the two above it. */
.ws-outcomes {
    position: relative;
    z-index: 1;
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: var(--ws-gap);
    list-style: none;
}

.ws-outcomes > .ws-outcome { grid-column: span 2; }

.ws-outcome {
    display: flex;
    align-items: flex-start;
    gap: 14px;
    padding: 22px 20px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    background: rgba(255, 255, 255, .78);
    backdrop-filter: blur(6px);
    box-shadow: var(--ws-shadow-sm);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition), border-color var(--ws-transition);
}

.ws-outcome:hover {
    transform: translateY(-4px);
    border-color: rgba(25, 171, 84, .35);
    box-shadow: var(--ws-shadow);
}

.ws-outcome .ws-icon-badge {
    flex: none;
    width: 44px;
    height: 44px;
    margin-block-start: 2px;
}

.ws-outcome__body { min-width: 0; }

/* Semi-bold, not the 800 the global heading rule applies — these read as card
   labels rather than section headings. */
.ws-outcome h4 {
    margin-block-end: 5px;
    font-size: 1rem;
    font-weight: 600;
    text-wrap: balance;
}

.ws-outcome p {
    margin-block: 0;
    color: var(--ws-muted);
    font-size: .9rem;
    text-wrap: pretty;
}

@media (max-width: 1100px) {
    .ws-outcomes { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

@media (max-width: 700px) {
    .ws-outcomes { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* -------------------------------------------------------------- buttons -- */
.ws-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 13px 26px;
    border: 1px solid transparent;
    border-radius: var(--ws-radius-pill);
    font-family: inherit;
    font-size: .95rem;
    font-weight: 700;
    line-height: 1.2;
    text-align: center;
    cursor: pointer;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition),
    background var(--ws-transition), color var(--ws-transition), border-color var(--ws-transition);
}

.ws-btn:hover { transform: translateY(-2px); }

.ws-btn:active { transform: translateY(0); }

.ws-btn--primary {
    background: var(--ws-gradient);
    color: #fff;
    box-shadow: var(--ws-shadow-primary);
}

.ws-btn--primary:hover {
    color: #fff;
    box-shadow: 0 18px 40px rgba(25, 171, 84, .34);
}

.ws-btn--ghost {
    background: var(--ws-surface);
    border-color: var(--ws-line);
    color: var(--ws-ink);
    box-shadow: var(--ws-shadow-sm);
}

.ws-btn--ghost:hover {
    border-color: var(--ws-primary);
    color: var(--ws-primary-dark);
}

.ws-btn--outline {
    background: transparent;
    border-color: currentColor;
    color: var(--ws-primary-dark);
}

.ws-btn--light {
    background: rgba(255, 255, 255, .16);
    color: #fff;
    border-color: rgba(255, 255, 255, .4);
}

.ws-btn--light:hover { background: rgba(255, 255, 255, .26); color: #fff; }

.ws-btn--danger {
    background: var(--ws-danger);
    color: #fff;
    box-shadow: 0 12px 26px rgba(226, 68, 92, .26);
}

.ws-btn--danger:hover { color: #fff; }

.ws-btn--block { width: 100%; }

.ws-btn--sm { padding: 9px 18px; font-size: .85rem; }

.ws-btn[disabled],
.ws-btn.is-loading {
    opacity: .6;
    pointer-events: none;
}

.ws-btn-row {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
}

/* ---------------------------------------------------------------- cards -- */
.ws-card {
    position: relative;
    display: flex;
    flex-direction: column;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
    overflow: hidden;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition),
    border-color var(--ws-transition);
}

.ws-card--hover:hover {
    transform: translateY(-6px);
    box-shadow: var(--ws-shadow-lg);
    border-color: rgba(25, 171, 84, .28);
}

.ws-card__body {
    padding: 26px;
    flex: 1 1 auto;
}

.ws-card__footer {
    padding: 0 26px 26px;
}

/* Feature / benefit card ---------------------------------------------- */
.ws-feature {
    padding: 30px 26px;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-feature:hover {
    transform: translateY(-6px);
    box-shadow: var(--ws-shadow-lg);
}

.ws-feature h4 { margin-block: 18px 8px; }

.ws-feature p { margin: 0; color: var(--ws-muted); }

/* Stat card ------------------------------------------------------------ */
.ws-stat {
    padding: 26px 20px;
    border-radius: var(--ws-radius);
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    box-shadow: var(--ws-shadow-sm);
    text-align: center;
}

.ws-stat__value {
    display: block;
    background: var(--ws-gradient);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    font-size: clamp(1.45rem, 2.4vw, 1.95rem);
    font-weight: 800;
    line-height: 1.15;
    white-space: nowrap;
}

.ws-stat__label {
    color: var(--ws-muted);
    font-size: .88rem;
    font-weight: 600;
}

/* Plan card ------------------------------------------------------------ */
.ws-plan {
    position: relative;
    display: flex;
    flex-direction: column;
    padding: 30px 26px;
    border-radius: var(--ws-radius-lg);
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    box-shadow: var(--ws-shadow-sm);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
    overflow: hidden;
}

.ws-plan::before {
    content: '';
    position: absolute;
    inset-block-start: 0;
    inset-inline: 0;
    height: 6px;
    background: var(--ws-plan-accent, var(--ws-gradient));
}

.ws-plan:hover {
    transform: translateY(-8px);
    box-shadow: var(--ws-shadow-lg);
}

.ws-plan__category {
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--ws-primary-dark);
}

.ws-plan__title { margin-block: 10px 6px; }

.ws-plan__price {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin-block: 14px;
}

.ws-plan__amount {
    color: var(--ws-ink);
    font-size: 2rem;
    font-weight: 800;
    line-height: 1;
}

.ws-plan__currency { color: var(--ws-muted); font-size: .95rem; font-weight: 700; }

.ws-plan__was {
    color: var(--ws-muted);
    font-size: .95rem;
    text-decoration: line-through;
}

.ws-plan__meta {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-block: 6px 22px;
    padding-block-start: 18px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-plan__meta li {
    display: flex;
    align-items: center;
    gap: 10px;
    list-style: none;
    color: var(--ws-body);
    font-size: .92rem;
}

.ws-plan__meta .ws-icon { color: var(--ws-primary); }

.ws-plan__cta { margin-block-start: auto; }

.ws-plan__ribbon {
    position: absolute;
    inset-block-start: 18px;
    inset-inline-end: 18px;
    padding: 5px 14px;
    border-radius: var(--ws-radius-pill);
    background: var(--ws-accent-soft);
    color: var(--ws-warning);
    font-size: .72rem;
    font-weight: 800;
    letter-spacing: .06em;
    text-transform: uppercase;
}

/* Meal card ------------------------------------------------------------ */
/* The whole card is the link, so colour has to be reset off the <a>. */
.ws-meal {
    display: flex;
    flex-direction: column;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
    overflow: hidden;
    color: inherit;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition), border-color var(--ws-transition);
}

.ws-meal:hover,
.ws-meal:focus-visible {
    transform: translateY(-6px);
    border-color: rgba(25, 171, 84, .35);
    box-shadow: var(--ws-shadow-lg);
    color: inherit;
}

.ws-meal:hover .ws-meal__title { color: var(--ws-primary-dark); }

.ws-meal__media {
    position: relative;
    aspect-ratio: 4 / 3;
    background: var(--ws-gradient-soft);
    overflow: hidden;
}

.ws-meal__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform .5s ease;
}

.ws-meal:hover .ws-meal__media img { transform: scale(1.06); }

/* Calorie badge over the photo — the figure people scan for first, so it gets
   the strongest slot on the card instead of the category name. */
.ws-meal__tag {
    position: absolute;
    inset-block-start: 12px;
    inset-inline-start: 12px;
    padding: 6px 13px;
    border-radius: var(--ws-radius-pill);
    background: rgba(255, 255, 255, .94);
    color: var(--ws-primary-darker);
    font-size: .78rem;
    font-weight: 800;
    white-space: nowrap;
    box-shadow: var(--ws-shadow-sm);
}

.ws-meal__body { padding: 18px 20px 22px; }

/* One line, ellipsised — meal names vary wildly in length and a two-line name
   pushes the macro chips out of alignment across the grid. */
.ws-meal__title {
    margin: 0 0 6px;
    font-size: 1.02rem;
    font-weight: 700;
    line-height: 1.5;
    color: var(--ws-ink);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.ws-meal__desc {
    margin: 0 0 14px;
    color: var(--ws-muted);
    font-size: .88rem;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.ws-meal__facts {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
}

.ws-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    border-radius: var(--ws-radius-pill);
    background: var(--ws-primary-softer);
    color: var(--ws-primary-darker);
    font-size: .76rem;
    font-weight: 700;
}

/* Blog card ------------------------------------------------------------ */
.ws-blog {
    display: flex;
    flex-direction: column;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
    overflow: hidden;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-blog:hover { transform: translateY(-6px); box-shadow: var(--ws-shadow-lg); }

.ws-blog__media { aspect-ratio: 16 / 9; background: var(--ws-gradient-soft); }

.ws-blog__media img { width: 100%; height: 100%; object-fit: cover; }

/* ---------------------------------------------------------- masonry -- */
/* CSS columns rather than a grid: card heights vary with the artwork, and
   `grid-template-rows: masonry` still is not broadly shipped. Note this fills
   column by column, so reading order runs down each column, not across. */
.ws-masonry {
    columns: 3;
    column-gap: var(--ws-gap);
}

.ws-masonry > * {
    break-inside: avoid;
    /* Safari still needs the legacy pair to honour break-inside in columns. */
    -webkit-column-break-inside: avoid;
    page-break-inside: avoid;
    margin-block-end: var(--ws-gap);
}

/* The card is flex elsewhere; inside a column it has to be a plain block or
   the column algorithm cannot split around it. */
.ws-masonry .ws-blog { display: block; }

/* Images keep their natural proportions here — that is the whole point. */
.ws-masonry .ws-blog__media {
    aspect-ratio: auto;
    line-height: 0;
}

.ws-masonry .ws-blog__media img { height: auto; object-fit: contain; }

@media (max-width: 1080px) {
    .ws-masonry { columns: 2; }
}

@media (max-width: 640px) {
    .ws-masonry { columns: 1; }
}

.ws-blog__body { padding: 22px; }

.ws-blog__cat {
    color: var(--ws-primary-dark);
    font-size: .76rem;
    font-weight: 800;
    letter-spacing: .06em;
    text-transform: uppercase;
}

.ws-blog__title { margin-block: 10px 8px; font-size: 1.08rem; }

.ws-blog__excerpt {
    margin: 0;
    color: var(--ws-muted);
    font-size: .9rem;
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* ------------------------------------------------- floating nav controls -- */
/* There is no full-width header: a CTA pill and the menu trigger float over
   the page, and the menu itself is a full-screen two-pane overlay. */
.ws-fab {
    position: fixed;
    inset-block-start: 20px;
    inset-inline-end: 20px;
    z-index: 90;
    display: flex;
    align-items: center;
    gap: 10px;
}

/* One height across the pill and the round buttons beside it. */
.ws-fab__cta {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 52px;
    padding-inline: 30px;
    border-radius: var(--ws-radius-pill);
    background: var(--ws-gradient);
    color: #fff;
    font-size: 1rem;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    box-shadow: var(--ws-shadow-primary);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-fab__cta:hover {
    color: #fff;
    transform: translateY(-2px);
    box-shadow: 0 18px 40px rgba(25, 171, 84, .34);
}

.ws-fab__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 52px;
    height: 52px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: #fff;
    color: var(--ws-ink);
    cursor: pointer;
    box-shadow: var(--ws-shadow);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition), color var(--ws-transition);
}

.ws-fab__icon:hover { color: var(--ws-primary-dark); }

.ws-fab__icon:hover { transform: translateY(-2px); box-shadow: var(--ws-shadow-lg); }

.ws-fab__icon .ws-icon { width: 1.4em; height: 1.4em; stroke-width: 2.2; }

/* --------------------------------------------------- full screen menu -- */
.ws-menu {
    position: fixed;
    inset: 0;
    z-index: 120;
    display: grid;
    grid-template-columns: 58% 42%;
    background: var(--ws-surface);
    animation: ws-menu-in .28s ease;
}

.ws-menu[hidden] { display: none; }

@keyframes ws-menu-in {
    from { opacity: 0; }
    to { opacity: 1; }
}

/* Left pane: brand on a dark field, download band pinned to the bottom. */
.ws-menu__brand {
    position: relative;
    display: flex;
    flex-direction: column;
    background: #1c1712;
    overflow: hidden;
}

.ws-menu__logo {
    padding: 34px 48px 0;
}

.ws-menu__logo img { max-height: 90px; width: auto; }

/* Three framed app screens in the dark pane.

   Sized by HEIGHT, not width: the pane is whatever is left between the logo and
   the download band, so the phones have to shrink to fit it rather than bleed
   under the band. Screenshots are 9:19.5, and the frame declares the same ratio
   so nothing is cropped. */
.ws-menu__screens {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 1 1 auto;
    min-height: 0;
    /* Extra bottom padding keeps the phones clear of the download band below. */
    padding: 20px 16px 110px;
}


.ws-menu__screens .ws-phone {
    flex: 0 0 auto;
    width: auto;
    height: min(100%, 660px);
    margin: 0;
    padding: 6px;
    border-radius: 26px;
    box-shadow: 0 18px 40px rgba(0, 0, 0, .55), inset 0 0 0 1px rgba(255, 255, 255, .1);
}

.ws-menu__screens .ws-phone__screen {
    height: 100%;
    width: auto;
    aspect-ratio: 9 / 19.5;
    border-radius: 21px;
}

.ws-menu__screens .ws-phone__screen img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: top;
}

/* Middle phone forward and taller. The stagger comes from pushing the OUTER
   two down rather than lifting the middle one up: the row is centre-aligned,
   so translating the middle would drag the whole group off the centre line. */
.ws-menu__screens[data-count="3"] .ws-phone:not(:first-child) { margin-inline-start: -26px; }

.ws-menu__screens[data-count="3"] .ws-phone:nth-child(2) {
    z-index: 2;
    height: min(100%, 760px);
}

.ws-menu__screens[data-count="3"] .ws-phone:first-child,
.ws-menu__screens[data-count="3"] .ws-phone:last-child {
    transform: translateY(7%);
    opacity: .9;
}

.ws-menu__apps { position: relative; }

/* Straddles the dark pane and the green band, so it needs to read against both
   — solid white with green text is the only pairing that holds on either side.
   It was near-black on near-black before. */
.ws-menu__join {
    position: absolute;
    inset-block-end: 100%;
    inset-inline-start: 48px;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-block-end: -20px;
    padding: 12px 26px;
    border-radius: var(--ws-radius-pill);
    background: #fff;
    color: var(--ws-primary-darker);
    font-size: .92rem;
    font-weight: 700;
    box-shadow: 0 10px 26px rgba(0, 0, 0, .35);
    z-index: 2;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-menu__join:hover {
    color: var(--ws-primary-darker);
    transform: translateY(-2px);
    box-shadow: 0 14px 30px rgba(0, 0, 0, .4);
}

.ws-menu__join .ws-icon { color: var(--ws-accent); width: 1em; height: 1em; }

.ws-menu__apps-inner {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 20px 28px;
    padding: 34px 48px;
    background:
        radial-gradient(120% 140% at 100% 0%, rgba(255, 255, 255, .18), transparent 55%),
        var(--ws-gradient);
}

.ws-menu__apps-copy { min-width: 0; }

.ws-menu__apps-title {
    margin: 0;
    color: #fff;
    font-size: clamp(1.4rem, 2.2vw, 2rem);
    font-weight: 800;
    line-height: 1.15;
}

.ws-menu__apps-text {
    max-width: 34ch;
    margin: 6px 0 0;
    color: rgba(255, 255, 255, .86);
    font-size: .92rem;
}

/* Frosted store buttons — the flat translucent fill washed out against the
   brand gradient behind it. */
.ws-store-btn--glass {
    padding: 10px 20px;
    border-radius: var(--ws-radius);
    background: rgba(255, 255, 255, .16);
    border: 1px solid rgba(255, 255, 255, .38);
    backdrop-filter: blur(6px);
    box-shadow: 0 8px 20px rgba(0, 0, 0, .18);
}

.ws-store-btn--glass:hover {
    background: #fff;
    border-color: #fff;
    color: var(--ws-primary-darker);
}

.ws-menu__store-buttons { display: flex; flex-wrap: wrap; gap: 14px; }

/* Right pane: the links. */
/* Links start at the top of the pane, not centred in it, so the list reads
   from the first item down however many entries the nav grows to. */
.ws-menu__panel {
    position: relative;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
    padding: 100px 56px 110px;
    overflow-y: auto;
}

.ws-menu__close {
    position: absolute;
    inset-block-start: 34px;
    inset-inline-end: 40px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 46px;
    height: 46px;
    padding: 0;
    border: 1px solid var(--ws-line);
    border-radius: 50%;
    background: var(--ws-surface);
    color: var(--ws-ink);
    cursor: pointer;
    box-shadow: var(--ws-shadow-sm);
    transition: background var(--ws-transition), border-color var(--ws-transition),
                color var(--ws-transition), transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-menu__close:hover {
    background: var(--ws-primary);
    border-color: var(--ws-primary);
    color: #fff;
    transform: rotate(90deg);
    box-shadow: var(--ws-shadow-primary);
}

.ws-menu__close:active { transform: rotate(90deg) scale(.94); }

.ws-menu__links { display: grid; gap: 6px; list-style: none; }

.ws-menu__link {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 11px 12px;
    border-radius: var(--ws-radius-sm);
    color: var(--ws-ink);
    font-size: clamp(.92rem, 1.05vw, 1.05rem);
    font-weight: 700;
    transition: color var(--ws-transition), background var(--ws-transition);
}

.ws-menu__link:hover { color: var(--ws-primary-dark); background: var(--ws-primary-softer); }

.ws-menu__link.is-active { color: var(--ws-primary); }

.ws-menu__link .ws-icon { width: 1.2em; height: 1.2em; }

/* Two-state English / العربية switch pinned to the bottom of the menu pane. */
.ws-lang-switch {
    position: absolute;
    inset-block-end: 34px;
    inset-inline-start: 56px;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 5px 5px 12px;
    border: 1px solid var(--ws-line, rgba(0, 0, 0, .1));
    border-radius: var(--ws-radius-pill);
    background: var(--ws-secondary, #f4f4f2);
}

.ws-lang-switch__icon {
    width: 1.1em;
    height: 1.1em;
    margin-inline-end: 4px;
    color: var(--ws-muted);
}

.ws-lang-switch__option {
    padding: 7px 16px;
    border-radius: var(--ws-radius-pill);
    color: var(--ws-muted);
    font-size: .9rem;
    font-weight: 700;
    line-height: 1;
    white-space: nowrap;
    transition: color var(--ws-transition), background var(--ws-transition);
}

.ws-lang-switch__option:hover { color: var(--ws-primary-dark); }

.ws-lang-switch__option.is-active {
    background: var(--ws-primary);
    color: #fff;
    box-shadow: 0 6px 16px rgba(25, 171, 84, .28);
}

.ws-lang-switch__option.is-active:hover { color: #fff; }

/* The Arabic label needs the Arabic face even while the page is in English —
   Montserrat has no Arabic glyphs, so it would fall back to a system font. */
.ws-lang-switch__option[lang="ar"] {
    font-family: 'Noto Kufi Arabic', 'Segoe UI', Tahoma, sans-serif;
    font-size: .84rem;
}

/* Pages start below the floating controls instead of below a header. */
.ws-hero,
.ws-page-head,
.ws-auth { padding-block-start: clamp(96px, 10vw, 132px); }

/* Account pages: the head carries a title and nothing else, so it does not need
   the full hero-height clearance — only enough to clear the floating controls. */
.ws-page-head--compact {
    padding-block: clamp(74px, 8vw, 92px) clamp(20px, 2.5vw, 30px);
}

/* ----------------------------------------------------------------- hero -- */
.ws-hero {
    position: relative;
    /* Asymmetric: the top only has to clear the fixed .ws-fab controls
       (20px offset + ~52px tall), the bottom just meets the stats band. */
    padding-block: clamp(44px, 5.5vw, 80px) clamp(30px, 3.5vw, 52px);
    background: var(--ws-gradient-hero);
    overflow: hidden;
}

.ws-hero::before,
.ws-hero::after {
    content: '';
    position: absolute;
    border-radius: 50%;
    pointer-events: none;
}

.ws-hero::before {
    width: 420px;
    height: 420px;
    inset-block-start: -140px;
    inset-inline-end: -120px;
    background: radial-gradient(circle, rgba(25, 171, 84, .18), transparent 68%);
}

.ws-hero::after {
    width: 320px;
    height: 320px;
    inset-block-end: -120px;
    inset-inline-start: -100px;
    background: radial-gradient(circle, rgba(246, 166, 9, .16), transparent 68%);
}

.ws-hero__inner {
    position: relative;
    z-index: 1;
    display: grid;
    grid-template-columns: 1.05fr .95fr;
    align-items: center;
    gap: clamp(28px, 5vw, 60px);
}

.ws-hero__logo {
    /* block, so the eyebrow below starts on its own line rather than
       sitting alongside the logo */
    display: block;
    width: fit-content;
    margin-block-end: 24px;
}

.ws-hero__logo img {
    max-height: 108px;
    width: auto;
}

/* The hero sits on `--ws-gradient-hero`, which is close enough to
   `--ws-primary-soft` that the default eyebrow tint washes out against it.
   Solid brand fill here, matching the active chip treatment. */
.ws-hero .ws-eyebrow {
    background: var(--ws-gradient);
    color: #fff;
    box-shadow: var(--ws-shadow-primary);
}

/* Sized to keep "Real Science, Real Results" on one line in the hero column;
   nowrap is only applied from the two-column breakpoint up, so the stacked
   mobile layout can still wrap it. */
.ws-hero__title {
    margin-block-end: 18px;
    font-size: clamp(1.9rem, 3.2vw, 2.6rem);
}

@media (min-width: 993px) {
    .ws-hero__title { white-space: nowrap; }
}

.ws-hero__title span {
    background: var(--ws-gradient);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

.ws-hero__lead {
    max-width: 540px;
    margin-block-end: 28px;
    color: var(--ws-body);
    font-size: 1.08rem;
}

/* Secondary hero paragraph — smaller and muted so it supports the lead above
   it rather than competing with it. */
.ws-hero__lead--sm {
    max-width: 560px;
    margin-block-start: -14px;
    color: var(--ws-muted);
    font-size: .97rem;
    text-wrap: pretty;
}

.ws-hero__points {
    display: flex;
    flex-wrap: wrap;
    gap: 12px 22px;
    margin-block-start: 28px;
    list-style: none;
}

.ws-hero__points li {
    display: flex;
    align-items: center;
    gap: 9px;
    color: var(--ws-body);
    font-size: .92rem;
    font-weight: 600;
}

.ws-hero__points .ws-icon { color: var(--ws-primary); }

/* 16/9 rather than 4/3: the hero photo is a wide flat-lay (1512x499), so a
   taller box would crop away most of the dish spread. */
.ws-hero__media {
    position: relative;
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-lg);
    overflow: hidden;
    aspect-ratio: 16 / 9;
    background: var(--ws-surface);
}

.ws-hero__media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: center;
}

.ws-hero__float {
    position: absolute;
    inset-block-end: 20px;
    inset-inline-start: 20px;
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 18px;
    border-radius: var(--ws-radius);
    background: rgba(255, 255, 255, .95);
    box-shadow: var(--ws-shadow);
    font-size: .85rem;
    font-weight: 700;
    color: var(--ws-ink);
}

.ws-hero__float .ws-icon { color: var(--ws-primary); }

/* ------------------------------------------------------- how it works ---- */
.ws-step {
    position: relative;
    padding: 32px 26px 28px;
    border-radius: var(--ws-radius-lg);
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    box-shadow: var(--ws-shadow-sm);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-step:hover { transform: translateY(-6px); box-shadow: var(--ws-shadow-lg); }

.ws-step__number {
    position: absolute;
    inset-block-start: 22px;
    inset-inline-end: 24px;
    font-size: 2.6rem;
    font-weight: 800;
    line-height: 1;
    color: var(--ws-primary-soft);
}

.ws-step h3 { margin-block: 18px 8px; }

.ws-step p { margin: 0; color: var(--ws-muted); }

/* -------------------------------------------------- app download band -- */
/* Light band, copy on one side, a CSS-drawn phone frame on the other. The
   screenshots stay admin-managed, so the frame has to work with whatever
   aspect ratio gets uploaded — hence a fixed 9/19.5 screen with object-fit. */
.ws-appdl {
    position: relative;
    overflow: hidden;
    background: linear-gradient(120deg, #eef7f1 0%, #f8fbf9 42%, #f3f8fb 100%);
}

.ws-appdl__inner {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.45fr);
    align-items: center;
    gap: clamp(28px, 4vw, 52px);
}

.ws-appdl__copy h2 {
    max-width: 26ch;
    margin-block-end: 18px;
    text-wrap: balance;
}

.ws-appdl__lead {
    max-width: 52ch;
    margin-block-end: 26px;
    color: var(--ws-muted);
    font-size: 1.05rem;
    text-wrap: pretty;
}

.ws-appdl__points {
    display: grid;
    gap: 14px;
    margin-block-end: 30px;
    list-style: none;
}

.ws-appdl__points li {
    display: flex;
    align-items: center;
    gap: 12px;
    color: var(--ws-ink);
    font-size: 1.02rem;
}

/* Ringed tick, matching the reference's outlined check marks. */
.ws-appdl__points .ws-icon {
    flex: none;
    width: 1.5em;
    height: 1.5em;
    padding: .28em;
    border: 1.5px solid var(--ws-primary);
    border-radius: 50%;
    color: var(--ws-primary);
}

.ws-store-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
}

.ws-store-btn {
    display: inline-flex;
    align-items: center;
    gap: 12px;
    padding: 11px 22px;
    border-radius: var(--ws-radius);
    background: rgba(255, 255, 255, .14);
    border: 1px solid rgba(255, 255, 255, .34);
    color: #fff;
    transition: background var(--ws-transition), transform var(--ws-transition);
}

.ws-store-btn:hover { background: rgba(255, 255, 255, .24); color: #fff; transform: translateY(-2px); }

.ws-store-btn img { height: 30px; width: auto; }

.ws-store-btn__text { display: flex; flex-direction: column; line-height: 1.2; text-align: start; }

.ws-store-btn__text small { font-size: .68rem; opacity: .82; }

.ws-store-btn__text strong { font-size: .95rem; }

/* Solid black store badges, for use on light backgrounds. */
.ws-store-btn--dark {
    padding: 12px 26px;
    border-radius: var(--ws-radius-sm);
    background: #111;
    border-color: #111;
    color: #fff;
    box-shadow: var(--ws-shadow-sm);
}

.ws-store-btn--dark:hover { background: #000; color: #fff; }

.ws-store-btn--dark .ws-store-btn__text small {
    opacity: 1;
    font-size: .7rem;
    letter-spacing: .04em;
    text-transform: uppercase;
}

.ws-store-btn--dark .ws-store-btn__text strong { font-size: 1.15rem; font-weight: 700; }

/* Phone frames --------------------------------------------------------- */
.ws-appdl__media {
    display: grid;
    justify-items: center;
}

/* Three screens up front. The middle one is raised and slightly larger, the
   outer two tuck behind it with a negative inline margin so the row stays
   compact instead of spreading across the whole column. */
.ws-phones {
    display: flex;
    align-items: center;
    justify-content: center;
}

.ws-phone {
    position: relative;
    flex: none;
    width: min(320px, 36vw);
    margin: 0;
    padding: 8px;
    border-radius: 32px;
    background: linear-gradient(160deg, #2b3138 0%, #12161a 100%);
    box-shadow: var(--ws-shadow-lg), inset 0 0 0 2px rgba(255, 255, 255, .08);
}

.ws-phones[data-count="3"] .ws-phone:not(:first-child) { margin-inline-start: -46px; }

/* Middle phone forward: bigger, lifted, and above its neighbours. */
.ws-phones[data-count="3"] .ws-phone:nth-child(2) {
    z-index: 2;
    width: min(362px, 40vw);
    transform: translateY(-18px);
}

.ws-phones[data-count="2"] .ws-phone:not(:first-child) { margin-inline-start: -30px; }

.ws-phone__screen {
    position: relative;
    border-radius: 26px;
    overflow: hidden;
    background: #fff;
    aspect-ratio: 9 / 19.5;
}

.ws-phone__screen img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    background: #fff;
}

@media (max-width: 992px) {
    .ws-appdl__inner { grid-template-columns: 1fr; }
    .ws-appdl__media { order: -1; }
    .ws-appdl__copy h2 { max-width: none; }
}

/* Below the split, the outer two would be too narrow to read — show the
   raised middle screen on its own. */
@media (max-width: 620px) {
    .ws-phones .ws-phone:not(:nth-child(2)) { display: none; }
    .ws-phones[data-count="1"] .ws-phone:first-child { display: block; }
    .ws-phones[data-count="3"] .ws-phone:nth-child(2) { width: min(260px, 68vw); transform: none; }
}

/* -------------------------------------------------------------- filters -- */
.ws-filters {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 12px;
    margin-block-end: 28px;
}

.ws-search {
    position: relative;
    flex: 1 1 260px;
    min-width: 220px;
}

.ws-search .ws-icon {
    position: absolute;
    inset-block-start: 50%;
    inset-inline-start: 16px;
    transform: translateY(-50%);
    color: var(--ws-muted);
}

.ws-search input {
    width: 100%;
    padding: 13px 18px;
    padding-inline-start: 46px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-pill);
    background: var(--ws-surface);
    font-family: inherit;
    font-size: .92rem;
    color: var(--ws-ink);
    box-shadow: var(--ws-shadow-xs);
}

.ws-search input:focus { outline: none; border-color: var(--ws-primary); }

.ws-chips {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    list-style: none;
}

.ws-chip--sm {
    padding: 3px 9px;
    font-size: .7rem;
    font-weight: 700;
}

.ws-chip-btn {
    padding: 9px 18px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-pill);
    background: var(--ws-surface);
    color: var(--ws-body);
    font-family: inherit;
    font-size: .86rem;
    font-weight: 600;
    cursor: pointer;
    transition: all var(--ws-transition);
}

.ws-chip-btn:hover { border-color: var(--ws-primary); color: var(--ws-primary-dark); }

.ws-chip-btn.is-active {
    background: var(--ws-gradient);
    border-color: transparent;
    color: #fff;
    box-shadow: var(--ws-shadow-primary);
}

/* Chips used as form controls (checkout day / cycle pickers) are <label>s, so
   they need to beat the generic `.ws-field label` typography. */
.ws-field .ws-chip-btn {
    display: inline-flex;
    align-items: center;
    color: var(--ws-body);
    font-size: .86rem;
    font-weight: 600;
    user-select: none;
}

.ws-field .ws-chip-btn.is-active { color: #fff; }

/* -------------------------------------------------------- coupon box -- */
.ws-coupon {
    margin-block: 18px 0;
    padding-block-start: 18px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-coupon__label {
    display: block;
    margin-block-end: 8px;
    color: var(--ws-ink);
    font-size: .88rem;
    font-weight: 700;
}

/* Input + Apply as one joined control. The input sits outside .ws-field, so it
   never picked up the form styling and was falling back to the browser default
   border — hence the heavy dark box next to a pill button. */
.ws-coupon__row {
    display: flex;
    align-items: stretch;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-sm);
    background: var(--ws-surface);
    overflow: hidden;
    transition: border-color var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-coupon__row:focus-within {
    border-color: var(--ws-primary);
    box-shadow: 0 0 0 3px rgba(25, 171, 84, .14);
}

.ws-coupon__row input {
    flex: 1 1 auto;
    min-width: 0;
    height: 46px;
    padding-inline: 14px;
    border: 0;
    background: none;
    color: var(--ws-ink);
    font-family: inherit;
    font-size: .95rem;
    text-transform: uppercase;
}

.ws-coupon__row input::placeholder { text-transform: none; }

.ws-coupon__row input:focus { outline: none; }

.ws-coupon__row .ws-btn {
    flex: none;
    height: 46px;
    padding-inline: 20px;
    border: 0;
    border-inline-start: 1px solid var(--ws-line);
    border-radius: 0;
    background: var(--ws-primary-softer);
    color: var(--ws-primary-dark);
    box-shadow: none;
    font-size: .88rem;
}

.ws-coupon__row .ws-btn:hover {
    transform: none;
    background: var(--ws-primary);
    color: #fff;
}

.ws-coupon__row .ws-btn[disabled] { transform: none; }

.ws-coupon__msg {
    margin-block: 8px 0;
    color: var(--ws-primary-dark);
    font-size: .82rem;
    font-weight: 600;
}

.ws-coupon__msg.is-error { color: var(--ws-danger); }

.ws-coupon__msg[hidden] { display: none; }

/* ---------------------------------------------------- address options -- */
.ws-address-options {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 12px;
}

.ws-address-option {
    display: block;
    padding: 14px 16px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    background: var(--ws-surface);
    cursor: pointer;
    transition: border-color var(--ws-transition), box-shadow var(--ws-transition), background var(--ws-transition);
}

.ws-address-option:hover { border-color: var(--ws-primary); }

.ws-address-option.is-active {
    border-color: var(--ws-primary);
    background: var(--ws-primary-softer);
    box-shadow: 0 0 0 1px var(--ws-primary) inset;
}

/* Location on one end, the zone/street/building badges on the other, wrapping
   only when the card is too narrow to hold them side by side. */
.ws-address-option__body {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 8px 14px;
}

.ws-address-option__line {
    color: var(--ws-body);
    font-size: .88rem;
    font-weight: 500;
    line-height: 1.5;
}

.ws-address-option__line:first-child { color: var(--ws-ink); font-weight: 700; }

/* Zone, street and building stay on one line — nowrap on the badges keeps a
   value from breaking mid-badge, and the card min-width above gives them room. */
.ws-address-option__tags {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

.ws-address-option__tags .ws-tag { white-space: nowrap; }

/* Compact variant of the labelled badge used on the meal detail page. */
.ws-tag--sm {
    gap: 5px;
    padding: 4px 10px;
    box-shadow: none;
}

.ws-tag--sm .ws-tag__label { font-size: .62rem; }

.ws-tag--sm .ws-tag__value { font-size: .8rem; }

/* ------------------------------------------------------- order summary -- */
.ws-summary {
    display: grid;
    gap: 10px;
    margin-block: 18px 0;
    padding-block-start: 18px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-summary > div {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 16px;
}

.ws-summary > div[hidden] { display: none; }

.ws-summary dt { color: var(--ws-muted); font-size: .9rem; }

.ws-summary dd { margin: 0; color: var(--ws-ink); font-weight: 700; }

.ws-summary__total {
    margin-block-start: 4px;
    padding-block-start: 12px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-summary__total dt { color: var(--ws-ink); font-size: 1rem; font-weight: 700; }

.ws-summary__total dd { color: var(--ws-primary-dark); font-size: 1.25rem; }

/* ---------------------------------------------------------------- forms -- */
.ws-form { display: grid; gap: 18px; }

.ws-form__row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
}

.ws-field { display: flex; flex-direction: column; gap: 8px; }

.ws-field label {
    color: var(--ws-ink);
    font-size: .88rem;
    font-weight: 700;
}

.ws-field label .ws-req { color: var(--ws-danger); }

/* The native picker is replaced by .ws-datepicker, so its glyph is hidden and
   the whole field becomes the trigger. */
.ws-field input[type="date"] { cursor: pointer; }

.ws-field input[type="date"]::-webkit-calendar-picker-indicator {
    display: none;
    -webkit-appearance: none;
}

/* ------------------------------------------------------------ datepicker -- */
.ws-field { position: relative; }

.ws-datepicker {
    position: absolute;
    inset-block-start: calc(100% + 8px);
    inset-inline-start: 0;
    z-index: 60;
    width: 300px;
    max-width: 100%;
    padding: 14px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    background: var(--ws-surface);
    box-shadow: var(--ws-shadow-lg);
}

.ws-datepicker[hidden] { display: none; }

.ws-datepicker__head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-block-end: 12px;
}

.ws-datepicker__month {
    color: var(--ws-ink);
    font-size: .95rem;
    font-weight: 700;
}

.ws-datepicker__nav {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    padding: 0;
    border: 1px solid var(--ws-line);
    border-radius: 50%;
    background: var(--ws-surface);
    color: var(--ws-body);
    cursor: pointer;
    transition: background var(--ws-transition), border-color var(--ws-transition), color var(--ws-transition);
}

.ws-datepicker__nav svg { width: 15px; height: 15px; }

.ws-datepicker__nav:hover {
    border-color: var(--ws-primary);
    background: var(--ws-primary-softer);
    color: var(--ws-primary-dark);
}

/* Chevrons point the reading direction, so they flip under RTL. */
[dir="rtl"] .ws-datepicker__nav svg { transform: scaleX(-1); }

.ws-datepicker__weekdays,
.ws-datepicker__grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}

.ws-datepicker__weekdays {
    margin-block-end: 6px;
}

.ws-datepicker__weekdays span {
    padding-block: 4px;
    color: var(--ws-muted);
    font-size: .72rem;
    font-weight: 700;
    text-align: center;
    text-transform: uppercase;
}

.ws-datepicker__day {
    aspect-ratio: 1;
    padding: 0;
    border: 0;
    border-radius: var(--ws-radius-sm);
    background: none;
    color: var(--ws-ink);
    font-family: inherit;
    font-size: .86rem;
    font-weight: 600;
    cursor: pointer;
    transition: background var(--ws-transition), color var(--ws-transition);
}

.ws-datepicker__day:hover:not(:disabled) { background: var(--ws-primary-softer); color: var(--ws-primary-dark); }

.ws-datepicker__day.is-outside { color: var(--ws-muted); opacity: .55; }

.ws-datepicker__day.is-today { box-shadow: inset 0 0 0 1px var(--ws-primary); }

.ws-datepicker__day.is-selected {
    background: var(--ws-gradient);
    color: #fff;
    box-shadow: var(--ws-shadow-primary);
}

.ws-datepicker__day:disabled {
    color: var(--ws-muted);
    opacity: .35;
    cursor: not-allowed;
}

.ws-field input,
.ws-field select,
.ws-field textarea {
    width: 100%;
    padding: 13px 16px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-sm);
    background: var(--ws-surface);
    color: var(--ws-ink);
    font-family: inherit;
    font-size: .95rem;
    transition: border-color var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-field textarea { min-height: 130px; resize: vertical; }

.ws-field input:focus,
.ws-field select:focus,
.ws-field textarea:focus {
    outline: none;
    border-color: var(--ws-primary);
    box-shadow: 0 0 0 4px rgba(25, 171, 84, .12);
}

.ws-field__hint { color: var(--ws-muted); font-size: .8rem; }

/* Numbers, emails and phone numbers stay LTR even on an Arabic page. */
[dir="rtl"] input[type="email"],
[dir="rtl"] input[type="tel"],
[dir="rtl"] input[type="number"],
[dir="rtl"] input[type="url"] {
    direction: ltr;
    text-align: start;
}

.ws-check {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: .88rem;
    color: var(--ws-body);
}

.ws-check input { width: 18px; height: 18px; accent-color: var(--ws-primary); }

/* --------------------------------------------------------------- alerts -- */
.ws-alert {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    margin-block: 20px 0;
    padding: 14px 18px;
    border-radius: var(--ws-radius);
    border: 1px solid transparent;
    font-size: .92rem;
    font-weight: 600;
    box-shadow: var(--ws-shadow-xs);
}

.ws-alert__text { flex: 1; }

.ws-alert__close {
    padding: 0;
    border: 0;
    background: none;
    color: inherit;
    cursor: pointer;
    opacity: .6;
}

.ws-alert__close:hover { opacity: 1; }

/* ---------------------------------------------------------------- toasts -- */
/* Fixed stack in the corner rather than an inline banner, so a flash message
   never shifts the page content under the reader. */
.ws-toasts {
    position: fixed;
    inset-block-start: 88px;
    inset-inline-end: 20px;
    z-index: 150;
    display: grid;
    gap: 10px;
    width: min(380px, calc(100vw - 40px));
    pointer-events: none;
}

.ws-toast {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    padding: 14px 16px;
    border-radius: var(--ws-radius);
    border: 1px solid transparent;
    background: var(--ws-surface);
    box-shadow: var(--ws-shadow-lg);
    font-size: .92rem;
    line-height: 1.5;
    pointer-events: auto;
    animation: ws-toast-in .32s cubic-bezier(.2, .8, .2, 1) both;
}

@keyframes ws-toast-in {
    from { opacity: 0; transform: translateX(24px); }
    to   { opacity: 1; transform: none; }
}

.ws-toast.is-leaving {
    opacity: 0;
    transform: translateX(24px);
    transition: opacity .3s ease, transform .3s ease;
}

.ws-toast__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: currentColor;
}

.ws-toast__icon .ws-icon { color: #fff; width: .95em; height: .95em; }

.ws-toast__text { flex: 1; min-width: 0; color: var(--ws-ink); }

.ws-toast__close {
    flex: none;
    padding: 0;
    border: 0;
    background: none;
    color: var(--ws-muted);
    cursor: pointer;
    transition: color var(--ws-transition);
}

.ws-toast__close:hover { color: var(--ws-ink); }

/* The border and icon disc carry the status colour; the body stays white so
   the text keeps full contrast. */
.ws-toast--success { border-color: rgba(25, 171, 84, .35); color: var(--ws-success); }
.ws-toast--danger  { border-color: rgba(226, 68, 92, .35); color: var(--ws-danger); }
.ws-toast--warning { border-color: rgba(246, 166, 9, .4);  color: var(--ws-accent); }
.ws-toast--info    { border-color: rgba(25, 171, 84, .3);  color: var(--ws-primary); }

/* Clear of the floating nav controls on small screens. */
@media (max-width: 576px) {
    .ws-toasts { inset-block-start: 74px; inset-inline: 14px auto; width: calc(100vw - 28px); }
}

@media (prefers-reduced-motion: reduce) {
    .ws-toast { animation: none; }
    .ws-toast.is-leaving { transition: none; }
}

.ws-alert--success { background: var(--ws-success-soft); border-color: rgba(25, 171, 84, .28); color: #12703a; }
.ws-alert--danger { background: var(--ws-danger-soft); border-color: rgba(226, 68, 92, .28); color: #a3243a; }
.ws-alert--warning { background: var(--ws-warning-soft); border-color: rgba(183, 121, 31, .3); color: #8a5b12; }
.ws-alert--info { background: var(--ws-primary-soft); border-color: rgba(25, 171, 84, .22); color: var(--ws-primary-darker); }

/* ------------------------------------------------------- faq groupings -- */
.ws-faq-group + .ws-faq-group { margin-block-start: 40px; }

.ws-faq-group[hidden] { display: none; }

/* Filtered-out grid items must not keep occupying a grid cell. */
[data-filter-item][hidden] { display: none; }

.ws-faq-group__title {
    margin-block-end: 16px;
    font-size: 1.25rem;
    color: var(--ws-primary-darker);
}

/* ------------------------------------------------------------ accordion -- */
.ws-accordion { display: grid; gap: 14px; }

.ws-accordion__item {
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    box-shadow: var(--ws-shadow-sm);
    overflow: hidden;
    transition: box-shadow var(--ws-transition), border-color var(--ws-transition);
}

.ws-accordion__item.is-open {
    border-color: rgba(25, 171, 84, .34);
    box-shadow: var(--ws-shadow);
}

.ws-accordion__trigger {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    width: 100%;
    padding: 20px 24px;
    border: 0;
    background: none;
    color: var(--ws-ink);
    font-family: inherit;
    font-size: 1rem;
    font-weight: 700;
    text-align: start;
    cursor: pointer;
}

.ws-accordion__trigger .ws-icon { transition: transform var(--ws-transition); color: var(--ws-primary); }

.ws-accordion__item.is-open .ws-accordion__trigger .ws-icon { transform: rotate(180deg); }

.ws-accordion__panel {
    display: none;
    padding: 0 24px 22px;
    color: var(--ws-body);
}

.ws-accordion__item.is-open .ws-accordion__panel { display: block; }

/* -------------------------------------------------------------- account -- */
.ws-account {
    display: grid;
    grid-template-columns: 340px minmax(0, 1fr);
    gap: 28px;
    align-items: start;
}

/* Sidebar hidden — the subscription detail table needs the whole row. */
.ws-account--wide { grid-template-columns: minmax(0, 1fr); }

/* Divides the account-settings group from the content links above it. */
.ws-account__divider {
    margin-block-start: 10px;
    padding-block-start: 10px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-account__nav {
    position: sticky;
    inset-block-start: 24px;
    padding: 22px;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
}

.ws-account__user {
    display: flex;
    align-items: center;
    gap: 12px;
    padding-block-end: 18px;
    margin-block-end: 14px;
    border-block-end: 1px solid var(--ws-line);
}

.ws-account__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 46px;
    height: 46px;
    border-radius: 50%;
    background: var(--ws-gradient);
    color: #fff;
    font-weight: 800;
}

.ws-account__name { font-weight: 700; color: var(--ws-ink); font-size: .95rem; }

.ws-account__meta { color: var(--ws-muted); font-size: .8rem; }

.ws-account__links { display: grid; gap: 4px; list-style: none; }

.ws-account__link {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 11px 14px;
    border-radius: var(--ws-radius-sm);
    color: var(--ws-body);
    font-size: .9rem;
    font-weight: 600;
    transition: background var(--ws-transition), color var(--ws-transition);
}

.ws-account__link:hover { background: var(--ws-primary-softer); color: var(--ws-primary-dark); }

.ws-account__link.is-active { background: var(--ws-primary-soft); color: var(--ws-primary-darker); }

.ws-panel {
    padding: 28px;
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-sm);
}

.ws-panel + .ws-panel { margin-block-start: 24px; }

/* ------------------------------------------------ subscription detail -- */
/* Detail card beside the day table, matching the admin screen's split. */
.ws-subscription {
    display: grid;
    grid-template-columns: minmax(0, 440px) minmax(0, 1fr);
    gap: 24px;
    align-items: start;
}

.ws-subscription > .ws-panel { margin-block-start: 0; }

/* Detail column is reference data, so it sits a step down from body copy. */
.ws-subscription .ws-datalist { gap: 10px; }

.ws-subscription .ws-datalist__row { padding-block-end: 9px; }

.ws-subscription .ws-datalist__label { font-size: .78rem; }

.ws-subscription .ws-datalist__value { font-size: .84rem; }

.ws-subscription .ws-panel__head h2 { font-size: 1.05rem; }

.ws-subscription .ws-table { font-size: .86rem; }

/* Status tabs above the table. */
.ws-tabs {
    gap: 6px;
    margin-block-end: 18px;
    padding-block-end: 14px;
    border-block-end: 1px solid var(--ws-line);
}

.ws-table--days td { vertical-align: middle; }

.ws-nowrap { white-space: nowrap; }

.ws-count {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--ws-ink);
    font-weight: 700;
    white-space: nowrap;
}

.ws-count .ws-icon { color: var(--ws-primary); }

.ws-count small { color: var(--ws-muted); font-weight: 600; }

.ws-day-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
}

/* Square icon buttons for the per-day actions. Each carries a title and an
   aria-label, so the meaning survives without a visible caption. */
.ws-icon-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 34px;
    padding: 0;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-sm);
    background: var(--ws-surface);
    color: var(--ws-body);
    cursor: pointer;
    transition: background var(--ws-transition), border-color var(--ws-transition), color var(--ws-transition);
}

.ws-icon-btn:hover {
    border-color: var(--ws-primary);
    background: var(--ws-primary-softer);
    color: var(--ws-primary-dark);
}

.ws-icon-btn.is-active {
    border-color: var(--ws-primary);
    background: var(--ws-primary);
    color: #fff;
}

.ws-icon-btn .ws-icon { width: 1.05em; height: 1.05em; }

/* The edit panel lives in its own full-width row under the day it belongs to. */
.ws-day-edit-cell { padding-block: 0 !important; }

.ws-schedule__edit {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 16px;
    margin-block: 4px 14px;
    padding: 16px;
    border-radius: var(--ws-radius);
    background: var(--ws-primary-softer);
}

.ws-schedule__edit[hidden] { display: none; }

.ws-schedule__form { display: grid; gap: 10px; align-content: start; }

/* Filtered-out table rows must lose their table display, not just `hidden`. */
tr[data-filter-item][hidden] { display: none; }

@media (max-width: 1200px) {
    .ws-subscription { grid-template-columns: 1fr; }
}

/* ---------------------------------------------------- calorie panel -- */
.ws-calories__grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 16px;
    margin-block-start: 18px;
}

.ws-calories__wide { grid-column: 1 / -1; }

.ws-calories__result {
    margin-block-start: 22px;
    padding: 26px 22px;
    border-radius: var(--ws-radius-lg);
    background: var(--ws-primary-softer);
    border: 1px solid rgba(25, 171, 84, .22);
    text-align: center;
}

.ws-calories__value {
    display: block;
    color: var(--ws-primary-darker);
    font-size: 2.6rem;
    font-weight: 800;
    line-height: 1.1;
}

.ws-calories__label {
    display: block;
    margin-block-start: 4px;
    color: var(--ws-body);
    font-size: .92rem;
    font-weight: 600;
}

.ws-calories__note {
    max-width: 46ch;
    margin: 10px auto 18px;
    color: var(--ws-muted);
    font-size: .86rem;
}

/* ------------------------------------------------------- meal picker -- */
.ws-course + .ws-course {
    margin-block-start: 26px;
    padding-block-start: 22px;
    border-block-start: 1px solid var(--ws-line);
}

.ws-course__title {
    margin-block-end: 14px;
    font-size: 1rem;
    font-weight: 700;
    color: var(--ws-primary-darker);
}

.ws-meal-pick {
    position: relative;
    display: flex;
    flex-direction: column;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    background: var(--ws-surface);
    overflow: hidden;
    cursor: pointer;
    transition: border-color var(--ws-transition), box-shadow var(--ws-transition), transform var(--ws-transition);
}

.ws-meal-pick:hover { transform: translateY(-3px); box-shadow: var(--ws-shadow); }

.ws-meal-pick.is-active {
    border-color: var(--ws-primary);
    box-shadow: 0 0 0 1px var(--ws-primary) inset, var(--ws-shadow);
}

/* At the limit the unchosen cards stay visible but stop responding. */
.ws-meal-pick.is-disabled { opacity: .45; cursor: not-allowed; }

.ws-meal-pick.is-disabled:hover { transform: none; box-shadow: none; }


.ws-meal-pick__media { position: relative; aspect-ratio: 3 / 2; background: var(--ws-gradient-soft); }

.ws-meal-pick__media img { width: 100%; height: 100%; object-fit: cover; }

.ws-meal-pick__body { display: grid; gap: 8px; padding: 14px; }

.ws-meal-pick__title { color: var(--ws-ink); font-weight: 700; font-size: .95rem; }

.ws-meal-pick__macros { display: flex; flex-wrap: wrap; gap: 6px; }

.ws-meal-pick__check {
    position: absolute;
    inset-block-start: 12px;
    inset-inline-end: 12px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: var(--ws-surface);
    color: transparent;
    box-shadow: var(--ws-shadow-sm);
    transition: background var(--ws-transition), color var(--ws-transition);
}

.ws-meal-pick.is-active .ws-meal-pick__check { background: var(--ws-primary); color: #fff; }

/* --------------------------------------------------- profile card -- */
.ws-profile-card__head {
    display: flex;
    align-items: flex-start;
    gap: 18px;
    padding-block-end: 22px;
    border-block-end: 1px solid var(--ws-line);
}

.ws-profile-card__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 64px;
    height: 64px;
    border-radius: 50%;
    background: var(--ws-gradient);
    color: #fff;
    font-size: 1.6rem;
    font-weight: 800;
    box-shadow: var(--ws-shadow-primary);
}

.ws-profile-card__id { flex: 1 1 auto; min-width: 0; }

.ws-profile-card__name {
    margin: 0 0 10px;
    font-size: 1.25rem;
    line-height: 1.3;
}

.ws-profile-card__tags {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}

/* Contact rows — icon, label, value. Auto-fit so one row of contacts spreads
   and three wrap into a tidy grid. */
.ws-profile-card__contacts {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 18px;
    margin-block: 22px 0;
    list-style: none;
}

.ws-profile-card__contacts li {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
}

.ws-profile-card__contact-icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 38px;
    height: 38px;
    border-radius: 50%;
    background: var(--ws-primary-softer);
    color: var(--ws-primary-dark);
}

.ws-profile-card__contact-body { display: grid; min-width: 0; }

.ws-profile-card__contact-label {
    color: var(--ws-muted);
    font-size: .74rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
}

.ws-profile-card__contact-value {
    color: var(--ws-ink);
    font-size: .92rem;
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

@media (max-width: 576px) {
    .ws-profile-card__head { flex-wrap: wrap; }
}

/* ------------------------------------------------- account overview -- */
.ws-account-stats {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 16px;
    margin-block-end: 24px;
}

.ws-account-stat {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 18px 20px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    background: var(--ws-surface);
    box-shadow: var(--ws-shadow-sm);
    color: inherit;
    transition: transform var(--ws-transition), box-shadow var(--ws-transition), border-color var(--ws-transition);
}

.ws-account-stat:hover {
    transform: translateY(-3px);
    border-color: rgba(25, 171, 84, .35);
    box-shadow: var(--ws-shadow);
    color: inherit;
}

.ws-account-stat .ws-icon-badge { flex: none; width: 44px; height: 44px; }

.ws-account-stat__body { display: grid; min-width: 0; }

.ws-account-stat__value {
    color: var(--ws-ink);
    font-size: 1.5rem;
    font-weight: 800;
    line-height: 1.1;
}

.ws-account-stat__label {
    color: var(--ws-muted);
    font-size: .84rem;
    font-weight: 600;
}

.ws-account-stat__go {
    flex: none;
    margin-inline-start: auto;
    color: var(--ws-muted);
    transition: transform var(--ws-transition), color var(--ws-transition);
}

.ws-account-stat:hover .ws-account-stat__go {
    color: var(--ws-primary);
    transform: translateX(3px);
}

[dir="rtl"] .ws-account-stat:hover .ws-account-stat__go { transform: translateX(-3px); }

@media (max-width: 1200px) {
    .ws-account-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 576px) {
    .ws-account-stats { grid-template-columns: 1fr; }
}

.ws-panel__head {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 14px;
    margin-block-end: 22px;
}

.ws-panel__head h2 { margin: 0; font-size: 1.25rem; }

/* Data list ------------------------------------------------------------ */
.ws-datalist { display: grid; gap: 14px; list-style: none; }

.ws-datalist__row {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: 8px;
    padding-block-end: 12px;
    border-block-end: 1px dashed var(--ws-line);
}

.ws-datalist__row:last-child { border-block-end: 0; padding-block-end: 0; }

.ws-datalist__label { color: var(--ws-muted); font-size: .86rem; font-weight: 600; }

.ws-datalist__value { color: var(--ws-ink); font-weight: 700; font-size: .92rem; }

/* Address card --------------------------------------------------------- */
.ws-address {
    position: relative;
    padding: 22px;
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius);
    background: var(--ws-surface);
    box-shadow: var(--ws-shadow-xs);
}

.ws-address.is-default { border-color: rgba(25, 171, 84, .4); background: var(--ws-primary-softer); }

.ws-address__badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-block-end: 10px;
    padding: 4px 12px;
    border-radius: var(--ws-radius-pill);
    background: var(--ws-primary-soft);
    color: var(--ws-primary-darker);
    font-size: .72rem;
    font-weight: 800;
    text-transform: uppercase;
}

.ws-address__actions {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-block-start: 16px;
    padding-block-start: 14px;
    border-block-start: 1px solid var(--ws-line);
}

/* Status pill ---------------------------------------------------------- */
.ws-status {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 13px;
    border-radius: var(--ws-radius-pill);
    font-size: .74rem;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: .04em;
}

.ws-status--activated,
.ws-status--completed { background: var(--ws-success-soft); color: #12703a; }

.ws-status--pending { background: var(--ws-warning-soft); color: var(--ws-warning); }

.ws-status--cancelled,
.ws-status--expired { background: var(--ws-danger-soft); color: #a3243a; }

.ws-status--freezed,
.ws-status--default { background: var(--ws-primary-soft); color: var(--ws-primary-darker); }

/* Simple table --------------------------------------------------------- */
.ws-table-wrap { overflow-x: auto; }

.ws-table {
    width: 100%;
    border-collapse: collapse;
    font-size: .9rem;
}

.ws-table th,
.ws-table td {
    padding: 13px 14px;
    text-align: start;
    border-block-end: 1px solid var(--ws-line);
    white-space: nowrap;
}

.ws-table th { color: var(--ws-muted); font-size: .78rem; text-transform: uppercase; letter-spacing: .05em; }

.ws-table tbody tr:hover { background: var(--ws-primary-softer); }

/* ------------------------------------------------------------ auth pages -- */
.ws-auth {
    display: grid;
    align-content: center;
    padding-block: clamp(40px, 6vw, 80px);
    background: var(--ws-gradient-hero);
    min-height: 100vh;
}

/* Card beside the "how it works" panel — the container is fluid, so a lone
   centred card left most of the band empty. */
.ws-auth__inner {
    display: grid;
    grid-template-columns: minmax(0, 520px) minmax(0, 1fr);
    align-items: center;
    gap: clamp(28px, 5vw, 72px);
    max-width: 1180px;
}

.ws-auth__card {
    width: 100%;
    max-width: 520px;
    padding: clamp(26px, 4vw, 42px);
    background: var(--ws-surface);
    border: 1px solid var(--ws-line);
    border-radius: var(--ws-radius-lg);
    box-shadow: var(--ws-shadow-lg);
}

.ws-auth__aside-title {
    margin-block-end: 26px;
    font-size: clamp(1.4rem, 2.2vw, 1.9rem);
    text-wrap: balance;
}

.ws-auth__steps {
    display: grid;
    gap: 20px;
    list-style: none;
}

.ws-auth__step {
    display: flex;
    align-items: flex-start;
    gap: 16px;
}

.ws-auth__step .ws-icon-badge { flex: none; }

.ws-auth__step-body { min-width: 0; }

.ws-auth__step-index {
    display: block;
    color: var(--ws-primary-dark);
    font-size: .72rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.ws-auth__step h3 {
    margin-block: 4px 4px;
    font-size: 1.05rem;
    font-weight: 700;
}

.ws-auth__step p {
    margin: 0;
    color: var(--ws-muted);
    font-size: .92rem;
}

.ws-auth__points {
    display: flex;
    flex-wrap: wrap;
    gap: 10px 24px;
    margin-block-start: 28px;
    padding-block-start: 22px;
    border-block-start: 1px solid var(--ws-line);
    list-style: none;
}

.ws-auth__points li {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: var(--ws-body);
    font-size: .9rem;
    font-weight: 600;
}

.ws-auth__points .ws-icon { color: var(--ws-primary); }

/* One column below the split: the card first, the explainer under it. */
@media (max-width: 992px) {
    .ws-auth__inner { grid-template-columns: 1fr; justify-items: center; }
    .ws-auth__aside { max-width: 520px; }
}

.ws-auth__head { text-align: center; margin-block-end: 26px; }

.ws-auth__head p { margin: 0; color: var(--ws-muted); }

.ws-auth__foot {
    margin-block-start: 22px;
    padding-block-start: 20px;
    border-block-start: 1px solid var(--ws-line);
    text-align: center;
    font-size: .9rem;
    color: var(--ws-muted);
}

/* ----------------------------------------------------------- page header -- */
.ws-page-head {
    padding-block: clamp(36px, 5vw, 64px);
    background: var(--ws-gradient-hero);
    text-align: center;
}

.ws-page-head h1 { margin-block-end: 10px; }

.ws-page-head p { max-width: 660px; margin-inline: auto; color: var(--ws-muted); }

.ws-breadcrumb {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 8px;
    margin-block-start: 16px;
    list-style: none;
    font-size: .84rem;
    color: var(--ws-muted);
}

.ws-breadcrumb .ws-icon { width: .9em; height: .9em; }

/* ------------------------------------------------------------------ CTA -- */
/* Capped because the page container is fluid — a full-bleed CTA card reads as
   a background band rather than a call to action. */
.ws-cta {
    position: relative;
    max-width: 1180px;
    margin-inline: auto;
    padding: clamp(38px, 5vw, 68px) clamp(24px, 5vw, 60px);
    border-radius: var(--ws-radius-lg);
    background: var(--ws-gradient);
    color: #fff;
    box-shadow: var(--ws-shadow-lg);
    overflow: hidden;
    text-align: center;
    isolation: isolate;
}

/* Two soft glows instead of one hard disc: reads as depth rather than as a
   stray circle clipped by the corner. */
.ws-cta::before {
    content: '';
    position: absolute;
    inset: 0;
    background:
        radial-gradient(60% 80% at 88% -10%, rgba(255, 255, 255, .26), transparent 62%),
        radial-gradient(48% 70% at 6% 108%, rgba(255, 255, 255, .16), transparent 60%);
    pointer-events: none;
}

/* Hairline inset ring — lifts the card off the page background. */
.ws-cta::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    border: 1px solid rgba(255, 255, 255, .22);
    pointer-events: none;
}

.ws-cta > * { position: relative; z-index: 1; }

.ws-cta h2 {
    max-width: 20ch;
    margin-inline: auto;
    color: #fff;
    text-wrap: balance;
}

.ws-cta p {
    max-width: 56ch;
    margin-inline: auto;
    margin-block-end: 0;
    color: rgba(255, 255, 255, .9);
    text-wrap: pretty;
}

.ws-cta .ws-btn-row { justify-content: center; margin-block-start: 28px; }

.ws-cta__eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    margin-block-end: 16px;
    padding: 6px 16px;
    border-radius: var(--ws-radius-pill);
    background: rgba(255, 255, 255, .18);
    border: 1px solid rgba(255, 255, 255, .28);
    color: #fff;
    font-size: .78rem;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.ws-cta__points {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 10px 26px;
    margin-block-start: 26px;
    padding-block-start: 24px;
    border-block-start: 1px solid rgba(255, 255, 255, .2);
    list-style: none;
}

.ws-cta__points li {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    color: rgba(255, 255, 255, .92);
    font-size: .9rem;
    font-weight: 600;
}

.ws-cta__points .ws-icon { color: #fff; }

/* Solid white primary against the green card — the translucent `--light`
   buttons gave the two actions equal weight. */
.ws-btn--solid-light {
    background: #fff;
    border-color: #fff;
    color: var(--ws-primary-darker);
    box-shadow: 0 14px 30px rgba(0, 0, 0, .18);
}

.ws-btn--solid-light:hover {
    background: #fff;
    color: var(--ws-primary-darker);
    box-shadow: 0 20px 40px rgba(0, 0, 0, .24);
}

/* Full-bleed light CTA -------------------------------------------------- */
/* The band carries the gradient so the CTA runs edge to edge; `--light` then
   strips the card chrome and flips the copy back to dark ink. */
.ws-cta-band {
    background: var(--ws-gradient-logo);
    border-block: 1px solid rgba(122, 181, 29, .18);
}

/* No card, so the card's own block padding would just double up on the
   section's — drop it and let `.ws-section--tight` set the rhythm. */
.ws-cta--light {
    max-width: none;
    padding: 0;
    border-radius: 0;
    background: none;
    box-shadow: none;
    color: var(--ws-body);
}

.ws-cta--light::before,
.ws-cta--light::after { content: none; }

.ws-cta--light h2 { color: var(--ws-logo-ink); }

.ws-cta--light p { color: var(--ws-body); }

.ws-cta--light .ws-cta__eyebrow {
    background: rgba(122, 181, 29, .14);
    border-color: rgba(122, 181, 29, .32);
    color: #4d7a0f;
}

.ws-cta--light .ws-cta__eyebrow .ws-icon { color: var(--ws-logo-orange); }

.ws-cta--light .ws-cta__points {
    border-block-start-color: rgba(48, 48, 48, .12);
}

.ws-cta--light .ws-cta__points li { color: var(--ws-body); }

.ws-cta--light .ws-cta__points .ws-icon { color: var(--ws-logo-lime); }

/* ------------------------------------------------- floating whatsapp -- */
/* Sits opposite the .ws-fab controls (which are pinned top-right), so the two
   never collide. */
.ws-whatsapp {
    position: fixed;
    inset-block-end: clamp(18px, 3vh, 30px);
    inset-inline-start: clamp(18px, 3vw, 30px);
    z-index: 110;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 58px;
    height: 58px;
    border-radius: 50%;
    background: linear-gradient(135deg, #25d366 0%, #14a44a 55%, #0d8a3d 100%);
    color: #fff;
    box-shadow: 0 12px 28px rgba(18, 140, 63, .42);
    transition: transform var(--ws-transition), box-shadow var(--ws-transition);
}

.ws-whatsapp:hover {
    color: #fff;
    transform: translateY(-3px) scale(1.04);
    box-shadow: 0 18px 38px rgba(18, 140, 63, .5);
}

.ws-whatsapp__icon { width: 1.7em; height: 1.7em; position: relative; z-index: 1; }

/* Expanding ring behind the button. Sits under the icon and ignores pointer
   events so it never steals the click. */
.ws-whatsapp__pulse {
    position: absolute;
    inset: 0;
    border-radius: 50%;
    background: rgba(37, 211, 102, .55);
    animation: ws-whatsapp-pulse 2.4s cubic-bezier(.4, 0, .6, 1) infinite;
    pointer-events: none;
}

@keyframes ws-whatsapp-pulse {
    0%   { transform: scale(1);   opacity: .7; }
    70%  { transform: scale(1.8); opacity: 0; }
    100% { transform: scale(1.8); opacity: 0; }
}

@media (max-width: 576px) {
    .ws-whatsapp { width: 52px; height: 52px; }
    .ws-whatsapp__icon { width: 1.5em; height: 1.5em; }
}

@media (prefers-reduced-motion: reduce) {
    .ws-whatsapp__pulse { animation: none; }
    .ws-whatsapp:hover { transform: none; }
}

/* --------------------------------------------------------------- footer -- */
.ws-footer {
    padding-block: clamp(44px, 6vw, 72px) 26px;
    background: linear-gradient(160deg, #14261c 0%, #0d1a13 100%);
    color: rgba(255, 255, 255, .74);
}

.ws-footer__grid {
    display: grid;
    grid-template-columns: 1.4fr 1fr 1fr 1.3fr;
    gap: clamp(24px, 4vw, 44px);
}

.ws-footer__brand img { max-height: 88px; width: auto; margin-block-end: 18px; }

.ws-footer__tagline { max-width: 420px; font-size: .92rem; }

.ws-footer__title {
    margin-block-end: 16px;
    color: #fff;
    font-size: .95rem;
    letter-spacing: .04em;
    text-transform: uppercase;
}

.ws-footer__links,
.ws-footer__contact { display: grid; gap: 11px; list-style: none; }

.ws-footer__links a { color: rgba(255, 255, 255, .74); font-size: .9rem; }

.ws-footer__links a:hover { color: #fff; }

.ws-footer__contact li {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    font-size: .88rem;
}

.ws-footer__contact .ws-icon { margin-block-start: 3px; color: var(--ws-primary); }

.ws-footer__contact a { color: rgba(255, 255, 255, .74); }

.ws-footer__contact a:hover { color: #fff; }

.ws-social { display: flex; gap: 10px; margin-block-start: 20px; }

.ws-social a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: rgba(255, 255, 255, .08);
    color: rgba(255, 255, 255, .82);
    transition: background var(--ws-transition), transform var(--ws-transition);
}

.ws-social a:hover { background: var(--ws-primary); color: #fff; transform: translateY(-3px); }

/* Contact card sits on a light surface, so the footer's translucent-on-dark
   treatment is overridden here. Declared after the base rule on purpose —
   same specificity, so source order decides. */
.ws-social--contact { margin-block-start: 8px; }

.ws-social--contact a {
    border: 1px solid var(--ws-line);
    background: var(--ws-surface);
    color: var(--ws-body);
}

.ws-social--contact a:hover {
    border-color: var(--ws-primary);
    background: var(--ws-primary-softer);
    color: var(--ws-primary-dark);
}

.ws-newsletter { margin-block-start: 22px; }

.ws-newsletter__label { display: block; margin-block-end: 10px; font-size: .84rem; font-weight: 600; }

.ws-newsletter__row { display: flex; gap: 8px; }

.ws-newsletter__row input {
    flex: 1;
    min-width: 0;
    padding: 12px 16px;
    border: 1px solid rgba(255, 255, 255, .18);
    border-radius: var(--ws-radius-pill);
    background: rgba(255, 255, 255, .07);
    color: #fff;
    font-family: inherit;
    font-size: .88rem;
}

.ws-newsletter__row input::placeholder { color: rgba(255, 255, 255, .5); }

.ws-newsletter__row input:focus { outline: none; border-color: var(--ws-primary); }

.ws-newsletter__row .ws-btn { padding: 12px 18px; }

.ws-footer__bottom {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    gap: 10px;
    margin-block-start: 44px;
    padding-block-start: 22px;
    border-block-start: 1px solid rgba(255, 255, 255, .1);
    font-size: .82rem;
}

.ws-footer__bottom p { margin: 0; }

.ws-footer__bottom a { color: rgba(255, 255, 255, .82); }

/* ------------------------------------------------------------ empty state -- */
.ws-empty {
    padding: 54px 24px;
    text-align: center;
    color: var(--ws-muted);
}

.ws-empty .ws-icon-badge { margin-inline: auto; margin-block-end: 18px; }

.ws-empty h3 { margin-block-end: 8px; }

/* ------------------------------------------------------------- utilities -- */
.ws-text-center { text-align: center; }
.ws-text-muted { color: var(--ws-muted); }
.ws-mb-0 { margin-block-end: 0; }
.ws-mt-3 { margin-block-start: 24px; }
.ws-mt-4 { margin-block-start: 32px; }
.ws-hidden { display: none !important; }
.ws-sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.ws-prose { color: var(--ws-body); }
.ws-prose h2 { margin-block: 1.6em .6em; }
.ws-prose h3 { margin-block: 1.4em .5em; }
.ws-prose ul, .ws-prose ol { margin-block-end: 1rem; padding-inline-start: 1.3rem; }
.ws-prose li { margin-block-end: .4rem; }
.ws-prose img { border-radius: var(--ws-radius); margin-block: 1rem; }

/* ------------------------------------------------------------ responsive -- */
@media (max-width: 1080px) {
    .ws-footer__grid { grid-template-columns: 1fr 1fr; }
    .ws-hero__inner { grid-template-columns: 1fr; }
    .ws-hero__media { order: -1; max-width: 560px; margin-inline: auto; }
    .ws-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 992px) {
    .ws-grid--split,
    .ws-grid--split-reverse,
    .ws-checkout { grid-template-columns: 1fr; }
    .ws-account { grid-template-columns: 1fr; }
    .ws-account__nav { position: static; }
    .ws-grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }

    /* The two-pane menu stacks: links first, download band underneath. */
    .ws-menu {
        grid-template-columns: 1fr;
        grid-template-rows: 1fr auto;
    }

    .ws-menu__brand { grid-row: 2; }

    .ws-menu__logo { display: none; }
    .ws-menu__screens { display: none; }

    .ws-menu__join { inset-inline-start: 24px; margin-block-end: -18px; }

    .ws-menu__apps-inner { padding: 30px 24px; gap: 16px; }

    .ws-menu__panel { justify-content: flex-start; padding: 84px 24px 32px; }

    .ws-lang-switch { position: static; margin-block-start: 28px; align-self: flex-start; }
}

@media (max-width: 768px) {
    .ws-form__row { grid-template-columns: 1fr; }
    .ws-footer__grid { grid-template-columns: 1fr; }
    .ws-panel { padding: 22px; }
    .ws-hero__points { gap: 10px 16px; }
}

@media (max-width: 576px) {
    body.ws-body { font-size: 15px; }

    .ws-fab { inset-block-start: 14px; inset-inline-end: 14px; gap: 8px; }
    .ws-fab__cta { height: 46px; padding-inline: 20px; font-size: .9rem; }
    .ws-fab__icon { width: 46px; height: 46px; }
    .ws-menu__apps-title { font-size: 1.5rem; }
    .ws-menu__store-buttons { width: 100%; }
    .ws-menu__store-buttons .ws-store-btn { flex: 1 1 140px; }
    .ws-grid--2,
    .ws-grid--3,
    .ws-grid--4 { grid-template-columns: 1fr; }
    .ws-grid--auto { grid-template-columns: 1fr; }
    .ws-btn { width: 100%; }
    .ws-btn-row .ws-btn { width: 100%; }
    .ws-card__body,
    .ws-plan { padding: 22px 20px; }
    .ws-footer__bottom { justify-content: center; text-align: center; }
}

@media (prefers-reduced-motion: reduce) {
    * {
        animation-duration: .01ms !important;
        transition-duration: .01ms !important;
        scroll-behavior: auto !important;
    }
}
