From 0c3461188a8b2bfaf6e29d18b1dd5f8a39c8091c Mon Sep 17 00:00:00 2001
From: andynnnfw
Date: Thu, 8 Oct 2026 20:38:58 -0300
Subject: [PATCH 1/6] refactor(css): estilos soltos das views viram classes em
components.css
- public/css/components.css: classes novas form-submit, auth-container-wide e progress (barra nativa com as cores da paleta)
- public/css/app.css: sai o estilo antigo da barra (.progress e .progress-bar), que agora mora no components.css
- views/auth/merchant/register.php: os dois style soltos (largura do card e margem do botao) viram classes
- views/partials/reward-progress.php: a barra passa a ser a tag progress com value, sem style de largura
- tests/Feature/RewardProgressScreenTest.php: testes conferem o value da barra e que a tela nao tem mais style solto
---
public/css/app.css | 16 +--------
public/css/components.css | 41 ++++++++++++++++++++++
tests/Feature/RewardProgressScreenTest.php | 13 +++----
views/auth/merchant/register.php | 5 +--
views/partials/reward-progress.php | 6 ++--
5 files changed, 54 insertions(+), 27 deletions(-)
diff --git a/public/css/app.css b/public/css/app.css
index c0179fe..a90266c 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -561,7 +561,7 @@ span.btn-secondary {
}
}
-/* progresso ate o proximo premio: barra fina com o preenchimento na cor da marca */
+/* progresso ate o proximo premio: frase em cima da barra (a barra em si e o .progress do components.css) */
.reward-progress {
margin-top: 0.75rem;
}
@@ -571,20 +571,6 @@ span.btn-secondary {
margin-bottom: 0.4rem;
}
-.progress {
- height: 0.6rem;
- background: var(--bg-body);
- border: 1px solid var(--border);
- border-radius: 999px;
- overflow: hidden;
-}
-
-.progress-bar {
- height: 100%;
- background: var(--primary);
- border-radius: 999px;
-}
-
/* cartaz: folha clara (--paper) com nome da loja e qr code; centralizado e legivel de longe */
.poster {
max-width: 520px;
diff --git a/public/css/components.css b/public/css/components.css
index b33a781..7cbb532 100644
--- a/public/css/components.css
+++ b/public/css/components.css
@@ -170,3 +170,44 @@
border-color: var(--warning);
color: var(--warning-text);
}
+
+/* botao de envio que vem logo depois de uma linha de campos: um respiro a mais em cima */
+.form-submit {
+ margin-top: 1rem;
+}
+
+/* card de formulario longo (cadastro da loja): no celular segue 100%, em tela grande vai ate 600px.
+ o seletor duplo vence o max-width que o auth.css da ao .auth-container nas telas maiores */
+.auth-container.auth-container-wide {
+ max-width: 600px;
+}
+
+/* barra de progresso:
-
-
-
+ = (int)$progress['percent'] ?>%
From f38872cdf79fb2c4517ab92b3db986d407f5fa00 Mon Sep 17 00:00:00 2001
From: andynnnfw
Date: Thu, 8 Oct 2026 20:45:29 -0300
Subject: [PATCH 2/6] feat(ui): botao mostra carregando e bloqueia clique duplo
no envio
- src/ts/forms.ts: script novo que marca o formulario enviado, poe o botao em carregando e barra o segundo envio
- public/js/forms.js: compilado do forms.ts pelo tsc (versionado, como o masks.js)
- public/css/components.css: classe is-loading (botao apagado, rodinha girando, sem clique) respeitando reduzir movimento
- views/auth/merchant/login.php: carrega o forms.js
- views/auth/merchant/register.php: carrega o forms.js
- views/customer/balance.php: carrega o forms.js
- views/partials/merchant-footer.php: carrega o forms.js em todas as telas do painel
- tests/js/forms.test.js: testa primeiro envio, envio duplo barrado, confirm cancelado e volta do navegador
- tests/Feature/FormsScriptTest.php: confere que login, cadastro, consulta publica e painel carregam o script
- .github/workflows/ci.yml: o CI passa a rodar o teste do forms.js
- CLAUDE.md: documenta o forms.ts e a classe is-loading
---
.github/workflows/ci.yml | 3 ++
CLAUDE.md | 1 +
public/css/components.css | 37 ++++++++++++++++++
public/js/forms.js | 47 ++++++++++++++++++++++
src/ts/forms.ts | 50 ++++++++++++++++++++++++
tests/Feature/FormsScriptTest.php | 33 ++++++++++++++++
tests/js/forms.test.js | 63 ++++++++++++++++++++++++++++++
views/auth/merchant/login.php | 1 +
views/auth/merchant/register.php | 1 +
views/customer/balance.php | 1 +
views/partials/merchant-footer.php | 1 +
11 files changed, 238 insertions(+)
create mode 100644 public/js/forms.js
create mode 100644 src/ts/forms.ts
create mode 100644 tests/Feature/FormsScriptTest.php
create mode 100644 tests/js/forms.test.js
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1d9d8e4..6ed5048 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -72,6 +72,9 @@ jobs:
- name: Testes das mascaras (JavaScript)
run: node tests/js/masks.test.js
+ - name: Testes do envio de formulario (JavaScript)
+ run: node tests/js/forms.test.js
+
# o public/js/masks.js e versionado e gerado do src/ts/masks.ts: se alguem mexer no .ts e esquecer
# de rodar o tsc (ou editar o .js na mao), o compilado deixa de bater com o fonte e o job falha.
mascaras:
diff --git a/CLAUDE.md b/CLAUDE.md
index 2c8eb99..5da9e97 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -69,6 +69,7 @@ Banco: `mysql -u root -p < database/schema.sql` em instalação nova. Banco já
- Commits no padrão `tipo(escopo): descrição` (`feat`, `fix`, `refactor`, `docs`, `test`, `chore`); branches `tipo/nome` com o mesmo tipo do commit (ex.: `feat/logout`, `fix/csrf-token`). Nunca commitar direto na `main`: tudo entra por PR, e o PR referencia a issue com `close #N` quando houver.
- SQL sempre com prepared statements; o PDO usa `ATTR_EMULATE_PREPARES = false`, então o mesmo placeholder não pode aparecer duas vezes na query (use `:p1`, `:p2`).
- Máscaras de telefone e CPF/CNPJ ficam em `src/ts/masks.ts` (`data-mask="phone"` / `"document"` no input), compiladas com `tsc` para `public/js/masks.js`, que é versionado: rode `tsc` ao mexer no `.ts`. É só apresentação; o back-end continua limpando os dígitos.
+- `src/ts/forms.ts` (compilado para `public/js/forms.js`, também versionado) vale para todo `