Demo Interactivo ✨
Prueba el Planificador Calendario Core. Los eventos de ejemplo están pre-cargados para **la fecha actual y los días siguientes**.
Nota:
Este demo usa la configuración por defecto: Modo Oscuro, Color Primario Azul, y vista de Mes. El **panel lateral está visible al cargar**. Haz clic en los eventos en el panel para ver sus detalles en un modal. Usa el botón "+ Nuevo" para crear un evento interactivo.
Primeros Pasos 🛠️
**PLC Core** es una librería Vanilla JavaScript. Para comenzar, solo necesita tres pasos: incluir el archivo **`calendar.js`**, definir el contenedor HTML y llamar a la función de inicialización.
1. Incluir la Librería (calendar.js):
Copie y pegue la siguiente etiqueta <script> justo antes de la etiqueta de cierre </body>.
<script src="https://guillepalma.xo.je/calendar/calendar.js"></script>
2. Estructura HTML:
Defina un contenedor vacío con un id. La librería inyectará todo el markup necesario dentro de él.
<!-- El calendario se renderizará aquí -->
<div id="mi-planificador" style="width: 100%; height: 500px;"></div>
<!-- NOTA: La librería se adapta al tamaño de este contenedor.
Recomendamos darle un tamaño fijo o máximo. -->
3. Inicialización:
Finalmente, cree un bloque de script y llame a inicializarPlanificador.
<script>
// Ejemplo de lista de eventos
const eventosLista = [
{ date: '2025-10-15', time: '10:00', description: 'Reunión con Cliente', details: 'Tema A', category: 'work' },
{ date: '2025-10-15', time: '14:30', description: 'Cita Médica', details: 'Chequeo anual', category: 'personal' },
// ... más eventos
];
window.onload = function() {
inicializarPlanificador({
// **[OBLIGATORIO]** ID del contenedor:
node: 'mi-planificador',
// Opciones:
eventos: eventosLista,
colorPrimario: '#3b82f6', // Azul principal para resaltar
modoOscuro: false,
vistaInicial: 'month',
// Callbacks:
alClicEnDia: (fecha, eventos) => console.log('Día clickeado:', fecha, eventos.length),
});
}
</script>
Ejemplos de Uso Avanzado 💡
La verdadera potencia de PLC Core reside en sus funciones de callback, que le permiten enlazar la interacción del usuario con cualquier lógica de negocio (abrir modales, enviar datos a una API, etc.).
1. Callback: Mostrar Detalle del Evento en un Modal (Vanilla JS)
Al usar alClicEnEvento, recibe el objeto evento completo y puede usarlo para poblar cualquier ventana de detalles o modal en su página.
Código JavaScript (Configuración del Callback):
inicializarPlanificador({
// ... otras opciones
alClicEnEvento: (evento) => {
// Lógica de Vanilla JS para poblar y abrir un modal/ventana:
document.getElementById('modalDetalleTitulo').textContent = evento.description;
document.getElementById('modalDetalleFecha').textContent = evento.date;
document.getElementById('modalDetalleHora').textContent = evento.time;
document.getElementById('modalDetalleDesc').textContent = evento.details;
// Muestra el modal (asumiendo que tiene un ID 'miModalDetalle')
document.getElementById('miModalDetalle').style.display = 'block';
},
});
Código HTML de Referencia para el Modal:
<div id="miModalDetalle" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5);">
<div style="background: white; margin: 10% auto; padding: 20px; width: 80%;">
<h3 id="modalDetalleTitulo"></h3>
<p>Fecha: <span id="modalDetalleFecha"></span></p>
<p>Hora: <span id="modalDetalleHora"></span></p>
<p>Detalles: <span id="modalDetalleDesc"></span></p>
<button onclick="document.getElementById('miModalDetalle').style.display='none';">Cerrar</button>
</div>
</div>
2. Callback: Abrir Formulario y Agregar Evento Dinámicamente
La función onNewEvent se activa al presionar el botón **+ Nuevo**. Podemos usarla para abrir un formulario y, crucialmente, **re-renderizar** el calendario con el nuevo evento.
// Asumimos que tiene un array 'eventosGlobales' fuera de la función de inicialización.
let eventosGlobales = [...eventosIniciales];
let planificadorInstancia; // Variable para almacenar la instancia del planificador
// Función principal para inicializar/re-inicializar
function cargarPlanificador() {
planificadorInstancia = inicializarPlanificador({
node: 'mi-planificador',
eventos: eventosGlobales, // Usamos el array global
// Callback para el botón '+ Nuevo'
onNewEvent: (fechaSeleccionada) => {
// 1. Pre-pobla la fecha en el formulario
document.getElementById('formFecha').value = fechaSeleccionada;
// 2. Muestra el modal del formulario
document.getElementById('miModalForm').style.display = 'block';
},
// ... otros callbacks
});
}
// ** Lógica para manejar el envío del formulario **
document.getElementById('miFormulario').addEventListener('submit', function(e) {
e.preventDefault();
const nuevoEvento = {
date: document.getElementById('formFecha').value,
time: document.getElementById('formHora').value,
description: document.getElementById('formTitulo').value,
details: document.getElementById('formDescripcion').value,
category: document.getElementById('formCategoria').value,
};
// 1. Agregar el nuevo evento al array global
eventosGlobales.push(nuevoEvento);
// 2. Cerrar el modal
document.getElementById('miModalForm').style.display = 'none';
// 3. ¡MÁS IMPORTANTE! Vuelve a cargar el calendario con la lista actualizada.
// Esto borra el viejo y dibuja el nuevo, incluyendo el evento recién creado.
cargarPlanificador();
alert('Evento creado y calendario actualizado.');
});
// Llamar al inicio para cargar la instancia
cargarPlanificador();
Opciones de Configuración y Eventos ⚙️
Parámetros (Opciones):
Se pasan como un objeto JavaScript a la función inicializarPlanificador(config).
| Opción | Tipo | Descripción | Default |
|---|---|---|---|
node |
String | **Obligatorio.** ID del elemento contenedor donde se renderizará el calendario. | N/A |
fechaInicial |
Date | String | Fecha inicial que se mostrará al cargar. Acepta objetos Date o strings válidos (ej: '2025-10-01'). | new Date() |
eventos |
Array | Lista de objetos evento para mostrar en el calendario. | [] |
colorPrimario |
String (Hex) | Color principal utilizado para resaltar días, el borde del panel y botones. Debe ser un **valor hexadecimal estricto** (ej: #10b981). |
#10b981 |
modoOscuro |
Boolean | Si es true, activa la paleta de colores oscuros (fondos grises oscuros y texto claro). |
true |
vistaInicial |
String | Vista por defecto al cargar. Valores posibles: 'month' (Mes) o 'week' (Semana). |
'month' |
panelOcultoInicial |
Boolean | Si es true, el panel lateral de eventos se ocultará al cargar. Se mostrará al hacer clic en un día. |
false |
Estructura del Objeto Evento:
Cada elemento en el arreglo eventos debe seguir esta estructura:
{
date: 'YYYY-MM-DD', // [OBLIGATORIO] Fecha del evento (Ej: '2025-10-25')
time: 'HH:MM', // Hora del evento (Ej: '14:30')
description: 'String', // Título corto del evento
details: 'String', // Descripción larga para el panel
category: 'String' // Categoría para el punto de color (Ej: 'work', 'personal', etc.)
}
Funciones de Callback:
Callbacks que se ejecutan cuando el usuario interactúa con el calendario.
| Callback | Parámetros | Descripción |
|---|---|---|
alClicEnDia |
fechaString, eventosDia |
Se ejecuta cuando un usuario hace clic en un día. Recibe la fecha formateada ('YYYY-MM-DD') y la lista de eventos para ese día. |
alClicEnEvento |
eventoObjeto |
Se ejecuta cuando un usuario hace clic en una tarjeta de evento en el panel lateral. |
onNewEvent |
fechaString |
Se ejecuta cuando el usuario presiona el botón "+ Nuevo" en el panel lateral. Recibe la fecha seleccionada actualmente. |