MelissaPaciente Fase 4: Tab Prontuario MVP (evolucao via session.observacoes)
O legacy PatientProntuario.vue tem a aba Prontuario como PLACEHOLDER
("Em breve" rich empty state). O MVP entregue aqui SUPERA o legacy: usa
agenda_eventos.observacoes como nota evolutiva — funcional ja hoje sem
precisar de schema novo.
ESTADO + COMPUTEDS adicionados ao MelissaPaciente.vue:
- pronFilter ref ('com-evolucao' default) + PRON_FILTERS com 5 opcoes
(Com evolucao / Todas / Realizadas / Faltas / Cancelamentos)
- pronSessions computed: filtra sessoes por status/presenca de observacoes
- sessoesComEvolucao computed: count de sessoes com observacoes nao-vazia
TEMPLATE Tab Prontuario (substitui placeholder Fase 1):
- Hint banner explicativo no topo (icon info + "Prontuario em construcao")
- 4 mini-stats em grid: com evolucao / realizadas / faltas / total
- 5 filter chips redondas — selecao default 'com-evolucao' filtra so
sessoes que tem nota
- Empty states contextuais (sem sessoes / sem evolucao / filtro vazio)
- Lista de sessoes:
- border-left colorida por status (verde/vermelho/amarelo/cinza)
- head com data + relative + chips status/modalidade/duracao
- block "Evolucao" destacado quando tem observacoes (bg medium + border
primary + label uppercase + texto pre-wrap)
- "Sem evolucao registrada" italico cinza quando nao tem
- Roadmap card (border dashed) listando 4 features futuras: anamnese
estruturada / plano terapeutico / evolucao por temas / assinatura
digital + LGPD Art. 18.
CSS: ~200L novos. Padrao Melissa (chips estilo MelissaTags, border-left
adaptativa, label uppercase nos blocks de evolucao).
ESLint: 0 errors da minha mudanca.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -50,6 +50,49 @@ Touched: none
|
|||||||
## [2026-05-08 00:00] session | Melissa cfg-* nativas + temas + cronometro DB
|
## [2026-05-08 00:00] session | Melissa cfg-* nativas + temas + cronometro DB
|
||||||
Touched: none
|
Touched: none
|
||||||
|
|
||||||
|
## [2026-05-08 15:30] session | MelissaPaciente Fase 4 — Tab Prontuario MVP
|
||||||
|
Touched: none
|
||||||
|
Detalhes: O legacy PatientProntuario.vue tem a aba Prontuario como
|
||||||
|
PLACEHOLDER ("Em breve"). MVP entregue aqui supera o legacy: usa
|
||||||
|
agenda_eventos.observacoes como nota evolutiva (pq nao tem schema de
|
||||||
|
anamnese/clinical_notes ainda).
|
||||||
|
|
||||||
|
ESTADO + COMPUTEDS adicionados:
|
||||||
|
- pronFilter ref ('com-evolucao' default) + PRON_FILTERS array com 5
|
||||||
|
opcoes (Com evolucao, Todas, Realizadas, Faltas, Cancelamentos).
|
||||||
|
- pronSessions computed: filtra sessions por status/observacoes presentes.
|
||||||
|
- sessoesComEvolucao computed: count de sessoes com observacoes nao-vazia.
|
||||||
|
|
||||||
|
TEMPLATE Tab Prontuario (substitui placeholder Fase 1):
|
||||||
|
- Hint banner top: "Prontuario em construcao", explica que usa observacoes
|
||||||
|
de sessoes como historico evolutivo.
|
||||||
|
- 4 mini-stats em grid responsivo: com evolucao / realizadas / faltas /
|
||||||
|
total. Cada uma colorida + icone + value 800.
|
||||||
|
- 5 filter chips redondas (estilo Melissa): com-evolucao default; troca
|
||||||
|
pra todas/realiz/falt/cancel.
|
||||||
|
- Empty state contextual:
|
||||||
|
- Se nao tem sessoes: "Quando atender este paciente..."
|
||||||
|
- Se filtro 'com-evolucao' e zero: "Use o campo Observacoes ao editar
|
||||||
|
sessao..."
|
||||||
|
- Outro filtro: "Tente outro filtro acima."
|
||||||
|
- Lista de sessoes (pron-list) com:
|
||||||
|
- border-left colorida por status (verde realiz / vermelho falta /
|
||||||
|
amarelo cancel / cinza default)
|
||||||
|
- head com data + relative + chips status/modalidade/duracao
|
||||||
|
- titulo opcional (titulo_custom || titulo)
|
||||||
|
- block "Evolucao" quando tem observacoes (background medium, border-
|
||||||
|
left primary, label uppercase com icone, texto pre-wrap)
|
||||||
|
- mensagem "Sem evolucao registrada" italico cinza quando nao tem
|
||||||
|
- Roadmap card (border-dashed) listando 4 features futuras: anamnese
|
||||||
|
estruturada / plano terapeutico / evolucao por temas / assinatura
|
||||||
|
digital + LGPD Art. 18.
|
||||||
|
|
||||||
|
CSS: ~200L novos pros componentes (mpa-pron-hint/stats/filters/list/
|
||||||
|
item/roadmap). Padrao visual Melissa: chips redondas estilo MelissaTags,
|
||||||
|
border-left adaptativa, monospace inutilizado.
|
||||||
|
|
||||||
|
ESLint: 0 errors da minha mudanca.
|
||||||
|
|
||||||
## [2026-05-08 14:30] session | MelissaPaciente Fase 3 — Tab Perfil (6 sections stacked)
|
## [2026-05-08 14:30] session | MelissaPaciente Fase 3 — Tab Perfil (6 sections stacked)
|
||||||
Touched: none
|
Touched: none
|
||||||
Detalhes: Substituiu o placeholder da aba Perfil por 6 sections stacked
|
Detalhes: Substituiu o placeholder da aba Perfil por 6 sections stacked
|
||||||
|
|||||||
@@ -91,6 +91,16 @@ function selectTab(key) {
|
|||||||
if (isMobile.value) drawerOpen.value = false;
|
if (isMobile.value) drawerOpen.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filtros da aba Prontuario (MVP — usa session.observacoes como evolucao)
|
||||||
|
const pronFilter = ref('com-evolucao'); // com-evolucao | todas | realiz | falt | cancel
|
||||||
|
const PRON_FILTERS = [
|
||||||
|
{ value: 'com-evolucao', label: 'Com evolução', icon: 'pi pi-file-edit' },
|
||||||
|
{ value: 'todas', label: 'Todas', icon: 'pi pi-list' },
|
||||||
|
{ value: 'realiz', label: 'Realizadas', icon: 'pi pi-check-circle' },
|
||||||
|
{ value: 'falt', label: 'Faltas', icon: 'pi pi-user-minus' },
|
||||||
|
{ value: 'cancel', label: 'Cancelamentos', icon: 'pi pi-ban' }
|
||||||
|
];
|
||||||
|
|
||||||
// Sub-nav da aba Perfil
|
// Sub-nav da aba Perfil
|
||||||
const PROFILE_SECTIONS = [
|
const PROFILE_SECTIONS = [
|
||||||
{ key: 'pessoais', label: 'Informações Pessoais', icon: 'pi pi-pencil' },
|
{ key: 'pessoais', label: 'Informações Pessoais', icon: 'pi pi-pencil' },
|
||||||
@@ -185,6 +195,31 @@ const groupNames = computed(() => detail.groups.value.map((g) => g?.name).filter
|
|||||||
const groupLabel = computed(() => groupNames.value.length ? groupNames.value.join(', ') : '—');
|
const groupLabel = computed(() => groupNames.value.length ? groupNames.value.join(', ') : '—');
|
||||||
const groupCountLabel = computed(() => groupNames.value.length <= 1 ? 'Grupo' : 'Grupos');
|
const groupCountLabel = computed(() => groupNames.value.length <= 1 ? 'Grupo' : 'Grupos');
|
||||||
|
|
||||||
|
// ── Tab Prontuario: lista filtrada de sessoes ──────────────
|
||||||
|
// MVP enquanto anamnese/evolucao_clinica nao existem no schema:
|
||||||
|
// usa agenda_eventos.observacoes como nota evolutiva.
|
||||||
|
const pronSessions = computed(() => {
|
||||||
|
const all = sessionsHook.sessions.value;
|
||||||
|
if (pronFilter.value === 'todas') return all;
|
||||||
|
if (pronFilter.value === 'com-evolucao') {
|
||||||
|
return all.filter((s) => s.observacoes && String(s.observacoes).trim());
|
||||||
|
}
|
||||||
|
if (pronFilter.value === 'realiz') {
|
||||||
|
return all.filter((s) => /realiz|present/i.test(String(s.status || '')));
|
||||||
|
}
|
||||||
|
if (pronFilter.value === 'falt') {
|
||||||
|
return all.filter((s) => /falt/i.test(String(s.status || '')));
|
||||||
|
}
|
||||||
|
if (pronFilter.value === 'cancel') {
|
||||||
|
return all.filter((s) => /cancel|remarca/i.test(String(s.status || '')));
|
||||||
|
}
|
||||||
|
return all;
|
||||||
|
});
|
||||||
|
const pronSessionsCount = computed(() => pronSessions.value.length);
|
||||||
|
const sessoesComEvolucao = computed(() =>
|
||||||
|
sessionsHook.sessions.value.filter((s) => s.observacoes && String(s.observacoes).trim()).length
|
||||||
|
);
|
||||||
|
|
||||||
// ── KPIs Visao Geral (Fase 2) ──────────────────────────────
|
// ── KPIs Visao Geral (Fase 2) ──────────────────────────────
|
||||||
const kpiSessoes = computed(() => sessionsHook.totalSessoes.value);
|
const kpiSessoes = computed(() => sessionsHook.totalSessoes.value);
|
||||||
const kpiRealizadas = computed(() => sessionsHook.totalRealizadas.value);
|
const kpiRealizadas = computed(() => sessionsHook.totalRealizadas.value);
|
||||||
@@ -991,20 +1026,184 @@ void toast;
|
|||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ABA: Prontuario -->
|
<!-- ABA: Prontuario (Fase 4 MVP — evolucao via session.observacoes) -->
|
||||||
<div v-else-if="activeTab === 'pron'" class="mpa-tab">
|
<div v-else-if="activeTab === 'pron'" class="mpa-tab">
|
||||||
<div class="mpa-w">
|
<!-- Header explicativo -->
|
||||||
|
<div class="mpa-pron-hint">
|
||||||
|
<i class="pi pi-info-circle" />
|
||||||
|
<div>
|
||||||
|
<strong>Prontuário em construção.</strong>
|
||||||
|
Por enquanto mostra as <strong>observações que você anota nas sessões</strong>
|
||||||
|
como histórico evolutivo. Anamnese estruturada, plano terapêutico e
|
||||||
|
evolução por temas chegam quando o módulo clínico for liberado.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Mini-stats -->
|
||||||
|
<div class="mpa-pron-stats">
|
||||||
|
<article class="mpa-pron-stat" style="--c:#06b6d4">
|
||||||
|
<i class="pi pi-file-edit" />
|
||||||
|
<div>
|
||||||
|
<div class="mpa-pron-stat__value">{{ sessoesComEvolucao }}</div>
|
||||||
|
<div class="mpa-pron-stat__label">com evolução</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="mpa-pron-stat" style="--c:#10b981">
|
||||||
|
<i class="pi pi-check-circle" />
|
||||||
|
<div>
|
||||||
|
<div class="mpa-pron-stat__value">{{ sessionsHook.totalRealizadas.value }}</div>
|
||||||
|
<div class="mpa-pron-stat__label">realizadas</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="mpa-pron-stat" style="--c:#f87171">
|
||||||
|
<i class="pi pi-user-minus" />
|
||||||
|
<div>
|
||||||
|
<div class="mpa-pron-stat__value">{{ sessionsHook.totalFaltas.value }}</div>
|
||||||
|
<div class="mpa-pron-stat__label">faltas</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<article class="mpa-pron-stat" style="--c:#94a3b8">
|
||||||
|
<i class="pi pi-calendar" />
|
||||||
|
<div>
|
||||||
|
<div class="mpa-pron-stat__value">{{ sessionsHook.totalSessoes.value }}</div>
|
||||||
|
<div class="mpa-pron-stat__label">total</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Filtros -->
|
||||||
|
<div class="mpa-pron-filters" role="tablist">
|
||||||
|
<button
|
||||||
|
v-for="f in PRON_FILTERS"
|
||||||
|
:key="f.value"
|
||||||
|
type="button"
|
||||||
|
role="tab"
|
||||||
|
:aria-selected="pronFilter === f.value"
|
||||||
|
class="mpa-pron-filter"
|
||||||
|
:class="{ 'is-active': pronFilter === f.value }"
|
||||||
|
@click="pronFilter = f.value"
|
||||||
|
>
|
||||||
|
<i :class="f.icon" />
|
||||||
|
<span>{{ f.label }}</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Lista de evolução -->
|
||||||
|
<div v-if="sessionsHook.loading.value" class="mpa-empty">
|
||||||
|
<i class="pi pi-spin pi-spinner mr-2" /> Carregando…
|
||||||
|
</div>
|
||||||
|
<div v-else-if="!pronSessionsCount" class="mpa-empty mpa-empty--rich">
|
||||||
|
<div class="mpa-empty__icon"><i class="pi pi-file-edit" /></div>
|
||||||
|
<div class="mpa-empty__title">
|
||||||
|
<template v-if="!sessionsHook.sessions.value.length">
|
||||||
|
Sem sessões registradas
|
||||||
|
</template>
|
||||||
|
<template v-else-if="pronFilter === 'com-evolucao'">
|
||||||
|
Nenhuma sessão tem evolução escrita ainda
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
Nenhuma sessão neste filtro
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="mpa-empty__sub">
|
||||||
|
<template v-if="pronFilter === 'com-evolucao' && sessionsHook.sessions.value.length">
|
||||||
|
Use o campo <strong>Observações</strong> ao editar uma sessão pra registrar
|
||||||
|
como ela transcorreu — vai aparecer aqui como nota evolutiva.
|
||||||
|
</template>
|
||||||
|
<template v-else-if="!sessionsHook.sessions.value.length">
|
||||||
|
Quando você atender este paciente, as sessões e evoluções aparecerão aqui.
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
Tente outro filtro acima ou veja "Todas" pra listar o histórico completo.
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else class="mpa-pron-list">
|
||||||
|
<article
|
||||||
|
v-for="s in pronSessions"
|
||||||
|
:key="s.id"
|
||||||
|
class="mpa-pron-item"
|
||||||
|
:data-status="String(s.status || 'agendado').toLowerCase()"
|
||||||
|
>
|
||||||
|
<div class="mpa-pron-item__head">
|
||||||
|
<div class="mpa-pron-item__when">
|
||||||
|
<span class="mpa-pron-item__date">{{ fmtDateTimeBR(s.inicio_em) }}</span>
|
||||||
|
<span class="mpa-pron-item__rel">{{ fmtRelative(s.inicio_em) }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="mpa-pron-item__chips">
|
||||||
|
<Tag
|
||||||
|
:value="STATUS_LABEL[s.status] || s.status || 'Agendado'"
|
||||||
|
:severity="STATUS_SEVERITY[s.status] || 'info'"
|
||||||
|
class="mpa-pron-item__tag"
|
||||||
|
/>
|
||||||
|
<span v-if="s.modalidade" class="mpa-tl__chip">
|
||||||
|
<i :class="s.modalidade === 'online' ? 'pi pi-video' : 'pi pi-map-marker'" />
|
||||||
|
{{ s.modalidade === 'online' ? 'Online' : 'Presencial' }}
|
||||||
|
</span>
|
||||||
|
<span v-if="sessionDuration(s.inicio_em, s.fim_em)" class="mpa-tl__chip mpa-tl__chip--dim">
|
||||||
|
<i class="pi pi-clock" /> {{ sessionDuration(s.inicio_em, s.fim_em) }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="s.titulo_custom || s.titulo" class="mpa-pron-item__title">
|
||||||
|
{{ s.titulo_custom || s.titulo }}
|
||||||
|
</div>
|
||||||
|
<div v-if="s.observacoes" class="mpa-pron-item__evol">
|
||||||
|
<div class="mpa-pron-item__evol-label">
|
||||||
|
<i class="pi pi-file-edit" />
|
||||||
|
Evolução
|
||||||
|
</div>
|
||||||
|
<p class="mpa-pron-item__evol-text">{{ s.observacoes }}</p>
|
||||||
|
</div>
|
||||||
|
<div v-else class="mpa-pron-item__noevol">
|
||||||
|
<i class="pi pi-circle" />
|
||||||
|
Sem evolução registrada
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Roadmap card "em breve" -->
|
||||||
|
<section class="mpa-w mpa-pron-roadmap">
|
||||||
<div class="mpa-w__head">
|
<div class="mpa-w__head">
|
||||||
<div class="mpa-w__icon mpa-w__icon--cyan"><i class="pi pi-file-edit" /></div>
|
<div class="mpa-w__icon mpa-w__icon--cyan"><i class="pi pi-sparkles" /></div>
|
||||||
<div class="mpa-w__title">
|
<div class="mpa-w__title">
|
||||||
<div class="mpa-w__title-text">Prontuário — Fase 4</div>
|
<div class="mpa-w__title-text">Em breve no prontuário</div>
|
||||||
<div class="mpa-w__sub">Anamnese + sessões clínicas + evoluções</div>
|
<div class="mpa-w__sub">Roadmap clínico previsto</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mpa-w__body">
|
<div class="mpa-w__body">
|
||||||
<p class="mpa-placeholder">Em desenvolvimento — <strong>Fase 4</strong>.</p>
|
<ul class="mpa-pron-roadmap__list">
|
||||||
|
<li>
|
||||||
|
<i class="pi pi-clipboard" />
|
||||||
|
<div>
|
||||||
|
<strong>Anamnese estruturada</strong>
|
||||||
|
<span>Modelo configurável por terapeuta com seções (queixa, história, hipótese diagnóstica, objetivos).</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="pi pi-bullseye" />
|
||||||
|
<div>
|
||||||
|
<strong>Plano terapêutico</strong>
|
||||||
|
<span>Objetivos com prazo + acompanhamento de progresso ao longo das sessões.</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="pi pi-tag" />
|
||||||
|
<div>
|
||||||
|
<strong>Evolução por temas</strong>
|
||||||
|
<span>Tagging das notas pra cruzar evolução com objetivos e gerar relatórios.</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="pi pi-shield" />
|
||||||
|
<div>
|
||||||
|
<strong>Assinatura digital + LGPD Art. 18</strong>
|
||||||
|
<span>Notas imutáveis com hash de auditoria, exportação compatível CFP.</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- ABA: Agenda -->
|
<!-- ABA: Agenda -->
|
||||||
@@ -2070,6 +2269,232 @@ void toast;
|
|||||||
font-size: 0.66rem !important;
|
font-size: 0.66rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ═══════ Tab Prontuario (Fase 4 MVP) ═══════ */
|
||||||
|
.mpa-pron-hint {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 12px 14px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: color-mix(in srgb, #06b6d4 9%, transparent);
|
||||||
|
border: 1px solid color-mix(in srgb, #06b6d4 28%, transparent);
|
||||||
|
color: var(--m-text);
|
||||||
|
font-size: 0.78rem;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.mpa-pron-hint > i {
|
||||||
|
color: #06b6d4;
|
||||||
|
font-size: 1rem;
|
||||||
|
margin-top: 2px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mpa-pron-stats {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
.mpa-pron-stat {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background: var(--m-bg-soft);
|
||||||
|
border: 1px solid var(--m-border);
|
||||||
|
border-left: 3px solid var(--c, var(--p-primary-color));
|
||||||
|
}
|
||||||
|
.mpa-pron-stat > i {
|
||||||
|
color: var(--c, var(--p-primary-color));
|
||||||
|
font-size: 1.05rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.mpa-pron-stat__value {
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: 800;
|
||||||
|
color: var(--m-text);
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
.mpa-pron-stat__label {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--m-text-muted);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mpa-pron-filters {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
.mpa-pron-filter {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 999px;
|
||||||
|
background: var(--m-bg-soft);
|
||||||
|
border: 1px solid var(--m-border);
|
||||||
|
color: var(--m-text);
|
||||||
|
cursor: pointer;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all 120ms ease;
|
||||||
|
}
|
||||||
|
.mpa-pron-filter > i { font-size: 0.7rem; }
|
||||||
|
.mpa-pron-filter:hover {
|
||||||
|
background: var(--m-bg-soft-hover);
|
||||||
|
border-color: var(--m-border-strong);
|
||||||
|
}
|
||||||
|
.mpa-pron-filter.is-active {
|
||||||
|
background: var(--p-primary-color);
|
||||||
|
border-color: var(--p-primary-color);
|
||||||
|
color: var(--p-primary-contrast-color, #fff);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mpa-pron-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
.mpa-pron-item {
|
||||||
|
border-radius: 12px;
|
||||||
|
border: 1px solid var(--m-border);
|
||||||
|
background: var(--m-bg-soft);
|
||||||
|
padding: 12px 14px;
|
||||||
|
border-left: 3px solid var(--m-text-muted);
|
||||||
|
transition: border-color 120ms ease;
|
||||||
|
}
|
||||||
|
.mpa-pron-item[data-status*="realiz"],
|
||||||
|
.mpa-pron-item[data-status*="present"] { border-left-color: rgb(34, 197, 94); }
|
||||||
|
.mpa-pron-item[data-status*="falt"] { border-left-color: rgb(239, 68, 68); }
|
||||||
|
.mpa-pron-item[data-status*="cancel"],
|
||||||
|
.mpa-pron-item[data-status*="remarc"] { border-left-color: rgb(245, 158, 11); }
|
||||||
|
.mpa-pron-item__head {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 10px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__when {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__date {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--m-text);
|
||||||
|
}
|
||||||
|
.mpa-pron-item__rel {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--m-text-muted);
|
||||||
|
}
|
||||||
|
.mpa-pron-item__chips {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__tag { font-size: 0.66rem !important; }
|
||||||
|
.mpa-pron-item__title {
|
||||||
|
font-size: 0.82rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--m-text);
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mpa-pron-item__evol {
|
||||||
|
margin-top: 8px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: var(--m-bg-medium);
|
||||||
|
border-left: 2px solid var(--p-primary-color);
|
||||||
|
}
|
||||||
|
.mpa-pron-item__evol-label {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 5px;
|
||||||
|
font-size: 0.66rem;
|
||||||
|
font-weight: 700;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
color: var(--p-primary-color);
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__evol-label > i { font-size: 0.62rem; }
|
||||||
|
.mpa-pron-item__evol-text {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--m-text);
|
||||||
|
line-height: 1.55;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__noevol {
|
||||||
|
margin-top: 6px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--m-text-muted);
|
||||||
|
opacity: 0.65;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
.mpa-pron-item__noevol > i { font-size: 0.5rem; }
|
||||||
|
|
||||||
|
.mpa-pron-roadmap {
|
||||||
|
margin-top: 6px;
|
||||||
|
border-style: dashed;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list > li {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 8px 0;
|
||||||
|
border-bottom: 1px solid var(--m-border);
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list > li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list > li > i {
|
||||||
|
color: var(--p-primary-color);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
margin-top: 2px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 24px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list > li > div {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list strong {
|
||||||
|
display: block;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--m-text);
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
.mpa-pron-roadmap__list span {
|
||||||
|
font-size: 0.74rem;
|
||||||
|
color: var(--m-text-muted);
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
/* ═══════ Notas e observacoes ═══════ */
|
/* ═══════ Notas e observacoes ═══════ */
|
||||||
.mpa-notes {
|
.mpa-notes {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
Reference in New Issue
Block a user