Commit Graph

409 Commits

Author SHA1 Message Date
Leonardo 25444c1f5f MelissaBloqueios: pagina nativa 2-col com nacionais + municipais + bloqueios
Tira "Bloqueios" do MelissaConfiguracoes (era embed cfg-bloqueios ->
BloqueiosPage.vue) e cria a /melissa/bloqueios nativa Melissa.

Sidebar (mbq-side):
- Card "Resumo" — 3 mini-stats coloridos (Nacionais blue, Municipais
  orange, Bloqueios red) + nav de ano (chevron < ANO > )
- Card "Adicionar" — 2 CTAs (Feriado municipal secundario + Novo
  bloqueio primary)
- Card "Como funciona" — FAQ 3-bullets explicando os tipos

Main (50/50 desktop, com Bloqueios full-row abaixo):
- Card Nacionais — read-only (gerado automaticamente), tags Movel
- Card Municipais — CRUD via dialog (nome + data + observacao)
- Card Bloqueios — CRUD via dialog (titulo + datas + horas + obs +
  recorrente). Border-left colorido por tipo (azul/laranja/vermelho).
- Items com data + titulo + observacao inline + acoes (edit/trash)

Cards aplicam o pattern dos anteriores: min-h 300, max-h 100%, body
overflow-y: auto. Bloqueios spans 2-col com .mbq-w--full.

Logica espelhada do BloqueiosPage (composable useFeriados +
agenda_bloqueios). Compativel com /configuracoes/bloqueios legacy.

Wire-up:
- MelissaLayout: import + render `<MelissaBloqueios>` quando
  secaoAberta === 'bloqueios'
- 'bloqueios' sai de MELISSA_CONFIG_ALIASES, entra em
  MELISSA_NON_CONFIG_SLUGS
- SECOES.bloqueios adicionado (icone pi-ban)
- MelissaConfiguracoes: cfg-bloqueios removido de COMPONENT_MAP,
  ROUTE_ALIASES e do grupo Agenda (resta cfg-agenda + cfg-agendador)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:21:44 -03:00
Leonardo 33370018b5 MelissaSeguranca: breakpoint mobile <768px (era <1024px)
Como a pagina e enxuta (so 1 form pequeno + sidebar com info), cabe
bem em tablet portrait. Reduzi o breakpoint mobile pra 768px e
adaptei a formula da largura:

- 768-1012px : full-width (right: 6px)
- 1012-2012px: width fixo 1000px
- >= 2012px  : ~50% do viewport (right: 50%)

Formula: right = max(6px, min(50%, calc(100% - 1006px)))

JS _mqMobile tambem atualizado pra (max-width: 767px).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:10:03 -03:00
Leonardo 3549a977cc MelissaSeguranca: pagina min 1000px de largura no desktop
Antes era right: 50% fixo, o que dava ~512px em viewports 1024-1100
(cramped p/ um form de senha + sidebar 320px).

Agora right = min(50%, calc(100% - 1006px)):
- viewport <  2012: page fixa em 1000px (nao shrink)
- viewport >= 2012: page = 50% (sobra mais espaco no lado direito)

Mobile (<1024px) continua full-width via media query existente.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:07:03 -03:00
Leonardo df7ab9c5a8 MelissaSeguranca: pagina 50% alinhada a esquerda
Troca a centralizacao (left: 25% + right: 25%) por alinhamento a
esquerda: left fica em 6px (do inset base) e right: 50% (push do
edge direito pro meio). Pagina passa a ocupar a metade esquerda
do viewport, encostada na borda esquerda.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:04:10 -03:00
Leonardo a89745f668 MelissaSeguranca: pagina 50% de largura em desktop
Em desktop a pagina ocupa apenas 50% da largura util (left: 25% +
right: 25%), centralizada. Como Seguranca so tem 1 form pequeno
(Trocar senha + sidebar de info), nao precisa de toda a largura
do viewport. Em mobile mantem 100% (override so na media query
>= 1024px).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:03:25 -03:00
Leonardo c605a4f1a2 MelissaSeguranca: card Trocar senha altura por conteudo + scroll y auto
Em desktop o card .mse-w do main (Trocar senha) ganha:
- max-height: 100% (do .mse-main) — nao passa do viewport
- SEM min-height — altura natural por conteudo
- body com flex: 1 + min-height: 0 + overflow-y: auto pra scroll
  interno quando o conteudo (3 inputs + barra de forca + match +
  warning + 2 botoes) precisar de mais espaco que o disponivel.

Diferente da sidebar (que mantem min-h 300 pq pode haver pouca info).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:59:26 -03:00
Leonardo 2ca9cde2ea MelissaSeguranca: pagina nativa 2-col + grupo "Conta" sai inteiro de Configuracoes
Tira "Seguranca" do MelissaConfiguracoes (era embed cfg-seguranca ->
SecurityPage.vue) e cria a /melissa/seguranca nativa Melissa.

Sidebar (mse-side):
- Card "Estado da conta" — email (mono) + tag "Sessão Ativa" pulsando
  + warning amber sobre desconectar todos dispositivos
- Card "Boas praticas" — 4 dicas com bullet colorido (8+ chars,
  evite obvio, encerre sessao publica, nao reuse senhas)

Main:
- Card "Trocar senha" — 3 Password inputs (atual + nova + confirmar)
  + barra de forca 4-segmentos (Muito fraca/Fraca/Boa/Forte) +
  match indicator (check verde / x amber) + warning + 2 botoes:
  "Enviar link por e-mail" (reset por email) + primary "Trocar senha"
- Estado "concluido" com check verde + redirect pro login

Logica espelhada do SecurityPage:
- changePassword: signInWithPassword pra reautenticar + updateUser +
  hardLogout (signOut global + clear sb-* tokens) apos 2.6s
- sendResetEmail: resetPasswordForEmail com redirectTo /auth/reset-password

Wire-up:
- MelissaLayout: import + render `<MelissaSeguranca v-if=secaoAberta=='seguranca'>`
- 'seguranca' sai de MELISSA_CONFIG_ALIASES, entra em MELISSA_NON_CONFIG_SLUGS
- SECOES.seguranca atualizado (label + descricao + duplicado removido)
- MelissaConfiguracoes: cfg-seguranca removido de COMPONENT_MAP +
  ROUTE_ALIASES; grupo "Conta" inteiro removido (Perfil/Plano/Negocio/
  Seguranca todos viraram nativos agora)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:57:27 -03:00
Leonardo 7c0c1b3528 MelissaPlano/AlterarPlano desktop: cards min-h 300 + body scroll
Aplica o mesmo fix do MelissaPerfil/Negocio:
- align-items: start no grid (cells nao stretch p/ row height)
- Cards min-height 300px + max-height 100% (do container)
- .mpl-w__body / .map-w__body com flex: 1 + min-height: 0 +
  overflow-y: auto (scrollbar fina)

MelissaPlano: vale pros 2 cards do main (Recursos / Historico) e
pros 2 cards da sidebar (Plano atual / Resumo) — quando o user
tem features longas ou muitos eventos, scroll interno engata.

MelissaAlterarPlano: aplicado SO na sidebar (Plano atual / Filtros).
Os plan cards do main (.map-plan) ficam fora — sao product cards
com layout proprio (preco grande + 3 CTAs).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:51:47 -03:00
Leonardo 5db6000c2c MelissaPerfil/Negocio desktop: cards min-h 300, max-h 100%, body scroll
Em desktop os cards ficavam com altura natural do conteudo, e o
.mpr-main / .mng-main scrollava externamente. Quando o usuario
adicionava redes sociais (ou customs), o card crescia, empurrava a
row do grid e o conteudo novo ficava fora do viewport sem feedback
de scroll claro.

Fix:
- align-items: start no grid (cells nao stretch p/ row height)
- Cada card min-height: 300px + max-height: 100% (do container)
- .mpr-w__body / .mng-w__body com flex: 1 + min-height: 0 +
  overflow-y: auto (scrollbar fina)
- Vale tanto pros cards do main (Identidade/Contato/Bio/Redes etc)
  quanto pros da sidebar (Sua evolucao/presenca + Avatar/Logomarca)
  que tinham o mesmo problema com badges/dicas

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:49:30 -03:00
Leonardo 5a2d24dd99 MelissaAlterarPlano: pagina nativa pra escolha de plano
Substitui o redirect pra /therapist/upgrade (que sai do overlay
Melissa) por uma pagina nativa em /melissa/alterar-plano com o
mesmo chrome 2-col das outras.

Sidebar (map-side):
- Card "Plano atual" — nome destacado em primary box + key + valor
  + status; ou empty state se nao tem plano pessoal
- Card "Filtros" — busca por nome/key/desc + chips Mensal/Anual
- Footer: botao "Voltar pro Meu Plano"

Main:
- Grid responsivo 1/2/3 cols (mobile/md/xl) de plan cards
- Cada card: nome + key (mono) + tag "Atual" se for o plano atual,
  descricao, preco grande (do interval selecionado), CTA primario
  "Escolher mensal/anual" + 2 botoes secundarios (Mensal | Anual)
  cada um mostrando seu preco abaixo do label
- Card destacado com border primary se for o plano atual
- Empty state: filtro vazio com botao "Limpar busca"

Logica:
- preflight: valida sessao + plano + interval + preco ativo + nao ja
  estar nesse plano/intervalo
- choosePlan: se ja tem subscription -> RPC change_subscription_plan
  + update do interval; se nao tem -> insert manual em subscriptions.
  Apos sucesso, emit('goto', 'plano') volta pro MelissaPlano com
  estado fresh.

Wire-up:
- MelissaLayout: import + render `<MelissaAlterarPlano>` com
  @goto="abrirSecao"
- 'alterar-plano' adicionado em SECOES + MELISSA_NON_CONFIG_SLUGS
- MelissaPlano.goUpgrade() agora router.push pra Melissa(secao=alterar-plano)
  em vez de /therapist/upgrade

Espelha o TherapistUpgradePage.vue (subscriptions + plans target=therapist
+ plan_prices + RPC change_subscription_plan), compativel com fluxo legacy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:42:45 -03:00
Leonardo 0c88cc2e72 MelissaNegocio: pagina nativa 2-col com gamificacao + logomarca
Tira "Meu Negocio" do MelissaConfiguracoes (era embed cfg-negocio
-> Negociopage.vue) e cria a /melissa/negocio nativa Melissa.

Sidebar (mng-side):
- Card "Sua presenca" — gamificacao 7 niveis (Cadastro Basico ->
  Excelencia) + barra de progresso + 7 badges (Nomeado, Categorizado,
  Regularizado, Localizado, Acessivel, Identificado, Online) +
  dicas do que falta. Badges/dicas com ancora pra sessao.
- Card "Logomarca" — preview 96x96 (object-fit: contain) + upload/
  remover (bucket 'logos', max 2MB, PNG/SVG/JPG/WebP)

Main (50/50 desktop):
- Identidade: nome_fantasia* + razao_social + tipo_empresa* (Select 8 opcoes)
- Dados Fiscais: cnpj (mask 99.999.999/9999-99) + IE + IM
- Endereco: cep (mask + ViaCEP autofill onBlur) + logradouro + numero
  + complemento + bairro + cidade + estado (Select UFs BR)
- Contato: telefone (mask) + email (placeholder=" ") + site
- Redes Sociais: array com add/remove (name + url)

Validacao: nome_fantasia + tipo_empresa obrigatorios.
URL: /melissa/negocio. Compativel com /account/negocio (mesma tabela
company_profiles + bucket logos).

Wire-up:
- MelissaLayout: import + render
- 'negocio' sai de MELISSA_CONFIG_ALIASES, entra em MELISSA_NON_CONFIG_SLUGS
- SECOES.negocio descricao atualizada
- MelissaConfiguracoes: cfg-negocio removido de COMPONENT_MAP,
  ROUTE_ALIASES e do grupo "Conta" (so resta Seguranca agora)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:38:48 -03:00
Leonardo 6395c4c0b6 MelissaPlano: pagina nativa 2-col com assinatura + recursos + historico
Tira "Meu Plano" do MelissaConfiguracoes (era embed cfg-plano ->
TherapistMeuPlanoPage.vue) e cria a /melissa/plano como pagina
nativa Melissa no padrao das outras 2-col.

Sidebar (mpl-side):
- Card "Plano atual" — nome destacado + valor + status + ciclo
  + proxima renovacao (com badge cancelamento agendado vs auto) +
  descricao do plano
- Card "Resumo" — mini-stats: Recursos / Eventos / Renova-Encerra +
  ID da assinatura
- Footer: botao "Alterar plano" (router.push /therapist/upgrade)

Main:
- Card "Seu plano inclui" — features agrupadas por modulo (a partir
  do prefix antes do . ou _ na key), cada item com check verde +
  key + descricao em 1 linha (ellipsis), grid 1-2 cols
- Card "Historico" — subscription_events com tag de tipo + before
  -> after dos plan_ids + autor (profiles join) + reason + metadata
  (max 50 eventos)

Estados:
- Loading: skeletons na sidebar + main
- Sem assinatura: empty state grande no main com CTA "Ver planos",
  empty compacto na sidebar
- Erro: toast (mesma logica do TherapistMeuPlanoPage)

Wire-up:
- MelissaLayout: import + render `<MelissaPlano v-if=secaoAberta=='plano'>`
- 'plano' sai de MELISSA_CONFIG_ALIASES, entra em MELISSA_NON_CONFIG_SLUGS
- SECOES.plano descricao atualizada (Assinatura, recursos, historico)
- MelissaConfiguracoes: cfg-plano removido de COMPONENT_MAP,
  ROUTE_ALIASES e do grupo "Conta" (continua com Negocio + Seguranca)

Logica de fetch espelhada do TherapistMeuPlanoPage (subscriptions +
plans + plan_prices + plan_features + features + subscription_events
+ profiles), compativel com a /therapist/meu-plano legacy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:31:50 -03:00
Leonardo 56d30b4285 MelissaPerfil: cards Sua evolucao e Avatar com bg --m-bg-medium
Espelha o pattern do MelissaPacientes (.mp-w dentro de .mp-side):
sidebar tem bg --m-bg-soft e os cards .mpr-w--side ganham bg
--m-bg-medium pra destacar com contraste sutil. Antes ambos eram
soft e os cards sumiam contra o fundo.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:26:05 -03:00
Leonardo dc57caf534 MelissaPerfil: botao Salvar mostra o texto em mobile
Remove o display: none do span do .mpr-act-btn--primary em mobile.
Salvar e acao primaria importante o suficiente pra ocupar espaco
do label + icone no header.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:24:52 -03:00
Leonardo 9e4421b7ff MelissaPerfil: cards mobile com altura por conteudo
Em mobile cada .mpr-w no main vira flex: 0 0 auto + height: auto +
align-self: stretch. Garante que cada card ocupa exatamente a
altura do seu conteudo sem ser comprimido nem esticado pelo flex
column do .mpr-main.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:24:33 -03:00
Leonardo dad1fd72c2 MelissaPerfil: cards com chrome estilo financeiro (icon-box + sub + body)
Cada card .mpr-w agora segue o mesmo padrao visual do MelissaFinanceiro:
- Head: icon-box 36x36 com bg primary-tint + titulo + subtitulo
- Border-bottom separando head do body
- Body wrappado em .mpr-w__body com padding 14px e gap 12px
- Box-shadow elevando o card sobre o bg da sidebar/main

Subtitulos novos por card:
- Sua evolucao  : Nivel, conquistas e pendencias
- Avatar        : Foto exibida no menu e cabecalho
- Identidade    : Nome, apelido e descricao profissional
- Contato       : WhatsApp e e-mail de login
- Bio           : Apresentacao curta para o seu perfil publico
- Sites e Redes : Site, redes sociais e links customizados

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:22:22 -03:00
Leonardo f2fd2e4722 MelissaPerfil: scroll mobile + ancoras nos badges + email placeholder + 50/50 desktop
1. Mobile scroll fix: .mpr-main ganha min-height: 0 (faltava pra
   permitir shrink dentro do flex column do .mpr-body em mobile, sem
   isso o overflow-y: auto nao engatava).

2. Badges e dicas viraram <button> com @click que rola pra sessao
   correspondente do form (Identidade / Avatar / Bio / Contato /
   Redes). Em mobile o drawer fecha antes do scroll (exceto Avatar,
   que vive na propria sidebar). Cada card .mpr-w ganhou id pra
   ancora (mpr-sec-*).

3. Email readonly recebe placeholder=" " (espaco) — sem ele o
   FloatLabel variant=on ficava em cima do email enquanto o user
   nao tinha foco, pq :placeholder-shown nao aplica.

4. Desktop (>=1024px): .mpr-main vira grid 2 colunas (50/50). Os 4
   cards (Identidade, Contato, Bio, Redes) ficam lado a lado em
   pares. Internal .mpr-grid colapsa pra 1 col nesse modo, e
   .mpr-field--half passa a span 1/-1 — evita ficar cramped em
   metade da largura.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:14:49 -03:00
Leonardo abd4f8f34c MelissaPerfil: pagina nativa 2-col com gamificacao no aside
Tira "Meu Perfil" do MelissaConfiguracoes (era embed cfg-perfil ->
ProfilePage.vue) e cria a /melissa/perfil como pagina nativa Melissa
no padrao das outras 2-col (sidebar + main).

Sidebar (mpr-side):
- Card "Sua evolucao" — gamificacao: nivel atual + barra de progresso
  + XP-to-next + 7 badges (earned/locked) + dicas do que falta
- Card "Avatar" — preview + upload (5MB max) + remover
- Footer: botao "Sair da conta" (com Confirm dialog)

Main:
- Card Identidade: full_name + nickname + work_description (+ outro)
- Card Contato: phone (mask BR) + email read-only
- Card Bio: textarea
- Card Sites e Redes: site/IG/YT/FB/X + customSocials (add/remove)

O que ficou de fora (vs ProfilePage.vue):
- Aparencia (tema/cores) — vive no MelissaConfiguracoes Layout Melissa
- Layout Variant (Rail/Classic/Melissa) — irrelevante dentro do Melissa
- Trocar senha — empurrado pro cfg-seguranca
- Preferencias (idioma/timezone/notifs) — fora de escopo do MVP

Wire-up:
- MelissaLayout: import + render `<MelissaPerfil v-if=secaoAberta=='perfil'>`
- 'perfil' sai de MELISSA_CONFIG_ALIASES, entra em MELISSA_NON_CONFIG_SLUGS
- SECOES.perfil descricao atualizada
- MelissaConfiguracoes: cfg-perfil removido de COMPONENT_MAP, ROUTE_ALIASES
  e do grupo "Conta" (continua com Plano + Negocio + Seguranca)

Logica de load/save espelhada do ProfilePage (auth.user_metadata +
profiles + storage avatars), compativel com a /account/perfil legacy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 15:06:22 -03:00
Leonardo 44135a961f MelissaConfiguracoes: gap entre os panels do accordion
Adiciona display: flex + flex-direction: column + gap: 8px no
.p-accordion pra os AccordionPanels nao colarem um no outro
quando todos estao fechados.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:53:56 -03:00
Leonardo ac8308f45b MelissaConfiguracoes: desc pode quebrar em ate 2 linhas
Volta -webkit-line-clamp: 2 no .mcfg-grp-desc e
.mcfg-nav-item__desc — descricao quebra em 2 linhas se precisar
ao inves de cortar com ellipsis em 1 linha.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:53:16 -03:00
Leonardo 1b5214c90b MelissaConfiguracoes: titulo + subtitulo de volta no accordion
Restaura label + desc tanto no header do grupo quanto no sub-item,
com altura confortavel (min-height 44px no item). Optimizacoes
mantidas pra evitar lag:

- Sem -webkit-line-clamp (custoso com o backdrop-filter do parent);
  desc 1 linha com text-overflow: ellipsis
- Icone inline (16-18px, sem caixa 32x32 + box-shadow transition)
- Sem transition de color-mix em hover

Hover/active continuam com cor primary (12-16%). Desc no hover/active
ganha tom misturado primary 70% pra ficar legivel sem competir com
o label.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:52:46 -03:00
Leonardo a0948919ef MelissaConfiguracoes: accordion enxuto pra tirar o lag
Continua usando o <Accordion> do PrimeVue, mas DOM/CSS bem mais leves:

- Header: icone inline + label + badge (era icone 36x36 caixa
  centralizada + label + desc 2-linhas + badge)
- Sub-itens: botao denso 1-linha (icone + label, desc vai pro
  title="" como tooltip nativo)
- Removidas transitions de box-shadow e color-mix nos hovers
  (eram custosas com o backdrop-filter blur do parent)
- Removidas as line-clamp 2-linhas em cada item (~30 itens
  abertos = ~30 layouts caros)
- Hover/active dos sub-itens com color-mix(--p-primary-color),
  alinhado com o padrao do MelissaMenu (.mm-foot-item)
- Padding compactado, gap entre items 1px (era 6px)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:49:38 -03:00
Leonardo e912558769 MelissaConfiguracoes: Layout Melissa unificado em 1 pagina
Antes a sidebar tinha 4 items (Aparencia / Plano de fundo / Relogio /
Cronometro), cada um abria uma sessao separada. Agora vira 1 unico
item "Layout Melissa" com os 4 cards stackeados em uma tela so.

- grupos[0].items reduzido pra 1 entrada (key: aparencia, label:
  Layout Melissa)
- INLINE_KEYS so tem 'aparencia' agora
- DEPRECATED_ALIASES adicionado: /melissa/fundo, /melissa/relogio,
  /melissa/cronometro -> 'aparencia' (URLs antigas continuam abrindo
  a tela unificada)
- Template: 4 v-if/v-else-if -> 1 <template v-if> com os 4 .mcfg-w
  como siblings
- MelissaLayout SECOES.aparencia label: "Configuracoes do Melissa"
  -> "Layout Melissa" (icon palette)
- MelissaMenu CATEGORIAS aparencia label idem

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:44:24 -03:00
Leonardo 66441c1744 MelissaMenu: busca tambem casa pelo nome da categoria
Se o termo bate com o label da categoria (ex: "financeiro"),
inclui todos os sub-itens dessa categoria nos resultados. Antes
so casava por label do sub-item.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:38:05 -03:00
Leonardo 9c6d77ec56 MelissaMenu: busca no topo do mm-side (estilo rail)
Input com pi-search a esquerda + botao limpar a direita. Quando
query tem texto, substitui a lista de categorias por uma lista
flat de sub-itens que casam (com nome da categoria a direita
como breadcrumb). Click no resultado dispara clicarSubItem (mesma
logica de navegacao) e limpa o termo. Empty state pra "nenhum
resultado".

Visual segue mm-aside: bg --m-bg-soft, border --m-border, focus
border --p-primary-color. Hover dos resultados usa color-mix
primary 12% (mesmo pattern do .mm-foot-item).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:33:58 -03:00
Leonardo 0dd070c6a5 Revert: divisor degrade entre .mm-cat
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:32:09 -03:00
Leonardo 7572cb3295 MelissaMenu: divisor com degrade entre categorias
Cada .mm-cat (exceto a ultima) ganha um ::after de 1px que sai
colado na borda esquerda e some no meio via linear-gradient
(--m-border-strong -> transparent). Da uma separacao visual
sutil sem precisar de border-bottom solido.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:30:04 -03:00
Leonardo 72f989f23c MelissaMenu: icones do .mm-aside na cor primary
.mm-sub__icon e .mm-link-row__icon agora usam --p-primary-color
em vez de --m-text-muted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:28:27 -03:00
Leonardo d8968d9aec MelissaMenu: hover/active primary nos itens do rodape
Hover e is-active dos .mm-foot-item agora usam --p-primary-color (text +
icone + bg color-mix 12-16%). Trocado "Meus Planos" -> "Meu Plano"
(singular). Cada item ganha is-active baseado em props.secaoAtiva
(perfil/plano/negocio/seguranca), Modo escuro fica is-active quando
isDarkTheme = true, Cores do Tema mantem is-active baseado em
themeViewActive.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:24:53 -03:00
Leonardo 684f673cc1 MelissaMenu: switch on/off no Modo escuro
Substitui o pill "Ligado/Desligado" por um switch CSS visual (track
+ thumb que desliza). Usa --p-primary-color quando ligado. O button
mantem o toggleDarkAndPersist no click + aria-pressed pra leitor de
tela. Switch tem aria-hidden pq a semantica vive no botao.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:16:01 -03:00
Leonardo e344661d4d MelissaMenu: categoria abre alinhada com a secao ativa
Antes o menu sempre abria em "Agenda e Pacientes" (CATEGORIAS[0]).
Agora resolve qual categoria contem o sub-item secaoAtiva e abre
direto nela: ex. estando em /melissa/financeiro-lancamentos, o menu
abre ja em "Financeiro". Sem secaoAtiva (resumo), mantem default
agenda-pacientes.

Watcher em props.secaoAtiva sincroniza o destaque se o user troca de
sessao com o menu aberto.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:14:28 -03:00
Leonardo 6495cefb7e MelissaFinanceiro mobile: .mf-card 300px fixo + scroll interno
Em mobile cada .mf-card tem min/max-height 300px com scroll no body
(flex: 1 + min-height: 0 + overflow-y: auto). Garante que o "Ultimos
lancamentos" fique visivel e cada card tenha altura previsivel sem
consumir toda a altura do .mf-body. Chart wrap vira flex: 1 dentro
do body de 300px - head.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:11:46 -03:00
Leonardo 0a24fd6233 MelissaFinanceiro: fix mobile - lancamentos sumindo
Em mobile reseta flex: 1 dos cards do row 50/50 (chart + projecao)
pra altura natural. O flex: 1 do desktop fazia os cards consumirem
toda a altura do .mf-body e empurrar o "Ultimos lancamentos" pra
fora do scroll visivel. Agora todos sizam por content em mobile.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:07:32 -03:00
Leonardo ef4c4d0fac MelissaFinanceiro: chart + projecao 50/50, lancamentos full-width
Wrappa "Receita x Despesa" e "Projecao de Caixa" em .mf-cards-row
flex 50/50 lado a lado em desktop (alturas iguais via align-items:
stretch + body flex: 1 com scroll interno). "Ultimos lancamentos"
fica full-width abaixo.

Mobile empilha (column), chart wrap volta pra altura fixa 240px,
body sem scroll interno (.mf-body ja scrolla).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:04:59 -03:00
Leonardo d8ce33f74f MelissaRelatorios: tabela primeiro, chart depois
Inverte a ordem dentro do .mr-charts-row via flex order — "Sessoes no
periodo" (tabela) em 1o lugar, "Sessoes por mes/semana" (chart) em 2o.
Vale pra desktop (esquerda/direita) e mobile (em cima/embaixo).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:58:17 -03:00
Leonardo 6d693a0a3b MelissaRelatorios: chart + tabela 50/50 + min-height mobile
Wrappa "Sessoes por mes/semana" e "Sessoes no periodo" em .mr-charts-row
flex 50/50 lado a lado em desktop. Mobile empilha (column) e a tabela
ganha min-height: 360px pra nao colapsar pra ~50px em telas curtas.
Chart wrap/skel viram flex: 1 dentro do card-chart pra acompanhar a
altura compartilhada da row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:56:32 -03:00
Leonardo bad828cab3 Melissa pages: esconde page-title-icon em mobile
No mobile o botao "Menu Lancamentos/Notificacoes/etc" ja indica a sessao,
entao o pi-list/pi-bell ao lado do contador era redundante. Adiciona
.<prefix>-page__title-icon { display: none; } no @media max-width: 1023px.
Em MelissaConversas usa > i:first-child (icone nao tem classe dedicada).

Pages: FinanceiroLancamentos, Compromissos, Documentos, CadastrosRecebidos,
Conversas, AgendamentosRecebidos, Financeiro, Grupos, Notificacoes, Tags,
Medicos, Relatorios, Recorrencias.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:54:28 -03:00
Leonardo 02af119dc6 Melissa drawers: footer colado no bottom (pattern AppMenu)
Refator do mobile drawer em todas as Melissa Pages com sidebar:
scroll move pra dentro de .xx-side__scroll (flex: 1 + min-height: 0)
e o __footer vira flex-shrink: 0 last child de flex column. Espelha
o pattern do AppMenu/layout-sidebar Rail. Substitui o sticky/margin:auto
que falhava quando o conteudo era pequeno (deixava espaco vazio sob
o "Limpar filtros").

Pages: Compromissos, Conversas, Documentos, FinanceiroLancamentos,
Grupos, Medicos, Notificacoes, Pacientes, Recorrencias, Relatorios, Tags.

Pacientes (caso especial): mp-quick fixo no topo (max-height: 50%)
+ mp-side flex: 1 com scroll/footer interno.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 11:30:52 -03:00
Leonardo 48bf2726a5 Drawer mobile + footer colado + Menu nomeado + tenant ensureLoaded
Tres ajustes globais nas Melissa Pages com sidebar:

1) FOOTER "Limpar filtros" colado no bottom do drawer mobile

   Problema: o sticky bottom precisa que algum container parent
   tenha altura definida e overflow. No drawer, o `.xx-side` tinha
   `height: auto` — entao o footer ficava no fluxo natural (logo
   apos os cards) mesmo com pouco conteudo, em vez de empurrado pro
   bottom do drawer.

   Fix: `.xx-mobile-drawer__scroll .xx-side` ganha
   `flex: 1; min-height: 0; display: flex; flex-direction: column`
   pra ocupar altura disponivel; o `.xx-side__footer` ganha
   `margin: auto -12px -24px` (margin-top: auto empurra pro fim).
   Sticky bottom continua pro caso de scroll com muito conteudo.

   Aplicado em: Compromissos, Grupos, Tags, Medicos, Conversas,
   Recorrencias, Pacientes (caso especial — separa .mp-side de
   .mp-quick), Cadastros Recebidos, FinanceiroLancamentos.

2) DRAWER MOBILE adicionado em Notificacoes, Documentos e
   Relatorios (estavam com sidebar virando topo via max-height
   50vh — faltava o pattern oficial das demais Melissa Pages).

   Pattern aplicado:
   - Aside host com id="<prefix>-mobile-drawer-target" + Transition
     backdrop com fade
   - Botao "Menu <Secao>" no header (esquerda do titulo)
   - <Teleport :disabled="!isMobile"> envolvendo a sidebar
   - Script: drawerOpen + isMobile + matchMedia listener registrado
     no onMounted, removido no onBeforeUnmount
   - CSS completo: .xx-mobile-drawer (fixed, transform translateX),
     __scroll (overflow + padding), __backdrop (rgba 0.45 + blur),
     overrides quando teleportada (sidebar perde bg/border-right,
     footer vira sticky bottom com margin-top auto)

3) Botao "Menu" passa a ter sufixo da pagina:
   - "Menu Lancamentos" (FinanceiroLancamentos)
   - "Menu Notificacoes" (Notificacoes)
   - "Menu Documentos" (Documentos)
   - "Menu Relatorios" (Relatorios)
   - "Menu Agendamentos" (AgendamentosRecebidos — corrigido tambem)

4) Bug de "lista vazia ao carregar via URL direto":

   FinanceiroLancamentos e Relatorios usam composables que dependem
   de tenantStore.activeTenantId. Quando aberta direto via URL
   (sem navegar pelo menu), o tenantStore pode nao estar inicializado
   ainda — entao fetchRecords() / loadSessions() retornam vazio.

   Fix: adicionar `await tenantStore.ensureLoaded()` no onMounted
   antes do fetch. Ja era pattern usado em outras Melissa Pages
   (Compromissos, etc).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 10:40:07 -03:00
Leonardo 532204708e Documentos + Templates + Relatorios nativas (so resta online-scheduling)
Promove '/melissa/documentos', '/melissa/documentos-templates' e
'/melissa/relatorios' do embed pra paginas nativas Melissa.

MelissaDocumentos (~700L):
- Sidebar com stats (Total / Tamanho / Tipos / Pendentes amber) +
  filtro Tipo (Select com TIPOS_DOCUMENTO 11 opcoes) + filtro Tag
  (Select dinamico com usedTags) + footer fixo Limpar filtros
- Main: toolbar busca + lista de DocumentCard (componente reusado)
- Modo "todos os pacientes" — patientId null. Upload/Gerar exigem
  abrir paciente especifico no prontuario (botoes nao aparecem).
- Dialogs reusados: PreviewDialog + SignatureDialog + ShareDialog +
  ConfirmDialog (delete).

MelissaDocumentosTemplates (~700L):
- Layout 1-col empilhado, 3 views: list / create / edit
- Header com botao "Novo template" (list) ou "Cancelar/Salvar"
  (create/edit) + back button
- 2 sections distintas: "Templates padrao do sistema" (info-blue,
  click duplica) e "Meus templates" (accent, click edita + menu de
  acoes Duplicar/Editar/Desativar)
- Cards em grid responsivo (auto-fill 280px), com badge "padrao"/
  "inativo" e count de variaveis
- DocumentTemplateEditor reusado pra create/edit
- ConfirmDialog reusado

MelissaRelatorios (~1100L):
- Sidebar com 6 stats (Total / Realizadas verde / Faltas red /
  Canceladas warn / Agendadas info / Taxa realizacao) + filtro
  Periodo (button list: semana/mes/3meses/6meses) + filtro Status
  (Realizadas/Faltas/Canceladas/Agendadas com cores) + footer
  Limpar filtros
- Main: card Grafico (Chart.js stacked bar agrupado por
  semana/mes) + card DataTable de sessoes filtradas (Data/Hora
  sortable / Paciente / Sessao / Modalidade / Status)
- Empty states distintos: sem sessoes no periodo / sem resultado
  do filtro

Logica preservada das paginas originais. Composables/services nao
foram tocados — apenas adaptacao do chrome pra blueprint Melissa.

DocumentsListPage / DocumentTemplatesPage / RelatoriosPage
continuam intactas no layout Rail (/therapist/*, /admin/*).

Wire-up MelissaLayout: imports + 3 render blocks + 'documentos',
'documentos-templates', 'relatorios' literais em NON_CONFIG_SLUGS;
removidos de MELISSA_EMBED_KEYS. Entries removidos do EMBED_MAP em
MelissaEmbed (resta apenas 'online-scheduling').

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 10:14:16 -03:00
Leonardo 387043b3b2 MelissaFinanceiro + MelissaFinanceiroLancamentos nativas
Promove '/melissa/financeiro' e '/melissa/financeiro-lancamentos' do
embed pra paginas nativas, eliminando o triplo header.

MelissaFinanceiro (dashboard, ~700L):
- Layout 1-col empilhado (sem sidebar — so cards de resumo)
- Header com ícone wallet + titulo + badge mes corrente +
  botao "Ver lancamentos" + Recarregar + Voltar
- Subheader explicativo
- 4 cards empilhados:
  1. Quick stats grid (Recebido verde / Pendente amber / Vencido red /
     Despesas neutral)
  2. Card Grafico Receita x Despesa (Chart.js bar, 6 meses)
  3. Card Projecao de Caixa (cobrancas em aberto, proximos 6 meses
     com receita/despesa/saldo + count badge)
  4. Card Ultimos lancamentos (DataTable 5 mais recentes)
- Click "Ver lancamentos" / "Ver todos" navega pra
  /melissa/financeiro-lancamentos

MelissaFinanceiroLancamentos (lista, ~1100L):
- Blueprint tabular Melissa completo
- Header com botao "Lancamento manual" + Recarregar + Voltar
- Subheader
- Sidebar com __scroll + __footer fixo:
  - Stats (Pendente amber / Vencido red / Pago verde / Total)
  - Filtro Status (button list: Pendentes amber / Vencidos red /
    Pagos green / Cancelados neutral) + X inline
  - Filtro Tipo (Receita green / Despesa red) + X inline
  - Filtro Paciente (Select com filter + identification_color dot)
    + X inline
  - Filtro Periodo (DatePicker range vencimento) + X inline
  - Footer fixo "Limpar filtros" (Transition fade+collapse)
- Main: DataTable lazy + paginator com 7 colunas (Paciente +
  avatar / Sessao / Tipo / Valor + desconto / Vencimento / Status /
  Acoes). Row overdue com bg vermelho tinted.
- Acoes por status:
  - pending/overdue: botoes "Receber" (abre dialog pagamento) +
    "Cancelar" (Confirm)
  - paid: badge "metodo + data"
  - cancelled: travessao
- Mobile: sidebar vira topo (max-height 50vh)

Dialogs preservados:
- Registrar pagamento (5 metodos com icones: pix/deposito/dinheiro/
  cartao/convenio)
- Lancamento manual (Paciente opcional + Valor + Desconto + Valor
  final read-only + Data vencimento + Metodo opcional + Obs)

Logica preservada do composable useFinancialRecords + RPCs
(get_financial_summary, list_financial_records, view
v_cashflow_projection, mark_as_paid, cancel_record,
create_manual_record).

FinanceiroDashboardPage e FinanceiroPage continuam intactas no
layout Rail (/admin/financeiro, /therapist/financeiro).

Wire-up: imports + render blocks + 'financeiro' e
'financeiro-lancamentos' em NON_CONFIG_SLUGS; removidos de
MELISSA_EMBED_KEYS. Entries removidos do EMBED_MAP em MelissaEmbed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 10:06:18 -03:00
Leonardo f9145442ae MelissaNotificacoes nativa (mesmo design do LinkExterno)
Promove '/melissa/notificacoes' do embed pra pagina nativa Melissa,
eliminando o triplo header (layout + embed + hero sticky da
NotificationsHistoryPage interna).

Layout 2-col seguindo o mesmo blueprint Melissa:

- Header: titulo + count badge + pill amber "X nao lidas" quando
  unreadCount > 0 + botao "Marcar todas lidas" (visivel se ha unread)
  + Recarregar + Voltar.
- Subheader explicativo.
- Sidebar (~280px) com __scroll + __footer fixo:
  - Stat card (Total / Nao lidas amber / Lidas verde / Arquivadas)
  - Filter card "Status" (button list: Todas / Nao lidas / Lidas /
    Arquivadas) + X inline pra voltar pro padrao 'all'
  - Filter card "Tipo" (button list: Agendamento red / Novo paciente
    sky / Recorrencia amber / Sessao orange / Mensagem emerald —
    cores espelham typeMap) + X inline
  - Footer fixo "Limpar filtros" (Transition fade+collapse) — zera
    busca + tipo + reseta status pra 'all'
- Main: toolbar com busca por titulo/descricao + lista de
  notificacoes com row design preservado:
  - Border-left colorido por tipo (--mn-row-color via inline style)
  - Icone do tipo + avatar circular primary com iniciais
  - Body: titulo + type pill colorido + arquivada pill (se aplicavel)
    + detail (2 lines clamp) + tempo relativo
  - Hover actions: marcar lida/nao lida + arquivar/desarquivar +
    remover (com ConfirmDialog)
  - is-unread: bg primary tinted; is-archived: opacity 0.7
- Mobile (<1024px): sidebar vira topo (max-height 50vh), main fica
  abaixo, actions sempre visiveis (sem hover).

Logica preservada da NotificationsHistoryPage:
- load() do supabase ('notifications' eq owner_id, limit 500)
- markRead/markUnread/archive/unarchive/remove + sync notifStore
- markAllRead em batch
- handleRowClick: inbound_message abre conversationDrawer (paciente
  ou anonimo via from_number); outras com deeplink fazem
  router.push (e fecham a Melissa pra navegar pra rota Rail);
  todas marcam como lida automaticamente.

Wire-up MelissaLayout: import + render block + 'notificacoes'
literal em NON_CONFIG_SLUGS; removido de MELISSA_EMBED_KEYS. Entry
removido do EMBED_MAP no MelissaEmbed.

NotificationsHistoryPage continua intacta — segue funcionando no
layout Rail (/therapist/notifications, /admin/notificacoes).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:53:34 -03:00
Leonardo ee084c2918 Pacientes restore unificado + MelissaLinkExterno nativa
Trabalho de continuidade pós-blueprint:

A) Botao "Restaurar" visivel direto na linha da PatientsListPage
   (layout Rail) quando paciente.status === 'Arquivado' — atalho
   pra usuarios que filtram por arquivados sem precisar abrir o
   menu de "..." (que ja tinha "Reativar" via PatientActionMenu).
   Icone pi-undo + label "Restaurar" + tooltip + click chama
   reactivatePatient do usePatientLifecycle. Aplicado tanto no
   DataTable desktop quanto nos cards mobile.

B) Consolidacao: removido restorePatient do patientsRepository
   (era duplicado com reactivatePatient do usePatientLifecycle).
   MelissaPacientes agora consome reactivatePatient direto, fonte
   unica de verdade pra toda transicao de status pra 'Ativo'.

C) MelissaLinkExterno (nova pagina nativa Melissa). Substitui o
   embed via MelissaEmbed que duplicava 3 headers (layout + embed
   + hero sticky da pagina interna). Lógica preservada (RPC
   issue_patient_invite + rotate_patient_invite_token_v2 +
   copy/openLink), so o chrome muda pra casar com o blueprint
   Melissa: 1 header com status pill (Link ativo/Gerando) +
   botao "Gerar novo link" + Recarregar + Voltar; subheader
   explicativo; body 2-col (esquerda card "Seu link publico" com
   InputGroup + 2 CTAs grandes + card "Mensagem pronta"; direita
   cards "Como funciona" + "Boas praticas"); mobile vira 1-col.

   PatientsExternalLinkPage continua intacta — segue funcionando
   no layout Rail. Wire-up no MelissaLayout: import +
   render block + 'link-externo' literal em NON_CONFIG_SLUGS;
   removido de MELISSA_EMBED_KEYS. Entry removido do EMBED_MAP
   no MelissaEmbed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:38:18 -03:00
Leonardo 97b0ec1ec5 HANDOFF + log atualizados pra sessao 2026-05-06
- HANDOFF.md reescrito refletindo estado atual: working tree limpa,
  5 commits criados na sessao, resumo do que foi feito (6 Melissa Pages
  blueprint + dialogs harmonizados + ConversationDrawer WhatsApp +
  bug fix de cores no MelissaPacientes), e o que continua pendente
  (A66 V2 design aguardando feedback + restore na PatientsListPage)
- Obsidian/Brain/log.md: entrada da sessao 05-06 anexada com detalhes
  e referencias dos 5 commits

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:18:57 -03:00
Leonardo 15103eded5 Cleanup: backups antigos removidos + dashboard config + HANDOFF/log
- Remove database-novo/backups/2026-03-27 e 2026-03-29 (deveriam estar
  no gitignore, mas haviam sido tracked antes)
- Atualiza db.config.json + generate-dashboard.cjs + dashboard.html
- HANDOFF.md atualizado com estado de 05-05 (sprint blueprint tabular +
  arquivamento de pacientes)
- Obsidian/Brain/log.md: entrada da sessao 05-05 adicionada

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:15:22 -03:00
Leonardo 98f7252dcd Melissa: 6 Pages aplicando blueprint + dialogs unificados + Conversa estilo WhatsApp
Sprint F (05-06). Blueprint tabular aplicado nas 6 paginas restantes;
dialogs harmonizados (FloatLabel + IconField + variant=filled + section
dividers, espelhando PatientsCadastroPage Identidade); ConversationDrawer
repaginado pra visual estilo WhatsApp.

Pages refatoradas (cada uma com subheader, sidebar __scroll + __footer
fixo "Limpar filtros", Xs inline pra zerar filtro individual, mobile
drawer com sticky footer):

- MelissaCompromissos: blueprint mantendo row design original (color
  stripe + name + badges + descricao + meta inline). Filtros Status
  (Ativos/Inativos) + Tipo (Nativos/Meus). Coluna Acoes frozen 140px
  com toggle+pencil+trash.

- MelissaGrupos / MelissaTags: pattern completo + dialog "Pacientes
  do grupo/tag" com lista vinculada via patient_group_patient /
  patient_patient_tag. Avatar primary nos pacientes, header colorido
  com cor da entidade, X de fechar igual .mc-close. Dialog de
  criar/editar com FloatLabel + section dividers.

- MelissaMedicos: blueprint + dialog "Pacientes encaminhados" usando
  cor primary do tema (medicos nao tem cor propria); dialog de
  criar/editar com 4 secoes (Identificacao/Contato/Localizacao/Obs)
  espelhando PatientsCadastroPage. Service ja tinha
  fetchPatientsByMedicoNome (ILIKE em encaminhado_por).

- MelissaConversas: subheader, sidebar com bg-soft + border-right e
  cards com sombra (mw-w--side), Limpar filtros global no footer fixo
  (fix bug: filters era ref({...}) e eu lia filters.search direto, agora
  usa .value), alerta de unlinked movido pro topo, kanban mobile com
  min-height nas colunas pra mostrar mensagens.

- MelissaRecorrencias: subheader, button list de status (Ativas verde/
  Encerradas vermelho/Todas) substitui SelectButton, busca por nome do
  paciente, footer Limpar filtros, X inline no filtro Status.

ConversationDrawer redesign (WhatsApp-style):
- Header com avatar circular primary + iniciais + numero formatado
- Container de mensagens com bg "papel de parede" (color-mix com bege
  esverdeado WA + radial-gradient pattern)
- Bolhas com cantos certos (top-left ou top-right zerado simulando
  tail), sombra sutil, cores autenticas (#d9fdd3 light/#005c4b dark
  outbound; #fff/#202c33 inbound), detecao dark via :global
- Time HH:MM + status overlay no canto inferior direito DENTRO do
  balao; checks azuis quando lida (#53bdeb)
- Compose pill rounded-full + botao Send circular verde #00a884
- Removido fmtDateTime obsoleto (substituido por fmtTimeOnly)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:14:35 -03:00
Leonardo 269b531158 Melissa: blueprint tabular + Cadastros/Agendamentos/Pacientes + restore
Sprint E (05-05). Blueprint tabular oficial pras paginas Melissa de
listagem (DataTable + sidebar com stats e filtros coloridos, view
toggle list/grade, subheader explicativo, mobile pencil+popover).

Novo arquivo:
- blueprints/melissa-table-page-blueprint.md (~530L, 18 secoes) —
  referencia canonica MelissaCadastrosRecebidos

Paginas refatoradas/criadas:
- MelissaCadastrosRecebidos: refator pra blueprint (DataTable + frozen
  action + view toggle + subheader)
- MelissaAgendamentosRecebidos (NOVO): substitui o embed via
  MelissaEmbed; 4 status coloridos (Pendente/Autorizado/Convertido/
  Recusado), 3 acoes condicionais (Recusar/Autorizar/Converter em
  sessao), wired com AgendaEventDialog
- MelissaPacientes: refator parcial (subheader, sombras, status pills
  coloridas, email/phone colunas proprias, mobile pencil+popover, fix
  scroll mobile com min-height:0 na .mp-list, view toggle persistido,
  tags/grupos color fix g.cor->g.color, restore de arquivados)
- MelissaEmbed: agendamentos-recebidos removido do EMBED_MAP
- MelissaLayout: wire-up MelissaAgendamentosRecebidos nativo
- composables/useMelissaPacientes + useMelissaPacientesAside ajustes

Restore de pacientes arquivados:
- patientsRepository: novo restorePatient(id, { tenantId })
- PatientsCadastroPage statusOpts: +Arquivado (fecha gap de
  inconsistencia ao editar paciente arquivado)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:13:53 -03:00
Leonardo 6d9b36d592 A66 WIP: AgendaEventDialog quebrado em 5 composables + 265 specs + V2 esqueleto
Sub-sessao 1 entregue (composables):
- agendaEventHelpers (262L) — utilitarios puros (date, format, parse)
- useAgendaEventComposer (485L) — montagem do form + validacao
- useAgendaEventActions (387L) — save/delete/cancel/move actions
- useAgendaEventPickerBilling (378L) — pickers (terapeuta, servico,
  convenio) + calculo de billing
- useAgendaEventLifecycle (474L) — open/close/dirty state + autosave
- 5 specs em __tests__/ (75+76+28+43+43 = 265 testes), 495/495 passing

AgendaEventDialog: 3522 -> 2632 linhas (-25%) consumindo os composables.
Backup byte-identico em AgendaEventDialog.vue.bak pra rollback.

Sub-sessao 2 entregue (esqueleto, NAO TESTADO):
- AgendaEventDialogV2 (~1100L, 3 zonas: PACIENTE/QUANDO/O QUE)
- Preview em /preview/agenda-dialog-v2 com 5 cenarios
- Rota em routes.misc.js
- User testou e nao gostou do design — aguarda feedback especifico
  pra iteracao na sub-sessao 3 (migracao nos 9 consumers).

Dialogs auxiliares novos pro AgendaEventDialog:
- InsurancePlanQuickCreateDialog (criar convenio inline)
- ServiceQuickCreateDialog (criar tipo de sessao inline)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:13:22 -03:00
Leonardo 957e912a7f Melissa polish + Prontuario Visao Geral + agenda historico
Sprints B (05-03) e C (05-04) acumulados:

- NotificationDrawer/Item redesign (visual mais limpo, ações inline)
- Dock pins compose (useMelissaDockPins) + cache store global (melissaCacheStore)
- MelissaAgenda: timeline FullCalendar parity + cards resumo, histórico
  card com useMelissaAgendaHistorico, MelissaEventoPanel ajustado
- useFeriados: cache opt-in pra evitar fetch redundante de feriados
- PatientProntuario: aba Visão Geral nova; PatientConversationsTab polish
- AgendaClinicMosaic / AgendaTerapeutaPage / useAgendaSettings: ajustes
  de paridade com Melissa
- DocumentsListPage: pequenos ajustes
- DB migration 20260504000001: fix do trigger pra status 'excluido' nas
  cancel_notifications

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 09:11:55 -03:00
Leonardo 86311ef305 Melissa: hub Configuracoes + Embed + 9 Pages novas + dialog blueprint dark
Sprints 04-29 + 04-30 acumuladas.

- MelissaConfiguracoes: hub 2-col com 6 grupos (Layout/Conta/Agenda/
  Financeiro/WhatsApp/Sistema), tudo embedado via MelissaEmbed.
- MelissaEmbed: wrapper generico que injeta layout-variant=melissa
  e remove cromos pra reaproveitar Pages tradicionais.
- 9 Melissa Pages novas: CadastrosRecebidos, Compromissos, Configuracoes,
  Conversas, Embed, Grupos, Medicos, Recorrencias, Tags.
- Dialog blueprint atualizado: bg-gray-100 (hardcoded light) ->
  bg-[var(--surface-ground)] (tema-aware). 22 dialogs migrados em
  9 arquivos. Anti-pattern documentado.
- PatientsCadastroPage: bug fix dropdown Grupo (optionLabel nome->name),
  toggle vertical/abas com persist localStorage, sticky margin-top.
- Surface picker no popover do MelissaLayout (8 swatches).
- useTopbarPlanMenu, useMelissaWhatsapp, useMelissaPacientesAside novos.
- Migration: status agenda remarcado/confirmado.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 11:41:19 -03:00