Atualização do calendario

This commit is contained in:
2026-03-23 09:40:59 -03:00
parent c49f619569
commit f675979736
2 changed files with 597 additions and 414 deletions

View File

@@ -1,306 +1,410 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Poppins', sans-serif;
}
/* ===== HEADER ===== */
#header {
width: 100%;
height: 50px;
position: fixed;
top: 0;
left: 0;
background: linear-gradient(to right, #C0392B, #114455);
display: flex;
align-items: center;
z-index: 10;
}
#title {
color: white;
padding-left: 20px;
font-size: 28px;
}
/* ===== BARRA ESQUERDA ===== */
#barraesquerda {
position: fixed;
top: 50px;
left: 0;
width: 320px;
height: calc(100vh - 50px);
background: #C0392B;
padding: 15px;
color: white;
display: flex;
flex-direction: column;
font-family: 'Inter', sans-serif;
}
/* ===== MINI CALENDÁRIO ===== */
#calendario {
margin-top: 10px;
}
.calendariotop {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
#mes {
font-size: 18px;
font-weight: 600;
}
#calendarseta {
display: flex;
gap: 15px; /* espaço entre as setas */
}
#calendarseta button {
background: transparent;
border: none;
color: white;
font-size: 26px; /* tamanho maior */
cursor: pointer;
padding: 5px 10px; /* aumenta área de clique */
transition: transform 0.2s ease;
}
#calendarseta button:hover {
transform: scale(1.2); /* efeito ao passar o mouse */
}
.setas-grande {
display: flex;
align-items: center;
gap: 15px;
}
.titulo-mes {
font-size: 16px;
font-weight: 500;
}
.dia-semana {
background: #f0f0f0;
text-align: center;
font-weight: 600;
font-size: 12px;
padding: 10px 0;
border: 1px solid #ddd;
}
.antGrande,
.proxGrande {
background: transparent;
border: none;
color: #1f3b57;
font-size: 26px;
cursor: pointer;
padding: 5px 10px;
transition: transform 0.2s ease;
}
.antGrande:hover,
.proxGrande:hover {
transform: scale(1.2);
}
.calendariodia {
width: 100%;
border-collapse: collapse;
}
.calendariodia th {
font-size: 11px;
opacity: 0.7;
}
.calendariodia td {
text-align: center;
padding: 6px;
font-size: 12px;
border-radius: 50%;
position: relative;
}
/* bolinha */
.calendariodia td::after {
content: "";
width: 5px;
height: 5px;
background: white;
border-radius: 50%;
position: absolute;
bottom: -2px;
left: 50%;
transform: translateX(-50%);
}
.outromes {
opacity: 0.4;
}
.calendariodia td.today {
background: #114455;
border-radius: 30%;
height: 0px;
width: 5px;
}
/* ===== AGENDA ===== */
.agenda-header {
margin-top: 15px;
border-top: 1px solid rgba(255,255,255,0.3);
border-bottom: 1px solid rgba(255,255,255,0.3);
padding: 8px 0;
font-size: 13px;
}
.evento {
margin-top: 10px;
padding-left: 10px;
border-left: 3px solid white;
}
.evento.azul {
border-color: #00c2ff;
}
.evento.rosa {
border-color: #ff4fa3;
}
.hora {
font-size: 11px;
opacity: 0.7;
}
.titulo {
font-size: 13px;
}
.link {
font-size: 11px;
color: #ffdede;
}
/* ===== FERIADOS ===== */
.feriados-header {
margin-top: 15px;
font-weight: 600;
}
.feriado {
display: flex;
gap: 8px;
margin-top: 8px;
font-size: 13px;
}
.dot {
width: 6px;
height: 6px;
background: #d4ff6a;
border-radius: 50%;
}
/* ===== MAIN ===== */
.main {
margin-left: 320px;
margin-top: 50px;
min-height: calc(100vh - 50px);
display: flex;
flex-direction: column;
background: #f5f5f5;
}
/* ===== TOPBAR ===== */
.topbar {
height: 70px;
background: #eaeaea;
border-bottom: 3px solid #c0392b;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 25px;
}
.topbar h1 {
font-size: 24px;
color: #1f3b57;
}
/* USER AREA */
.user-area {
display: flex;
align-items: center;
gap: 20px;
}
.icone {
font-size: 20px;
cursor: pointer;
}
.perfil {
display: flex;
align-items: center;
gap: 10px;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: url('https://i.pravatar.cc/100') center/cover;
}
.info {
display: flex;
flex-direction: column;
}
.nome {
font-weight: 600;
color: #1f3b57;
}
.cargo {
font-size: 12px;
color: #666;
}
/* ===== SUBHEADER ===== */
.subheader {
background: #eaeaea;
border-bottom: 3px solid #c0392b;
padding: 10px 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.subheader h2 {
color: #1f3b57;
}
/* BOTÕES */
.view-buttons button {
border: none;
padding: 5px 10px;
border-radius: 6px;
cursor: pointer;
background: transparent;
}
.view-buttons .active {
background: #c0392b;
color: white;
}
/* ===== MÊS ===== */
.month-title {
padding: 10px 20px;
font-size: 16px;
}
/* ===== CALENDÁRIO GRANDE ===== */
.calendar-area {
display: grid;
grid-template-columns: repeat(7, 1fr);
/* PRIMEIRA LINHA MENOR */
grid-template-rows: 40px repeat(6, 120px);
}
body {
font-family: 'Poppins', sans-serif;
}
/* ===== HEADER ===== */
#header {
width: 100%;
height: 50px;
position: fixed;
top: 0;
left: 0;
background: linear-gradient(to right, #C0392B, #114455);
display: flex;
align-items: center;
z-index: 10;
}
#title {
color: white;
padding-left: 20px;
font-size: 28px;
}
/* ===== BARRA ESQUERDA ===== */
#barraesquerda {
position: fixed;
top: 50px;
left: 0;
width: 320px;
height: calc(100vh - 50px);
background: #C0392B;
padding: 15px;
color: white;
display: flex;
flex-direction: column;
font-family: 'Inter', sans-serif;
}
/* ===== MINI CALENDÁRIO ===== */
#calendario {
margin-top: 10px;
}
.calendariotop {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
#mes {
font-size: 18px;
font-weight: 600;
}
#calendarseta button {
background: transparent;
border: none;
color: white;
font-size: 18px;
cursor: pointer;
}
.calendariodia {
width: 100%;
border-collapse: collapse;
}
.calendariodia th {
font-size: 11px;
opacity: 0.7;
}
.calendariodia td {
/* DIAS DA SEMANA */
.dia-semana {
background: #f0f0f0;
text-align: center;
padding: 6px;
font-size: 12px;
border-radius: 50%;
position: relative;
}
/* bolinha */
.calendariodia td::after {
content: "";
width: 5px;
height: 5px;
background: white;
border-radius: 50%;
position: absolute;
bottom: -2px;
left: 50%;
transform: translateX(-50%);
}
.outromes {
opacity: 0.4;
}
.calendariodia td.today {
background: #114455;
border-radius: 30%;
height: 0px;
width: 5px;
}
/* ===== AGENDA ===== */
.agenda-header {
margin-top: 15px;
border-top: 1px solid rgba(255,255,255,0.3);
border-bottom: 1px solid rgba(255,255,255,0.3);
padding: 8px 0;
font-size: 13px;
}
.evento {
margin-top: 10px;
padding-left: 10px;
border-left: 3px solid white;
}
.evento.azul {
border-color: #00c2ff;
}
.evento.rosa {
border-color: #ff4fa3;
}
.hora {
font-size: 11px;
opacity: 0.7;
}
.titulo {
font-size: 13px;
}
.link {
font-size: 11px;
color: #ffdede;
}
/* ===== FERIADOS ===== */
.feriados-header {
margin-top: 15px;
font-weight: 600;
}
.feriado {
display: flex;
gap: 8px;
margin-top: 8px;
font-size: 13px;
padding: 10px 0;
border: 1px solid #ddd;
}
.dot {
width: 6px;
height: 6px;
background: #d4ff6a;
border-radius: 50%;
}
.dia-box {
background: #fff;
border: 1px solid #ddd;
}
/* ===== MAIN ===== */
.main {
margin-left: 320px;
margin-top: 50px;
min-height: calc(100vh - 50px);
.dia-box:hover {
background: #eaeaff;
}
.icone-img {
width: 20px;
height: 20px;
cursor: pointer;
object-fit: contain;
transition: transform 0.2s ease;
}
.icone-img:hover {
transform: scale(1.15);
}
.calendar-header {
display: flex;
flex-direction: column;
background: #f5f5f5;
}
/* ===== TOPBAR ===== */
.topbar {
height: 70px;
background: #eaeaea;
border-bottom: 3px solid #c0392b;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 25px;
}
.topbar h1 {
font-size: 24px;
color: #1f3b57;
}
/* USER AREA */
.user-area {
display: flex;
align-items: center;
gap: 20px;
padding: 10px 20px;
background: #eee;
border-bottom: 1px solid #ccc;
}
.icone {
font-size: 20px;
cursor: pointer;
}
.perfil {
/* ESQUERDA (MÊS + SETAS) */
.mes-nav {
display: flex;
align-items: center;
gap: 10px;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
background: url('https://i.pravatar.cc/100') center/cover;
}
.info {
display: flex;
flex-direction: column;
}
.nome {
.titulo-mes {
font-size: 18px;
font-weight: 600;
color: #1f3b57;
}
.cargo {
font-size: 12px;
color: #666;
.seta {
background: transparent;
border: none;
font-size: 22px;
cursor: pointer;
color: #c0392b;
}
/* ===== SUBHEADER ===== */
.subheader {
background: #eaeaea;
border-bottom: 3px solid #c0392b;
padding: 10px 20px;
/* DIREITA (DIA / SEMANA / MÊS) */
.view-switch {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
}
.subheader h2 {
.view-switch button {
border: none;
padding: 6px 14px;
border-radius: 8px;
background: transparent;
cursor: pointer;
font-weight: 500;
color: #1f3b57;
}
/* BOTÕES */
.view-buttons button {
border: none;
padding: 5px 10px;
border-radius: 6px;
cursor: pointer;
background: transparent;
}
.view-buttons .active {
/* BOTÃO ATIVO (MÊS) */
.view-switch .active {
background: #c0392b;
color: white;
}
/* ===== MÊS ===== */
.month-title {
padding: 10px 20px;
font-size: 16px;
}
/* ===== CALENDÁRIO GRANDE ===== */
.calendar-area {
flex: 1;
margin: 20px;
background: #ddd;
border-radius: 8px;
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-auto-rows: 120px;
}
.dia-box {
background: #fff;
border: 1px solid #ddd;
}
.dia-box:hover {
background: #eaeaff;
}
.icone-img {
width: 20px;
height: 20px;
cursor: pointer;
object-fit: contain;
transition: transform 0.2s ease;
}
.icone-img:hover {
transform: scale(1.15);
}

View File

@@ -81,187 +81,266 @@
<!-- MÊS -->
<div class="month-title">
<span></span>
Janeiro, 2025
<span></span>
</div>
<div class="calendar-header">
<!-- ESQUERDA (SETAS + MÊS) -->
<div class="mes-nav">
<button class="seta antGrande"></button>
<span class="titulo-mes">Janeiro, 2025</span>
<button class="seta proxGrande"></button>
</div>
<!-- DIREITA (DIA / SEMANA / MÊS) -->
<div class="view-switch">
<button>Dia</button>
<button>Semana</button>
<button class="active">Mês</button>
</div>
</div>
<!-- CALENDÁRIO GRANDE -->
<div class="calendar-area" id="calendarArea"></div>
</div>
<!-- SCRIPT -->
<script>
/* ===== MINI CALENDÁRIO ===== */
<script>
/* ===== VARIÁVEIS ===== */
let dataMini = new Date();
let dataGrande = new Date();
let dataAtual = new Date();
/* ===== MESES ===== */
const meses = [
"Janeiro", "Fevereiro", "Março", "Abril",
"Maio", "Junho", "Julho", "Agosto",
"Setembro", "Outubro", "Novembro", "Dezembro"
];
function renderCalendario() {
const mesEl = document.getElementById("mes");
const diasEl = document.getElementById("dias");
/* ===== MINI CALENDÁRIO ===== */
function renderCalendario() {
const mesEl = document.getElementById("mes");
const diasEl = document.getElementById("dias");
const meses = [
"Janeiro", "Fevereiro", "Março", "Abril",
"Maio", "Junho", "Julho", "Agosto",
"Setembro", "Outubro", "Novembro", "Dezembro"
];
let ano = dataMini.getFullYear();
let mes = dataMini.getMonth();
let ano = dataAtual.getFullYear();
let mes = dataAtual.getMonth();
mesEl.textContent = `${meses[mes]} ${ano}`;
mesEl.textContent = `${meses[mes]} ${ano}`;
let primeiroDia = new Date(ano, mes, 1).getDay();
let ultimoDia = new Date(ano, mes + 1, 0).getDate();
let ultimoDiaMesAnterior = new Date(ano, mes, 0).getDate();
let primeiroDia = new Date(ano, mes, 1).getDay();
let ultimoDia = new Date(ano, mes + 1, 0).getDate();
let ultimoDiaMesAnterior = new Date(ano, mes, 0).getDate();
diasEl.innerHTML = "";
diasEl.innerHTML = "";
let diaAtualNum = 1;
let diaSeguinte = 1;
let diaAtual = 1;
let diaSeguinte = 1;
let totalCelulas = primeiroDia + ultimoDia;
let totalLinhas = Math.ceil(totalCelulas / 7);
if (totalLinhas < 4) totalLinhas = 4;
let totalCelulas = primeiroDia + ultimoDia;
let totalLinhas = Math.ceil(totalCelulas / 7);
if (totalLinhas < 4) totalLinhas = 4;
for (let semana = 0; semana < totalLinhas; semana++) {
let linha = document.createElement("tr");
for (let semana = 0; semana < totalLinhas; semana++) {
let linha = document.createElement("tr");
for (let diaSemana = 0; diaSemana < 7; diaSemana++) {
let pos = semana * 7 + diaSemana;
for (let diaSemana = 0; diaSemana < 7; diaSemana++) {
let pos = semana * 7 + diaSemana;
if (pos < primeiroDia) {
let dia = ultimoDiaMesAnterior - (primeiroDia - pos - 1);
linha.innerHTML += `<td class="outromes">${dia}</td>`;
}
else if (diaAtualNum <= ultimoDia) {
let hoje = new Date();
if (pos < primeiroDia) {
let dia = ultimoDiaMesAnterior - (primeiroDia - pos - 1);
linha.innerHTML += `<td class="outromes">${dia}</td>`;
}
else if (diaAtual <= ultimoDia) {
let hoje = new Date();
let classeHoje =
diaAtualNum === hoje.getDate() &&
mes === hoje.getMonth() &&
ano === hoje.getFullYear()
? "today"
: "";
let classeHoje =
diaAtual === hoje.getDate() &&
mes === hoje.getMonth() &&
ano === hoje.getFullYear()
? "today"
: "";
linha.innerHTML += `<td class="${classeHoje}">${diaAtual}</td>`;
diaAtual++;
}
else {
linha.innerHTML += `<td class="outromes">${diaSeguinte}</td>`;
diaSeguinte++;
}
}
diasEl.appendChild(linha);
linha.innerHTML += `<td class="${classeHoje}">${diaAtualNum}</td>`;
diaAtualNum++;
}
else {
linha.innerHTML += `<td class="outromes">${diaSeguinte}</td>`;
diaSeguinte++;
}
}
document.querySelector(".prox").onclick = () => {
dataAtual.setMonth(dataAtual.getMonth() + 1);
renderCalendario();
};
diasEl.appendChild(linha);
}
}
document.querySelector(".ant").onclick = () => {
dataAtual.setMonth(dataAtual.getMonth() - 1);
renderCalendario();
};
/* ===== CALENDÁRIO GRANDE ===== */
function renderCalendarioGrande() {
const area = document.getElementById("calendarArea");
const titulo = document.querySelector(".titulo-mes");
/* ===== CALENDÁRIO GRANDE ===== */
let ano = dataGrande.getFullYear();
let mes = dataGrande.getMonth();
function renderCalendarioGrande() {
const area = document.getElementById("calendarArea");
area.innerHTML = "";
/* ATUALIZA TÍTULO */
titulo.textContent = `${meses[mes]}, ${ano}`;
for (let i = 0; i < 35; i++) {
area.innerHTML += `<div class="dia-box"></div>`;
area.innerHTML = "";
/* DIAS DA SEMANA */
const diasSemana = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"];
diasSemana.forEach(dia => {
area.innerHTML += `<div class="dia-semana">${dia}</div>`;
});
let primeiroDia = new Date(ano, mes, 1).getDay();
let ultimoDia = new Date(ano, mes + 1, 0).getDate();
let ultimoMesAnterior = new Date(ano, mes, 0).getDate();
let total = primeiroDia + ultimoDia;
let linhas = Math.ceil(total / 7);
let diaAtualNum = 1;
let proxMes = 1;
for (let i = 0; i < linhas * 7; i++) {
let classe = "dia-box";
let numero = "";
if (i < primeiroDia) {
numero = ultimoMesAnterior - (primeiroDia - i - 1);
classe += " outro-mes";
}
else if (diaAtualNum <= ultimoDia) {
numero = diaAtualNum;
let hoje = new Date();
if (
diaAtualNum === hoje.getDate() &&
mes === hoje.getMonth() &&
ano === hoje.getFullYear()
) {
classe += " today";
}
diaAtualNum++;
}
else {
numero = proxMes++;
classe += " outro-mes";
}
/* ===== DADOS ===== */
area.innerHTML += `<div class="${classe}">${numero}</div>`;
}
}
let agendaData = [
{
hora: "08:15 09:15",
titulo: "Coçar oq fazer",
link: "https://youtube.com",
cor: "azul"
},
{
hora: "09:00 10:00",
titulo: "COMO QUE DIMINUI A FONTE?",
link: "https://sccor.com",
cor: "azul"
},
{
hora: "11:00 11:45",
titulo: "Pintar boobie-goods",
cor: "rosa"
},
{
hora: "18:20 23:00",
titulo: "Ir pro curso (infelizmente)",
link: "dom 4, BBP",
cor: "azul"
}
];
/* ===== ATUALIZAÇÕES ===== */
function atualizarMini() {
renderCalendario();
}
let feriadosData = [
{ texto: "15 Proclamação da República" },
{ texto: "20 Dia Nacional da Consciência Negra" }
];
function atualizarGrande() {
renderCalendarioGrande();
}
/* ===== RENDER AGENDA ===== */
/* ===== SETAS MINI ===== */
document.querySelector(".prox").onclick = () => {
dataMini.setMonth(dataMini.getMonth() + 1);
atualizarMini();
};
function renderAgenda() {
const container = document.getElementById("agenda");
document.querySelector(".ant").onclick = () => {
dataMini.setMonth(dataMini.getMonth() - 1);
atualizarMini();
};
container.innerHTML = `
<div class="agenda-header">
<strong>HOJE</strong> ${new Date().toLocaleDateString()}
</div>
`;
/* ===== SETAS GRANDE ===== */
document.querySelector(".antGrande").onclick = () => {
dataGrande.setMonth(dataGrande.getMonth() - 1);
atualizarGrande();
};
agendaData.forEach(ev => {
container.innerHTML += `
<div class="evento ${ev.cor}">
<div class="hora">${ev.hora}</div>
<div class="titulo">${ev.titulo}</div>
${ev.link ? `<div class="link">${ev.link}</div>` : ""}
</div>
`;
});
document.querySelector(".proxGrande").onclick = () => {
dataGrande.setMonth(dataGrande.getMonth() + 1);
atualizarGrande();
};
/* ===== BOTÕES DIA / SEMANA / MÊS ===== */
const botoesView = document.querySelectorAll(".view-switch button");
botoesView.forEach(btn => {
btn.addEventListener("click", () => {
botoesView.forEach(b => b.classList.remove("active"));
btn.classList.add("active");
const tipo = btn.textContent;
if (tipo === "Dia") {
alert("Modo DIA (você pode implementar depois)");
}
/* ===== RENDER FERIADOS ===== */
function renderFeriados() {
const container = document.getElementById("feriados");
container.innerHTML = `
<div class="feriados-header">FERIADOS 🎉</div>
`;
feriadosData.forEach(f => {
container.innerHTML += `
<div class="feriado">
<span class="dot"></span>
<span>${f.texto}</span>
</div>
`;
});
else if (tipo === "Semana") {
alert("Modo SEMANA (você pode implementar depois)");
}
else {
atualizarGrande(); // Mês já funciona
}
});
});
/* ===== INICIAR ===== */
/* ===== AGENDA ===== */
function renderAgenda() {
const container = document.getElementById("agenda");
renderCalendario();
renderCalendarioGrande();
renderAgenda();
renderFeriados();
</script>
container.innerHTML = `
<div class="agenda-header">
<strong>HOJE</strong> ${new Date().toLocaleDateString()}
</div>
`;
agendaData.forEach(ev => {
container.innerHTML += `
<div class="evento ${ev.cor}">
<div class="hora">${ev.hora}</div>
<div class="titulo">${ev.titulo}</div>
${ev.link ? `<div class="link">${ev.link}</div>` : ""}
</div>
`;
});
}
/* ===== FERIADOS ===== */
function renderFeriados() {
const container = document.getElementById("feriados");
container.innerHTML = `
<div class="feriados-header">FERIADOS 🎉</div>
`;
feriadosData.forEach(f => {
container.innerHTML += `
<div class="feriado">
<span class="dot"></span>
<span>${f.texto}</span>
</div>
`;
});
}
/* ===== DADOS ===== */
let agendaData = [
{ hora: "08:15 09:15", titulo: "Evento 1", cor: "azul" },
{ hora: "10:00 11:00", titulo: "Evento 2", cor: "rosa" }
];
let feriadosData = [
{ texto: "01 Ano Novo" }
];
/* ===== INICIAR ===== */
atualizarMini();
atualizarGrande();
renderAgenda();
renderFeriados();
</script>
</body>
</html>