+ Menu Hover no Layout Rail, Twilio, Sms, Email, Templates, LNovo Layout Configurações
This commit is contained in:
@@ -253,10 +253,10 @@ onMounted(loadSessions);
|
||||
<div class="absolute w-72 h-72 top-0 -left-16 rounded-full blur-[60px] bg-emerald-400/[0.08]" />
|
||||
</div>
|
||||
|
||||
<div class="relative z-[1] flex items-center gap-3 flex-wrap">
|
||||
<div class="relative z-1 flex items-center gap-3 flex-wrap">
|
||||
<!-- Brand -->
|
||||
<div class="flex items-center gap-2 flex-shrink-0">
|
||||
<div class="grid place-items-center w-9 h-9 rounded-md flex-shrink-0 bg-indigo-500/10 text-indigo-500">
|
||||
<div class="flex items-center gap-2 shrink-0">
|
||||
<div class="grid place-items-center w-9 h-9 rounded-md shrink-0 bg-indigo-500/10 text-indigo-500">
|
||||
<i class="pi pi-chart-bar text-base" />
|
||||
</div>
|
||||
<div class="min-w-0 hidden lg:block">
|
||||
@@ -271,13 +271,13 @@ onMounted(loadSessions);
|
||||
</div>
|
||||
|
||||
<!-- Refresh -->
|
||||
<div class="flex items-center gap-1.5 flex-shrink-0 ml-auto">
|
||||
<div class="flex items-center gap-1.5 shrink-0 ml-auto">
|
||||
<Button icon="pi pi-refresh" severity="secondary" outlined class="h-9 w-9 rounded-full" :loading="loading" title="Recarregar" @click="loadSessions" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Seletor de período — mobile (abaixo da linha principal) -->
|
||||
<div class="xl:hidden relative z-[1] mt-2.5 flex flex-wrap gap-1.5">
|
||||
<div class="xl:hidden relative z-1 mt-2.5 flex flex-wrap gap-1.5">
|
||||
<button
|
||||
v-for="p in PERIODS"
|
||||
:key="p.value"
|
||||
|
||||
@@ -34,7 +34,7 @@ let _heroObserver = null;
|
||||
const agora = ref(new Date());
|
||||
const asideOpen = ref(false);
|
||||
|
||||
const { effectiveVariant, layoutState, layoutConfig, isMobile } = useLayout();
|
||||
const { effectiveVariant, layoutState, layoutConfig, isMobile, railPanelPushesLayout } = useLayout();
|
||||
// ≤ xl: aside é drawer mobile, não usa left fixo
|
||||
const isMobileLayout = computed(() => isMobile.value);
|
||||
// left do aside fixo:
|
||||
@@ -48,7 +48,7 @@ const asideLeft = computed(() => {
|
||||
const isStaticActive = layoutConfig.menuMode === 'static' && !layoutState.staticMenuInactive;
|
||||
return isStaticActive ? '20rem' : '0';
|
||||
}
|
||||
return layoutState.railPanelOpen ? 'calc(60px + 260px)' : '60px';
|
||||
return railPanelPushesLayout.value ? 'calc(60px + 260px)' : '60px';
|
||||
});
|
||||
let timer = null;
|
||||
onBeforeUnmount(() => {
|
||||
@@ -781,7 +781,7 @@ onMounted(async () => {
|
||||
══════════════════════════════════════════ -->
|
||||
<div v-if="asideOpen" class="fixed inset-0 bg-black/40 backdrop-blur-sm z-[39] xl:hidden" @click="asideOpen = false" />
|
||||
|
||||
<aside class="aside-drawer flex flex-col overflow-y-auto flex-shrink-0 bg-[var(--surface-card,#fff)] border-r border-[var(--surface-border,#e2e8f0)]" :class="asideOpen ? 'translate-x-0 visible' : 'max-xl:-translate-x-full max-xl:invisible'" :style="{ left: asideLeft }">
|
||||
<aside class="aside-drawer flex flex-col overflow-y-auto shrink-0 bg-[var(--surface-card,#fff)] border-r border-[var(--surface-border,#e2e8f0)]" :class="asideOpen ? 'translate-x-0 visible' : 'max-xl:-translate-x-full max-xl:invisible'" :style="{ left: asideLeft }">
|
||||
<!-- Mini calendário -->
|
||||
<div class="p-3.5 pb-2.5 border-b border-[var(--surface-border,#e2e8f0)]">
|
||||
<div class="flex items-center gap-1.5 text-xs font-bold uppercase tracking-widest text-[var(--text-color-secondary,#64748b)] mb-2.5">
|
||||
@@ -871,7 +871,7 @@ onMounted(async () => {
|
||||
<span class="aside-ev__hora">{{ ev.hora }}</span>
|
||||
<span class="aside-ev__dur">{{ ev.dur }}</span>
|
||||
</div>
|
||||
<Avatar :label="initials(ev.nome)" shape="square" size="small" class="flex-shrink-0" />
|
||||
<Avatar :label="initials(ev.nome)" shape="square" size="small" class="shrink-0" />
|
||||
<div class="flex-1 min-w-0">
|
||||
<span class="block text-[0.8125rem] font-semibold truncate text-[var(--text-color)]">{{ ev.nome }}</span>
|
||||
<div class="flex gap-1.5 mt-0.5 items-center">
|
||||
@@ -879,7 +879,7 @@ onMounted(async () => {
|
||||
<i v-if="ev.recorrente" class="pi pi-sync text-[0.6rem] text-[var(--primary-color,#6366f1)]" title="Recorrente" />
|
||||
</div>
|
||||
</div>
|
||||
<i :class="ev.statusIcon" class="text-xs text-[var(--text-color-secondary)] flex-shrink-0" />
|
||||
<i :class="ev.statusIcon" class="text-xs text-[var(--text-color-secondary)] shrink-0" />
|
||||
</div>
|
||||
<div v-if="!eventosDoDia.length" class="flex items-center gap-2 py-3 text-[var(--text-color-secondary)] text-sm"><i class="pi pi-sun" /><span>Sem compromissos</span></div>
|
||||
</div>
|
||||
@@ -908,7 +908,7 @@ onMounted(async () => {
|
||||
|
||||
<div v-else class="flex flex-col gap-1.5 max-h-[210px] overflow-y-auto pr-0.5">
|
||||
<div v-for="r in recorrencias" :key="r.id" class="aside-rec" @click="openRecMenu($event, r)">
|
||||
<Avatar :label="r.initials" shape="square" size="normal" class="flex-shrink-0" />
|
||||
<Avatar :label="r.initials" shape="square" size="normal" class="shrink-0" />
|
||||
<div class="flex-1 min-w-0">
|
||||
<span class="block text-[0.8125rem] font-semibold truncate text-[var(--text-color)]">{{ r.nome }}</span>
|
||||
<span class="block text-xs text-[var(--text-color-secondary)]">{{ r.freq }}</span>
|
||||
@@ -953,9 +953,9 @@ onMounted(async () => {
|
||||
</div>
|
||||
|
||||
<!-- Linha 1 -->
|
||||
<div class="relative z-[1] flex items-center gap-4">
|
||||
<div class="relative z-1 flex items-center gap-4">
|
||||
<div class="flex items-center gap-3 flex-1 min-w-0">
|
||||
<div class="grid place-items-center w-10 h-10 rounded-md flex-shrink-0 bg-indigo-500/10 text-indigo-500">
|
||||
<div class="grid place-items-center w-10 h-10 rounded-md shrink-0 bg-indigo-500/10 text-indigo-500">
|
||||
<i class="pi pi-home text-lg" />
|
||||
</div>
|
||||
<div class="min-w-0">
|
||||
@@ -964,7 +964,7 @@ onMounted(async () => {
|
||||
</div>
|
||||
</div>
|
||||
<!-- Controles (desktop e mobile — mesmo conteúdo, sempre visível) -->
|
||||
<div class="flex items-center gap-2 flex-shrink-0">
|
||||
<div class="flex items-center gap-2 shrink-0">
|
||||
<Button icon="pi pi-refresh" severity="secondary" outlined class="h-9 w-9 rounded-full" title="Recarregar" @click="load" />
|
||||
<Button icon="pi pi-cog" severity="secondary" outlined class="h-9 w-9 rounded-full" title="Configurações" @click="$router.push('/configuracoes')" />
|
||||
</div>
|
||||
@@ -973,7 +973,7 @@ onMounted(async () => {
|
||||
<Divider class="hidden xl:block my-2" />
|
||||
|
||||
<!-- Quick stats -->
|
||||
<div class="relative z-[1] mt-2">
|
||||
<div class="relative z-1 mt-2">
|
||||
<div class="flex flex-wrap gap-2.5">
|
||||
<div
|
||||
v-for="s in quickStats"
|
||||
@@ -1009,7 +1009,7 @@ onMounted(async () => {
|
||||
<div class="flex items-center gap-2 min-w-0">
|
||||
<i class="pi pi-calendar-clock text-[var(--primary-color,#6366f1)]" />
|
||||
<span class="truncate">Agenda · {{ labelDiaSelecionado }}</span>
|
||||
<span v-if="eventosDoDia.length" class="inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-[var(--primary-color,#6366f1)] text-white text-xs font-bold flex-shrink-0">{{ eventosDoDia.length }}</span>
|
||||
<span v-if="eventosDoDia.length" class="inline-flex items-center justify-center min-w-[18px] h-[18px] px-1 rounded-full bg-[var(--primary-color,#6366f1)] text-white text-xs font-bold shrink-0">{{ eventosDoDia.length }}</span>
|
||||
</div>
|
||||
<i class="pi transition-transform duration-200" :class="asideOpen ? 'pi-chevron-up' : 'pi-chevron-down'" />
|
||||
</button>
|
||||
@@ -1026,7 +1026,7 @@ onMounted(async () => {
|
||||
<section v-if="!loading" class="bg-[var(--surface-card,#fff)] rounded-md border border-[var(--surface-border,#e2e8f0)] p-2.5 shadow-[0_0_0_3px_color-mix(in_srgb,var(--primary-color)_7%,transparent)]">
|
||||
<div class="flex items-center justify-between mb-2.5">
|
||||
<div class="flex items-center gap-2.5">
|
||||
<i class="pi pi-chart-bar w-10 h-10 rounded-md cfg-subheader__icon flex-shrink-0" />
|
||||
<i class="pi pi-chart-bar w-10 h-10 rounded-md cfg-subheader__icon shrink-0" />
|
||||
|
||||
<div class="flex flex-col leading-tight">
|
||||
<div class="font-bold tracking-tight text-[var(--text-color-secondary)]">Linha do tempo — Hoje</div>
|
||||
@@ -1239,9 +1239,9 @@ onMounted(async () => {
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-3 mt-2 flex-wrap">
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-indigo-500 to-indigo-400 flex-shrink-0" />Presentes </span>
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-red-500 to-red-300 flex-shrink-0" />Faltas </span>
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-amber-500 to-amber-300 flex-shrink-0" />Reposição </span>
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-indigo-500 to-indigo-400 shrink-0" />Presentes </span>
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-red-500 to-red-300 shrink-0" />Faltas </span>
|
||||
<span class="flex items-center gap-1.5 text-sm text-[var(--text-color-secondary)] font-semibold"> <span class="w-4 h-2.5 rounded-sm bg-gradient-to-r from-amber-500 to-amber-300 shrink-0" />Reposição </span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1284,7 +1284,7 @@ onMounted(async () => {
|
||||
<div class="flex flex-col gap-1.5">
|
||||
<div v-for="c in commitments" :key="c.id" class="flex items-center gap-2.5 px-2.5 py-2 rounded-md bg-[var(--surface-ground,#f8fafc)] hover:bg-[var(--surface-hover,#f1f5f9)] transition-colors duration-100">
|
||||
<div
|
||||
class="w-[3px] h-7 rounded-sm flex-shrink-0"
|
||||
class="w-[3px] h-7 rounded-sm shrink-0"
|
||||
:class="{
|
||||
'bg-indigo-500': c.cor === 'blue',
|
||||
'bg-purple-500': c.cor === 'purple',
|
||||
|
||||
Reference in New Issue
Block a user