- Backend PHP: architecture MVC avec API REST (upload, merge, preview, extract) - Frontend JavaScript: composants modulaires (arborescence, upload, themes, i18n) - Fonctionnalités: drag&drop, sélection exclusive, détection conflits, persistance état - Sécurité: validation stricte, isolation sessions, sanitization chemins - UI/UX: responsive, thèmes clair/sombre, multi-langue (FR/EN) - Documentation: README complet avec installation et utilisation
227 lines
5.7 KiB
CSS
227 lines
5.7 KiB
CSS
/**
|
|
* FuZip - Thèmes (Dark Mode)
|
|
* Option E du plan : Toggle dark/light mode
|
|
*/
|
|
|
|
/* ===== Thème sombre ===== */
|
|
[data-theme="dark"] {
|
|
/* Couleurs principales (inchangées) */
|
|
--color-primary: #3b82f6;
|
|
--color-primary-hover: #60a5fa;
|
|
--color-primary-light: #1e3a8a;
|
|
|
|
--color-secondary: #94a3b8;
|
|
--color-secondary-hover: #cbd5e1;
|
|
|
|
--color-success: #10b981;
|
|
--color-warning: #f59e0b;
|
|
--color-error: #ef4444;
|
|
|
|
/* Couleurs neutres (inversées pour dark) */
|
|
--color-bg: #0f172a;
|
|
--color-bg-secondary: #1e293b;
|
|
--color-bg-tertiary: #334155;
|
|
|
|
--color-text: #f1f5f9;
|
|
--color-text-secondary: #cbd5e1;
|
|
--color-text-muted: #94a3b8;
|
|
|
|
--color-border: #334155;
|
|
--color-border-hover: #475569;
|
|
|
|
/* Ombres adaptées pour dark */
|
|
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
|
|
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
|
|
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.4);
|
|
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6), 0 10px 10px -5px rgba(0, 0, 0, 0.5);
|
|
}
|
|
|
|
/* ===== Ajustements spécifiques dark mode ===== */
|
|
|
|
/* Drop zone dark */
|
|
[data-theme="dark"] .drop-zone {
|
|
background-color: var(--color-bg-secondary);
|
|
}
|
|
|
|
[data-theme="dark"] .drop-zone:hover,
|
|
[data-theme="dark"] .drop-zone.drag-over {
|
|
background-color: var(--color-bg-tertiary);
|
|
border-color: var(--color-primary);
|
|
}
|
|
|
|
/* Bouton browse dark */
|
|
[data-theme="dark"] .btn-browse {
|
|
background-color: var(--color-bg-tertiary);
|
|
color: var(--color-primary-hover);
|
|
border-color: var(--color-primary);
|
|
}
|
|
|
|
[data-theme="dark"] .btn-browse:hover {
|
|
background-color: var(--color-primary);
|
|
color: white;
|
|
}
|
|
|
|
/* Input search dark */
|
|
[data-theme="dark"] .search-input {
|
|
background-color: var(--color-bg-tertiary);
|
|
border-color: var(--color-border);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
[data-theme="dark"] .search-input:focus {
|
|
border-color: var(--color-primary);
|
|
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);
|
|
}
|
|
|
|
/* Tree items dark */
|
|
[data-theme="dark"] .tree-item:hover {
|
|
background-color: var(--color-bg-tertiary);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-item.selected {
|
|
background-color: rgba(59, 130, 246, 0.2);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-item.search-match {
|
|
background-color: rgba(245, 158, 11, 0.2);
|
|
}
|
|
|
|
/* Checkbox dark */
|
|
[data-theme="dark"] .tree-checkbox {
|
|
background-color: var(--color-bg-tertiary);
|
|
border-color: var(--color-border-hover);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-checkbox:hover {
|
|
border-color: var(--color-primary);
|
|
}
|
|
|
|
[data-theme="dark"] input[type="checkbox"]:checked + .tree-checkbox,
|
|
[data-theme="dark"] .tree-checkbox.checked {
|
|
background-color: var(--color-primary);
|
|
border-color: var(--color-primary);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-checkbox.indeterminate {
|
|
background-color: rgba(59, 130, 246, 0.3);
|
|
border-color: var(--color-primary);
|
|
}
|
|
|
|
/* Conflicts banner dark */
|
|
[data-theme="dark"] .conflicts-banner {
|
|
background-color: rgba(245, 158, 11, 0.1);
|
|
border-color: var(--color-warning);
|
|
color: #fbbf24;
|
|
}
|
|
|
|
/* Modal dark */
|
|
[data-theme="dark"] .modal {
|
|
background-color: rgba(0, 0, 0, 0.7);
|
|
}
|
|
|
|
[data-theme="dark"] .modal-content {
|
|
background-color: var(--color-bg-secondary);
|
|
}
|
|
|
|
[data-theme="dark"] .preview-content {
|
|
background-color: var(--color-bg-tertiary);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
/* Loading overlay dark */
|
|
[data-theme="dark"] .loading-overlay {
|
|
background-color: rgba(0, 0, 0, 0.7);
|
|
}
|
|
|
|
/* Messages d'erreur/succès dark */
|
|
[data-theme="dark"] .error-message {
|
|
background-color: rgba(239, 68, 68, 0.2);
|
|
border-color: var(--color-error);
|
|
color: #fca5a5;
|
|
}
|
|
|
|
[data-theme="dark"] .success-message {
|
|
background-color: rgba(16, 185, 129, 0.2);
|
|
border-color: var(--color-success);
|
|
color: #6ee7b7;
|
|
}
|
|
|
|
/* Upload panel states dark */
|
|
[data-theme="dark"] .upload-panel.success {
|
|
border-color: var(--color-success);
|
|
background-color: rgba(16, 185, 129, 0.1);
|
|
}
|
|
|
|
[data-theme="dark"] .upload-panel.error {
|
|
border-color: var(--color-error);
|
|
background-color: rgba(239, 68, 68, 0.1);
|
|
}
|
|
|
|
/* Progress bar dark */
|
|
[data-theme="dark"] .progress-bar {
|
|
background-color: var(--color-bg-tertiary);
|
|
}
|
|
|
|
/* Scrollbar dark */
|
|
[data-theme="dark"] .tree-content::-webkit-scrollbar-track {
|
|
background: var(--color-bg);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-content::-webkit-scrollbar-thumb {
|
|
background: var(--color-border-hover);
|
|
}
|
|
|
|
[data-theme="dark"] .tree-content::-webkit-scrollbar-thumb:hover {
|
|
background: var(--color-border);
|
|
}
|
|
|
|
/* ===== Transition smooth entre thèmes ===== */
|
|
body,
|
|
.header,
|
|
.upload-panel,
|
|
.tree-panel,
|
|
.footer,
|
|
.drop-zone,
|
|
.btn-icon,
|
|
.search-input,
|
|
.tree-item,
|
|
.tree-checkbox,
|
|
.modal-content,
|
|
.preview-content {
|
|
transition:
|
|
background-color var(--transition-base),
|
|
color var(--transition-base),
|
|
border-color var(--transition-base);
|
|
}
|
|
|
|
/* ===== Preference système ===== */
|
|
/* Détecter automatiquement la préférence système */
|
|
@media (prefers-color-scheme: dark) {
|
|
/* Par défaut, respecter la préférence système
|
|
Mais l'utilisateur peut override avec le toggle */
|
|
body:not([data-theme]) {
|
|
/* Les variables dark seront appliquées via JavaScript si aucun thème n'est explicitement défini */
|
|
}
|
|
}
|
|
|
|
/* ===== Accessibilité ===== */
|
|
/* Assurer un contraste suffisant en dark mode */
|
|
[data-theme="dark"] {
|
|
/* Force le contraste minimum pour accessibilité */
|
|
color-scheme: dark;
|
|
}
|
|
|
|
[data-theme="light"] {
|
|
color-scheme: light;
|
|
}
|
|
|
|
/* ===== Print styles ===== */
|
|
/* Forcer le thème clair pour l'impression */
|
|
@media print {
|
|
body[data-theme] {
|
|
--color-bg: white;
|
|
--color-text: black;
|
|
--color-border: #e5e7eb;
|
|
}
|
|
}
|