Skip to content

feat: design system oficial do He4rt + splash animada com a marca - #3

Merged
tecrodrigocastro merged 8 commits into
mainfrom
feat/design-system-splash
Sep 24, 2026
Merged

tecrodrigocastro merged 8 commits into
mainfrom
feat/design-system-splash

Conversation

@tecrodrigocastro

Copy link
Copy Markdown
Contributor

Contexto

O app ainda usava os tokens/placeholder de cor padrão do template do NativePHP. Essa PR porta o design system real do He4rt (de heartdevs.com, módulo he4rt) e usa a marca (coração/H) como tela de splash — tanto o boot estático do OS quanto uma tela animada logo em seguida.

Alterações

Paleta e raio do design system

  • config/native-ui.php: tokens de cor portados de app-modules/he4rt/resources/css/support/themes.css (heartdevs.com) — primary #782BF1, secondary #9828BD (fixos entre light/dark, o CSS de origem não os sobrescreve), escala de elevação dark #09090A → #1C1C1F mapeada pra surface/background/surface-variant, helper-success/error (#00CD0F/#FC3A38), outline-medium/outline-low. Raios sm/md/lg/pill também portados (8/16/24/9999).
  • config/nativephp.php: cor primária do tema Android alinhada com o roxo do He4rt.

Fontes

  • Satoshi (sans, corpo/headings) e Fira Code (mono) convertidas de .woff2 pra .ttf (via woff2_decompress) a partir dos arquivos reais do site e trazidas pra resources/fonts/. Aliases default/medium/bold/mono/mono-medium em config/native-ui.php.
  • Cal-Sans existe como token no CSS do site mas não tem arquivo de fonte versionado lá — não foi portado.

Splash estático do OS

  • public/splash.png/splash-dark.png — rasterizados do SVG oficial da marca (app-modules/portal/resources/views/components/logo.blade.php) sobre o background do design system, substituindo o placeholder do NativePHP no boot do app. Removido o logo do starter (nativephp-logo.png), não usado.

Tela de splash animada

  • Nova Splash (app/NativeComponents/Splash.php) vira a rota inicial (/); a Home antiga passou pra /home.
  • Marca central com pulso contínuo (heartbeat) + halo roxo atrás (native:canvas + circle, scale/opacity em loop) — aproximação nativa do logo animado do portal, que usa stroke-dasharray/stroke-dashoffset (efeito de "LED correndo" na borda) sem equivalente direto nos primitivos de desenho do EDGE (canvas/rect/circle/line, sem path arbitrário).
  • Troca automática pra /home via #[Poll(1800)] — dispara uma vez e para sozinho porque o componente desmonta ao navegar.

Plano de Testes

  • vendor/bin/pint --dirty limpo
  • php artisan test — 10 testes (3 novos pra Splash, incluindo assertReplacedWith('/home') via firePoll('finish'))
  • Não testado em device/simulador real — quem revisar precisa rodar native:run pra conferir visualmente o pulso e o timing da transição (não posso rodar isso eu mesmo)

Evidências

Preview do splash estático (dark), gerado a partir do SVG oficial da marca:

Light Dark
fundo #FBFBFF + marca #782BF1 fundo #09090A + marca #782BF1

Issues Relacionadas

Relates to he4rt/heartdevs.com#531

Portado de heartdevs.com (app-modules/he4rt/resources/css/support/themes.css):
primary #782BF1, secondary #9828BD, escala de elevação dark #09090A→#1C1C1F,
helper-success/error/info e raios (sm/md/lg/pill). Cor primária do tema
Android também alinhada.
Convertidas de heartdevs.com/app-modules/he4rt/resources/fonts (woff2 →
ttf via woff2_decompress). Cal-Sans existe como token no CSS do site mas
não tem arquivo de fonte versionado lá — não foi portado.
public/splash.png e splash-dark.png (rasterizados do SVG oficial em
app-modules/portal/resources/views/components/logo.blade.php, heartdevs.com)
substituem o placeholder do NativePHP no boot do app, antes da tela
animada assumir. Remove o logo do starter, não usado.
Nova rota inicial (/) — vira o intro animado antes de home (movida pra
/home). Marca central com pulso contínuo (native:canvas + circle, scale/
opacity em loop) e halo roxo atrás, aproximação nativa do efeito de
"LED correndo" do logo animado do portal (que usa stroke-dasharray, sem
equivalente direto no EDGE). Troca automática pra /home via #[Poll] após
1.8s.
@tecrodrigocastro
tecrodrigocastro requested a review from a team September 22, 2026 19:08
…vbar

A versão anterior usava o logo pequeno estático da navbar com um pulso
genérico — nada a ver com o efeito de LED correndo pela borda que
existe de verdade no fundo do hero (animated-logo.blade.php).

Corrigido: as duas curvas SVG reais desse componente foram amostradas
em 48 pontos por segmento (arc-length uniforme, svgpathtools), viram o
contorno de fundo (rasterizado uma vez, he4rt-hero-trace.png) e dois
pontos roxos que percorrem essas mesmas curvas via translate-x/y a
cada tick de #[Poll], no mesmo ritmo do @Keyframes original (2.6s por
volta, segundo LED meia volta atrás — igual ao animation-delay: 1.3s
do CSS). Remove o mark antigo, não usado mais.
@tecrodrigocastro

Copy link
Copy Markdown
Contributor Author

Correção: splash agora reproduz o animated-logo.blade.php real

A primeira versão usava o logo pequeno da navbar (logo.blade.php) com um pulso genérico — nada a ver com o efeito real do fundo do hero. Corrigido:

  • As duas curvas SVG de app-modules/portal/resources/views/components/animated-logo.blade.php (heartdevs.com) foram amostradas em 48 pontos por segmento (arc-length uniforme, via svgpathtools) e viram o contorno de fundo (public/images/he4rt-hero-trace.png, rasterizado uma vez).
  • Dois pontos roxos percorrem essas mesmas curvas via translate-x/translate-y, um frame por tick de #[Poll], no mesmo ritmo do @keyframes he4rt-led-run original — 2.6s por volta, segundo LED meia volta atrás do primeiro (igual ao animation-delay: 1.3s do CSS).
  • 2 testes novos garantem a defasagem inicial e que os LEDs avançam a cada tick (cobrem a lógica, não o visual).

Preview (Python/PIL, com blur — no device o glow é mais simples, dois círculos empilhados com opacidade, já que o EDGE não tem blur):

O EDGE não desenha paths/stroke-dasharray arbitrários — a tentativa
anterior (LEDs percorrendo pontos amostrados) não chegava perto do
efeito real. Solução: <native:webview php> apontando pra uma rota
normal (resources/views/web/splash-animation.blade.php) que embute o
HTML/CSS/SVG de animated-logo.blade.php verbatim — mesma animação
CSS, sem aproximação. É o escape hatch documentado pra exatamente
esse caso (sem equivalente nativo), não uma webview cobrindo o app —
o resto continua 100% EDGE.

Remove a lógica de LED/pontos amostrados (Splash.php volta a ser só
o timer de troca de tela) e o PNG do contorno, que não são mais
necessários. Teste novo garante que a rota da animação serve o CSS/
SVG intactos.
@tecrodrigocastro

Copy link
Copy Markdown
Contributor Author

Pivô: webview embarcada em vez de aproximar com primitivos nativos

A tentativa anterior (dois pontos percorrendo waypoints amostrados) ainda não batia com o original — feedback correto. Causa raiz: o EDGE genuinamente não tem desenho de path/`stroke-dasharray` arbitrário, só formas (`rect`/`circle`/`line`), então qualquer aproximação com esses primitivos ia ficar visualmente diferente.

Solução: `<native:webview php>` (o escape hatch documentado do próprio NativePHP pra exatamente esse caso) apontando pra uma rota normal que serve o HTML/CSS/SVG de `animated-logo.blade.php` verbatim — mesmo CSS, mesma animação, zero aproximação. Só essa tela usa webview; o resto do app continua 100% EDGE nativo.

Fundo/texto da splash seguiam o tema do sistema (bg-theme-background) —
em light mode ficava claro, sem casar com a webview (que já é escura
por baixo). Novos tokens splash-background/on-splash-background
(mesmo valor nos dois temas, config/native-ui.php) fixam o visual da
marca independente do modo do device. O splash.png estático do boot
do OS também virou escuro, pra não ter flash claro antes da tela
animada assumir.

Timer de troca de tela dobrado (2 voltas completas de 2.6s em vez de
1) — corta num ponto parado do ciclo, não no meio de uma volta.
@tecrodrigocastro
tecrodrigocastro merged commit 6b54181 into main Sep 24, 2026
1 check passed
@tecrodrigocastro
tecrodrigocastro deleted the feat/design-system-splash branch September 24, 2026 01:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant