39 🌙 Como Activar el Modo Dark en AdminLTE | Laravel 12 FullStack Sistema de Inventario

Duración: 13 min
Módulo: Módulo Ajustes y reportes Lección 1 de 1

Descripción

🌗 Lección 39: ¡Implementando el Modo Oscuro! 🌙✨

En esta lección, te centrarás en una funcionalidad moderna que mejora la experiencia del usuario y la accesibilidad: el modo oscuro. Aprenderás a activarlo en tu sistema de ventas de forma sencilla y a añadir un interruptor para que los usuarios puedan cambiar entre el tema claro y el oscuro.

El video cubre los siguientes puntos clave:

  • Demostración del Sistema: El creador del video comienza mostrando el funcionamiento actual del sistema de gestión de inventario.
  • Activación del Modo Oscuro: Se explica cómo habilitar el modo oscuro cambiando el valor de layout_dark_mode de null a true en el archivo de configuración adminlte.php.
  • Habilitación de la Barra Lateral: Se muestra cómo activar la barra lateral derecha para obtener opciones de personalización adicionales.
  • Añadiendo el Interruptor de Tema: El creador del video añade un fragmento de código JavaScript a un archivo de plantilla (page.blade.php) que activa la funcionalidad de cambio de tema a través de la barra lateral.
  • Prueba Final: Se demuestra que el nuevo interruptor de tema aparece en la esquina superior derecha, permitiendo a los usuarios alternar entre el tema oscuro y el claro. Además, se confirma que el tema seleccionado se mantiene incluso después de recargar la página.

Contenido

<script>
$(document).ready(function() {
   // Crear contenido del control sidebar
   var sidebarContent = `
       <div class="p-3">
           <h5><i class="fas fa-cogs"></i> Configuración</h5>
           <hr class="mb-2">
           
           <h6>Cambiar tema</h6>
           <div class="form-group mb-3">
               <select id="theme-selector" class="form-control form-control-sm">
                   <option value="default">Por defecto</option>
                   <option value="primary">Azul (Primario)</option>
                   <option value="success">Verde</option>
                   <option value="danger">Rojo</option>
                   <option value="warning">Amarillo</option>
                   <option value="info">Celeste</option>
                   <option value="secondary">Gris</option>
               </select>
           </div>
           
           <div class="form-group mb-3">
               <div class="custom-control custom-switch">
                   <input type="checkbox" class="custom-control-input" id="dark-mode">
                   <label class="custom-control-label" for="dark-mode">Modo oscuro</label>
               </div>
           </div>
           
           <hr class="mb-2">
           <h6>Sistema</h6>
           <small class="text-muted">
               <div><i class="fas fa-user mr-2"></i>{{ Auth::user()->name }}</div>
               <div><i class="fas fa-calendar mr-2"></i>{{ date('d/m/Y') }}</div>
               <div><i class="fas fa-clock mr-2"></i>{{ date('H:i') }}</div>
           </small>
       </div>
   `;
   
   // Esperar a que todo cargue y luego insertar contenido
   setTimeout(function() {
       $('.control-sidebar').html(sidebarContent);
       
       // Arreglar el layout cuando se abre/cierra el sidebar
       $('[data-widget="control-sidebar"]').on('click', function() {
           setTimeout(function() {
               $('body').toggleClass('control-sidebar-slide-open');
           }, 100);
       });
       
   }, 100);
   
   // Cambiar tema
   $(document).on('change', '#theme-selector', function() {
       var theme = $(this).val();
       
       if (theme === 'default') {
           // Restaurar tema por defecto de AdminLTE
           $('.main-sidebar').removeClass('sidebar-dark-primary sidebar-dark-success sidebar-dark-danger sidebar-dark-warning sidebar-dark-info sidebar-dark-secondary')
                             .addClass('sidebar-dark-primary elevation-4');
           
           $('.main-header').removeClass('navbar-primary navbar-success navbar-danger navbar-warning navbar-info navbar-secondary')
                            .addClass('navbar-white navbar-light');
           
           $('.info-box-icon').removeClass('bg-info bg-primary bg-success bg-danger bg-warning bg-secondary')
                              .addClass('bg-info');
           
           localStorage.setItem('selected-theme', 'default');
       } else {
           // Aplicar tema seleccionado
           $('.main-sidebar').removeClass('sidebar-dark-primary sidebar-dark-success sidebar-dark-danger sidebar-dark-warning sidebar-dark-info sidebar-dark-secondary')
                             .addClass('sidebar-dark-' + theme + ' elevation-4');
           
           $('.main-header').removeClass('navbar-primary navbar-success navbar-danger navbar-warning navbar-info navbar-secondary navbar-white navbar-light')
                            .addClass('navbar-' + theme + ' navbar-light');
           
           $('.info-box-icon').removeClass('bg-info bg-primary bg-success bg-danger bg-warning bg-secondary')
                              .addClass('bg-' + theme);
           
           localStorage.setItem('selected-theme', theme);
       }
   });
   
   // Modo oscuro
   $(document).on('change', '#dark-mode', function() {
       if ($(this).is(':checked')) {
           $('body').addClass('dark-mode');
           localStorage.setItem('dark-mode', 'true');
       } else {
           $('body').removeClass('dark-mode');
           localStorage.setItem('dark-mode', 'false');
       }
   });
   
   // Establecer valores por defecto
   setTimeout(function() {
       var savedTheme = localStorage.getItem('selected-theme');
       var darkMode = localStorage.getItem('dark-mode');
       
       if (savedTheme) {
           $('#theme-selector').val(savedTheme).trigger('change');
       } else {
           // Establecer "Por defecto" como selección inicial
           $('#theme-selector').val('default');
       }
       
       if (darkMode === 'true') {
           $('#dark-mode').prop('checked', true).trigger('change');
       }
   }, 100);
});
</script>