From cb0e4540f21c1e6ebb970d7d0149db3fd0aaa1dc Mon Sep 17 00:00:00 2001 From: andre Date: Thu, 24 Sep 2026 22:02:58 +0100 Subject: [PATCH] =?UTF-8?q?feat(modalidades):=206=20=C3=ADcones=20em=20fal?= =?UTF-8?q?ta,=20=C3=ADcones=20animados,=20=C3=ADcone=20centrado=20no=20ca?= =?UTF-8?q?rt=C3=A3o=20aberto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ícones novos (Bootcamp, YourFit Core, Run3070, Total Workout, On Ramp, Jump) do mesmo conjunto; só o LPO continua sem ícone no ficheiro de design. - Os ícones fitme-*.svg passam a ir embutidos (modalidade_icon_html): cada traço tem pathLength=1 e desenha-se ao aparecer, no hover e ao abrir o cartão; cada família tem um movimento (levantar, soco, respirar, saltar, chama, pedalar, correr). Outros ícones continuam . - No cartão de detalhe (desktop) o ícone e o nome deslizam até ao centro vertical da coluna. Co-Authored-By: Claude Opus 5.5 --- config/functions_site.php | 39 ++++++ site/assets/css/style.css | 127 ++++++++++++++++++ site/assets/js/main.js | 18 ++- site/index.php | 4 +- uploads/modalidades/icons/fitme-bootcamp.svg | 1 + uploads/modalidades/icons/fitme-jump.svg | 1 + uploads/modalidades/icons/fitme-on-ramp.svg | 1 + uploads/modalidades/icons/fitme-run3070.svg | 1 + .../modalidades/icons/fitme-total-workout.svg | 1 + .../modalidades/icons/fitme-yourfit-core.svg | 1 + 10 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 uploads/modalidades/icons/fitme-bootcamp.svg create mode 100644 uploads/modalidades/icons/fitme-jump.svg create mode 100644 uploads/modalidades/icons/fitme-on-ramp.svg create mode 100644 uploads/modalidades/icons/fitme-run3070.svg create mode 100644 uploads/modalidades/icons/fitme-total-workout.svg create mode 100644 uploads/modalidades/icons/fitme-yourfit-core.svg diff --git a/config/functions_site.php b/config/functions_site.php index 5abc3cf..73b9fe6 100644 --- a/config/functions_site.php +++ b/config/functions_site.php @@ -137,3 +137,42 @@ function site_tel(?string $phone): string { if ($p[0] !== '+' && str_starts_with($p, '00')) return '+' . substr($p, 2); return $p; } + +// ─── Modalidade icon markup ─────────────────────────────────────────────────── +// The FitMe icon set (uploads/modalidades/icons/fitme-*.svg, shipped in the repo +// — backoffice uploads are always named upl_*) is inlined so CSS can animate +// the strokes: every drawable element gets pathLength="1" for the draw-in, and +// the carries data-anim, a per-family movement (see style.css). Anything +// else (legacy PNGs, uploaded SVGs) stays a plain . +function modalidade_icon_anim(string $slug): string { + $map = [ + 'lift' => ['yourfit-pump', 'crossfit', 'crossfit-teen-s', 'fbb', 'yourfit-core', 'total-workout'], + 'punch' => ['yourfit-fight', 'bootcamp'], + 'breathe' => ['yourfit-mind', 'yoga', 'pilates'], + 'bounce' => ['zumba', 'jump', 'yourfit-pulse', 'hybrid'], + 'flicker' => ['fitburn'], + 'ride' => ['cycling'], + 'run' => ['run3070', 'on-ramp', 'localizada'], + ]; + foreach ($map as $anim => $slugs) if (in_array($slug, $slugs, true)) return $anim; + return 'lift'; +} + +function modalidade_icon_html(?string $icon): string { + $icon = trim((string) $icon); + if ($icon === '') return ''; + if (preg_match('/^fitme-([a-z0-9-]+)\.svg$/', $icon, $m)) { + $file = dirname(__DIR__) . '/uploads/modalidades/icons/' . $icon; + $svg = is_file($file) ? (string) file_get_contents($file) : ''; + if (str_starts_with(ltrim($svg), '~is', '', $svg); + $svg = preg_replace('~\son\w+\s*=\s*("[^"]*"|\'[^\']*\')~i', '', $svg); + $svg = preg_replace('~\scolor="[^"]*"~', '', $svg, 1); // colour comes from CSS + $svg = preg_replace('~<(path|circle|rect|line|polyline|polygon|ellipse)\b~', '<$1 pathLength="1"', $svg); + $svg = preg_replace('~^\s*