Files
fitme3070.pt/site/assets/css/style.css
T
2026-08-12 21:50:26 +01:00

2916 lines
70 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ==========================================================================
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);
object-position: top;
}
/* 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 (<b></b>); 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;
}
/* ══════════════════════════════════════════════════════════════════════════
Events — homepage banner + landing page (/evento/<slug>)
══════════════════════════════════════════════════════════════════════════ */
/* ── Active events — featured inside the hero/header ───────────────────────── */
.event-live-dot {
width: 9px; height: 9px;
flex: 0 0 auto;
border-radius: 50%;
background: var(--fitme-accent);
box-shadow: 0 0 0 0 rgba(var(--fitme-accent-rgb), .7);
animation: event-pulse 1.8s infinite;
}
@keyframes event-pulse {
0% { box-shadow: 0 0 0 0 rgba(var(--fitme-accent-rgb), .7); }
70% { box-shadow: 0 0 0 10px rgba(var(--fitme-accent-rgb), 0); }
100% { box-shadow: 0 0 0 0 rgba(var(--fitme-accent-rgb), 0); }
}
.hero-events {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
margin-bottom: 1.75rem;
}
.hero-event {
--ev-accent: var(--fitme-accent);
position: relative;
overflow: hidden;
display: flex;
align-items: center;
gap: 16px;
width: min(640px, 92vw);
padding: 12px 14px 12px 18px;
background: rgba(11, 11, 13, .55);
border: 1.5px solid rgba(var(--fitme-accent-rgb), .55);
border-radius: 999px;
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
text-decoration: none;
text-align: left;
animation: hero-event-glow 2.8s ease-in-out infinite;
transition: transform var(--fitme-transition), box-shadow var(--fitme-transition), border-color var(--fitme-transition);
}
/* The event's own image as a frosted (blurred + darkened) backdrop inside the
pill — only when --ev-img is set; otherwise the translucent dark bg shows. */
.hero-event.has-img::before {
content: '';
position: absolute;
inset: 0;
z-index: 0;
background-image: var(--ev-img);
background-size: cover;
background-position: center;
filter: blur(6px) saturate(1.15) brightness(.5);
transform: scale(1.18); /* hide the blur's transparent edges */
transition: transform var(--fitme-transition);
}
.hero-event.has-img:hover::before { transform: scale(1.24); }
/* Keep the content above the image layer. */
.hero-event > * { position: relative; z-index: 1; }
@keyframes hero-event-glow {
0%, 100% { box-shadow: 0 10px 34px rgba(0,0,0,.45), 0 0 18px rgba(var(--fitme-accent-rgb), .14); }
50% { box-shadow: 0 10px 34px rgba(0,0,0,.45), 0 0 30px rgba(var(--fitme-accent-rgb), .32); }
}
.hero-event:hover {
transform: translateY(-2px);
border-color: var(--ev-accent);
box-shadow: 0 16px 44px rgba(0, 0, 0, .55), 0 0 34px rgba(var(--fitme-accent-rgb), .38);
}
.hero-event-badge {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
gap: 7px;
padding: 7px 13px;
font-size: .72rem;
font-weight: 800;
letter-spacing: 1.5px;
text-transform: uppercase;
color: var(--fitme-accent);
background: rgba(var(--fitme-accent-rgb), .14);
border-radius: 999px;
}
.hero-event-text {
flex: 1 1 auto;
min-width: 0;
display: flex;
flex-direction: column;
line-height: 1.22;
}
.hero-event-title {
font-size: 1.12rem;
font-weight: 800;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hero-event-sub {
font-size: .9rem;
color: rgba(255, 255, 255, .72);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hero-event-go {
flex: 0 0 auto;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 11px 20px;
font-size: .92rem;
font-weight: 700;
white-space: nowrap;
color: var(--fitme-dark);
background: var(--ev-accent);
border-radius: 999px;
}
.hero-event-go i { transition: transform var(--fitme-transition); }
.hero-event:hover .hero-event-go i { transform: translateX(4px); }
@media (max-width: 575px) {
.hero-event {
flex-wrap: wrap;
justify-content: center;
text-align: center;
border-radius: 18px;
gap: 10px;
padding: 14px;
}
.hero-event-text { flex-basis: 100%; align-items: center; }
.hero-event-title, .hero-event-sub { white-space: normal; }
.hero-event-go { flex-basis: 100%; justify-content: center; }
}
@media (prefers-reduced-motion: reduce) {
.hero-event { animation: none; }
.event-live-dot { animation: none; }
}
/* ── Staff preview ribbon ──────────────────────────────────────────────────── */
.event-preview-bar {
position: sticky;
top: 0;
z-index: 1080;
padding: 8px 16px;
text-align: center;
font-size: .85rem;
font-weight: 600;
color: #0B0B0D;
background: #ffd84d;
}
/* ── Landing hero ──────────────────────────────────────────────────────────── */
.event-hero {
position: relative;
display: flex;
align-items: center;
min-height: 70vh;
padding: 160px 0 90px;
background-size: cover;
background-position: center;
color: #fff;
}
.event-hero--plain {
background: linear-gradient(135deg, var(--fitme-dark) 0%, var(--fitme-dark-2) 100%);
}
.event-hero-overlay {
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(11,11,13,.35) 0%, rgba(11,11,13,.78) 100%);
}
.event-hero .container { position: relative; z-index: 2; }
.event-hero-inner { max-width: 760px; }
.event-hero-eyebrow {
display: inline-block;
font-size: .8rem;
font-weight: 700;
letter-spacing: 3px;
text-transform: uppercase;
margin-bottom: 14px;
}
.event-hero-inner h1 {
font-size: clamp(2.2rem, 5vw, 3.6rem);
line-height: 1.08;
margin: 0 0 14px;
color: #fff;
}
.event-hero-sub {
font-size: 1.2rem;
color: rgba(255,255,255,.85);
margin-bottom: 20px;
}
.event-hero-meta {
list-style: none;
padding: 0;
margin: 0 0 26px;
display: flex;
flex-wrap: wrap;
gap: 10px 26px;
}
.event-hero-meta li {
font-size: 1rem;
color: rgba(255,255,255,.9);
}
.event-hero-meta i { margin-right: 8px; opacity: .85; }
.event-hero-cta { border: none; color: var(--fitme-dark) !important; }
/* ── Landing body (admin HTML) ─────────────────────────────────────────────── */
.event-body { padding: 70px 0; background: var(--fitme-white); }
.event-body p { font-size: 1.05rem; line-height: 1.7; color: var(--fitme-text-soft); }
.event-body h2, .event-body h3, .event-body h4 { margin-top: 1.6rem; }
.event-body img { max-width: 100%; height: auto; border-radius: var(--fitme-radius); }
/* ── Lead form ─────────────────────────────────────────────────────────────── */
.event-leadform { padding: 70px 0; background: var(--fitme-surface); }
.event-form { margin-top: 26px; }
.event-form-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.event-field--full { grid-column: 1 / -1; }
.event-field label {
display: block;
font-size: .85rem;
font-weight: 600;
margin-bottom: 6px;
color: var(--fitme-text-soft);
}
.event-field input,
.event-field textarea {
width: 100%;
padding: 12px 14px;
font-size: 1rem;
background: var(--fitme-white);
border: 1px solid var(--fitme-surface-dark);
border-radius: var(--fitme-radius);
color: var(--fitme-text);
}
.event-field input:focus,
.event-field textarea:focus {
outline: none;
border-color: var(--fitme-accent);
box-shadow: 0 0 0 3px rgba(var(--fitme-accent-rgb), .2);
}
/* honeypot — visually hidden, kept in the layout flow for bots */
.event-hp {
position: absolute !important;
left: -9999px;
width: 1px;
height: 1px;
opacity: 0;
}
.event-alert {
padding: 12px 16px;
margin-bottom: 16px;
border-radius: var(--fitme-radius);
font-size: .95rem;
}
.event-alert--ok { background: #e6f6ea; color: #1c6b34; border: 1px solid #9fdcb0; }
.event-alert--err { background: #fdecec; color: #a32424; border: 1px solid #f1b5b5; }
.event-consent {
display: flex;
align-items: flex-start;
gap: 9px;
margin-top: 16px;
font-size: .88rem;
color: var(--fitme-text-soft);
cursor: pointer;
}
.event-consent input { margin-top: 3px; flex: 0 0 auto; }
.event-consent a { color: var(--fitme-accent-dark); text-decoration: underline; }
@media (max-width: 575px) {
.event-form-grid { grid-template-columns: 1fr; }
}