From 989c5330f892fd1a163f77fbc142d73ab7e52372 Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 6 May 2026 17:50:03 -0300 Subject: [PATCH] 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 `` 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) --- src/layout/melissa/MelissaAgendaConfig.vue | 2 +- src/layout/melissa/MelissaAgendador.vue | 2 +- src/layout/melissa/MelissaAlterarPlano.vue | 2 +- src/layout/melissa/MelissaBloqueios.vue | 2 +- src/layout/melissa/MelissaConfigSidebar.vue | 323 ++++++++++++++++++ src/layout/melissa/MelissaConfiguracoes.vue | 2 +- src/layout/melissa/MelissaLayout.vue | 48 ++- src/layout/melissa/MelissaNegocio.vue | 2 +- src/layout/melissa/MelissaPagamento.vue | 2 +- src/layout/melissa/MelissaPerfil.vue | 2 +- src/layout/melissa/MelissaPlano.vue | 2 +- src/layout/melissa/MelissaSeguranca.vue | 2 +- .../composables/melissaConfigGrupos.js | 116 +++++++ 13 files changed, 496 insertions(+), 11 deletions(-) create mode 100644 src/layout/melissa/MelissaConfigSidebar.vue create mode 100644 src/layout/melissa/composables/melissaConfigGrupos.js diff --git a/src/layout/melissa/MelissaAgendaConfig.vue b/src/layout/melissa/MelissaAgendaConfig.vue index 014e83f..b1be047 100644 --- a/src/layout/melissa/MelissaAgendaConfig.vue +++ b/src/layout/melissa/MelissaAgendaConfig.vue @@ -1431,7 +1431,7 @@ onBeforeUnmount(() => { /* ═══════ Page chrome ═══════ */ .mac-page { position: absolute; - inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) 6px; + inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) var(--m-config-aside-left, 6px); z-index: 40; display: flex; flex-direction: column; diff --git a/src/layout/melissa/MelissaAgendador.vue b/src/layout/melissa/MelissaAgendador.vue index 17875f7..b1a3693 100644 --- a/src/layout/melissa/MelissaAgendador.vue +++ b/src/layout/melissa/MelissaAgendador.vue @@ -1381,7 +1381,7 @@ const summaryItems = computed(() => [ /* ═══════ Page chrome ═══════ */ .mag-page { position: absolute; - inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) 6px; + inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) var(--m-config-aside-left, 6px); z-index: 40; display: flex; flex-direction: column; diff --git a/src/layout/melissa/MelissaAlterarPlano.vue b/src/layout/melissa/MelissaAlterarPlano.vue index 853d12b..f145628 100644 --- a/src/layout/melissa/MelissaAlterarPlano.vue +++ b/src/layout/melissa/MelissaAlterarPlano.vue @@ -542,7 +542,7 @@ onMounted(async () => { /* ═══════ Page chrome ═══════ */ .map-page { position: absolute; - inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) 6px; + inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) var(--m-config-aside-left, 6px); z-index: 40; display: flex; flex-direction: column; diff --git a/src/layout/melissa/MelissaBloqueios.vue b/src/layout/melissa/MelissaBloqueios.vue index 582f741..d12b39f 100644 --- a/src/layout/melissa/MelissaBloqueios.vue +++ b/src/layout/melissa/MelissaBloqueios.vue @@ -837,7 +837,7 @@ onBeforeUnmount(() => { /* ═══════ Page chrome ═══════ */ .mbq-page { position: absolute; - inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) 6px; + inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) var(--m-config-aside-left, 6px); z-index: 40; display: flex; flex-direction: column; diff --git a/src/layout/melissa/MelissaConfigSidebar.vue b/src/layout/melissa/MelissaConfigSidebar.vue new file mode 100644 index 0000000..ba0709c --- /dev/null +++ b/src/layout/melissa/MelissaConfigSidebar.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/layout/melissa/MelissaConfiguracoes.vue b/src/layout/melissa/MelissaConfiguracoes.vue index ee2ac2d..11724fd 100644 --- a/src/layout/melissa/MelissaConfiguracoes.vue +++ b/src/layout/melissa/MelissaConfiguracoes.vue @@ -593,7 +593,7 @@ function resetCores() { /* ═════ Container ═════ */ .mcfg-page { position: absolute; - inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) 6px; + inset: 6px 6px calc(var(--m-dock-h, 76px) + 6px) var(--m-config-aside-left, 6px); z-index: 40; display: flex; flex-direction: column; diff --git a/src/layout/melissa/MelissaLayout.vue b/src/layout/melissa/MelissaLayout.vue index 9a1c537..6c5ebf0 100644 --- a/src/layout/melissa/MelissaLayout.vue +++ b/src/layout/melissa/MelissaLayout.vue @@ -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) {