Files
fitme3070.pt/site/assets/css/style.css
T
andreandClaude Opus 5.5 8ebf20f52f feat: horário em 3 dias, horário de funcionamento compacto, textura na equipa, estrutura/SEO
- Horário de aulas: cartões mais pequenos e estreitos; a partir de 992px mostra
  o dia anterior, hoje ao centro e o seguinte (a dar a volta à semana), com as
  horas alinhadas e os dias laterais esbatidos. O JPG continua a semana toda.
- Horário de funcionamento: cartões compactos numa <dl>, ordenados por hora.
- Equipa: fundo no cinzento da parede do ginásio com juntas de blocos e grão
  muito discretos (SVG inline).
- Tira o «FitMe 3070» do header e esconde a newsletter.
- Estrutura: um <main> em todas as páginas públicas (skip link aponta-lhe),
  h2 por secção com aria-labelledby, h3 nos itens em vez de h4, sem secções
  aninhadas, alts distintos na galeria e no h1 do CrossFit.
- robots.txt e sitemap.xml gerados com o domínio da instalação; SEO_NOINDEX
  no .env tira uma cópia de staging dos motores de pesquisa.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 21:46:21 +01:00

3701 lines
91 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);
}
/* Team backdrop: the warm grey of the gym's block wall in the header photo
(sampled ≈ rgb(70,66,62)), a touch darker so white names still pop. On top,
very faint mortar joints in running bond (120×60 blocks, alternate rows
offset by half a block) plus a fine concrete grain, both as inline SVG
tiles, and a soft shade at the top and bottom edges. */
.trainers-section {
position: relative;
background-color: #403d3a;
background-image:
linear-gradient(180deg, rgba(0, 0, 0, .28) 0%, transparent 18%, transparent 82%, rgba(0, 0, 0, .28) 100%),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .07 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"),
url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='120'%3E%3Cpath d='M0 1H240M0 61H240M1 0V60M121 0V60M61 60V120M181 60V120' fill='none' stroke='rgba(0,0,0,0.09)' stroke-width='1.5'/%3E%3Cpath d='M0 3.5H240M0 63.5H240' fill='none' stroke='rgba(255,255,255,0.022)' stroke-width='1'/%3E%3C/svg%3E");
background-size: 100% 100%, 200px 200px, 240px 120px;
}
.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);
padding: 48px 0 44px;
}
.workhours-section .section-title {
margin-bottom: 1.4rem;
}
/* Compact opening-hours cards: dark day label on top, hours underneath,
side by side and close together (wraps to a column on phones). */
.wh-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 12px;
margin: 0;
}
.wh-day {
flex: 0 1 210px;
border-radius: 6px;
overflow: hidden;
background: var(--fitme-surface);
border: 1px solid var(--fitme-surface-2);
text-align: center;
}
.wh-day dt {
background: var(--fitme-dark-3);
color: #fff;
font-size: .9rem;
font-weight: 700;
padding: 8px 10px;
}
.wh-day dd {
margin: 0;
padding: 7px 10px;
font-weight: 700;
font-size: 1rem;
color: var(--fitme-text);
}
.wh-day dd + dd {
border-top: 1px solid var(--fitme-surface-2);
}
.wh-day dd.wh-closed {
font-weight: 600;
color: var(--fitme-text-muted);
}
@media (max-width: 575px) {
.wh-day { flex-basis: 100%; }
}
.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 h3,
.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 h3,
.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 h3,
.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;
}
/* The form heading is an h3 under the section's h2 — keep the h2 look. */
h3.contact-title {
font-size: 2.25rem;
}
.contact-info-warp {
margin-bottom: 2rem;
}
.contact-info-warp h3,
.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 h3,
.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;
}
/* Short titles (e.g. "Modalidades") would otherwise sit on the eyebrow's line. */
.section-title.deco .section-eyebrow {
display: block;
}
.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;
}
/* ── Horário: compact cards (on screen, every width) ───────────────────────────
Smaller, narrower cards and type so a day reads at a glance and three days
fit side by side on desktop. The JPG export keeps its own sizing. */
.schedule:not(.schedule-export) .schedule_cell {
gap: 6px;
margin-bottom: .6rem;
}
.schedule:not(.schedule-export) .schedule_cell > .schedule_box {
flex: 0 1 112px;
padding: 6px 3px;
}
.schedule:not(.schedule-export) .schedule_box img {
height: 22px;
margin-bottom: 2px;
}
.schedule:not(.schedule-export) .schedule_box a {
font-size: 10px;
min-height: 2.3em;
}
.schedule:not(.schedule-export) .schedule_info {
margin: auto -3px -6px;
padding: 4px 6px;
font-size: 11.5px;
min-height: 2.4em;
}
.schedule:not(.schedule-export) .schedule_box:hover {
transform: scale(1.05);
}
.schedule:not(.schedule-export) .schedule_dayhead {
margin-bottom: .7rem;
}
.schedule:not(.schedule-export) .rounded_frame {
width: 104px;
height: 32px;
font-size: .95rem;
}
.schedule:not(.schedule-export) .schedule_section_label {
margin: .5rem 0 .8rem;
}
.schedule:not(.schedule-export) .schedule_section_label span {
font-size: .72rem;
}
/* ── Desktop: yesterday · today · tomorrow ─────────────────────────────────────
≥992px, main.js shows three days — the chosen one (today by default) centred
between its neighbours, wrapping round the week — and tags each visible
header/cell with .sched-pos-1/2/3 for its column. Rows stay time-aligned, so
classes at the same hour line up across the three days. The side days are
toned down so the centre one leads. */
@media (min-width: 992px) {
.schedule.is-3day:not(.schedule-export) .schedule_panel {
grid-template-columns: repeat(3, minmax(0, 420px));
column-gap: 28px;
}
.schedule.is-3day:not(.schedule-export) .schedule_section_label {
grid-column: 1 / -1;
}
.schedule.is-3day:not(.schedule-export) .sched-pos-1 { grid-column: 1 !important; }
.schedule.is-3day:not(.schedule-export) .sched-pos-2 { grid-column: 2 !important; }
.schedule.is-3day:not(.schedule-export) .sched-pos-3 { grid-column: 3 !important; }
.schedule.is-3day:not(.schedule-export) .schedule_cell.sched-side {
opacity: .5;
transition: opacity var(--fitme-transition);
}
.schedule.is-3day:not(.schedule-export) .schedule_cell.sched-side:hover {
opacity: 1;
}
.schedule.is-3day:not(.schedule-export) .schedule_dayhead.sched-side .rounded_frame {
background: var(--fitme-surface-2);
color: var(--fitme-text-muted);
}
.schedule.is-3day:not(.schedule-export) .schedule_dayhead.sched-pos-2 .rounded_frame {
background: var(--fitme-accent);
color: var(--fitme-dark);
}
.schedule.is-3day:not(.schedule-export) .schedule_dayhead.sched-side {
cursor: pointer;
}
}
/* ── 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; }
}
/* ══════════════════════════════════════════════════════════════════════════
Equipa — título + cartão de detalhe horizontal
Default card = photo + name + title. The detail card is laid OVER the grid
(absolute), so opening it never reflows the team wall. Desktop (fine pointer)
opens it on hover / keyboard focus; touch opens it on tap (.is-open, main.js),
where it becomes a centred fixed card with its own close button.
══════════════════════════════════════════════════════════════════════════ */
/* content-visibility:auto implies paint containment, which would clip the
overlay at the section edge and trap position:fixed inside the section. */
#equipa.trainers-section {
content-visibility: visible;
contain: none;
position: relative;
z-index: 3; /* hover card may overhang the next section */
}
/* While a card is open on touch, lift the whole section over the navbar and
the mobile CTA bar so the dimmed backdrop covers everything. */
#equipa.trainers-section.has-open-detail {
z-index: 1100;
}
/* The global scroll-reveal keeps transform:translateY(0) applied (fill
forwards), and any transform makes an element the containing block for
position:fixed descendants — which would pin the mobile detail card inside
its own tile. Reveal the team with opacity only. */
#equipa.revealed,
#equipa .trainer-item.revealed {
animation-name: fitmeFadeOnly;
}
@keyframes fitmeFadeOnly {
from { opacity: 0; }
to { opacity: 1; }
}
.trainer-item {
position: relative;
}
/* The name used to be the tile's last child and got its size from the
`.trainer-item>*:last-child` rule; pin it so it stays the same whether or
not a title follows it. */
.trainers-section .trainer-item h3,
.trainers-section .trainer-item h4 {
font-size: .9rem;
}
/* …and keep that same rule (white, .9rem) off the detail card when it is the
last child. */
.trainers-section .trainer-item>.trainer-detail {
color: var(--fitme-text);
font-size: 1rem;
}
.trainers-section .trainer-item p.trainer-title {
margin: 0;
font-size: .85rem;
font-weight: 600;
letter-spacing: .04em;
color: var(--fitme-accent);
}
.trainer-item.has-detail {
cursor: pointer;
outline: none;
}
/* On tiles with a card, the card IS the hover effect: keep the photo in its
resting tilt (the card starts from exactly that pose) and hide it while the
card covers it, bringing it back only once the card has folded back in. */
#powerRotation>div:nth-child(odd) .trainer-item.has-detail .trainer-pic:hover { transform: rotate(-3deg); }
#powerRotation>div:nth-child(even) .trainer-item.has-detail .trainer-pic:hover { transform: rotate(3deg); }
.trainer-item.has-detail .trainer-pic {
transition: transform .4s cubic-bezier(.34, 1.56, .64, 1), box-shadow var(--fitme-transition), visibility 0s linear .38s;
}
.trainer-item.has-detail.is-open .trainer-pic {
visibility: hidden;
transition-delay: 0s;
}
@media (max-width: 767px), (hover: none) {
/* Touch: the card flies to the centre, so leave the tile photo in place. */
.trainer-item.has-detail.is-open .trainer-pic { visibility: visible; }
}
/* ── Detail card: grows out of the tile's own photo ─────────────────────────
main.js places the card so its photo column sits exactly on the tile photo
(--td-x/--td-y, size --td-pw/--td-ph) with the tile's tilt (--td-rot). Closed,
the clip-path shows only that photo square, so it reads as the tile itself;
opening straightens it and unclips it sideways — the card "stretches" out of
the photo and the text fades in behind the edge. .td-flip mirrors it for
right-hand tiles (photo on the right, card stretching left). While open, the
mouse position feeds a small 3D tilt + drift (--td-rx/--td-ry/--td-mx/--td-my).
Both transform lists have the same functions so they interpolate. */
.trainer-detail {
position: absolute;
z-index: 30;
left: var(--td-x, 0px);
top: var(--td-y, 0px);
width: var(--td-w, 560px);
min-height: var(--td-ph, 200px);
display: flex;
text-align: left;
background: #fff;
color: var(--fitme-text);
border-radius: 6px;
box-shadow: 0 24px 60px rgba(0, 0, 0, .45);
overflow: hidden;
/* px from main.js: Chrome won't interpolate inset() with calc(100% - …). */
clip-path: inset(0px var(--td-cx, 360px) var(--td-cy, 0px) 0px round 2px);
transform-origin: calc(var(--td-pw, 200px) / 2) calc(var(--td-ph, 200px) / 2);
transform: perspective(900px) rotateX(0deg) rotateY(0deg) translate(0px, 0px) rotate(var(--td-rot, 0deg));
opacity: 0;
visibility: hidden;
pointer-events: none;
transition:
clip-path .38s cubic-bezier(.4, 0, .2, 1),
transform .38s cubic-bezier(.4, 0, .2, 1),
opacity .12s ease .26s,
visibility 0s linear .38s;
}
.trainer-detail.td-flip {
flex-direction: row-reverse;
clip-path: inset(0px 0px var(--td-cy, 0px) var(--td-cx, 360px) round 2px);
transform-origin: calc(100% - var(--td-pw, 200px) / 2) calc(var(--td-ph, 200px) / 2);
}
.trainer-item.is-open .trainer-detail {
clip-path: inset(0px 0px 0px 0px round 6px);
transform: perspective(900px) rotateX(var(--td-rx, 0deg)) rotateY(var(--td-ry, 0deg)) translate(var(--td-mx, 0px), var(--td-my, 0px)) rotate(0deg);
opacity: 1;
visibility: visible;
pointer-events: auto;
transition:
clip-path .55s cubic-bezier(.2, .9, .25, 1),
transform .6s cubic-bezier(.34, 1.35, .64, 1),
opacity 0s,
visibility 0s;
}
/* After the opening move, follow the mouse with a short, soft transition. */
.trainer-item.is-open .trainer-detail.td-tracking {
transition:
clip-path .55s cubic-bezier(.2, .9, .25, 1),
transform .18s ease-out,
opacity 0s,
visibility 0s;
}
.trainer-item.is-open { z-index: 31; }
.td-photo {
flex: 0 0 var(--td-pw, 200px);
box-sizing: border-box;
border: 4px solid var(--fitme-accent);
background: var(--fitme-surface-2);
align-self: stretch;
}
.td-photo img {
width: 100%;
height: 100%;
min-height: calc(var(--td-ph, 200px) - 8px);
object-fit: cover;
object-position: top;
display: block;
}
.td-body {
flex: 1 1 auto;
padding: 18px 22px 18px 20px;
max-height: 340px;
overflow-y: auto;
opacity: 0;
transform: translateX(-10px);
transition: opacity .12s ease, transform .12s ease;
}
.td-flip .td-body { transform: translateX(10px); }
.trainer-item.is-open .td-body {
opacity: 1;
transform: none;
transition: opacity .3s ease .18s, transform .35s ease .18s;
}
.td-name {
display: block;
font-size: 1.15rem;
font-weight: 800;
color: var(--fitme-dark);
padding-right: 20px;
}
.td-title {
display: block;
font-size: .82rem;
font-weight: 700;
color: var(--fitme-accent-dark);
margin-bottom: .6rem;
}
.td-bio {
font-size: .88rem;
color: var(--fitme-text-soft);
margin-bottom: .6rem;
}
.td-bio p:last-child { margin-bottom: 0; }
.td-block + .td-block { margin-top: .55rem; }
.td-label {
display: block;
font-size: .68rem;
font-weight: 800;
letter-spacing: .14em;
text-transform: uppercase;
color: var(--fitme-text-muted);
margin-bottom: .25rem;
}
.td-block ul {
list-style: none;
padding: 0;
margin: 0;
}
.td-block li {
position: relative;
padding-left: 14px;
font-size: .87rem;
line-height: 1.45;
color: var(--fitme-text);
}
.td-block li:before {
content: '';
position: absolute;
left: 0;
top: .55em;
width: 6px;
height: 6px;
border-radius: 1px;
background: var(--fitme-accent);
}
.td-close {
position: absolute;
top: 6px;
right: 10px;
z-index: 2;
background: transparent;
border: 0;
font-size: 1.6rem;
line-height: 1;
color: var(--fitme-text-muted);
cursor: pointer;
display: none;
}
/* Touch / small screens: a centred fixed card over a dimmed page. The "grows
out of the tile" move is done in main.js with a FLIP animation instead of
the clip-path, since the card no longer sits on top of the tile. */
@media (max-width: 767px), (hover: none) {
.trainer-detail,
.trainer-detail.td-flip {
position: fixed;
top: var(--td-top, 20vh);
left: 16px;
right: 16px;
width: auto;
max-width: 560px;
min-height: 0;
margin: 0 auto;
max-height: calc(100vh - 48px);
flex-direction: row;
clip-path: none;
transform: none;
transform-origin: top left;
transition: opacity .15s ease, visibility 0s linear .15s;
}
.trainer-item.is-open .trainer-detail {
clip-path: none;
transform: none;
transition: opacity 0s, visibility 0s;
}
.trainer-item.is-open:after {
content: '';
position: fixed;
inset: 0;
z-index: 29;
background: rgba(0, 0, 0, .55);
}
.td-close { display: block; }
.td-photo { flex-basis: 34%; border-width: 3px; }
.td-photo img { min-height: 180px; }
.td-body,
.td-flip .td-body { max-height: calc(100vh - 48px); padding: 16px 16px 16px 14px; transform: none; }
}
@media (max-width: 339px) {
.trainer-detail,
.trainer-detail.td-flip { flex-direction: column; }
.td-photo { max-width: none; flex-basis: auto; }
.td-photo img { min-height: 0; height: 160px; }
}
@media (prefers-reduced-motion: reduce) {
.trainer-detail,
.trainer-item.is-open .trainer-detail { transition-duration: .01ms !important; }
}
/* ══════════════════════════════════════════════════════════════════════════
Mensalidades — cartões de preço
══════════════════════════════════════════════════════════════════════════ */
.pricing-section {
padding: 90px 0 70px;
background: var(--fitme-surface);
}
.pricing-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: stretch;
gap: 24px;
}
.price-card {
position: relative;
flex: 0 1 270px;
display: flex;
flex-direction: column;
background: #fff;
border: 1px solid var(--fitme-surface-2);
border-radius: 6px;
padding: 30px 26px 26px;
box-shadow: var(--fitme-shadow);
transition: transform var(--fitme-transition), box-shadow var(--fitme-transition);
}
.price-card:hover {
transform: translateY(-4px);
box-shadow: var(--fitme-shadow-lg);
}
.price-card.is-featured {
background: var(--fitme-dark-2);
border: 2px solid var(--fitme-accent);
color: var(--fitme-ash);
box-shadow: 0 18px 50px rgba(var(--fitme-dark-rgb), .28);
}
@media (min-width: 992px) {
.price-card.is-featured { transform: scale(1.04); }
.price-card.is-featured:hover { transform: scale(1.04) translateY(-4px); }
}
.pc-badge {
position: absolute;
top: 0;
left: 50%;
transform: translate(-50%, -50%);
white-space: nowrap;
background: var(--fitme-accent);
color: var(--fitme-dark);
font-size: .72rem;
font-weight: 800;
letter-spacing: .12em;
text-transform: uppercase;
padding: 6px 14px;
border-radius: 999px;
}
.pc-badge i { font-size: .65rem; }
.price-card .pc-name {
font-size: 1.35rem;
font-weight: 900;
margin: 0 0 .35rem;
color: var(--fitme-dark);
}
.price-card.is-featured .pc-name { color: #fff; }
.pc-sub {
font-size: .9rem;
line-height: 1.45;
color: var(--fitme-text-muted);
margin: 0 0 1rem;
}
.price-card.is-featured .pc-sub { color: var(--fitme-ash); }
.pc-price {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 8px;
padding: .9rem 0 1rem;
border-top: 1px solid var(--fitme-surface-2);
border-bottom: 1px solid var(--fitme-surface-2);
margin-bottom: 1rem;
}
.price-card.is-featured .pc-price { border-color: rgba(255, 255, 255, .12); }
.pc-amount {
font-size: 2.3rem;
font-weight: 900;
line-height: 1;
color: var(--fitme-dark);
}
.pc-amount.is-text { font-size: 1.35rem; }
.price-card.is-featured .pc-amount { color: var(--fitme-accent); }
.pc-suffix {
font-size: .88rem;
color: var(--fitme-text-muted);
}
.price-card.is-featured .pc-suffix { color: var(--fitme-ash); }
.pc-features {
list-style: none;
padding: 0;
margin: 0 0 1.4rem;
flex: 1 1 auto;
}
.pc-features li {
display: flex;
gap: 10px;
font-size: .92rem;
line-height: 1.4;
padding: 4px 0;
color: var(--fitme-text-soft);
}
.price-card.is-featured .pc-features li { color: #fff; }
.pc-features i {
color: var(--fitme-accent-dark);
margin-top: 3px;
font-size: .8rem;
}
.price-card.is-featured .pc-features i { color: var(--fitme-accent); }
.price-card .pc-cta {
width: 100%;
border: none;
margin-top: auto;
}
.price-card:not(.is-featured) .pc-cta {
background: var(--fitme-dark-2);
color: var(--fitme-accent);
}
.price-card:not(.is-featured) .pc-cta:hover {
background: var(--fitme-dark-3);
box-shadow: none;
}
@media (max-width: 575px) {
.pricing-section { padding: 60px 0 50px; }
.price-card { flex-basis: 100%; }
}
/* ══════════════════════════════════════════════════════════════════════════
Reviews Google
══════════════════════════════════════════════════════════════════════════ */
.reviews-section {
padding: 90px 0 60px;
background: var(--fitme-dark);
color: var(--fitme-ash);
}
.reviews-section .section-title h2 { color: #fff; }
.reviews-summary {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 6px 12px;
margin: 1rem 0 0;
color: var(--fitme-ash);
}
.reviews-summary strong {
font-size: 1.8rem;
font-weight: 900;
color: #fff;
line-height: 1;
}
.rv-stars {
color: #FBBC04;
letter-spacing: 2px;
font-size: .95rem;
}
.reviews-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 22px;
}
.review-card {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
margin: 0;
background: var(--fitme-dark-2);
border: 1px solid var(--fitme-dark-3);
border-radius: 6px;
padding: 28px 24px 24px;
}
.rv-avatar {
width: 84px;
height: 84px;
border-radius: 50%;
overflow: hidden;
border: 3px solid var(--fitme-accent);
background: var(--fitme-dark-3);
display: flex;
align-items: center;
justify-content: center;
margin-bottom: .8rem;
flex: 0 0 auto;
}
.rv-avatar img {
width: 100%;
height: 100%;
object-fit: cover;
}
.rv-avatar span {
font-size: 2rem;
font-weight: 900;
color: var(--fitme-accent);
}
.rv-author {
display: flex;
flex-direction: column;
font-size: 1.05rem;
font-weight: 800;
color: #fff;
}
.rv-author a { color: #fff; }
.rv-author a:hover { color: var(--fitme-accent); }
.rv-author small {
font-size: .78rem;
font-weight: 400;
color: var(--fitme-ash);
margin-top: 2px;
}
.rv-stars-lg {
font-size: 1.3rem;
letter-spacing: 3px;
margin: .6rem 0 .2rem;
}
.rv-text {
margin: .6rem 0 0;
font-size: .85rem;
line-height: 1.55;
color: var(--fitme-ash);
display: -webkit-box;
-webkit-line-clamp: 6;
-webkit-box-orient: vertical;
overflow: hidden;
}
.reviews-actions {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 12px;
margin-top: 2rem;
}
.reviews-section .site-btn.sb-line {
border-color: #fff;
color: #fff;
}
.reviews-section .site-btn.sb-line:hover {
background: #fff;
color: var(--fitme-dark);
}
.reviews-attribution {
margin: 1.2rem 0 0;
text-align: center;
font-size: .75rem;
color: var(--fitme-ash);
opacity: .8;
}