Widget de Calendario

Avanzado

Widget de calendario interactivo con gestión de eventos, selección de fechas y múltiples modos de vista para programación y planificación.

Vista Previa en Vivo

Implementación del Código

HTML
<div class="calendar-container">
  <div class="calendar-header">
    <h1 class="calendar-title">Widget de Calendario Interactivo</h1>
    <p class="calendar-subtitle">Calendario completo con gestión de eventos y múltiples modos de vista</p>
  </div>
  
  <div class="calendar-widget">
    <div class="calendar-controls">
      <div class="calendar-nav">
        <button class="nav-btn" id="prevMonth">
          <svg viewBox="0 0 24 24" fill="currentColor">
            <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
          </svg>
        </button>
        
        <div class="current-month">
          <h2 id="currentMonth">Enero 2025</h2>
          <button class="today-btn" id="todayBtn">Hoy</button>
        </div>
        
        <button class="nav-btn" id="nextMonth">
          <svg viewBox="0 0 24 24" fill="currentColor">
            <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
          </svg>
        </button>
      </div>
      
      <div class="view-controls">
        <div class="view-buttons">
          <button class="view-btn active" data-view="month">Mes</button>
          <button class="view-btn" data-view="week">Semana</button>
          <button class="view-btn" data-view="day">Día</button>
        </div>
        
        <button class="add-event-btn" id="addEventBtn">
          <svg viewBox="0 0 24 24" fill="currentColor">
            <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
          </svg>
          Agregar Evento
        </button>
      </div>
    </div>
    
    <div class="calendar-main">
      <div class="calendar-grid" id="calendarGrid">
        <div class="weekdays">
          <div class="weekday">Dom</div>
          <div class="weekday">Lun</div>
          <div class="weekday">Mar</div>
          <div class="weekday">Mié</div>
          <div class="weekday">Jue</div>
          <div class="weekday">Vie</div>
          <div class="weekday">Sáb</div>
        </div>
        
        <div class="calendar-days" id="calendarDays">
          <!-- Days will be generated by JavaScript -->
        </div>
      </div>
      
      <div class="calendar-sidebar">
        <div class="mini-calendar">
          <h3>Navegación Rápida</h3>
          <div class="mini-months" id="miniMonths">
            <!-- Mini months will be generated -->
          </div>
        </div>
        
        <div class="upcoming-events">
          <h3>Próximos Eventos</h3>
          <div class="events-list" id="eventsList">
            <!-- Events will be populated -->
          </div>
        </div>
        
        <div class="calendar-stats">
          <h3>Estadísticas</h3>
          <div class="stats-grid">
            <div class="stat-item">
              <span class="stat-number" id="totalEvents">0</span>
              <span class="stat-label">Total Eventos</span>
            </div>
            <div class="stat-item">
              <span class="stat-number" id="thisMonth">0</span>
              <span class="stat-label">Este Mes</span>
            </div>
            <div class="stat-item">
              <span class="stat-number" id="todayEvents">0</span>
              <span class="stat-label">Hoy</span>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
  
  <!-- Event Modal -->
  <div class="modal-overlay" id="eventModal">
    <div class="modal-content">
      <div class="modal-header">
        <h3 id="modalTitle">Agregar Nuevo Evento</h3>
        <button class="modal-close" id="modalClose">
          <svg viewBox="0 0 24 24" fill="currentColor">
            <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/>
          </svg>
        </button>
      </div>
      
      <form class="event-form" id="eventForm">
        <div class="form-group">
          <label for="eventTitle">Título del Evento</label>
          <input type="text" id="eventTitle" required placeholder="Ingresa el título del evento">
        </div>
        
        <div class="form-row">
          <div class="form-group">
            <label for="eventDate">Fecha</label>
            <input type="date" id="eventDate" required>
          </div>
          
          <div class="form-group">
            <label for="eventTime">Hora</label>
            <input type="time" id="eventTime">
          </div>
        </div>
        
        <div class="form-group">
          <label for="eventDescription">Descripción</label>
          <textarea id="eventDescription" placeholder="Descripción del evento (opcional)"></textarea>
        </div>
        
        <div class="form-row">
          <div class="form-group">
            <label for="eventCategory">Categoría</label>
            <select id="eventCategory">
              <option value="work">Trabajo</option>
              <option value="personal">Personal</option>
              <option value="meeting">Reunión</option>
              <option value="reminder">Recordatorio</option>
              <option value="holiday">Feriado</option>
            </select>
          </div>
          
          <div class="form-group">
            <label for="eventPriority">Prioridad</label>
            <select id="eventPriority">
              <option value="low">Baja</option>
              <option value="medium" selected>Media</option>
              <option value="high">Alta</option>
            </select>
          </div>
        </div>
        
        <div class="form-actions">
          <button type="button" class="btn-secondary" id="cancelBtn">Cancelar</button>
          <button type="submit" class="btn-primary" id="saveBtn">Guardar Evento</button>
          <button type="button" class="btn-danger" id="deleteBtn" style="display: none;">Eliminar</button>
        </div>
      </form>
    </div>
  </div>
</div>

Características del Fragmento

Diseño Responsivo: Sí
Soporte para Modo Oscuro: No
Categoría: widgets
Nivel de Dificultad: Avanzado

Compatibilidad del Navegador

🟢
chrome 60+
🟠
firefox 55+
🔵
safari 10+
🟦
edge 15+