# Handoff: Login → Dashboard (auth estilo GitHub)

**Objetivo:** Entregar o fluxo público de entrada do Prumo polido no estilo GitHub:
`prumoboard.com` redireciona para o app; páginas de entrar/criar conta em duas telas
separadas e alternáveis (botão cruzado), com as regras de erro de conta corretas; e um
dashboard que mostra o nome do usuário com botão "Sair" no rodapé inferior esquerdo.

> ## Como usar este arquivo (protocolo de execução)
> - Executar **uma etapa por vez**, na ordem. Cada etapa é **estanque** e tem como
>   verificar no fim.
> - Ao concluir uma etapa: marcar `[x]` (etapa e sub-itens), **preencher "Notas de
>   execução"**, salvar este arquivo e **PARAR**.
> - **Esperar o aval** do usuário **ou** a correção de erros. Erros → corrigir na
>   mesma etapa e parar de novo.
> - **No aval:** fazer **commit + push** dos arquivos da etapa (incluindo este
>   handoff e os untracked relevantes). Em seguida rodar `python deploy.py`. Depois
>   **esperar a liberação** para iniciar a **próxima** etapa.
> - **Entrega é do Claude; deploy/teste costuma ser do usuário.** Onde disser
>   "Verificar", o Claude entrega e descreve o teste; se não der para rodar aqui, o
>   usuário roda e retorna o comportamento (ou os erros/logs).

---

## Decisões (já acordadas)

1. **Redirect do domínio raiz:** `https://prumoboard.com/` → `https://app.prumoboard.com/`
   via `Redirect 301` num `.htaccess` no **docroot específico** do domínio
   (`public_html/prumoboard.com/.htaccess`), nunca em `public_html/` (que cascatearia
   para bianch.in e demais sites e criaria loop no próprio app). **Já aplicado no servidor
   pelo usuário** e verificado (301 → 200).
2. **Estrutura de auth:** **duas páginas separadas** (`/login` e `/register`), como o
   GitHub faz — cada uma com seu form e um botão/link cruzado para a outra. Sem toggle JS.
3. **Estilo:** visual no espírito do GitHub (tela de auth limilpa e centrada, card,
   botão cruzado de troca), reusando o CSS próprio já existente (sem framework).
4. **Regra signup com e-mail já cadastrado:** avisa **"Conta já criada com esse e-mail."**
5. **Regra signin com conta inexistente / senha errada:** mensagem **genérica**
   "E-mail ou senha inválidos." (não revela se a conta existe — padrão de segurança).
6. **Dashboard:** nome do usuário + botão "Sair" fixos no **rodapé inferior esquerdo**
   da tela (não mais um card centralizado).
7. **Landing page** (`/`) permanece como porta de entrada com os botões; será
   **enriquecida depois** — neste handoff só recebe alinhamento visual mínimo se preciso.

---

## Estado atual (pontos de toque)

- @app/templates/landing.html — hero com "Prumo" + tagline + 3 botões (Criar conta, Entrar, Google).
- @app/templates/auth/login.html — form e-mail/senha + Google + link "Criar conta".
- @app/templates/auth/register.html — form nome/e-mail/senha + Google + link "Entrar".
- @app/templates/dashboard.html — card centralizado com saudação + "Sair".
- @app/templates/base.html — layout base; bloco `content`; flash messages.
- @app/static/css/main.css — tema escuro, card, botões, form (sem framework).
- @app/services/auth_service.py — `register_user`, `authenticate_user`, `find_or_create_google_user`, `AuthError`.
- @app/routes/auth/auth.py — `POST /auth/register`, `POST /auth/login`, logout, Google.
- @app/routes/main/main.py — `GET /`, `/login`, `/register`, `/dashboard`.
- @site/.htaccess — redirect do repo (comentário diz "public_html/"; corrigir para o docroot do domínio).

---

## Etapas

### [x] Etapa 1 — Redirect prumoboard.com (verificar + acertar o repo)

**Objetivo:** Confirmar o redirect já aplicado e deixar o repositório coerente com o
local correto do `.htaccess` (docroot do domínio, não `public_html/`).

Arquivos:
@site/.htaccess
@issues/start/start-handoff.md

- [x] Verificar o redirect em produção (já aplicado pelo usuário): `prumoboard.com` → 301 → `app.prumoboard.com`.
- [x] `site/.htaccess` — manter a regra `Redirect 301 / https://app.prumoboard.com/`; adicionar comentário deixando claro que o destino é `public_html/prumoboard.com/.htaccess` (docroot do domínio), **não** `public_html/`.
- [x] `issues/start/start-handoff.md` — corrigir a Decisão nº 7 (que dizia ".htaccess em `public_html/`") para refletir o docroot específico do domínio.

**Verificar:**
```
curl -s -o /dev/null -w "%{http_code} -> %{redirect_url}\n" https://prumoboard.com/
curl -sL -o /dev/null -w "final:%{url_effective} %{http_code}\n" https://prumoboard.com/
```
Esperado: `301 -> https://app.prumoboard.com/` e final `200`. bianch.in e demais sites continuam normais.

_Notas de execução:_ Comentário adicionado ao `site/.htaccess` indicando o caminho correto no servidor (`public_html/prumoboard.com/.htaccess`). Decisão 7 do `start-handoff.md` corrigida para "docroot específico do domínio". Redirect em produção já verificado pelo usuário (301 → 200).

---

### [x] Etapa 2 — Telas de entrar/criar conta no estilo GitHub

**Objetivo:** `/login` e `/register` redesenhadas no estilo GitHub — duas páginas
separadas, cada uma com botão cruzado para a outra; mensagens de erro conforme as
regras acordadas.

Arquivos:
@app/templates/auth/login.html
@app/templates/auth/register.html
@app/services/auth_service.py
@app/static/css/main.css

- [x] `auth/login.html` — form e-mail/senha estilo GitHub; botão primário "Entrar"; separador "ou"; "Entrar com Google"; rodapé do card com botão/link cruzado "Criar conta" → `/register`.
- [x] `auth/register.html` — form nome/e-mail/senha; botão primário "Criar conta"; "Entrar com Google"; rodapé com botão cruzado "Entrar" → `/login`.
- [x] `auth_service.py` — ajustar a mensagem de signup duplicado para **"Conta já criada com esse e-mail."** (Decisão 4). Manter signin genérico "E-mail ou senha inválidos." (Decisão 5).
- [x] `main.css` — estilos para aproximar do GitHub (card, espaçamentos, botão cruzado destacado), sem framework.

**Verificar:** (local — `flask --app app run` na venv)
1. `/login` e `/register` abrem com o novo visual; o botão cruzado leva de uma à outra.
2. `POST /auth/register` com e-mail já existente → re-renderiza com flash "Conta já criada com esse e-mail." (HTTP 400).
3. `POST /auth/login` com conta inexistente **ou** senha errada → flash "E-mail ou senha inválidos." (HTTP 401).
4. Signup válido → login automático → `/dashboard`. Signin válido → `/dashboard`.

_Notas de execução:_ Templates `login.html` e `register.html` redesenhados: card com form + botão Google + caixa separada `.auth-switch` abaixo (estilo GitHub) com link cruzado para a outra tela. `auth_service.py`: mensagem de signup duplicado alterada para "Conta já criada com esse e-mail." `main.css`: adicionado `.auth-switch` com borda e `.auth-switch a`. `.alt` removido. Verificado localmente: `/login` 200, `/register` 200, POST register duplicado → 400 com "Conta já criada com esse e-mail.", POST login senha errada → 401 com "E-mail ou senha inválidos.", link cruzado presente em ambas as páginas.

---

### [x] Etapa 3 — Dashboard com nome + "Sair" no rodapé inferior esquerdo

**Objetivo:** Dashboard com o nome do usuário e o botão "Sair" fixos no canto inferior
esquerdo da tela, no lugar do card centralizado.

Arquivos:
@app/templates/dashboard.html
@app/static/css/main.css
@app/templates/base.html

- [x] `dashboard.html` — área principal do dashboard (vazia/placeholder por ora) + um rodapé/aside fixo no inferior esquerdo com `current_user.name or current_user.email` e botão "Sair" → `auth.logout`.
- [x] `main.css` — estilo do bloco fixo (posição inferior esquerda, discreto, responsivo). Atenção: o `body` hoje é `flex` centralizado para as telas de auth — garantir que o dashboard não herde a centralização (usar classe própria ou ajustar o layout).
- [x] Conferir se `base.html` precisa de um bloco/área para esse rodapé fixo ou se o template do dashboard se vira sozinho.

**Verificar:** (local)
1. Login → dashboard: nome do usuário visível no rodapé inferior esquerdo + botão "Sair".
2. Clicar "Sair" → redirect `/`.
3. `/dashboard` sem sessão → redirect `/login`.
4. As telas de auth continuam centralizadas (não foram afetadas pela mudança de layout do dashboard).

_Notas de execução:_ `base.html` ganhou `{% block body_class %}` no `<body>` para isolar o layout do dashboard. `dashboard.html` reescrito: `{% block body_class %}dashboard-page{% endblock %}`, área `.dashboard-main` (placeholder vazio), `<footer class="dashboard-footer">` fixo no inferior esquerdo com `.user-label` (nome/email) e `.btn-sm` "Sair". `main.css`: `body.dashboard-page` sobrescreve `display: block` (desfaz o flex centralizado); `.container` perde `max-width` e `padding`; `.dashboard-footer` com `position: fixed; bottom: 1rem; left: 1rem`; `.btn-sm` inline. Verificado localmente: login → dashboard 200 com `dashboard-page`, nome e botão "Sair" visíveis; Sair → 302 para `/`; dashboard sem sessão → 302 para `/login`; `/login` continua com `body class=""` (não herdou dashboard-page).

---

## Riscos / observações

- **`.htaccess` no lugar errado quebra outros sites.** O redirect tem de ficar em
  `public_html/prumoboard.com/.htaccess`. Em `public_html/.htaccess` cascatearia para
  bianch.in, ricardo.bianch.in e até o próprio app (loop). Já aplicado corretamente.
- **`body` centralizado:** o CSS atual centraliza tudo via flex no `body` (bom para
  auth, ruim para o dashboard de tela cheia). A Etapa 3 precisa isolar o layout do
  dashboard sem desalinhar as telas de auth.
- **Regras de erro já existem** no `auth_service.py`; a Etapa 2 só ajusta a mensagem
  de signup duplicado e confirma a genérica do signin.
- **Deploy:** após o aval de cada etapa, `git push` + `python deploy.py` (ver CLAUDE.md).
- **Landing fica para depois:** enriquecimento da landing não é escopo aqui.
