/* ========================================================================== FitMe 3070 — Bootstrap 4 Override Stylesheet Base: Bootstrap 4.3.1 (vendor/bootstrap/) Palette: Neon Moss (#C2D500) accent over a Void Black (#0B0B0D) → Charcoal Slate (#3D403E) dark ramp, with Ash Silver (#B8B9BE) + Arctic White (#F7F8FA) for light/secondary. Treat the green as a spotlight (~10%). ========================================================================== */ /* ── Design Tokens ───────────────────────────────────────────────────────────── Brand palette — "Neon Moss" on a Void-Black → Charcoal-Slate dark ramp, with an Ash-Silver / Arctic-White light toolkit. Darks carry a cool, greenish- neutral undertone so they sit flush with the vibrant green. */ :root { /* The Hero — Neon Moss. Spotlight only (≈10%): CTAs, active states, accents. */ --fitme-accent: #C2D500; --fitme-accent-rgb: 194, 213, 0; --fitme-accent-dark: #A6B600; /* deeper moss for hover / active */ /* The Anchor — Void Black, and a cool ramp lifting toward Charcoal Slate. */ --fitme-dark: #0B0B0D; /* Void Black — primary dark canvas */ --fitme-dark-2: #16181A; /* lifted void (sections / overlays) */ --fitme-dark-3: #26292A; /* structural dark (frames, pills) */ --fitme-mid: #3D403E; /* Charcoal Slate — cards / structure */ --fitme-slate: #3D403E; /* Charcoal Slate (alias) */ --fitme-dark-rgb: 11, 11, 13; /* Ash Silver — secondary text, borders, inactive UI on dark backgrounds. */ --fitme-ash: #B8B9BE; --fitme-ash-rgb: 184, 185, 190; /* Arctic White light toolkit (cool, crisp). */ --fitme-white: #ffffff; --fitme-surface: #F7F8FA; /* Arctic White — light section canvas */ --fitme-surface-2: #ECEEF2; --fitme-surface-dark: #DDE0E6; /* Text on light surfaces. */ --fitme-text: #0B0B0D; /* Void Black */ --fitme-text-soft: #3D403E; /* Charcoal Slate */ --fitme-text-muted: #6B6E73; /* readable muted gray */ --fitme-nav-bg: rgba(247, 248, 250, 0.68); --fitme-shadow: 0 2px 20px rgba(11, 11, 13, .07); --fitme-shadow-lg: 0 8px 40px rgba(11, 11, 13, .13); --fitme-radius: 2px; --fitme-transition: 0.25s ease; } /* ── Bootstrap 4 Overrides ─────────────────────────────────────────────────── */ /* Make Bootstrap rows use our gutters */ .row { margin-left: 0; margin-right: 0; } .container>.row { margin-left: -15px; margin-right: -15px; } /* Remove default outlines, use our focus ring */ input:focus, select:focus, button:focus, textarea:focus { outline: none; } a:hover, a:focus { text-decoration: none; outline: none; } ul, ol { padding: 0; margin: 0; } img { max-width: 100%; } /* ── Skip to content (accessibility) ───────────────────────────────────────── */ .skip-link { position: absolute; top: -100px; left: 16px; z-index: 9999; background: var(--fitme-accent); color: var(--fitme-dark); padding: 12px 20px; border-radius: var(--fitme-radius); font-weight: 700; font-size: .9rem; text-decoration: none; transition: top .2s; } .skip-link:focus { top: 8px; } /* ── Focus ring (accessibility) ────────────────────────────────────────────── */ :focus-visible { outline: 3px solid var(--fitme-accent) !important; outline-offset: 2px; } /* Reset for elements with their own focus styles */ .site-btn:focus-visible, .cta-btn:focus-visible { outline-color: var(--fitme-dark) !important; } /* ── Touch target minimum (WCAG 2.5.5) ─────────────────────────────────────── */ @media (pointer: coarse) { .nav-link, .footer-menu li a, .contact-info-warp a, .footer-widget a { min-height: 44px; display: inline-flex; align-items: center; } } /* ── Base & Typography ─────────────────────────────────────────────────────── */ html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: 'Roboto', 'PT Sans', -apple-system, BlinkMacSystemFont, sans-serif; font-size: 1rem; font-weight: 400; line-height: 1.6; color: var(--fitme-text); background: var(--fitme-white); overflow-x: hidden; } h1, h2, h3, h4, h5, h6 { margin: 0 0 .5em; color: var(--fitme-text); font-weight: 700; line-height: 1.15; text-transform: uppercase; letter-spacing: -.02em; } h1 { font-size: 4.375rem; } /* 70px */ h2 { font-size: 2.25rem; } /* 36px */ h3 { font-size: 1.875rem; } /* 30px */ h4 { font-size: 1.5rem; } /* 24px */ h5 { font-size: 1.125rem; } /* 18px */ h6 { font-size: 1rem; } p { font-size: 1rem; color: var(--fitme-text-soft); line-height: 1.8; margin-bottom: 1rem; } /* ── Utility Classes ───────────────────────────────────────────────────────── */ .float_right { float: right; } .section-title { margin-bottom: 1.5rem; } .section-title h2 { font-size: 2.5rem; line-height: 1.2; margin-bottom: .5rem; } .section-title h2 span { color: var(--fitme-accent); } .section-title p { color: var(--fitme-text-muted); } .set-bg { background-repeat: no-repeat; background-size: cover; background-position: center; } .text-white h1, .text-white h2, .text-white h3, .text-white h4, .text-white h5, .text-white h6, .text-white p, .text-white span, .text-white li, .text-white a { color: #fff; } /* Section anchor offset for sticky nav */ section[id] { scroll-margin-top: 72px; } /* ── Fade-in animation (used by preloader + hero) ──────────────────────────── */ .fade-in { animation: fitmeFadeIn .8s ease forwards; opacity: 0; } /* Reveal on scroll (IntersectionObserver) */ .revealed { animation: fitmeReveal .6s ease forwards; opacity: 0; } @keyframes fitmeFadeIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } @keyframes fitmeReveal { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } /* ── Buttons ───────────────────────────────────────────────────────────────── */ .site-btn { display: inline-block; border: none; font-size: 1rem; font-weight: 700; min-width: 200px; padding: 16px 36px; background: var(--fitme-accent); color: var(--fitme-dark); text-align: center; cursor: pointer; border-radius: var(--fitme-radius); transition: background var(--fitme-transition), transform var(--fitme-transition); text-transform: uppercase; letter-spacing: .5px; } .site-btn:hover { background: var(--fitme-accent-dark); color: var(--fitme-dark); transform: translateY(-1px); box-shadow: 0 4px 16px rgba(var(--fitme-accent-rgb), .35); } .site-btn.sb-dark { background: var(--fitme-dark-2); color: var(--fitme-accent); } .site-btn.sb-dark:hover { background: var(--fitme-dark-3); } .site-btn.sb-line { background: transparent; border: 2px solid var(--fitme-dark-2); color: var(--fitme-dark-2); padding: 14px 36px; } .site-btn.sb-line:hover { background: var(--fitme-dark-2); color: var(--fitme-accent); } /* ── Bootstrap Nav Overrides ───────────────────────────────────────────────── */ .nav-link { font-weight: 700; color: var(--fitme-text); margin: 0 .6rem !important; transition: color var(--fitme-transition); position: relative; } .nav-link:after { content: ''; position: absolute; bottom: -2px; left: 0; width: 0; height: 2px; background: var(--fitme-accent); transition: width var(--fitme-transition); } .nav-link:hover:after, .nav-item.active .nav-link:after { width: 100%; } .nav-link:hover, .nav-item.active .nav-link { color: var(--fitme-dark); background: transparent !important; } /* ── CrossFit nav pill ─────────────────────────────────────────────────────── */ .crossfit-nav-link { color: #b71c1c !important; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; border: 2px solid #b71c1c; border-radius: var(--fitme-radius); padding: 6px 14px !important; transition: all var(--fitme-transition); } .crossfit-nav-link:after { display: none; } /* Hover and current-page state: filled pill, white text (must outrank the generic .nav-item.active .nav-link transparent-background rule above) */ .crossfit-nav-link:hover, .nav-item.active .crossfit-nav-link { background: #b71c1c !important; color: #fff !important; } /* ── Sticky Navbar ─────────────────────────────────────────────────────────── */ .header-section { position: fixed; top: 0; width: 100%; z-index: 1000; -webkit-backdrop-filter: blur(14px) saturate(140%); backdrop-filter: blur(14px) saturate(140%); background: var(--fitme-nav-bg); border-bottom: 1px solid rgba(0, 0, 0, .04); } .site-logo { max-width: 150px; padding: 12px 0; } .header-right { float: right; padding: 0 !important; width: auto; } .header-right .hr-box { display: flex; align-items: center; gap: .5rem; padding: 0 1.2rem; height: 10vh; background: rgba(var(--fitme-accent-rgb), .12); color: var(--fitme-text); font-size: .85rem; border-radius: 0; transition: background var(--fitme-transition); } .header-right .hr-box:hover { background: rgba(var(--fitme-accent-rgb), .22); } .header-right .hr-box .icon { font-size: 1.5rem; color: var(--fitme-accent); } .header-right .hr-box h6 { margin: 0; font-size: .8rem; font-weight: 700; color: var(--fitme-text); overflow: hidden; } .header-right a { color: var(--fitme-text); } /* ── Hero ──────────────────────────────────────────────────────────────────── */ .hero-section { position: relative; min-height: 100vh; display: flex; align-items: center; justify-content: center; text-align: center; background-color: var(--fitme-dark); overflow: hidden; } /* Depth gradient — darkens top for nav readability, lifts mid-section */ .hero-section:before { content: ''; position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(0, 0, 0, 0.65) 0%, rgba(0, 0, 0, 0.40) 25%, rgba(0, 0, 0, 0.15) 50%, rgba(0, 0, 0, 0.30) 75%, rgba(0, 0, 0, 0.55) 100%); } /* Neon-Moss grounding accent at the base of the hero. One clean diagonal edge (no jagged peak) echoes the brand's straight-line language; the colour fades upward and stays low-opacity so the green reads as a spotlight, not a wash. */ .hero-section:after { content: ''; position: absolute; bottom: 0; left: 0; width: 100%; height: 72%; z-index: 1; pointer-events: none; background: /* soft glow grounding the base, slightly left of centre */ radial-gradient(62% 62% at 30% 104%, rgba(var(--fitme-accent-rgb), 0.22) 0%, transparent 70%), /* gentle upward fade so only the lower hero is tinted */ linear-gradient(180deg, transparent 46%, rgba(var(--fitme-accent-rgb), 0.13) 100%); /* single straight diagonal top edge, rising to the right */ clip-path: polygon(0 28%, 100% 0, 100% 100%, 0 100%); } .hero-section .container { z-index: 2; } .hero-text { padding-top: 60px; } .hero-text h1 { font-size: 3.8rem; font-weight: 900; color: #fff; text-shadow: 0 2px 40px rgba(0, 0, 0, .5); line-height: 1.05; letter-spacing: -.5px; } .hero-text h1 span { color: var(--fitme-accent); } .hero-brand { display: inline-block; font-size: .95rem; font-weight: 700; letter-spacing: .35em; text-transform: uppercase; color: var(--fitme-accent); margin-bottom: 1rem; padding-left: .35em; text-shadow: 0 2px 16px rgba(0, 0, 0, .5); } .hero-text .site-btn { margin-top: 2.5rem; } .hero-text .hero-tagline { color: #fff; font-size: 1.3rem; font-weight: 500; max-width: 600px; margin: 1.25rem auto 0; text-shadow: 0 2px 24px rgba(0, 0, 0, .6); } .hero-cta-row { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin-top: 2.5rem; } .hero-cta-row .site-btn { margin-top: 0; } .site-btn.sb-ghost { background: transparent; border: 2px solid #fff; color: #fff; padding: 14px 36px; } .site-btn.sb-ghost:hover { background: #fff; color: var(--fitme-dark); box-shadow: none; } /* ── CSS performance: skip rendering off-screen sections ──────────────────── */ .trainers-section, .service-section, .schedule-section, .workhours-section, .map-section, .classes-section { content-visibility: auto; contain-intrinsic-size: 500px; } /* ── Section backgrounds (alternating) ─────────────────────────────────────── */ .feature-section { background: var(--fitme-white); } .trainers-section { background: var(--fitme-dark); position: relative; } .trainers-section:before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, var(--fitme-accent), transparent); opacity: .35; } .service-section { background: var(--fitme-white); } .schedule-section { background: var(--fitme-surface); position: relative; } .schedule-section:before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, var(--fitme-accent), transparent); opacity: .35; } .contact-section { background: var(--fitme-dark-2); } .workhours-section { background: var(--fitme-white); } .map-section { background: var(--fitme-surface); position: relative; } .map-section:before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: linear-gradient(90deg, transparent, var(--fitme-accent), transparent); opacity: .35; } /* ── Center orphans in flex grids ──────────────────────────────────────────── */ .row.auto-grid { display: flex; flex-wrap: wrap; justify-content: center; } .row.auto-grid>[class*="col-"] { flex: 0 0 auto; } .row.auto-grid>.col-6 { width: calc(50% - .75rem); } @media (min-width: 768px) { .row.auto-grid>.col-md-4 { width: calc(33.333% - 1rem); } } @media (min-width: 992px) { .row.auto-grid>.col-lg-3 { width: calc(25% - 1rem); } } /* ── Feature / Offer section ───────────────────────────────────────────────── */ .feature-section { padding: 100px 0 60px; } .icon-box-item { text-align: center; margin-bottom: 3rem; } .icon-box-item .ib-icon { width: 72px; height: 72px; border-radius: var(--fitme-radius); display: flex; align-items: center; justify-content: center; background: var(--fitme-surface); margin: 0 auto 1.5rem; font-size: 2.5rem; color: var(--fitme-accent); transition: all var(--fitme-transition); } .icon-box-item .ib-icon img { max-width: 44px; max-height: 44px; mix-blend-mode: multiply; } .icon-box-item h4 { margin-bottom: .75rem; font-size: 1.15rem; } .icon-box-item p { font-size: .9rem; color: var(--fitme-text-muted); } .icon-box-item:hover .ib-icon { background: var(--fitme-accent); transform: scale(1.06); } .icon-box-item { transition: transform var(--fitme-transition); } .icon-box-item:hover { transform: translateY(-3px); } .icon-box-item .ib-icon img { transition: filter var(--fitme-transition); } .icon-box-item:hover .ib-icon img { filter: brightness(0) invert(0); /* darken icon on accent bg */ } /* ── Trainers / Team ───────────────────────────────────────────────────────── */ .trainers-section { padding: 100px 0 60px; } /* Homepage: sit the team section right under the gallery (no big gap) */ #equipa.trainers-section { padding-top: 48px; } .trainers-section>h2 { margin-bottom: 3rem; } .trainer-item { text-align: center; padding: 0 5px; margin-bottom: 2.5rem; } .trainer-item .trainer-pic { width: 200px; height: 200px; border-radius: var(--fitme-radius); margin: 0 auto 1.5rem; overflow: hidden; position: relative; border: 4px solid var(--fitme-accent); box-shadow: var(--fitme-shadow-lg); transform: rotate(-3deg); /* Springy curve so the square "snaps" upright + lifts on hover */ transition: transform .4s cubic-bezier(.34, 1.56, .64, 1), box-shadow var(--fitme-transition); } /* CSS overlay replaces the old small_overlay_white.svg — one less HTTP request */ .trainer-item .trainer-pic:after { content: ''; position: absolute; inset: 0; border-radius: var(--fitme-radius); background: radial-gradient(ellipse at 30% 20%, rgba(255, 255, 255, 0.25) 0%, transparent 50%), radial-gradient(ellipse at 70% 80%, rgba(255, 255, 255, 0.08) 0%, transparent 45%), linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, transparent 40%, rgba(0, 0, 0, 0.1) 100%); pointer-events: none; z-index: 1; } .trainer-item .trainer-pic:hover { transform: rotate(0deg) translateY(-8px) scale(1.05); box-shadow: 0 18px 44px rgba(0, 0, 0, .22); } /* Alternate the tilt direction across the grid for a livelier team wall; #powerRotation wraps the homepage team cards (the col-* siblings). */ #powerRotation>div:nth-child(even) .trainer-pic { transform: rotate(3deg); } #powerRotation>div:nth-child(even) .trainer-pic:hover { transform: rotate(0deg) translateY(-8px) scale(1.05); } .trainer-item .trainer-pic:hover:after { background: radial-gradient(ellipse at 30% 20%, rgba(255, 255, 255, 0.32) 0%, transparent 50%), radial-gradient(ellipse at 70% 80%, rgba(255, 255, 255, 0.10) 0%, transparent 45%), linear-gradient(135deg, rgba(255, 255, 255, 0.18) 0%, transparent 40%, rgba(0, 0, 0, 0.08) 100%); } .trainer-item .trainer-pic img { width: 100%; height: 100%; object-fit: cover; position: relative; z-index: 0; background: var(--fitme-surface-2); } /* Graceful fallback when image src is empty or 404 */ .trainer-item .trainer-pic img[src=""]:after, .trainer-item .trainer-pic img:not([src]), .trainer-item .trainer-pic img[src=""] { /* Hide broken image icon — parent .trainer-pic already has :after overlay */ visibility: hidden; } .trainer-item h4 { margin-bottom: .3rem; } .trainer-item>*:last-child { font-size: .9rem; color: var(--fitme-text-muted); } /* Team runs on the dark (Void Black) canvas: light text so names read and the accent photo frames pop — the photos' own dark backgrounds now blend in. */ .trainers-section { color: var(--fitme-ash); } .trainers-section .section-title h2, .trainers-section .trainer-item h4, .trainers-section .trainer-item>*:last-child { color: #fff; } .trainers-section .section-subtitle { color: var(--fitme-ash); } /* ── Classes / Modalidades ─────────────────────────────────────────────────── */ .service-section { padding: 100px 0 60px; } .service-section>.container>.row:first-child { margin-bottom: 2rem; } /* ── Schedule / Horário ────────────────────────────────────────────────────── */ .schedule_container { margin-top: 2rem; /* Scroll sideways rather than crush columns on narrow desktops/tablets. */ overflow-x: auto; } /* Time-aligned weekly grid: columns are days, rows are start times. Each cell is placed by inline `grid-column` (day) + `grid-row` (time) from the PHP, so every class lines up on the row of its start time across the whole week. */ .schedule_panel { margin-top: 1rem; display: grid; grid-template-columns: repeat(var(--sched-days, 6), minmax(150px, 1fr)); /* Explicit rows (day header + Manhã/Tarde dividers + one per start time) so the day stripes can span the whole grid with grid-row: 1 / -1. */ grid-template-rows: repeat(var(--sched-rows, 14), auto); align-items: start; /* cells hug the top of their time row */ column-gap: 14px; row-gap: 14px; min-width: 760px; /* keep columns legible; the container scrolls if narrower */ } /* Per-day vertical band, painted behind the cards (emitted first in the DOM) so each weekday column reads as its own stripe. A faint wash of the brand accent green; alternating columns get a deeper tint and the light column gaps act as the separators between them. */ .schedule_stripe { align-self: stretch; /* fill every row (panel sets align-items:start) */ grid-row: 1 / -1; border-radius: 8px; background: rgba(var(--fitme-accent-rgb), .06); pointer-events: none; } .schedule_stripe.is-alt { background: rgba(var(--fitme-accent-rgb), .13); } /* Manhã / Tarde divider spanning the whole week above each block of times. */ .schedule_section_label { grid-column: 1 / -1; display: flex; align-items: center; justify-content: center; gap: 1rem; margin: .35rem 0 .1rem; text-align: center; } .schedule_section_label span { font-weight: 800; text-transform: uppercase; letter-spacing: .18em; font-size: .8rem; color: var(--fitme-text-muted); } .schedule_section_label::before, .schedule_section_label::after { content: ''; flex: 1 1 0; height: 2px; border-radius: 2px; background: rgba(var(--fitme-accent-rgb), .5); } /* Day header (grid row 1). Class cards carry their own time label, so the grid needs no separate time gutter — rows align purely by placement. */ .schedule_dayhead { display: flex; justify-content: center; align-items: flex-start; margin-bottom: .25rem; } /* One (day, time) slot. Concurrent classes (same day + time, different rooms) sit SIDE BY SIDE so the overlap reads at a glance; a lone class fills the column. They share the column width equally and shrink to fit. */ .schedule_cell { display: flex; flex-direction: row; align-items: stretch; gap: 8px; min-width: 0; } .schedule_cell > .schedule_box { flex: 1 1 0; min-width: 0; /* allow equal shrink instead of overflowing the column */ } .rounded_frame { background: var(--fitme-dark-3); color: #fff; border-radius: var(--fitme-radius); height: 40px; width: 140px; display: flex; align-items: center; justify-content: center; font-size: 1.1rem; font-weight: 700; } .rounded_frame_grey { margin: auto; text-align: center; background: var(--fitme-surface-2); border-radius: var(--fitme-radius); height: 44px; width: 210px; display: flex; align-items: center; justify-content: center; } .rounded_frame_grey p { margin: 0; line-height: 1; display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; } .rounded_frame_medium { margin: auto; text-align: center; background: var(--fitme-dark-3); border-radius: var(--fitme-radius); height: 42px; width: 250px; display: flex; align-items: center; justify-content: center; } .schedule_frame { min-width: 230px; font-size: 1.1rem; font-weight: 700; color: #fff !important; text-decoration: none; } .schedule_box { display: flex; flex-direction: column; justify-content: flex-start; align-items: center; width: 100%; padding: 8px 4px; border-radius: var(--fitme-radius); text-align: center; transition: transform var(--fitme-transition), box-shadow var(--fitme-transition); } /* Reserve up to two lines for the class name so 1- and 2-line names produce the same card height. */ .schedule_box a { display: flex; align-items: center; justify-content: center; min-height: 2.5em; line-height: 1.15; text-align: center; } .schedule_box a { font-size: 11px; color: #fff; } /* Fixed-height logo slot so every card's icon lines up regardless of the source image's aspect ratio. */ .schedule_box img { height: 30px; width: auto; max-width: 84%; object-fit: contain; margin-bottom: 4px; mix-blend-mode: multiply; filter: brightness(1.3) contrast(1.1); } .schedule_box>div:first-of-type { font-size: 16px; color: #fff; } .schedule_box>div:last-of-type { font-size: 13px; color: rgba(255, 255, 255, .85); } .schedule_box { transition: transform .2s ease, box-shadow .2s ease, filter .2s ease; } .schedule_box:hover { transform: scale(1.08); z-index: 100; box-shadow: 0 8px 32px rgba(0, 0, 0, .22); filter: brightness(1.1); } .schedule_info { /* Full-bleed footer band the full width of the card. The box is a centered flex column, so the strip must align-self:stretch (otherwise it shrinks to its text); negative margins then cancel the .schedule_box padding (8px top/bottom, 4px sides) so it reaches the card edges. The time sits on its own line with the classroom stacked beneath it — consistent at every card width (no side-by-side / wrapping differences between wide and narrow). */ align-self: stretch; width: auto; margin: auto -4px -8px; /* margin-top:auto pins the strip to the card foot */ padding: 6px 8px; background: rgba(0, 0, 0, .25); border-radius: 0 0 var(--fitme-radius) var(--fitme-radius); display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; min-height: 2.6em; /* same strip height whether or not a room is set */ line-height: 1.25; font-weight: 700; /* time — the primary line */ } /* Classroom — the secondary line under the time. */ .schedule_info b { font-weight: 500; font-size: .88em; opacity: .9; } /* Some classes have no room set (); don't reserve a blank second line. */ .schedule_info b:empty { display: none; } /* ── Contact section ───────────────────────────────────────────────────────── */ .contact-section { padding: 100px 0 80px; color: var(--fitme-ash); position: relative; overflow: hidden; background-color: var(--fitme-dark-2); } /* Strong overlay to keep text readable over the background image */ .contact-section:before { content: ''; position: absolute; inset: 0; z-index: 0; background: linear-gradient(180deg, rgba(10, 10, 10, 0.88) 0%, rgba(10, 10, 10, 0.78) 40%, rgba(10, 10, 10, 0.82) 100%); } .contact-section .container { z-index: 1; position: relative; } .contact-section h1, .contact-section h2, .contact-section h3, .contact-section h4, .contact-section h5, .contact-section h6 { color: #fff; } .contact-title { margin-bottom: 2.5rem; } .contact-info-warp { margin-bottom: 2rem; } .contact-info-warp h4 { color: var(--fitme-accent); margin-bottom: .5rem; font-size: 1rem; } .contact-info .fas, .contact-info .fab { float: left; margin-right: 12px; padding-top: 4px; font-size: 1.2rem; color: var(--fitme-accent); } .contact-info .cf-text { overflow: hidden; } .contact-info .cf-text p { color: rgba(255, 255, 255, .7); line-height: 1.8; margin: 0; } .contact-info-warp a { color: rgba(255, 255, 255, .7); } .contact-info-warp a:hover { color: var(--fitme-accent); } .contact-form input[type=text], .contact-form input[type=email], .contact-form textarea { width: 100%; padding: 14px 20px; border: 1px solid rgba(255, 255, 255, .1); background: rgba(255, 255, 255, .06); color: #fff; font-size: .95rem; border-radius: var(--fitme-radius); margin-bottom: 16px; transition: border-color var(--fitme-transition), background var(--fitme-transition); } .contact-form input::placeholder, .contact-form textarea::placeholder { color: rgba(255, 255, 255, .35); } .contact-form input:focus, .contact-form textarea:focus { border-color: var(--fitme-accent); background: rgba(255, 255, 255, .1); } .contact-form textarea { resize: vertical; min-height: 150px; } .contact-form .site-btn { float: right; } /* The Nome/Telemóvel row sits in Bootstrap columns (15px padding); cancel that with negative margins so those inputs line up flush with the full-width Razão and Mensagem fields below them. */ .contact-form .row { margin-left: -15px; margin-right: -15px; } @media (min-width: 992px) { /* Natural column heights — the textarea is stretched by JS to meet the map's bottom (see main.js), and the consent + submit button follow just below. */ #contactos > .container > .row { align-items: flex-start; } } /* ── Newsletter ────────────────────────────────────────────────────────────── */ .newsletter-section { padding: 80px 0; background-color: var(--fitme-dark-3); /* not shorthand → keeps .set-bg cover */ position: relative; overflow: hidden; } .newsletter-section:before { content: ''; position: absolute; inset: 0; z-index: 0; background: linear-gradient(180deg, rgba(31, 31, 31, 0.92) 0%, rgba(31, 31, 31, 0.85) 50%, rgba(31, 31, 31, 0.92) 100%); } .newsletter-section .container { z-index: 1; position: relative; } .newsletter-section .section-title { padding-top: .5rem; } .newsletter-form { margin-left: -55px; } .newsletter-form input { width: calc(100% - 210px); height: 58px; padding: 10px 28px; float: left; border: none; border-radius: var(--fitme-radius) 0 0 var(--fitme-radius); font-size: .95rem; } .newsletter-form .site-btn { min-width: 180px; border-radius: 0 var(--fitme-radius) var(--fitme-radius) 0; height: 58px; padding: 0 28px; } /* ── Map ───────────────────────────────────────────────────────────────────── */ .map { position: relative; height: 480px; background: var(--fitme-surface-dark); border-radius: var(--fitme-radius); overflow: hidden; } /* Compact map shown in the contacts info column (beside the form). */ .map-side { height: 220px; margin-top: 1.5rem; } .map iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; } /* ── Footer ────────────────────────────────────────────────────────────────── */ .footer-section { padding: 60px 0 30px; background-color: var(--fitme-dark); /* not shorthand → keeps .set-bg cover */ color: rgba(255, 255, 255, .6); position: relative; overflow: hidden; } .footer-section:before { content: ''; position: absolute; inset: 0; z-index: 0; background: linear-gradient(180deg, rgba(10, 10, 10, 0.94) 0%, rgba(10, 10, 10, 0.88) 50%, rgba(10, 10, 10, 0.94) 100%); } .footer-section .container { z-index: 1; position: relative; } .footer-widget { margin-bottom: 2.5rem; } .footer-widget h4 { color: #fff; margin-bottom: 1.2rem; font-size: 1rem; } .footer-widget .fw-info-box { display: flex; align-items: flex-start; gap: .8rem; margin-bottom: .75rem; } .footer-widget .fw-info-box .fas { color: var(--fitme-accent); font-size: 1.1rem; margin-top: 3px; } .footer-widget .fw-info-box p { color: rgba(255, 255, 255, .55); line-height: 1.7; margin: 0; font-size: .88rem; } .footer-widget a { color: rgba(255, 255, 255, .55); } .footer-widget a:hover { color: var(--fitme-accent); } .footer-widget .social-links { display: flex; gap: .5rem; } .footer-widget .social-links a { font-size: 1.4rem; color: rgba(255, 255, 255, .45); transition: color var(--fitme-transition), transform var(--fitme-transition); } .footer-widget .social-links a:hover { color: var(--fitme-accent); transform: translateY(-2px); } /* Slimmed, centred footer: social row, site menu, legal links. */ .footer-social { display: flex; justify-content: center; gap: .9rem; font-size: 1.6rem; margin-bottom: 1.5rem; } .footer-social a { color: rgba(255, 255, 255, .6); transition: color var(--fitme-transition), transform var(--fitme-transition); } .footer-social a:hover { color: var(--fitme-accent); transform: translateY(-2px); } .footer-menu { list-style: none; text-align: center; padding-top: 0; margin: 0 0 1rem; } .footer-menu li { display: inline-block; } .footer-menu li a { color: rgba(255, 255, 255, .6); font-size: .82rem; font-weight: 700; padding: 5px 10px; margin: 0 .35rem; transition: color var(--fitme-transition); } .footer-menu li a:hover { color: var(--fitme-accent); } .footer-legal { color: rgba(255, 255, 255, .5); margin: .25rem 0; } .footer-legal a { color: rgba(255, 255, 255, .7); } .footer-legal a:hover { color: var(--fitme-accent); } /* Discreet backoffice link — faint until hovered. */ .footer-legal-sep { color: rgba(255, 255, 255, .25); margin: 0 .35rem; } .footer-admin-link { opacity: .35; transition: opacity .2s ease; } .footer-admin-link:hover { opacity: 1; } /* ── Page-top header (CrossFit page) ───────────────────────────────────────── */ .page-top-section { height: 340px; text-align: center; padding-top: 140px; position: relative; overflow: hidden; background-color: var(--fitme-dark); } /* Depth gradient overlay */ .page-top-section:before { content: ''; position: absolute; inset: 0; z-index: 0; background: linear-gradient(180deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.30) 50%, rgba(0, 0, 0, 0.50) 100%); } .page-top-section .container { z-index: 2; position: relative; } .page-top-section h1 { display: inline-block; position: relative; font-size: 4rem; color: #fff; padding-bottom: 16px; text-shadow: 0 2px 30px rgba(0, 0, 0, .7); } .page-top-section h1:after { position: absolute; content: ""; width: 100%; height: 5px; bottom: 0; left: 0; background: var(--fitme-accent); } /* ── CrossFit video header ─────────────────────────────────────────────────── */ .video { position: relative; background: #000; height: 75vh; min-height: 20rem; width: 100%; overflow: hidden; } .video video { position: absolute; top: 50%; left: 50%; min-width: 100%; min-height: 100%; width: auto; height: auto; z-index: 0; transform: translate(-50%, -50%); } .video .container { position: relative; z-index: 2; } .video .overlay { position: absolute; inset: 0; z-index: 1; background: linear-gradient(180deg, rgba(0, 0, 0, 0.45) 0%, rgba(0, 0, 0, 0.25) 35%, rgba(0, 0, 0, 0.35) 65%, rgba(0, 0, 0, 0.60) 100%); } @media (pointer: coarse) and (hover: none) { .video { background: url('../img/crossfit.jpg') #000 center/cover no-repeat; } .video video { display: none; } } /* ── Classes / CrossFit section ────────────────────────────────────────────── */ .classes-section { padding: 80px 0; /* background-color (not the `background` shorthand) so a .set-bg image keeps the cover/no-repeat from .set-bg instead of tiling at natural size. */ background-color: var(--fitme-white); } .classes-section .section-title h2 span { color: var(--fitme-accent); } /* Variant with a background image (e.g. the CrossFit "O que é o CrossFit?" banner): dark gradient overlay for legible white text over the photo. */ .classes-section.has-bg { position: relative; background-color: var(--fitme-dark); } .classes-section.has-bg::before { content: ''; position: absolute; inset: 0; z-index: 0; background: linear-gradient(90deg, rgba(11,11,13,.82) 0%, rgba(11,11,13,.62) 55%, rgba(11,11,13,.40) 100%); } .classes-section.has-bg .container { position: relative; z-index: 1; } .classes-section.has-bg h2, .classes-section.has-bg .classes-text p { color: #fff; text-shadow: 0 2px 12px rgba(0,0,0,.5); } .classes-text p { color: var(--fitme-text-soft); margin-bottom: 2.5rem; } /* ── Gallery (Splide overrides) ────────────────────────────────────────────── */ .splide__slide { background-size: cover; } /* Brand the arrows + pagination (the sea-green theme ships them blue). Loaded after the Splide theme CSS, so plain selectors win — no !important needed. */ .splide__arrow { background: var(--fitme-accent); opacity: 1; width: 2.4em; height: 2.4em; border-radius: var(--fitme-radius); transition: background var(--fitme-transition), transform var(--fitme-transition); } .splide__arrow svg, .splide__arrow:hover svg, .splide__arrow:focus svg { fill: var(--fitme-dark); width: 1.1em; height: 1.1em; } .splide__arrow:hover { background: var(--fitme-accent-dark); } .splide__arrow:disabled { opacity: .35; } .splide__arrow--prev { left: 1em; } .splide__arrow--next { right: 1em; } .splide__pagination__page { background: var(--fitme-ash); opacity: .6; } .splide__pagination__page.is-active { background: var(--fitme-accent); opacity: 1; transform: scale(1.3); } /* ── 404 / Error pages ─────────────────────────────────────────────────────── */ .page-top-section h1:after { background: var(--fitme-accent); } /* ── Modal / Pop-up ────────────────────────────────────────────────────────── */ .modal-content { border: none; background: transparent !important; } /* ── Sticky mobile CTA bar ─────────────────────────────────────────────────── */ .mobile-cta-bar { display: none; position: fixed; bottom: 0; left: 0; right: 0; z-index: 999; background: rgba(10, 10, 10, 0.94); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); padding: 8px 12px; gap: 10px; border-top: 1px solid rgba(255, 255, 255, 0.08); } .mobile-cta-bar .cta-btn { flex: 1; text-align: center; padding: 12px 8px; border-radius: var(--fitme-radius); font-weight: 700; font-size: .9rem; text-decoration: none; display: flex; align-items: center; justify-content: center; gap: 6px; transition: background var(--fitme-transition); } .mobile-cta-bar .cta-btn-call { background: transparent; color: #fff; border: 1px solid rgba(255, 255, 255, 0.25); } .mobile-cta-bar .cta-btn-call:active { background: rgba(255, 255, 255, 0.1); } .mobile-cta-bar .cta-btn-cta { background: var(--fitme-accent); color: var(--fitme-dark); } .mobile-cta-bar .cta-btn-cta:active { background: var(--fitme-accent-dark); } /* ── Back to top button ────────────────────────────────────────────────────── */ .back-to-top { position: fixed; bottom: 80px; right: 16px; z-index: 998; width: 44px; height: 44px; border-radius: 50%; background: var(--fitme-accent); color: var(--fitme-dark); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 1.2rem; font-weight: 700; opacity: 0; visibility: hidden; transform: translateY(8px); transition: opacity .25s, visibility .25s, transform .25s; box-shadow: 0 2px 12px rgba(0, 0, 0, .25); } .back-to-top.visible { opacity: 1; visibility: visible; transform: translateY(0); } .back-to-top:active { transform: scale(0.95); } /* ── Consent checkbox (RGPD, contact + newsletter forms on dark sections) ──── */ .consent-check { display: flex; gap: 8px; align-items: flex-start; clear: both; padding-top: 12px; font-size: .8rem; line-height: 1.5; font-weight: 400; color: rgba(255, 255, 255, .75); cursor: pointer; } .consent-check input[type=checkbox] { width: 16px; height: 16px; margin-top: 2px; flex-shrink: 0; accent-color: var(--fitme-accent); cursor: pointer; } .consent-check a { color: #fff; text-decoration: underline; } .consent-check a:hover { color: var(--fitme-accent); } /* ── WhatsApp floating button ──────────────────────────────────────────────── */ .whatsapp-float { position: fixed; bottom: 20px; right: 16px; z-index: 998; width: 48px; height: 48px; border-radius: 50%; background: #25d366; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; box-shadow: 0 2px 12px rgba(0, 0, 0, .25); } .whatsapp-float:hover, .whatsapp-float:focus { background: #1ebe5d; color: #fff; text-decoration: none; } /* ── Mobile schedule: horizontal scroll ────────────────────────────────────── */ .schedule-scroll-hint { display: none; text-align: center; font-size: .75rem; color: var(--fitme-text-muted); margin-top: .5rem; } /* ========================================================================== RESPONSIVE ========================================================================== */ /* ── ≥ 1200px ──────────────────────────────────────────────────────────────── */ @media (min-width: 1200px) { .container { max-width: 1176px; } } /* ── 992px–1199px ──────────────────────────────────────────────────────────── */ @media only screen and (min-width: 992px) and (max-width: 1199px) { .hero-text h1 { font-size: 3.2rem; } .header-right .hr-box { display: none !important; } .newsletter-form { margin-left: 0; } } /* ── 768px–991px ───────────────────────────────────────────────────────────── */ @media only screen and (min-width: 768px) and (max-width: 991px) { .hero-text h1 { font-size: 2.7rem; } .header-right .hr-box { display: none; } .section-title h2 { font-size: 2rem; } /* Schedule keeps the time-aligned grid here; .schedule_container scrolls it sideways when six columns don't fit. */ .newsletter-section { text-align: center; } .newsletter-form { margin-top: 2rem; margin-left: 0; } .newsletter-form input { width: 100%; margin-bottom: 1rem; border-radius: var(--fitme-radius); } .newsletter-form .site-btn { border-radius: var(--fitme-radius); width: 100%; } .footer-menu { text-align: center; } .footer-menu li a { margin-left: .5rem; } .contact-form .site-btn { float: none; width: 100%; } .navbar-collapse { background: #fff; padding: 1rem; } .nav-link { text-align: center; } .navbar-toggler { margin-right: 1rem; } .trainer-item .trainer-pic { width: 150px; height: 150px; } .map { height: 320px; } } /* ── ≤ 767px ───────────────────────────────────────────────────────────────── */ @media only screen and (max-width: 767px) { /* Hero */ .hero-section { min-height: max(100svh, 500px); min-height: max(100vh, 500px); } .hero-text { padding-top: 120px; padding-bottom: 100px; } .hero-text h1 { font-size: 2.1rem; } .hero-brand { font-size: .8rem; letter-spacing: .28em; margin-bottom: .6rem; } .hero-text .site-btn { min-width: 180px; padding: 14px 28px; font-size: .95rem; } /* General */ .section-title h2 { font-size: 1.6rem; } html { scroll-padding-top: 60px; } /* Sticky mobile bar */ .mobile-cta-bar { display: flex; } /* The dark footer clears the fixed CTA bar itself, so there's no blank strip after it (the old body padding-bottom showed a white gap below the footer). */ .footer-section { padding-top: 44px; padding-bottom: 92px; } /* Glass bar on mobile too, just a touch more opaque for legibility. The open dropdown stays solid (.navbar-collapse below) so menu text never competes with the page content showing through the blur. */ .header-section { background: rgba(247, 248, 250, 0.85); } .site-logo { padding-left: 12px; max-width: 130px; } .header-right { display: none !important; } .navbar-collapse { background: #fff; padding: 1rem; } .navbar-toggler { margin-right: .75rem; } /* The single-day layout + day picker now apply at every width (see the "Schedule day filter" block); only small-screen card sizing lives here. */ .schedule:not(.schedule-export) .schedule_panel { max-width: none; /* use the full phone width */ } .schedule_box { padding: 8px 6px; gap: 3px; } .rounded_frame { margin: 0 auto .75rem; width: 130px; height: 36px; font-size: 1rem; } .schedule_box img { height: 26px; } .schedule_box a { font-size: 11px; } .schedule_box>div:first-of-type { font-size: 14px; } .schedule_box>div:last-of-type { font-size: 12px; } .schedule-scroll-hint { display: block; padding: 0 16px; } /* Work hours */ .rounded_frame_grey { width: 160px; } .rounded_frame_medium { width: 180px; } .schedule_frame { min-width: auto; font-size: .95rem; } /* Team grid */ .trainer-item .trainer-pic { width: 140px; height: 140px; } /* Gallery */ #primary-slider .splide__slide { height: 280px !important; } /* Contact form */ .contact-form input[type=text], .contact-form input[type=email], .contact-form textarea { font-size: 1rem; padding: 14px 16px; height: 50px; } .contact-form textarea { height: 130px; } .contact-form .site-btn { float: none; width: 100%; margin-top: .5rem; } .contact-form input:focus, .contact-form textarea:focus { box-shadow: 0 0 0 3px rgba(var(--fitme-accent-rgb), 0.35); outline: none; } /* Map */ .map { height: 220px; } .map-section { padding-bottom: 0 !important; } /* Newsletter */ .newsletter-section { text-align: center; } .newsletter-form { margin-top: 2rem; margin-left: 0; } .newsletter-form input { width: 100%; margin-bottom: .75rem; border-radius: var(--fitme-radius); height: 50px; font-size: 1rem; } .newsletter-form .site-btn { border-radius: var(--fitme-radius); width: 100%; height: 50px; } /* Footer */ .footer-menu { text-align: center; } .footer-menu li a { margin-left: .3rem; font-size: .75rem; padding: 8px 6px; } /* Floating buttons: stack above the sticky CTA bar */ .whatsapp-float { bottom: 80px; } .back-to-top { bottom: 140px; } /* CrossFit page */ .page-top-section h1 { font-size: 2.5rem; } } /* ── ≤ 479px ───────────────────────────────────────────────────────────────── */ @media only screen and (max-width: 479px) { .hero-text h1 { font-size: 1.75rem; } .hero-text { padding-top: 100px; padding-bottom: 80px; } .section-title h2 { font-size: 1.4rem; } .trainer-item .trainer-pic { width: 120px; height: 120px; } .site-btn { min-width: 150px; padding: 13px 22px; font-size: .88rem; } /* Contact: stack name + phone */ .contact-form .col-md-6 { width: 100%; } /* Offer + modalidades: compact icons */ .icon-box-item .ib-icon { width: 56px; height: 56px; } .icon-box-item .ib-icon img { max-width: 34px; max-height: 34px; } .icon-box-item h4 { font-size: .95rem; } .rounded_frame { width: 100px; height: 30px; font-size: .85rem; } } /* ── Reduced motion ────────────────────────────────────────────────────────── */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } .fade-in { animation: none; opacity: 1; } *, *:before, *:after { animation-duration: .01ms !important; transition-duration: .01ms !important; } /* Exempt the modalidades marquee: the .01ms nuke turns its infinite loop into a strobing blur (reduced-motion is on by default over Remote Desktop and with Windows "animation effects" off). Keep its gentle glide instead; JS re-asserts the measured duration inline with !important. */ .mod-track { animation-duration: 220s !important; } } /* ── Decorated section title (eyebrow + accent underline + subtitle) ────────── */ /* Reusable heading style — add `.deco` to a `.section-title` and optionally an `.section-eyebrow` above the h2 and an `.section-subtitle` below it. */ .section-eyebrow { display: inline-block; font-size: .8rem; font-weight: 700; letter-spacing: .2em; text-transform: uppercase; color: var(--fitme-accent); margin-bottom: .5rem; } .section-title.deco h2 { position: relative; display: inline-block; padding-bottom: .7rem; } .section-title.deco h2:after { content: ''; position: absolute; left: 50%; bottom: 0; transform: translateX(-50%); width: 64px; height: 3px; border-radius: 2px; background: var(--fitme-accent); } .section-subtitle { color: var(--fitme-text-muted); margin-top: .9rem; margin-bottom: 0; font-size: 1rem; } /* ── Modalidades: tap card to reveal its description ───────────────────────── */ /* No separate icon — the whole card (icon + name) is the trigger. The description reveals as a clean panel laid over the card footprint, so the grid never reflows. Click-only (no hover), per request. */ .mod-card { position: relative; } .mod-card.has-info { cursor: pointer; outline: none; } .mod-card.has-info .ib-icon, .mod-card.has-info h4 { transition: opacity var(--fitme-transition); } .mod-card.has-info:hover h4 { color: var(--fitme-accent-dark); } .mod-card.has-info:focus-visible { box-shadow: 0 0 0 3px rgba(var(--fitme-accent-rgb), .35); border-radius: var(--fitme-radius); } /* Subtle "tap for more" affordance under the name */ .mod-card.has-info h4:after { content: 'Saber mais'; display: block; margin-top: .35rem; font-size: .68rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: var(--fitme-accent-dark); opacity: .85; } .mod-tooltip { position: absolute; inset: -10px -6px auto -6px; z-index: 6; min-height: calc(100% + 20px); display: flex; align-items: center; justify-content: center; background: #fff; color: var(--fitme-text-soft); border: 1px solid var(--fitme-surface-2); border-top: 3px solid var(--fitme-accent); border-radius: var(--fitme-radius); box-shadow: var(--fitme-shadow-lg); padding: 1rem 1.1rem; font-size: .85rem; line-height: 1.5; text-align: center; opacity: 0; visibility: hidden; transform: scale(.96); transition: opacity var(--fitme-transition), transform var(--fitme-transition); } .mod-tooltip span { display: block; } .mod-card.is-open .mod-tooltip { opacity: 1; visibility: visible; transform: scale(1); } .mod-card.is-open .ib-icon, .mod-card.is-open h4 { opacity: 0; } /* Full-width auto-scrolling modalidade marquee */ .mod-scroll { overflow: hidden; padding: 8px 0 10px; } .mod-track { display: flex; width: max-content; animation: modMarquee 220s linear infinite; /* slow fallback; JS tunes it to ~18px/s */ will-change: transform; } /* Pause while hovering, focusing inside, or reading an open card */ .mod-scroll:hover .mod-track, .mod-scroll:focus-within .mod-track, .mod-scroll.is-paused .mod-track { animation-play-state: paused; } /* Trailing margin (not flex gap) keeps every copy the same width, so a translateX(-50%) of the duplicated track loops perfectly seamlessly. */ .mod-scroll .mod-card { flex: 0 0 auto; width: 180px; min-height: 200px; margin: 0 1rem 0 0; } @keyframes modMarquee { from { transform: translateX(0); } to { transform: translateX(-50%); } } /* Keep the reveal panel inside the card footprint so it isn't clipped by the scroller's overflow (which can't be visible on one axis only). Top-align + scroll so long descriptions don't get their first lines hidden by vertical centering (you can't scroll back above a centered overflowing flex item). */ .mod-scroll .mod-tooltip { inset: 0; min-height: 0; overflow-y: auto; align-items: flex-start; } /* ── Horário "save as JPG" button + capture-clone export board ─────────────── */ .schedule-dl-btn { display: inline-flex; align-items: center; gap: 8px; border: none; cursor: pointer; background: var(--fitme-accent); color: var(--fitme-dark); font-weight: 700; font-size: .85rem; letter-spacing: .3px; padding: 10px 18px; border-radius: var(--fitme-radius); transition: background var(--fitme-transition), transform var(--fitme-transition); } .schedule-dl-btn:hover { background: var(--fitme-accent-dark); transform: translateY(-1px); } .schedule-dl-btn:disabled { opacity: .6; cursor: default; transform: none; } /* Applied (via html2canvas onclone) to the schedule clone inside the capture iframe — never visible on the live page. */ .schedule-export { width: 1920px; padding: 48px 40px 32px; box-sizing: border-box; background: var(--fitme-surface); } /* html2canvas snapshots the page inside a hidden iframe where the .fade-in / .revealed entry animations restart from their opacity:0 keyframe — freeze every node at its final visible state or the JPG exports blank white. */ .schedule-export, .schedule-export * { animation: none !important; transition: none !important; opacity: 1 !important; } .schedule-stamp { text-align: center; margin: 22px 0 0; font-size: .9rem; font-weight: 700; letter-spacing: .3px; color: var(--fitme-text-soft); } /* Force the full desktop time-grid inside the export board, independent of the real viewport's media queries (otherwise a phone renders the clone with the mobile single-column layout → a tall, mostly-empty image). */ .schedule-export .container { max-width: none !important; width: 100% !important; } .schedule-export .schedule-day-filter, .schedule-export .schedule-scroll-hint { display: none !important; } .schedule-export .schedule_container { overflow: visible !important; } .schedule-export .schedule_panel { display: grid !important; grid-template-columns: repeat(var(--sched-days, 6), minmax(0, 1fr)) !important; align-items: start !important; column-gap: 14px !important; row-gap: 14px !important; min-width: 0 !important; margin: 0 !important; padding: 0 !important; -webkit-mask-image: none !important; mask-image: none !important; } /* Cells keep their inline grid-row/grid-column placement: the capture iframe is 1920px wide so the ≤767px single-column override never applies, and inline styles outrank these stylesheet rules anyway. */ .schedule-export .schedule_box { display: flex !important; flex-direction: column !important; align-items: center !important; } /* ── Schedule day filter — one day on screen, picker bar to switch ───────────── On screen the schedule shows a single day with a clickable day-picker bar (the same behaviour the phone had, now at every width). The JPG export ignores all of this — it re-enables the full-week grid via .schedule-export — so the downloaded image is always the complete week. */ .schedule-day-filter { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; margin: 0 0 1.75rem; } .sdf-btn { border: 1px solid var(--fitme-surface-2); background: #fff; color: var(--fitme-text-soft); font-weight: 700; font-size: .9rem; padding: 9px 20px; border-radius: var(--fitme-radius); cursor: pointer; transition: all var(--fitme-transition); } .sdf-btn:hover { border-color: var(--fitme-accent); color: var(--fitme-text); } .sdf-btn.active { background: var(--fitme-accent); border-color: var(--fitme-accent); color: var(--fitme-dark); } /* On-screen single-day layout — one centred column showing the chosen day's classes in time order, keeping the Manhã / Tarde dividers as section breaks. Scoped to :not(.schedule-export) so the capture clone keeps the full week. */ .schedule:not(.schedule-export) .schedule_container { overflow-x: visible; } .schedule:not(.schedule-export) .schedule_panel { grid-template-columns: minmax(0, 720px); /* single, comfortably wide column */ justify-content: center; /* …centred in the section */ column-gap: 0; row-gap: 0; min-width: 0; margin: 1rem auto 0; -webkit-mask-image: none; mask-image: none; } /* Day stripes are a week-only device; drop them. Keep the Manhã/Tarde labels. */ .schedule:not(.schedule-export) .schedule_stripe { display: none; } .schedule:not(.schedule-export) .schedule_section_label { grid-column: 1; margin: .9rem 0 1.1rem; } /* Pull the selected day's header + cells into the single column (override the inline grid-column that otherwise places them under their weekday). */ .schedule:not(.schedule-export) .schedule_dayhead { grid-column: 1 !important; margin-bottom: 1.1rem; } .schedule:not(.schedule-export) .schedule_cell { grid-column: 1 !important; justify-content: center; flex-wrap: wrap; margin-bottom: 1rem; } /* A lone class stays a tidy card instead of stretching the whole column. */ .schedule:not(.schedule-export) .schedule_cell > .schedule_box { flex: 0 1 220px; } /* Hide every day but the selected one, plus any empty Manhã/Tarde divider (JS toggles .sched-hide by data-day / by section). */ .schedule:not(.schedule-export) .schedule_cell.sched-hide, .schedule:not(.schedule-export) .schedule_dayhead.sched-hide, .schedule:not(.schedule-export) .schedule_section_label.sched-hide { display: none !important; } .schedule-scroll-hint { display: none !important; } /* ── Aula experimental modal ───────────────────────────────────────────────── */ .modal-content.trial-modal { background: #fff !important; border-radius: var(--fitme-radius); overflow: hidden; box-shadow: var(--fitme-shadow-lg); } .trial-modal-head { position: relative; background: var(--fitme-dark-2); color: #fff; padding: 1.75rem 1.75rem 1.5rem; } .trial-modal-head h3 { margin: 0 0 .4rem; font-weight: 900; font-size: 1.5rem; color: #fff; /* override the global dark h1–h6 colour (black-on-dark otherwise) */ } .trial-modal-head p { margin: 0; color: var(--fitme-ash); font-size: .92rem; } .trial-close { position: absolute; top: 12px; right: 16px; background: transparent; border: none; color: #fff; font-size: 1.8rem; line-height: 1; cursor: pointer; opacity: .8; transition: opacity var(--fitme-transition); } .trial-close:hover { opacity: 1; } .trial-form { padding: 1.5rem 1.75rem 1.75rem; } .trial-form input, .trial-form select, .trial-form textarea { width: 100%; border: 1px solid var(--fitme-surface-2); border-radius: var(--fitme-radius); padding: 12px 14px; font-size: .95rem; color: var(--fitme-text); background: #fff; transition: box-shadow var(--fitme-transition), border-color var(--fitme-transition); } .trial-form input:focus, .trial-form select:focus, .trial-form textarea:focus { border-color: var(--fitme-accent); box-shadow: 0 0 0 3px rgba(var(--fitme-accent-rgb), .25); } .trial-form textarea { resize: vertical; } .trial-form .consent-check { margin-bottom: 1rem; color: var(--fitme-text-soft); } .trial-form .consent-check a { color: var(--fitme-text); } .trial-form .consent-check a:hover { color: var(--fitme-accent-dark); } .trial-form .site-btn { border: none; }