COMPOSANTS

Bascule de vue

Bascule tableau / grille

Composant join avec deux boutons icône. L'état actif est marqué par btn-active.

<div class="join">
  <button class="join-item btn btn-sm btn-ghost btn-active" title="Vue tableau" aria-label="Vue tableau">
    <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
      <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h18M3 6h18M3 14h18M3 18h18"/>
    </svg>
  </button>
  <button class="join-item btn btn-sm btn-ghost" title="Vue grille" aria-label="Vue grille">
    <svg class="w-4 h-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
      <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
            d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6z
               M14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6z
               M4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2z
               M14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"/>
    </svg>
  </button>
</div>

Contexte dans une toolbar

Le toggle s'intègre dans la barre d'outils entre le compteur de résultats et le CTA principal. Il ne doit pas monopoliser l'attention.

284 produits
<div class="flex items-center justify-between mb-4">
  <div class="flex items-center gap-3">
    <span class="text-sm text-base-content/60">284 produits</span>
    <div class="join">
      <button class="join-item btn btn-sm btn-ghost btn-active" title="Vue tableau">
        <!-- icône lignes -->
      </button>
      <button class="join-item btn btn-sm btn-ghost" title="Vue grille">
        <!-- icône grille -->
      </button>
    </div>
  </div>
  <button class="btn btn-primary btn-sm">Ajouter un produit</button>
</div>

Persistance localStorage

La préférence de vue est mémorisée entre les sessions. Appliquer au chargement de la page, sauvegarder à chaque changement.

const viewPref = localStorage.getItem('catalog-view') || 'table';
// Apply on page load, save on toggle
document.querySelectorAll('[data-view]').forEach(btn => {
  btn.addEventListener('click', () => {
    const view = btn.dataset.view;
    localStorage.setItem('catalog-view', view);
    // Toggle btn-active, show/hide relevant section
  });
});
Utiliser btn-active pour la vue sélectionnée.
Stocker la préférence en localStorage (persistante entre les sessions).
Toujours ajouter title et aria-label (icônes uniquement).
Ne pas utiliser un dropdown pour basculer entre 2 vues — utiliser join + btn.