MelissaLayout: sidebar global de configs em qualquer rota de config

Antes cada pagina nativa de config tinha seu proprio chrome 2-col, e
quando o usuario navegava entre Perfil/Plano/Negocio/Seguranca/Agenda
Config/Bloqueios/Agendador/Pagamento, perdia o contexto do menu.

Agora:
- Catalogo unico em composables/melissaConfigGrupos.js (MELISSA_CONFIG_
  GRUPOS + isMelissaConfigSlug helper)
- MelissaConfigSidebar.vue componente standalone com accordion +
  navegacao via router.push + destaque do item ativo
- MelissaLayout renderiza `<MelissaConfigSidebar>` em qualquer slug
  que esteja em MELISSA_CONFIG_GRUPOS (computed showConfigSidebar)
- CSS var --m-config-aside-left no .win11-root: 296px quando sidebar
  visivel, 6px caso contrario
- Todas as 9 paginas nativas (Perfil, Plano, AlterarPlano, Negocio,
  Seguranca, Bloqueios, AgendaConfig, Agendador, Pagamento) +
  MelissaConfiguracoes ajustam left do inset usando a var

Sidebar tem entrada animada (lift + slide) e usa o pattern do .mcfg-
accordion (head com icone primary + label + desc 2-linhas + badge;
items com hover/active color-mix primary 12-16%).

Proximo passo: limpar o aside redundante interno do MelissaConfiguracoes
+ ajustar MelissaSeguranca pra considerar o aside no min-width 1000.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Leonardo
2026-05-06 17:50:03 -03:00
parent 7d2307dcf0
commit 989c5330f8
13 changed files with 496 additions and 11 deletions
+47 -1
View File
@@ -42,6 +42,8 @@ import MelissaBloqueios from './MelissaBloqueios.vue';
import MelissaAgendador from './MelissaAgendador.vue';
import MelissaAgendaConfig from './MelissaAgendaConfig.vue';
import MelissaPagamento from './MelissaPagamento.vue';
import MelissaConfigSidebar from './MelissaConfigSidebar.vue';
import { isMelissaConfigSlug } from './composables/melissaConfigGrupos.js';
import MelissaEmbed from './MelissaEmbed.vue';
import MelissaCadastrosRecebidos from './MelissaCadastrosRecebidos.vue';
import MelissaAgendamentosRecebidos from './MelissaAgendamentosRecebidos.vue';
@@ -248,6 +250,17 @@ const secaoAberta = computed(() => {
return null;
});
// Mostra o sidebar lateral de configuracoes (MelissaConfigSidebar)
// quando a rota atual e um slug do catalogo de configs (any item em
// MELISSA_CONFIG_GRUPOS).
const showConfigSidebar = computed(() => isMelissaConfigSlug(secaoAberta.value));
// CSS var pras paginas nativas saberem que precisam abrir espaco a
// esquerda pro sidebar (296px = 280 width + 16 gap).
const configAsideLeftStyle = computed(() => ({
'--m-config-aside-left': showConfigSidebar.value ? '296px' : '6px'
}));
// Quando o usuário fecha a seção e volta pro resumo, garante que os
// dados estão prontos (caso o idle callback ainda não tenha disparado
// no fluxo deep-link). fetchCached é idempotente: cache hit → instant,
@@ -1388,7 +1401,7 @@ function onKeydown(e) {
</script>
<template>
<div class="win11-root" :class="{ 'win11-has-photo': !!bgUrl }" :style="defaultBgStyle">
<div class="win11-root" :class="{ 'win11-has-photo': !!bgUrl }" :style="[defaultBgStyle, configAsideLeftStyle]">
<!-- Camada da foto custom (acima do gradiente, abaixo do dim).
Opacidade controlada pelo slider permite blend com o gradiente
default que vive no .win11-root. -->
@@ -2228,6 +2241,19 @@ function onKeydown(e) {
@close="fecharSecao"
/>
<!-- -->
<!-- SIDEBAR DE CONFIGURACOES fixo a esquerda em qualquer
rota de config (perfil, plano, agenda-config, pagamento, etc) -->
<!-- -->
<Transition name="lift">
<div
v-if="layoutReady && showConfigSidebar"
class="melissa-config-aside-host"
>
<MelissaConfigSidebar />
</div>
</Transition>
<MelissaPerfil
v-if="layoutReady && secaoAberta === 'perfil'"
@close="fecharSecao"
@@ -2444,6 +2470,26 @@ function onKeydown(e) {
transition: background-color 200ms ease;
}
/* ─── Sidebar global de configuracoes ──────────────────────────
Renderizado em qualquer rota de config (qualquer slug em
MELISSA_CONFIG_GRUPOS). Fica na lateral esquerda; as paginas
nativas usam var(--m-config-aside-left) no left do inset pra
abrir espaco automatico. */
.melissa-config-aside-host {
position: absolute;
top: 6px;
bottom: calc(var(--m-dock-h, 76px) + 6px);
left: 6px;
width: 280px;
z-index: 41;
pointer-events: auto;
animation: mcs-aside-enter 240ms cubic-bezier(0.2, 0.7, 0.3, 1);
}
@keyframes mcs-aside-enter {
from { opacity: 0; transform: translateX(-8px); }
to { opacity: 1; transform: translateX(0); }
}
/* ─── Plano de trás (resumo) ───────────────────────────────── */
.win11-summary {
position: relative;