From 21974c82c4071a52a0b18a8c07c636c9157aa7bd Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Nov 2025 13:48:08 +0000 Subject: [PATCH] =?UTF-8?q?UX:=20Refonte=20UI=20compl=C3=A8te=20-=20Partie?= =?UTF-8?q?=202/3=20(Components=20CSS)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Design moderne avec shadows élégantes - Note cards avec effet hover et transformation - Todo box sticky avec design épuré - Note editor fullscreen au lieu de modal - Boutons modernes avec transitions - Tables admin avec hover effects - Modal de confirmation élégant - Animations fluides (fadeIn, slideUp) - Responsive design intégré --- public/css/components.css | 719 +++++++++++++++++++++----------------- 1 file changed, 401 insertions(+), 318 deletions(-) diff --git a/public/css/components.css b/public/css/components.css index f96a037..6535892 100644 --- a/public/css/components.css +++ b/public/css/components.css @@ -1,240 +1,152 @@ -/* Composants UI */ +/* Components - UI Elements modernes */ -/* Search input */ -.search-input { - width: 100%; - padding: var(--spacing-sm) var(--spacing-md); - padding-right: 40px; - border: 2px solid var(--color-border); - border-radius: var(--radius-lg); - font-size: var(--font-size-base); - transition: border-color var(--transition-base); -} +/* ============================================ + NOTES CARDS + ============================================ */ -.search-input:focus { - outline: none; - border-color: var(--color-accent); -} - -.search-clear { - position: absolute; - right: var(--spacing-sm); - top: 50%; - transform: translateY(-50%); - width: 28px; - height: 28px; - border-radius: 50%; - background: var(--color-border); - color: var(--color-text-secondary); - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: background var(--transition-base); -} - -.search-clear:hover { - background: var(--color-text-secondary); - color: white; -} - -/* User dropdown */ -.user-info { - display: flex; - align-items: center; - gap: var(--spacing-sm); - padding: var(--spacing-sm) var(--spacing-md); - border-radius: var(--radius-md); - cursor: pointer; - transition: background var(--transition-base); -} - -.user-info:hover { - background: var(--color-background); -} - -.user-avatar { - font-size: var(--font-size-xl); -} - -.user-name { - font-weight: 500; -} - -.user-dropdown { - position: absolute; - top: calc(100% + var(--spacing-sm)); - right: 0; - background: white; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - box-shadow: var(--shadow-lg); - min-width: 200px; - display: none; - animation: fadeIn var(--transition-base); -} - -.user-dropdown.show { - display: block; -} - -.dropdown-item { - width: 100%; - padding: var(--spacing-md); - text-align: left; - transition: background var(--transition-base); - border-bottom: 1px solid var(--color-border); -} - -.dropdown-item:last-child { - border-bottom: none; -} - -.dropdown-item:hover { - background: var(--color-background); -} - -/* Note cards */ .note-card { background: var(--color-card); + border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: var(--spacing-lg); - box-shadow: var(--shadow-sm); cursor: pointer; - transition: transform var(--transition-base), box-shadow var(--transition-base); - position: relative; - min-height: 150px; - max-height: 400px; - overflow: hidden; + transition: all var(--transition-base); + box-shadow: var(--shadow-sm); } .note-card:hover { - transform: translateY(-4px); - box-shadow: var(--shadow-lg); + box-shadow: var(--shadow-hover); + transform: translateY(-2px); + border-color: var(--color-accent); } .note-card-title { font-size: var(--font-size-lg); - font-weight: 600; + font-weight: var(--font-weight-semibold); + color: var(--color-text-primary); margin-bottom: var(--spacing-sm); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + line-height: 1.4; } -.note-card-content { - color: var(--color-text-secondary); +.note-card-preview { font-size: var(--font-size-sm); + color: var(--color-text-secondary); line-height: 1.6; + margin-bottom: var(--spacing-md); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; - margin-bottom: var(--spacing-md); -} - -.note-card-image { - width: 50px; - height: 50px; - border-radius: var(--radius-sm); - object-fit: cover; - position: absolute; - top: var(--spacing-md); - right: var(--spacing-md); } .note-card-meta { display: flex; - justify-content: space-between; align-items: center; + justify-content: space-between; font-size: var(--font-size-xs); color: var(--color-text-secondary); - margin-top: auto; + padding-top: var(--spacing-sm); + border-top: 1px solid var(--color-border); } -.note-card-badge { - background: var(--color-accent); - color: white; - padding: 2px 8px; - border-radius: var(--radius-sm); - font-size: var(--font-size-xs); +.note-card-date { + font-weight: var(--font-weight-medium); } -/* FAB Button */ -.fab { - position: fixed; - bottom: var(--spacing-xl); - right: calc(var(--sidebar-width) + var(--spacing-xl)); - width: 60px; - height: 60px; - background: var(--color-accent); - color: white; - border-radius: 50%; - font-size: 32px; - box-shadow: var(--shadow-lg); - transition: transform var(--transition-base), box-shadow var(--transition-base); - z-index: 50; -} - -.fab:hover { - transform: scale(1.1); - box-shadow: var(--shadow-xl); - background: var(--color-accent-hover); -} - -/* Todo sidebar components */ -.sidebar-title { - font-size: var(--font-size-xl); - font-weight: bold; - margin-bottom: var(--spacing-lg); -} - -.todo-input-container { +.note-card-todos-count { display: flex; - gap: var(--spacing-sm); + align-items: center; + gap: 4px; + padding: 2px 8px; + background: var(--color-background); + border-radius: var(--radius-full); + font-weight: var(--font-weight-medium); +} + +.note-card-image { + width: 100%; + height: 140px; + object-fit: cover; + border-radius: var(--radius-md); margin-bottom: var(--spacing-md); } +/* ============================================ + TODO BOX + ============================================ */ + +.todo-input-wrapper { + position: relative; + margin-bottom: var(--spacing-lg); +} + .todo-input { - flex: 1; - padding: var(--spacing-sm) var(--spacing-md); - border: 2px solid var(--color-border); + width: 100%; + padding: var(--spacing-md) 48px var(--spacing-md) var(--spacing-md); + border: 1px solid var(--color-border); border-radius: var(--radius-md); - font-size: var(--font-size-base); + font-size: var(--font-size-sm); + color: var(--color-text-primary); + background: var(--color-background); + transition: all var(--transition-base); } .todo-input:focus { outline: none; border-color: var(--color-accent); + background: var(--color-card); + box-shadow: var(--shadow-sm); } -.todo-add-btn { - width: 40px; - height: 40px; +.btn-add-todo { + position: absolute; + right: var(--spacing-sm); + top: 50%; + transform: translateY(-50%); + width: 32px; + height: 32px; + padding: 6px; + border: none; + border-radius: var(--radius-sm); background: var(--color-accent); color: white; - border-radius: var(--radius-md); - font-size: var(--font-size-xl); - transition: background var(--transition-base); + cursor: pointer; + transition: all var(--transition-fast); } -.todo-add-btn:hover { +.btn-add-todo:hover { background: var(--color-accent-hover); + transform: translateY(-50%) scale(1.05); } +.btn-add-todo svg { + width: 100%; + height: 100%; +} + +/* Todo Filters */ .todo-filters { display: flex; - gap: var(--spacing-sm); - margin-bottom: var(--spacing-md); + gap: var(--spacing-xs); + margin-bottom: var(--spacing-lg); } .filter-btn { flex: 1; padding: var(--spacing-sm); border: 1px solid var(--color-border); - border-radius: var(--radius-md); - font-size: var(--font-size-sm); - transition: background var(--transition-base), color var(--transition-base); + border-radius: var(--radius-sm); + background: transparent; + color: var(--color-text-secondary); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: all var(--transition-fast); +} + +.filter-btn:hover { + background: var(--color-hover); + color: var(--color-text-primary); } .filter-btn.active { @@ -243,14 +155,10 @@ border-color: var(--color-accent); } -.todo-counter { - text-align: center; - color: var(--color-text-secondary); - font-size: var(--font-size-sm); - margin-bottom: var(--spacing-md); -} - +/* Todo List */ .todo-list { + flex: 1; + overflow-y: auto; display: flex; flex-direction: column; gap: var(--spacing-sm); @@ -261,28 +169,34 @@ align-items: center; gap: var(--spacing-md); padding: var(--spacing-md); - background: white; + background: var(--color-background); border-radius: var(--radius-md); - transition: background var(--transition-base); + transition: all var(--transition-fast); } .todo-item:hover { - background: var(--color-background); -} - -.todo-item.hidden { - display: none; + background: var(--color-hover); } .todo-checkbox { - width: 20px; - height: 20px; + width: 18px; + height: 18px; + border: 2px solid var(--color-border); + border-radius: 4px; cursor: pointer; + transition: all var(--transition-fast); +} + +.todo-checkbox:checked { + background: var(--color-accent); + border-color: var(--color-accent); } .todo-text { flex: 1; - font-size: var(--font-size-base); + font-size: var(--font-size-sm); + color: var(--color-text-primary); + line-height: 1.5; } .todo-item.completed .todo-text { @@ -291,109 +205,180 @@ } .todo-delete { - opacity: 0; width: 24px; height: 24px; - border-radius: 50%; - background: var(--color-danger); - color: white; - font-size: var(--font-size-sm); - transition: opacity var(--transition-base); + padding: 4px; + border: none; + border-radius: var(--radius-sm); + background: transparent; + color: var(--color-text-secondary); + cursor: pointer; + opacity: 0; + transition: all var(--transition-fast); } .todo-item:hover .todo-delete { opacity: 1; } -/* Modal */ -.modal-backdrop { +.todo-delete:hover { + background: var(--color-danger); + color: white; +} + +/* ============================================ + NOTE EDITOR (EXPANDED) + ============================================ */ + +.note-editor-backdrop { position: fixed; - inset: 0; + top: 0; + left: 0; + right: 0; + bottom: 0; background: rgba(0, 0, 0, 0.5); - backdrop-filter: blur(8px); + z-index: var(--z-modal); display: flex; align-items: center; justify-content: center; - z-index: 1000; - padding: var(--spacing-lg); -} - -.modal-content { - background: white; - border-radius: var(--radius-xl); - box-shadow: var(--shadow-xl); - max-width: 700px; - width: 100%; - max-height: 90vh; - overflow-y: auto; padding: var(--spacing-xl); + backdrop-filter: blur(4px); + animation: fadeIn var(--transition-base); } -.admin-modal { - max-width: 900px; +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } } -.modal-header { +.note-editor { + width: 100%; + max-width: 800px; + max-height: 90vh; + background: var(--color-card); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-2xl); + display: flex; + flex-direction: column; + overflow: hidden; + animation: slideUp var(--transition-base); +} + +@keyframes slideUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.note-editor-header { display: flex; - justify-content: space-between; align-items: center; - margin-bottom: var(--spacing-lg); + justify-content: space-between; + padding: var(--spacing-lg) var(--spacing-xl); + border-bottom: 1px solid var(--color-border); } -.modal-close { +.btn-close-editor { width: 36px; height: 36px; - border-radius: 50%; - background: var(--color-border); - font-size: var(--font-size-lg); - transition: background var(--transition-base); + padding: 8px; + border: none; + border-radius: var(--radius-md); + background: transparent; + color: var(--color-text-secondary); + cursor: pointer; + transition: all var(--transition-fast); } -.modal-close:hover { - background: var(--color-text-secondary); - color: white; +.btn-close-editor:hover { + background: var(--color-hover); + color: var(--color-text-primary); } -.modal-delete { +.note-editor-actions { + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.btn-icon { width: 36px; height: 36px; - border-radius: 50%; - background: var(--color-danger); - color: white; - font-size: var(--font-size-lg); - transition: background var(--transition-base); + padding: 8px; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + background: transparent; + color: var(--color-text-secondary); + cursor: pointer; + transition: all var(--transition-fast); } -.modal-delete:hover { - background: #DC2626; +.btn-icon:hover { + background: var(--color-hover); + color: var(--color-text-primary); + border-color: var(--color-accent); +} + +.btn-primary { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-lg); + border: none; + border-radius: var(--radius-md); + background: var(--color-accent); + color: white; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + cursor: pointer; + transition: all var(--transition-base); +} + +.btn-primary:hover { + background: var(--color-accent-hover); + box-shadow: var(--shadow-md); +} + +.btn-primary svg { + width: 16px; + height: 16px; } .note-title-input { width: 100%; - font-size: var(--font-size-xl); - font-weight: bold; + padding: var(--spacing-lg) var(--spacing-xl); border: none; - padding: var(--spacing-sm) 0; - margin-bottom: var(--spacing-md); + border-bottom: 1px solid var(--color-border); + font-size: var(--font-size-2xl); + font-weight: var(--font-weight-bold); + color: var(--color-text-primary); + background: transparent; } .note-title-input:focus { outline: none; -} - -.note-divider { - height: 1px; - background: var(--color-border); - margin: var(--spacing-lg) 0; + background: var(--color-background); } .note-content-textarea { - width: 100%; - min-height: 200px; + flex: 1; + min-height: 300px; + padding: var(--spacing-xl); border: none; - resize: vertical; font-size: var(--font-size-base); - line-height: 1.6; + color: var(--color-text-primary); + line-height: 1.8; + resize: none; + font-family: var(--font-family); } .note-content-textarea:focus { @@ -401,30 +386,45 @@ } .note-image-container { + padding: 0 var(--spacing-xl) var(--spacing-lg); position: relative; - margin: var(--spacing-lg) 0; } .note-image { width: 100%; - border-radius: var(--radius-md); + max-height: 300px; + object-fit: cover; + border-radius: var(--radius-lg); } -.note-image-remove { +.btn-remove-image { position: absolute; - top: var(--spacing-sm); - right: var(--spacing-sm); + top: var(--spacing-md); + right: calc(var(--spacing-xl) + var(--spacing-md)); width: 32px; height: 32px; - border-radius: 50%; - background: var(--color-danger); + padding: 6px; + border: none; + border-radius: var(--radius-full); + background: rgba(0, 0, 0, 0.7); color: white; - font-size: var(--font-size-base); + cursor: pointer; + transition: all var(--transition-fast); +} + +.btn-remove-image:hover { + background: var(--color-danger); +} + +.note-todos-section { + padding: var(--spacing-lg) var(--spacing-xl); + border-top: 1px solid var(--color-border); } .note-section-title { - font-size: var(--font-size-lg); - font-weight: 600; + font-size: var(--font-size-base); + font-weight: var(--font-weight-semibold); + color: var(--color-text-primary); margin-bottom: var(--spacing-md); } @@ -435,56 +435,136 @@ margin-bottom: var(--spacing-md); } -.note-add-todo-btn { - width: 100%; - padding: var(--spacing-md); - border: 2px dashed var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text-secondary); - transition: border-color var(--transition-base), color var(--transition-base); -} - -.note-add-todo-btn:hover { - border-color: var(--color-accent); - color: var(--color-accent); -} - -.modal-actions { +.btn-add-note-todo { display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + border: 1px dashed var(--color-border); + border-radius: var(--radius-md); + background: transparent; + color: var(--color-text-secondary); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: all var(--transition-fast); +} + +.btn-add-note-todo:hover { + background: var(--color-hover); + border-color: var(--color-accent); + color: var(--color-text-primary); +} + +.btn-add-note-todo svg { + width: 16px; + height: 16px; +} + +.note-editor-footer { + display: flex; + align-items: center; gap: var(--spacing-md); - margin-top: var(--spacing-lg); + padding: var(--spacing-lg) var(--spacing-xl); + border-top: 1px solid var(--color-border); + background: var(--color-background); +} + +.note-metadata { + flex: 1; + font-size: var(--font-size-xs); + color: var(--color-text-secondary); +} + +/* ============================================ + MODALS (Admin & Confirm) + ============================================ */ + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: var(--z-modal); + backdrop-filter: blur(4px); +} + +.modal-content { + background: var(--color-card); + border-radius: var(--radius-xl); + box-shadow: var(--shadow-2xl); + max-width: 90vw; + max-height: 90vh; + overflow: hidden; + animation: slideUp var(--transition-base); +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-xl); + border-bottom: 1px solid var(--color-border); +} + +.modal-header h2 { + font-size: var(--font-size-xl); + font-weight: var(--font-weight-bold); + color: var(--color-text-primary); +} + +.modal-close { + width: 36px; + height: 36px; + padding: 8px; + border: none; + border-radius: var(--radius-md); + background: transparent; + color: var(--color-text-secondary); + font-size: var(--font-size-xl); + cursor: pointer; + transition: all var(--transition-fast); +} + +.modal-close:hover { + background: var(--color-hover); + color: var(--color-text-primary); +} + +/* Admin Modal */ +.admin-modal { + min-width: 700px; +} + +.admin-actions { + padding: var(--spacing-lg) var(--spacing-xl); + border-bottom: 1px solid var(--color-border); } .action-btn { - padding: var(--spacing-md) var(--spacing-lg); + padding: var(--spacing-sm) var(--spacing-lg); + border: none; + border-radius: var(--radius-md); background: var(--color-accent); color: white; - border-radius: var(--radius-md); - font-size: var(--font-size-base); - transition: background var(--transition-base); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + cursor: pointer; + transition: all var(--transition-base); } .action-btn:hover { background: var(--color-accent-hover); -} - -.modal-footer { - margin-top: var(--spacing-lg); - padding-top: var(--spacing-lg); - border-top: 1px solid var(--color-border); -} - -.note-metadata { - font-size: var(--font-size-sm); - color: var(--color-text-secondary); -} - -/* Admin table */ -.admin-actions { - margin-bottom: var(--spacing-lg); + box-shadow: var(--shadow-md); } .users-table-container { + padding: var(--spacing-xl); overflow-x: auto; } @@ -501,49 +581,53 @@ } .users-table th { - font-weight: 600; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + color: var(--color-text-secondary); background: var(--color-background); } .users-table tbody tr:hover { - background: var(--color-background); + background: var(--color-hover); } .btn-edit-user, .btn-delete-user { padding: var(--spacing-sm) var(--spacing-md); - color: white; border: none; - border-radius: 6px; + border-radius: var(--radius-sm); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-medium); cursor: pointer; - font-size: 0.875rem; - transition: all var(--transition-speed); - margin-right: var(--spacing-sm); + transition: all var(--transition-fast); + margin-right: var(--spacing-xs); } .btn-edit-user { - background: var(--color-primary); + background: var(--color-accent); + color: white; } .btn-edit-user:hover { - background: #2980b9; - transform: translateY(-1px); + background: var(--color-accent-hover); + box-shadow: var(--shadow-sm); } .btn-delete-user { background: var(--color-danger); + color: white; } .btn-delete-user:hover { background: #c0392b; - transform: translateY(-1px); + box-shadow: var(--shadow-sm); } -/* Modal de confirmation */ +/* Confirm Modal */ .confirm-modal { max-width: 450px; + padding: var(--spacing-2xl); text-align: center; - padding: var(--spacing-xl) var(--spacing-lg); } .confirm-icon { @@ -553,16 +637,16 @@ .confirm-title { font-size: var(--font-size-xl); - font-weight: 600; + font-weight: var(--font-weight-bold); + color: var(--color-text-primary); margin-bottom: var(--spacing-md); - color: var(--color-text); } .confirm-message { font-size: var(--font-size-base); color: var(--color-text-secondary); - margin-bottom: var(--spacing-xl); line-height: 1.6; + margin-bottom: var(--spacing-xl); } .confirm-actions { @@ -577,20 +661,20 @@ border: none; border-radius: var(--radius-md); font-size: var(--font-size-base); - font-weight: 500; + font-weight: var(--font-weight-semibold); cursor: pointer; - transition: all var(--transition-speed); + transition: all var(--transition-base); min-width: 120px; } .btn-cancel { background: var(--color-background); - color: var(--color-text); - border: 2px solid var(--color-border); + color: var(--color-text-primary); + border: 1px solid var(--color-border); } .btn-cancel:hover { - background: var(--color-border); + background: var(--color-hover); } .btn-confirm { @@ -600,6 +684,5 @@ .btn-confirm:hover { background: #c0392b; - transform: translateY(-2px); - box-shadow: 0 4px 12px rgba(231, 76, 60, 0.3); + box-shadow: var(--shadow-md); }